From 3ef31c9c3cdfc0e9a0395eafcda51b2f0b993c1b Mon Sep 17 00:00:00 2001 From: qvalentin Date: Mon, 16 May 2022 21:09:45 +0200 Subject: [PATCH] all sorts of things --- 0-Plugin/src/main/java/cli/Subcommand.java | 2 +- .../src/main/java/cli/link/LinkCommands.java | 6 +- .../src/main/java/cli/tag/TagCommands.java | 3 +- .../src/main/java/main/CommandHandler.java | 96 +++++++++++++++++++ 0-Plugin/src/main/java/main/Main.java | 9 +- .../main/java/persistence/GenericCSVDAO.java | 17 +++- .../java/persistence/PersistenceError.java | 8 ++ .../main/java/cli/link/LinkCliAdapter.java | 5 + .../persistence/category/CategoryEntity.java | 4 +- .../link/CSVLinkPersistenceAdapter.java | 4 +- .../main/java/persistence/tag/TagEntity.java | 6 -- .../category/CategoryEntityTest.java | 16 ++++ .../main/java/category/CategoryUseCase.java | 2 +- 2-Application/src/main/java/link/LinkDto.java | 11 +++ .../src/main/java/link/LinkUseCase.java | 17 ++++ .../src/main/java/tag/TaggingUseCase.java | 6 +- 3-Domain/src/main/java/category/Category.java | 5 + .../src/main/java/category/CategoryName.java | 5 + 3-Domain/src/main/java/link/Link.java | 9 ++ .../src/main/java/link/LinkRepository.java | 7 +- 3-Domain/src/main/java/tag/Tag.java | 7 +- 3-Domain/src/main/java/tag/TagName.java | 5 + 3-Domain/src/main/java/user/Username.java | 5 + 23 files changed, 228 insertions(+), 27 deletions(-) create mode 100644 0-Plugin/src/main/java/main/CommandHandler.java create mode 100644 0-Plugin/src/main/java/persistence/PersistenceError.java create mode 100644 1-Adapter/src/test/java/persistence/category/CategoryEntityTest.java create mode 100644 2-Application/src/main/java/link/LinkDto.java diff --git a/0-Plugin/src/main/java/cli/Subcommand.java b/0-Plugin/src/main/java/cli/Subcommand.java index 492cce4..ecf187b 100644 --- a/0-Plugin/src/main/java/cli/Subcommand.java +++ b/0-Plugin/src/main/java/cli/Subcommand.java @@ -28,7 +28,7 @@ abstract public class Subcommand { private void commandExits(String command) { if (commands.get(command) == null) { - throw new CliError("Subcommand does not exist! " + getUsage()); + throw new CliError("Subcommand " + command + " does not exist! " + getUsage()); } } } diff --git a/0-Plugin/src/main/java/cli/link/LinkCommands.java b/0-Plugin/src/main/java/cli/link/LinkCommands.java index 5990625..090eb65 100644 --- a/0-Plugin/src/main/java/cli/link/LinkCommands.java +++ b/0-Plugin/src/main/java/cli/link/LinkCommands.java @@ -12,6 +12,7 @@ public class LinkCommands extends Subcommand { public LinkCommands(LinkCliAdapter linkCliAdapter) { this.linkCliAdapter = linkCliAdapter; commands.put("add", this::addLink); + commands.put("get", this::getAll); } @Override @@ -26,10 +27,13 @@ public class LinkCommands extends Subcommand { } 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()); + } } diff --git a/0-Plugin/src/main/java/cli/tag/TagCommands.java b/0-Plugin/src/main/java/cli/tag/TagCommands.java index 005b753..1d62ddf 100644 --- a/0-Plugin/src/main/java/cli/tag/TagCommands.java +++ b/0-Plugin/src/main/java/cli/tag/TagCommands.java @@ -9,7 +9,6 @@ public class TagCommands extends Subcommand { final private CustomTagsCliAdapter customTagsCliAdapter; - final private HashMap> commands = new HashMap<>(); public TagCommands(CustomTagsCliAdapter customTagsCliAdapter) { this.customTagsCliAdapter = customTagsCliAdapter; @@ -24,7 +23,7 @@ public class TagCommands extends Subcommand { @Override public String getUsage() { return "Usage: " + System.lineSeparator()+ - getSubcommand() + "add tagName tagRegexExpression"; + getSubcommand() + " add tagName tagRegexExpression"; } private String addCustomTag(String[] args) { diff --git a/0-Plugin/src/main/java/main/CommandHandler.java b/0-Plugin/src/main/java/main/CommandHandler.java new file mode 100644 index 0000000..1cb9a80 --- /dev/null +++ b/0-Plugin/src/main/java/main/CommandHandler.java @@ -0,0 +1,96 @@ +package main; + +import category.CategoryRepository; +import category.CategoryUseCase; +import category.RandomCategoryIdGenerator; +import cli.CliError; +import cli.Subcommand; +import cli.category.CategoryCliAdapter; +import cli.category.CategoryCommands; +import cli.link.LinkCliAdapter; +import cli.link.LinkCommands; +import cli.tag.CustomTagsCliAdapter; +import cli.tag.TagCommands; +import link.LinkRepository; +import link.LinkUseCase; +import link.RandomLinkIdGenerator; +import persistence.GenericCSVDAO; +import persistence.category.CSVCategoryPersistenceAdapter; +import persistence.category.CategoryEntity; +import persistence.customTags.CSVCustomTagMatcherPersistenceAdapter; +import persistence.customTags.CustomTagMatcherEntity; +import persistence.link.CSVLinkPersistenceAdapter; +import persistence.link.LinkEntity; +import tag.CustomTagsUseCase; +import tag.TagMatcher; +import tag.TagMatcherRepository; +import tag.TaggingUseCase; +import tag.matcherImplementations.GitHubTagMatcher; + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Set; + +public class CommandHandler { + + private final HashMap subcommands = new HashMap<>(); + + public CommandHandler() { + this.addSubcommands(); + } + + public void executeCommand(String[] args) { + + if(args.length == 0){ + //TODO: print usage + } + + var command = subcommands.get(args[0]); + + if (command == null) { + throw new CliError("Unknown Command"); + } + + var output = command.executeSubcommand(Arrays.copyOfRange(args, 1, args.length)); + System.out.println(output); + } + + private void addSubcommands() { + + CategoryRepository categoryRepository = + new CategoryRepository(new CSVCategoryPersistenceAdapter(new GenericCSVDAO<>(new File("category.csv"), + CategoryEntity::new))); + CategoryCliAdapter categoryCliAdapter = new CategoryCliAdapter(new CategoryUseCase(categoryRepository, + new RandomCategoryIdGenerator( + categoryRepository))); + + var categoryCommands = new CategoryCommands(categoryCliAdapter); + subcommands.put(categoryCommands.getSubcommand(), categoryCommands); + + LinkRepository linkRepository = + new LinkRepository(new CSVLinkPersistenceAdapter(new GenericCSVDAO<>(new File("links.csv"), + LinkEntity::new))); + Set staticTagMatchers = Set.of(new GitHubTagMatcher()); + TagMatcherRepository tagMatcherRepository = + new TagMatcherRepository(new CSVCustomTagMatcherPersistenceAdapter(new GenericCSVDAO<>( + new File("customtags.csv"), + CustomTagMatcherEntity::new)), staticTagMatchers); + TaggingUseCase taggingUseCase = + new TaggingUseCase(tagMatcherRepository, new RandomLinkIdGenerator(linkRepository)); + LinkCliAdapter linkCliAdapter = + new LinkCliAdapter(new LinkUseCase(linkRepository, + categoryRepository, + taggingUseCase, + new RandomLinkIdGenerator(linkRepository))); + + var linkCommands = new LinkCommands(linkCliAdapter); + subcommands.put(linkCommands.getSubcommand(), linkCommands); + + TagCommands tagCommands = + new TagCommands(new CustomTagsCliAdapter(new CustomTagsUseCase(tagMatcherRepository))); + + subcommands.put(tagCommands.getSubcommand(), tagCommands); + + } +} diff --git a/0-Plugin/src/main/java/main/Main.java b/0-Plugin/src/main/java/main/Main.java index bef5087..3fab6c5 100644 --- a/0-Plugin/src/main/java/main/Main.java +++ b/0-Plugin/src/main/java/main/Main.java @@ -10,12 +10,11 @@ import java.io.File; public class Main { public static void main(String[] args) { - TagName test = new TagName("ds"); - var csvCategoryPersistenceAdapter = - new CSVCategoryPersistenceAdapter(new GenericCSVDAO(new File("dsa"), - CategoryEntity::new)); - System.out.println(test); + CommandHandler commandHandler = new CommandHandler(); + + commandHandler.executeCommand(args); + } } diff --git a/0-Plugin/src/main/java/persistence/GenericCSVDAO.java b/0-Plugin/src/main/java/persistence/GenericCSVDAO.java index e717727..3dadbab 100644 --- a/0-Plugin/src/main/java/persistence/GenericCSVDAO.java +++ b/0-Plugin/src/main/java/persistence/GenericCSVDAO.java @@ -21,6 +21,17 @@ public class GenericCSVDAO implements GenericDAO { public GenericCSVDAO(File file, Function constructor) { this.file = file; this.constructor = constructor; + createFileIfMissing(); + } + + private void createFileIfMissing() { + if (file.exists()) return; + try { + file.createNewFile(); + } + catch (IOException e) { + throw new PersistenceError("Could not create the file " + file.getAbsolutePath()); + } } public Set getALl() { @@ -31,7 +42,7 @@ public class GenericCSVDAO implements GenericDAO { } } catch (IOException e) { - e.printStackTrace(); + throw new PersistenceError("Something went wrong while reading from file " + file.getAbsolutePath()); } return lines @@ -55,7 +66,7 @@ public class GenericCSVDAO implements GenericDAO { bufferedWriter.newLine(); } catch (IOException e) { - e.printStackTrace(); + throw new PersistenceError("Something went wrong while writing to file " + file.getAbsolutePath()); } } @@ -65,7 +76,7 @@ public class GenericCSVDAO implements GenericDAO { bufferedWriter.write(""); } catch (IOException e) { - e.printStackTrace(); + throw new PersistenceError("Something went wrong while writing to file " + file.getAbsolutePath()); } } } diff --git a/0-Plugin/src/main/java/persistence/PersistenceError.java b/0-Plugin/src/main/java/persistence/PersistenceError.java new file mode 100644 index 0000000..95d6363 --- /dev/null +++ b/0-Plugin/src/main/java/persistence/PersistenceError.java @@ -0,0 +1,8 @@ +package persistence; + +public class PersistenceError extends RuntimeException { + + public PersistenceError(String message) { + super(message); + } +} diff --git a/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java b/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java index a6a3ee7..b73d787 100644 --- a/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java +++ b/1-Adapter/src/main/java/cli/link/LinkCliAdapter.java @@ -1,6 +1,7 @@ package cli.link; import category.CategoryName; +import link.LinkDto; import link.LinkUrl; import link.LinkUseCase; import user.Username; @@ -21,4 +22,8 @@ public class LinkCliAdapter { categoryNames.stream().map(CategoryName::new).collect(Collectors.toSet()), new Username(creator)); } + + public Set getLinks() { + return linkUseCase.getLinks().stream().map(LinkDto::toString).collect(Collectors.toSet()); + } } diff --git a/1-Adapter/src/main/java/persistence/category/CategoryEntity.java b/1-Adapter/src/main/java/persistence/category/CategoryEntity.java index 0abe8f2..e6e7f6c 100644 --- a/1-Adapter/src/main/java/persistence/category/CategoryEntity.java +++ b/1-Adapter/src/main/java/persistence/category/CategoryEntity.java @@ -22,7 +22,7 @@ public class CategoryEntity implements CSVSerializable { } public CategoryEntity(Category category) { - this(category.getName().toString(), category.getId().id()); + this(category.getName().getName(), category.getId().id()); } public Category toCategory() { @@ -36,7 +36,7 @@ public class CategoryEntity implements CSVSerializable { @Override public String toCSVString() { - return name + CSVSerializable.seperator + Integer.toString(id); + return name.toString() + CSVSerializable.seperator + Integer.toString(id); } @Override diff --git a/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java b/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java index 3aa4ea9..d3f1328 100644 --- a/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java +++ b/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java @@ -22,11 +22,11 @@ public class CSVLinkPersistenceAdapter implements PersistenceAdapter { @Override public void add(Link link) { - linkDAO.remove(new LinkEntity(link)); + linkDAO.add(new LinkEntity(link)); } @Override public void remove(Link link) { - linkDAO.add(new LinkEntity(link)); + linkDAO.remove(new LinkEntity(link)); } } diff --git a/1-Adapter/src/main/java/persistence/tag/TagEntity.java b/1-Adapter/src/main/java/persistence/tag/TagEntity.java index 5c4abc4..fea64f9 100644 --- a/1-Adapter/src/main/java/persistence/tag/TagEntity.java +++ b/1-Adapter/src/main/java/persistence/tag/TagEntity.java @@ -12,12 +12,6 @@ public class TagEntity { private final String name; private Optional additionalData = Optional.empty(); - public TagEntity(String name, Optional additionalData) { - this.name = name; - this.additionalData = additionalData; - } - - public TagEntity(String name, String additionalData) { this.name = name; this.additionalData = Optional.of(additionalData); diff --git a/1-Adapter/src/test/java/persistence/category/CategoryEntityTest.java b/1-Adapter/src/test/java/persistence/category/CategoryEntityTest.java new file mode 100644 index 0000000..7a59945 --- /dev/null +++ b/1-Adapter/src/test/java/persistence/category/CategoryEntityTest.java @@ -0,0 +1,16 @@ +package persistence.category; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CategoryEntityTest { + + @Test + void categoryConversionWorks() { + + var sut = new CategoryEntity("categoryName", 99); + + assertEquals(sut,new CategoryEntity(sut.toCategory())); + } +} diff --git a/2-Application/src/main/java/category/CategoryUseCase.java b/2-Application/src/main/java/category/CategoryUseCase.java index 36327ee..9fe7b00 100644 --- a/2-Application/src/main/java/category/CategoryUseCase.java +++ b/2-Application/src/main/java/category/CategoryUseCase.java @@ -7,7 +7,7 @@ public class CategoryUseCase { private final CategoryRepository categoryRepository; private final CategoryIdGenerator categoryIdGenerator; - CategoryUseCase(final CategoryRepository categoryRepository, final CategoryIdGenerator idGenerator) { + public CategoryUseCase(final CategoryRepository categoryRepository, final CategoryIdGenerator idGenerator) { this.categoryRepository = categoryRepository; this.categoryIdGenerator = idGenerator; } diff --git a/2-Application/src/main/java/link/LinkDto.java b/2-Application/src/main/java/link/LinkDto.java new file mode 100644 index 0000000..2662222 --- /dev/null +++ b/2-Application/src/main/java/link/LinkDto.java @@ -0,0 +1,11 @@ +package link; + +import category.Category; +import tag.Tag; +import user.Username; + +import java.util.Set; + +public record LinkDto(Username creator, LinkUrl url, Set categories, Set tags) { + +} diff --git a/2-Application/src/main/java/link/LinkUseCase.java b/2-Application/src/main/java/link/LinkUseCase.java index 88c1f77..01eae21 100644 --- a/2-Application/src/main/java/link/LinkUseCase.java +++ b/2-Application/src/main/java/link/LinkUseCase.java @@ -2,6 +2,7 @@ package link; import category.CategoryName; import category.CategoryRepository; +import exeptions.CategroyDoesNotExist; import exeptions.URLIsNotReachable; import tag.TaggingUseCase; import user.Username; @@ -43,4 +44,20 @@ public class LinkUseCase { linkRepository.add(link); } + public Set getLinks() { + return linkRepository + .getAll() + .stream() + .map(link -> new LinkDto(link.getCreator(), + link.getUrl(), + link + .getCategoryIds() + .stream() + .map(categoryRepository::getById) + .map(optional -> optional.orElseThrow(() -> new CategroyDoesNotExist( + "A Category for a certain id does not exits. You must create it first."))) + .collect(Collectors.toSet()), + link.getTags())) + .collect(Collectors.toSet()); + } } diff --git a/2-Application/src/main/java/tag/TaggingUseCase.java b/2-Application/src/main/java/tag/TaggingUseCase.java index 79634f1..eaa18d0 100644 --- a/2-Application/src/main/java/tag/TaggingUseCase.java +++ b/2-Application/src/main/java/tag/TaggingUseCase.java @@ -1,19 +1,21 @@ package tag; import link.LinkUrl; +import link.RandomLinkIdGenerator; +import java.util.HashSet; import java.util.Set; public class TaggingUseCase { TagMatcherRepository tagMatcherRepository; - public TaggingUseCase(TagMatcherRepository tagMatcherRepository) { + public TaggingUseCase(TagMatcherRepository tagMatcherRepository, RandomLinkIdGenerator randomLinkIdGenerator) { this.tagMatcherRepository = tagMatcherRepository; } public Set getTagsFor(LinkUrl url) { - Set result = Set.of(); + Set result = new HashSet<>(); tagMatcherRepository.getTagMatchers().forEach(tagMatcher -> tagMatcher.ifMatches(url).addTo(result)); return result; } diff --git a/3-Domain/src/main/java/category/Category.java b/3-Domain/src/main/java/category/Category.java index 0739a3a..ce6d5a2 100644 --- a/3-Domain/src/main/java/category/Category.java +++ b/3-Domain/src/main/java/category/Category.java @@ -19,6 +19,11 @@ public class Category { return name; } + @Override + public String toString() { + return name.toString(); + } + public CategoryId getId() { return id; } diff --git a/3-Domain/src/main/java/category/CategoryName.java b/3-Domain/src/main/java/category/CategoryName.java index f7c6b0d..27cc299 100644 --- a/3-Domain/src/main/java/category/CategoryName.java +++ b/3-Domain/src/main/java/category/CategoryName.java @@ -41,4 +41,9 @@ public class CategoryName { public int hashCode() { return name != null ? name.hashCode() : 0; } + + @Override + public String toString() { + return name; + } } diff --git a/3-Domain/src/main/java/link/Link.java b/3-Domain/src/main/java/link/Link.java index b5e8ff6..d7e4a28 100644 --- a/3-Domain/src/main/java/link/Link.java +++ b/3-Domain/src/main/java/link/Link.java @@ -53,6 +53,15 @@ public class Link { return url.equals(link.url); } + @Override + public String toString() { + return url + + " created by =" + creator + + ", categoryIds=" + categoryIds + + ", tags=" + tags + + '}'; + } + @Override public int hashCode() { int result = id.hashCode(); diff --git a/3-Domain/src/main/java/link/LinkRepository.java b/3-Domain/src/main/java/link/LinkRepository.java index 21feab0..abbe73b 100644 --- a/3-Domain/src/main/java/link/LinkRepository.java +++ b/3-Domain/src/main/java/link/LinkRepository.java @@ -7,13 +7,14 @@ import exeptions.LinkAlreadyExists; import exeptions.LinkDoesNotExist; import java.util.Optional; +import java.util.Set; public class LinkRepository { final private CustomSet links; public LinkRepository(PersistenceAdapter linkPersistenceAdapter) { - this.links = new CustomSetPersistenceDecorator(linkPersistenceAdapter); + this.links = new CustomSetPersistenceDecorator<>(linkPersistenceAdapter); } public Optional getById(LinkId id) { @@ -41,6 +42,10 @@ public class LinkRepository { links.add(link); } + public Set getAll() { + return links.getSet(); + } + private void remove(Link link) { links.remove(link); } diff --git a/3-Domain/src/main/java/tag/Tag.java b/3-Domain/src/main/java/tag/Tag.java index e345cbd..6ef9a32 100644 --- a/3-Domain/src/main/java/tag/Tag.java +++ b/3-Domain/src/main/java/tag/Tag.java @@ -5,7 +5,7 @@ import java.util.Optional; public class Tag { private TagName name; - private Optional additionalData; + private Optional additionalData = Optional.empty(); public Tag(TagName name) { this.name = name; @@ -21,6 +21,11 @@ public class Tag { this.additionalData = additionalData; } + @Override + public String toString() { + return "Tag: " + name + " " + additionalData.orElse(""); + } + public TagName getName() { return name; } diff --git a/3-Domain/src/main/java/tag/TagName.java b/3-Domain/src/main/java/tag/TagName.java index 95cbf4d..ebc92fd 100644 --- a/3-Domain/src/main/java/tag/TagName.java +++ b/3-Domain/src/main/java/tag/TagName.java @@ -9,4 +9,9 @@ public record TagName(String name) { throw new IllegalValueObjectArgument("A Tag name must be a valid non-empty string."); } } + + @Override + public String toString() { + return name; + } } diff --git a/3-Domain/src/main/java/user/Username.java b/3-Domain/src/main/java/user/Username.java index 27eb83c..a3fe578 100644 --- a/3-Domain/src/main/java/user/Username.java +++ b/3-Domain/src/main/java/user/Username.java @@ -9,4 +9,9 @@ public record Username(String username) { throw new IllegalValueObjectArgument("A username must be a valid non-empty string."); } } + + @Override + public String toString() { + return username; + } }