From 22a93686973a4b6af4ec964e2d16b809b92545e7 Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 27 May 2022 09:54:06 +0200 Subject: [PATCH] stuff --- 0-Plugin/src/main/java/cli/Subcommand.java | 2 +- .../java/cli/category/CategoryCommands.java | 2 +- .../src/main/java/cli/link/LinkCommands.java | 92 ++++++++------ .../src/main/java/cli/tag/TagCommands.java | 3 +- 0-Plugin/src/main/java/main/Main.java | 1 - .../main/java/cli/link/LinkCliAdapter.java | 5 + .../java/persistence/link/LinkEntity.java | 8 +- .../src/main/java/link/LinkUseCase.java | 105 +++++++++------- .../main/java/link/RandomLinkIdGenerator.java | 4 +- 3-Domain/src/main/java/link/Link.java | 13 ++ .../src/main/java/link/LinkRepository.java | 118 +++++++++++------- 3-Domain/src/main/java/link/LinkUrl.java | 19 +++ 12 files changed, 228 insertions(+), 144 deletions(-) diff --git a/0-Plugin/src/main/java/cli/Subcommand.java b/0-Plugin/src/main/java/cli/Subcommand.java index c8ae3df..61970b1 100644 --- a/0-Plugin/src/main/java/cli/Subcommand.java +++ b/0-Plugin/src/main/java/cli/Subcommand.java @@ -21,7 +21,7 @@ abstract public class Subcommand { commandExists(args[0]); return commands.get(args[0]).apply(args); } - catch (IndexOutOfBoundsException e) { + catch (IndexOutOfBoundsException | IllegalArgumentException e) { throw new CliError("Missing a value! " + getUsage()); } } diff --git a/0-Plugin/src/main/java/cli/category/CategoryCommands.java b/0-Plugin/src/main/java/cli/category/CategoryCommands.java index 3c0cfc1..e0070a8 100644 --- a/0-Plugin/src/main/java/cli/category/CategoryCommands.java +++ b/0-Plugin/src/main/java/cli/category/CategoryCommands.java @@ -19,7 +19,7 @@ public class CategoryCommands extends Subcommand { @Override public String getUsage() { - return "Usage:" + System.lineSeparator() + getSubcommand() + "add categoryName" + System.lineSeparator() + getSubcommand() + "get"; + return "Usage:" + System.lineSeparator() + getSubcommand() + " add categoryName" + System.lineSeparator() + getSubcommand() + " get"; } diff --git a/0-Plugin/src/main/java/cli/link/LinkCommands.java b/0-Plugin/src/main/java/cli/link/LinkCommands.java index b8f61b8..9f80e37 100644 --- a/0-Plugin/src/main/java/cli/link/LinkCommands.java +++ b/0-Plugin/src/main/java/cli/link/LinkCommands.java @@ -7,52 +7,64 @@ import java.util.stream.Collectors; public class LinkCommands extends Subcommand { - private final LinkCliAdapter linkCliAdapter; + private final LinkCliAdapter linkCliAdapter; - public LinkCommands(LinkCliAdapter linkCliAdapter) { - this.linkCliAdapter = linkCliAdapter; - commands.put("add", this::addLink); - commands.put("get", this::getAll); - commands.put("category", this::getByCategory); - commands.put("user", this::getByUser); - commands.put("tag", this::getByTag); - } + public LinkCommands(LinkCliAdapter linkCliAdapter) { + this.linkCliAdapter = linkCliAdapter; + commands.put("add", this::addLink); + commands.put("get", this::getAll); + commands.put("category", this::getByCategory); + commands.put("user", this::getByUser); + commands.put("tag", this::getByTag); + commands.put("hosts", this::groupByHosts); + } - @Override - public String getSubcommand() { - return "link"; - } + @Override + public String getSubcommand() { + return "link"; + } - @Override - public String getUsage() { - return "Usage: " + System.lineSeparator() + - getSubcommand() + "add http://example.org yourUsername [category1 category2 .. categoryN]" + System.lineSeparator() + - getSubcommand() + "get " + System.lineSeparator() + - getSubcommand() + "category aCategoryName " + System.lineSeparator() + - getSubcommand() + "tag aTagName " + System.lineSeparator() + - getSubcommand() + "user aUserName "; - } + @Override + public String getUsage() { + return "Usage: " + System.lineSeparator() + + getSubcommand() + " add http://example.org yourUsername [category1 category2 .. categoryN]" + System.lineSeparator() + + getSubcommand() + " get " + System.lineSeparator() + + getSubcommand() + " category aCategoryName " + System.lineSeparator() + + getSubcommand() + " tag aTagName " + System.lineSeparator() + + getSubcommand() + " user aUserName " + System.lineSeparator() + + getSubcommand() + " hosts"; - private String addLink(String[] args) { - linkCliAdapter.addLink(args[1], - Arrays.stream(Arrays.copyOfRange(args, 3, args.length)).collect(Collectors.toSet()), - args[2]); - return "Added the new Link"; - } + } - private String getAll(String[] args) { - return String.join(System.lineSeparator(), linkCliAdapter.getLinks()); - } + private String addLink(String[] args) { + linkCliAdapter.addLink(args[1], + Arrays.stream(Arrays.copyOfRange(args, 3, args.length)).collect(Collectors.toSet()), + args[2]); + return "Added the new Link"; + } - private String getByCategory(String[] args) { - return String.join(System.lineSeparator(), linkCliAdapter.getLinksForCategory(args[1])); - } + private String getAll(String[] args) { + var firstLine = "All available Links:" + System.lineSeparator(); + return firstLine + String.join(System.lineSeparator(), linkCliAdapter.getLinks()); + } - private String getByUser(String[] args) { - return String.join(System.lineSeparator(), linkCliAdapter.getLinksForUser(args[1])); - } + private String getByCategory(String[] args) { + var firstLine = "All available Links for the category:" + System.lineSeparator(); + return firstLine + String.join(System.lineSeparator(), linkCliAdapter.getLinksForCategory(args[1])); + } - private String getByTag(String[] args) { - return String.join(System.lineSeparator(), linkCliAdapter.getLinksForTag(args[1])); - } + private String getByUser(String[] args) { + var firstLine = "All available Links for the user:" + System.lineSeparator(); + return firstLine + String.join(System.lineSeparator(), linkCliAdapter.getLinksForUser(args[1])); + } + + private String getByTag(String[] args) { + var firstLine = "All available Links for the tag:" + System.lineSeparator(); + return firstLine + String.join(System.lineSeparator(), linkCliAdapter.getLinksForTag(args[1])); + } + + private String groupByHosts(String[] strings) { + var firstLine = "All available Links grouped by the host names:" + System.lineSeparator(); + return firstLine + String.join(System.lineSeparator(), linkCliAdapter.groupByHosts()); + } } diff --git a/0-Plugin/src/main/java/cli/tag/TagCommands.java b/0-Plugin/src/main/java/cli/tag/TagCommands.java index 4c469ed..fa95025 100644 --- a/0-Plugin/src/main/java/cli/tag/TagCommands.java +++ b/0-Plugin/src/main/java/cli/tag/TagCommands.java @@ -30,6 +30,7 @@ public class TagCommands extends Subcommand { } private String getTags(String[] args) { - return String.join(System.lineSeparator(), customTagsCliAdapter.getAllTagNames()); + var firstLine = "All available Tags:" + System.lineSeparator(); + return firstLine + String.join(System.lineSeparator(), customTagsCliAdapter.getAllTagNames()); } } diff --git a/0-Plugin/src/main/java/main/Main.java b/0-Plugin/src/main/java/main/Main.java index 6eb467c..e013425 100644 --- a/0-Plugin/src/main/java/main/Main.java +++ b/0-Plugin/src/main/java/main/Main.java @@ -19,6 +19,5 @@ public class Main { catch (RuntimeException runtimeException) { System.out.println(runtimeException.getMessage()); } - } } diff --git a/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java b/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java index 5209efc..5d23583 100644 --- a/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java +++ b/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java @@ -7,6 +7,7 @@ import link.LinkUseCase; import tag.TagName; import user.Username; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -39,4 +40,8 @@ public class LinkCliAdapter { public Set getLinksForUser(String userName) { return linkUseCase.getLinksForUser(new Username(userName)).stream().map(LinkDto::toString).collect(Collectors.toSet()); } + + public List groupByHosts() { + return linkUseCase.groupByHosts().stream().map(LinkDto::toString).collect(Collectors.toList()); + } } diff --git a/1-Adapter/src/main/java/persistence/link/LinkEntity.java b/1-Adapter/src/main/java/persistence/link/LinkEntity.java index 5569f95..66190a0 100644 --- a/1-Adapter/src/main/java/persistence/link/LinkEntity.java +++ b/1-Adapter/src/main/java/persistence/link/LinkEntity.java @@ -33,13 +33,13 @@ public class LinkEntity implements CSVSerializable { this.id = Integer.parseInt(fields[0]); this.creator = fields[1]; this.url = fields[2]; - this.categoryIds = + this.categoryIds = fields.length > 3 ? (Arrays.stream(fields[3].split(CSVSerializable.listSeperator)).map(Integer::parseInt)).collect( - Collectors.toSet()); + Collectors.toSet()) : Set.of(); - this.tags = (Arrays + this.tags = fields.length > 4 ? (Arrays .stream(fields[4].split(CSVSerializable.listSeperator)) - .map(TagEntity::new)).collect(Collectors.toSet()); + .map(TagEntity::new)).collect(Collectors.toSet()) : Set.of(); } public LinkEntity(Link link) { diff --git a/2-Application/src/main/java/link/LinkUseCase.java b/2-Application/src/main/java/link/LinkUseCase.java index 42ee1eb..bcd60fc 100644 --- a/2-Application/src/main/java/link/LinkUseCase.java +++ b/2-Application/src/main/java/link/LinkUseCase.java @@ -10,65 +10,76 @@ import tag.TagName; import tag.TaggingUseCase; import user.Username; +import java.util.List; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; public class LinkUseCase { - private final LinkRepository linkRepository; - private final CategoryRepository categoryRepository; - private final TaggingUseCase taggingUseCase; - private final RandomLinkIdGenerator linkIdGenerator; - public LinkUseCase(LinkRepository linkRepository, - CategoryRepository categoryRepository, - TaggingUseCase taggingUseCase, - RandomLinkIdGenerator linkIdGenerator) { - this.linkRepository = linkRepository; - this.categoryRepository = categoryRepository; - this.taggingUseCase = taggingUseCase; - this.linkIdGenerator = linkIdGenerator; - } + private final LinkRepository linkRepository; + private final CategoryRepository categoryRepository; + private final TaggingUseCase taggingUseCase; + private final RandomLinkIdGenerator linkIdGenerator; - public void addLink(LinkUrl url, Set categoryNames, Username creator) { - if (!OnlineCheck.isReachable(url)) { - throw new URLIsNotReachable("The url " + url + " does not seem online. Check if it is correct and you have internet access."); - } - var categoryIds = categoryNames.stream().map(categoryRepository::getIdByName).collect(Collectors.toSet()); - var tags = taggingUseCase.getTagsFor(url); - var id = linkIdGenerator.generateId(); - var link = new Link(id, creator, url, categoryIds, tags); - linkRepository.add(link); - } + public LinkUseCase(LinkRepository linkRepository, + CategoryRepository categoryRepository, + TaggingUseCase taggingUseCase, + RandomLinkIdGenerator linkIdGenerator) { + this.linkRepository = linkRepository; + this.categoryRepository = categoryRepository; + this.taggingUseCase = taggingUseCase; + this.linkIdGenerator = linkIdGenerator; + } + public void addLink(LinkUrl url, Set categoryNames, Username creator) { + if (!OnlineCheck.isReachable(url)) { + throw new URLIsNotReachable("The url " + url + " does not seem online. Check if it is correct and you have internet access."); + } + var categoryIds = categoryNames.stream().map(categoryRepository::getIdByName).collect(Collectors.toSet()); + var tags = taggingUseCase.getTagsFor(url); + var id = linkIdGenerator.generateId(); + var link = new Link(id, creator, url, categoryIds, tags); + linkRepository.add(link); + } - public Set getLinks() { - return linkRepository.getAll().stream().map(this::convertLink).collect(Collectors.toSet()); - } + public Set getLinks() { + return linkRepository.getAll().stream().map(this::convertLink).collect(Collectors.toSet()); + } - public Set getLinksForCategory(CategoryName categoryName) { - return linkRepository.getByCategory(categoryRepository.getIdByName(categoryName).id()).stream().map(this::convertLink).collect(Collectors.toSet()); - } + public Set getLinksForCategory(CategoryName categoryName) { + return linkRepository + .getByCategory(categoryRepository.getIdByName(categoryName)) + .stream() + .map(this::convertLink) + .collect(Collectors.toSet()); + } - public Set getLinksForTag(TagName tagName) { - return linkRepository.getByTag(tagName).stream().map(this::convertLink).collect(Collectors.toSet()); - } - public Set getLinksForUser(Username username) { - return linkRepository.getByUser(username).stream().map(this::convertLink).collect(Collectors.toSet()); - } + public Set getLinksForTag(TagName tagName) { + return linkRepository.getByTag(tagName).stream().map(this::convertLink).collect(Collectors.toSet()); + } - private LinkDto convertLink(Link link) { - return new LinkDto(link.getCreator(), link.getUrl(), getCategoriesOf(link), link.getTags()); - } + public Set getLinksForUser(Username username) { + return linkRepository.getByUser(username).stream().map(this::convertLink).collect(Collectors.toSet()); + } - private Set getCategoriesOf(Link link) { - return link.getCategoryIds().stream().map(getCategoryForId()).collect(Collectors.toSet()); - } + public List groupByHosts() { + return linkRepository.groupByHost().stream().map(this::convertLink).collect(Collectors.toList()); + } + + private LinkDto convertLink(Link link) { + return new LinkDto(link.getCreator(), link.getUrl(), getCategoriesOf(link), link.getTags()); + } + + private Set getCategoriesOf(Link link) { + return link.getCategoryIds().stream().map(getCategoryForId()).collect(Collectors.toSet()); + } + + private Function getCategoryForId() { + return id -> categoryRepository + .getById(id) + .orElseThrow(() -> new CategroyDoesNotExist( + "A Category for a certain id does not exits. You must create it first.")); + } - private Function getCategoryForId() { - return id -> categoryRepository - .getById(id) - .orElseThrow(() -> new CategroyDoesNotExist( - "A Category for a certain id does not exits. You must create it first.")); - } } diff --git a/2-Application/src/main/java/link/RandomLinkIdGenerator.java b/2-Application/src/main/java/link/RandomLinkIdGenerator.java index f9f34f3..84e5e7a 100644 --- a/2-Application/src/main/java/link/RandomLinkIdGenerator.java +++ b/2-Application/src/main/java/link/RandomLinkIdGenerator.java @@ -1,13 +1,13 @@ package link; -public class RandomLinkIdGenerator implements LinkIdGenerator { +public class RandomLinkIdGenerator { + private final LinkRepository linkRepository; public RandomLinkIdGenerator(LinkRepository linkRepository) { this.linkRepository = linkRepository; } - @Override public LinkId generateId() { var randomID = (int) (Math.random() * 10000); diff --git a/3-Domain/src/main/java/link/Link.java b/3-Domain/src/main/java/link/Link.java index d7e4a28..cbfe280 100644 --- a/3-Domain/src/main/java/link/Link.java +++ b/3-Domain/src/main/java/link/Link.java @@ -2,6 +2,7 @@ package link; import category.CategoryId; import tag.Tag; +import tag.TagName; import user.Username; import java.util.Set; @@ -34,10 +35,22 @@ public class Link { return url; } + public boolean hasCategoryId(CategoryId categoryId) { + return categoryIds.contains(categoryId); + } + public Set getCategoryIds() { return categoryIds; } + public boolean hasTagName(TagName tagName) { + return tags.stream().anyMatch(tag -> tag.getName().equals(tagName)); + } + + public boolean wasCreatedBy(Username username) { + return this.creator.equals(username); + } + public Set getTags() { return tags; } diff --git a/3-Domain/src/main/java/link/LinkRepository.java b/3-Domain/src/main/java/link/LinkRepository.java index 26d333d..952bd4c 100644 --- a/3-Domain/src/main/java/link/LinkRepository.java +++ b/3-Domain/src/main/java/link/LinkRepository.java @@ -2,76 +2,100 @@ package link; import abstraction.CustomSetPersistenceDecorator; import abstraction.PersistenceAdapter; +import category.CategoryId; import datastructures.set.CustomSet; import exeptions.LinkAlreadyExists; import exeptions.LinkDoesNotExist; import tag.TagName; import user.Username; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; public class LinkRepository { - final private CustomSet links; + final private CustomSet links; - public LinkRepository(PersistenceAdapter linkPersistenceAdapter) { - this.links = new CustomSetPersistenceDecorator<>(linkPersistenceAdapter); - } + public LinkRepository(PersistenceAdapter linkPersistenceAdapter) { + this.links = new CustomSetPersistenceDecorator<>(linkPersistenceAdapter); + } - public Optional getById(LinkId id) { - return links.find(link -> link.getId().equals(id)); - } + public Optional getById(LinkId id) { + return links.find(link -> link.getId().equals(id)); + } - public Optional getByUrl(LinkUrl url) { - return links.find(link -> link.getUrl().equals(url)); - } + public Optional getByUrl(LinkUrl url) { + return links.find(link -> link.getUrl().equals(url)); + } - public void removeById(LinkId id) { - getById(id).ifPresentOrElse(this::remove, () -> { - throw new LinkDoesNotExist("Tried removing a link with id " + id + " but it does not exist."); - }); - } + public void removeById(LinkId id) { + getById(id).ifPresentOrElse(this::remove, () -> { + throw new LinkDoesNotExist("Tried removing a link with id " + id + " but it does not exist."); + }); + } - public void removeByUrl(LinkUrl url) { - getByUrl(url).ifPresentOrElse(this::remove, () -> { - throw new LinkDoesNotExist("Tried removing a link with url " + url + " but it does not exist."); - }); - } + public void removeByUrl(LinkUrl url) { + getByUrl(url).ifPresentOrElse(this::remove, () -> { + throw new LinkDoesNotExist("Tried removing a link with url " + url + " but it does not exist."); + }); + } - public void add(Link link) { - checkDuplicates(link); - links.add(link); - } + public void add(Link link) { + checkDuplicates(link); + links.add(link); + } - public Set getAll() { - return links.getSet(); - } + public Set getAll() { + return links.getSet(); + } - private void remove(Link link) { - links.remove(link); - } + private void remove(Link link) { + links.remove(link); + } - private void checkDuplicates(Link newLink) { - if (this.getById(newLink.getId()).isPresent()) { - throw new LinkAlreadyExists("A link with the id " + newLink.getId() + " already exitsts"); - } + private void checkDuplicates(Link newLink) { + if (this.getById(newLink.getId()).isPresent()) { + throw new LinkAlreadyExists("A link with the id " + newLink.getId() + " already exitsts"); + } - if (this.getByUrl(newLink.getUrl()).isPresent()) { - throw new LinkAlreadyExists("A link with the url " + newLink.getUrl() + " already exitsts"); - } - } + if (this.getByUrl(newLink.getUrl()).isPresent()) { + throw new LinkAlreadyExists("A link with the url " + newLink.getUrl() + " already exitsts"); + } + } - public Set getByCategory(int id) { - return links.stream().filter(it -> it.getCategoryIds().contains(id)).collect(Collectors.toSet()); - } + public Set getByCategory(CategoryId id) { + return links.stream().filter(link -> link.hasCategoryId(id)).collect(Collectors.toSet()); + } - public Set getByTag(TagName tagName) { - return links.stream().filter(it -> it.getTags().stream().anyMatch(tag -> tag.getName().equals(tagName))).collect(Collectors.toSet()); - } + public Set getByTag(TagName tagName) { + return links.stream().filter(link -> link.hasTagName(tagName)).collect(Collectors.toSet()); + } - public Set getByUser(Username username) { - return links.stream().filter(it -> it.getCreator().equals(username)).collect(Collectors.toSet()); - } + public Set getByUser(Username username) { + return links.stream().filter(link -> link.wasCreatedBy(username)).collect(Collectors.toSet()); + } + + public List groupByHost() { + var input = new ArrayList<>(links.stream().toList()); + var result = new ArrayList(); + + boolean changed = false; + while (!input.isEmpty()) { + input.removeAll(result); + changed = false; + for (Link link : input) { + if (result.stream().anyMatch(resultLink -> resultLink.getUrl().hostEquals(link.getUrl()))) { + result.add(link); + changed = true; + } + } + if (!changed && !input.isEmpty()) { + result.add(input.get(0)); + } + } + return result; + } } diff --git a/3-Domain/src/main/java/link/LinkUrl.java b/3-Domain/src/main/java/link/LinkUrl.java index 9aa7a5c..a6fc195 100644 --- a/3-Domain/src/main/java/link/LinkUrl.java +++ b/3-Domain/src/main/java/link/LinkUrl.java @@ -22,6 +22,25 @@ public class LinkUrl { return url; } + public boolean hostEquals(LinkUrl other) { + return this.url.getHost().equals(other.getUrl().getHost()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LinkUrl linkUrl = (LinkUrl) o; + + return url != null ? url.toString().equals(linkUrl.url.toString()) : linkUrl.url == null; + } + + @Override + public int hashCode() { + return url != null ? url.toString().hashCode() : 0; + } + @Override public String toString() { return url.toString();