diff --git a/1-Adapter/src/main/java/persistence/csv/CSVSerializable.java b/1-Adapter/src/main/java/persistence/csv/CSVSerializable.java index 48e2020..da4c549 100644 --- a/1-Adapter/src/main/java/persistence/csv/CSVSerializable.java +++ b/1-Adapter/src/main/java/persistence/csv/CSVSerializable.java @@ -3,8 +3,11 @@ package persistence.csv; public interface CSVSerializable { static String seperator = ","; + static String listSeperator = "-"; + static String memberSeperator = "#"; String[] getHeaders(); String toCSVString(); + } diff --git a/1-Adapter/src/main/java/persistence/errors/PersistenceError.java b/1-Adapter/src/main/java/persistence/errors/PersistenceError.java new file mode 100644 index 0000000..91678ee --- /dev/null +++ b/1-Adapter/src/main/java/persistence/errors/PersistenceError.java @@ -0,0 +1,5 @@ +package persistence.errors; + +public class PersistenceError extends RuntimeException { + +} diff --git a/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java b/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java new file mode 100644 index 0000000..f513321 --- /dev/null +++ b/1-Adapter/src/main/java/persistence/link/CSVLinkPersistenceAdapter.java @@ -0,0 +1,32 @@ +package persistence.link; + +import abstraction.PersistenceAdapter; +import link.Link; +import persistence.GenericDAO; + +import java.util.Set; +import java.util.stream.Collectors; + +public class CSVLinkPersistenceAdapter implements PersistenceAdapter { + + private final GenericDAO linkDAO; + + public CSVLinkPersistenceAdapter(GenericDAO linkDAO) { + this.linkDAO = linkDAO; + } + + @Override + public Set getAll() { + return linkDAO.getALl().stream().map(LinkEntity::toLink).collect(Collectors.toSet()); + } + + @Override + public void add(Link value) { + + } + + @Override + public void remove(Link value) { + + } +} diff --git a/1-Adapter/src/main/java/persistence/link/LinkEntity.java b/1-Adapter/src/main/java/persistence/link/LinkEntity.java new file mode 100644 index 0000000..b5fd5be --- /dev/null +++ b/1-Adapter/src/main/java/persistence/link/LinkEntity.java @@ -0,0 +1,103 @@ +package persistence.link; + +import category.CategoryId; +import link.Link; +import link.LinkId; +import link.LinkUrl; +import persistence.csv.CSVSerializable; +import persistence.tag.TagEntity; +import user.Username; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class LinkEntity implements CSVSerializable { + + private final Integer id; + private final String creator; + private final String url; + private final Set categoryIds; + private final Set tags; + + public LinkEntity(Integer id, String creator, String url, Set categoryIds, Set tags) { + this.id = id; + this.creator = creator; + this.url = url; + this.categoryIds = categoryIds; + this.tags = tags; + } + + public LinkEntity(String[] fields) { + this.id = Integer.parseInt(fields[0]); + this.creator = fields[1]; + this.url = fields[2]; + this.categoryIds = + (Arrays.stream(fields[3].split(CSVSerializable.listSeperator)).map(Integer::parseInt)).collect( + Collectors.toSet()); + + this.tags = (Arrays + .stream(fields[4].split(CSVSerializable.listSeperator)) + .map(TagEntity::new)).collect(Collectors.toSet()); + } + + public LinkEntity(Link link) { + this.id = link.getId().id(); + this.creator = link.getCreator().username(); + this.url = link.getUrl().toString(); + this.categoryIds = link.getCategoryIds().stream().map(CategoryId::id).collect(Collectors.toSet()); + this.tags = link.getTags().stream().map(TagEntity::new).collect(Collectors.toSet()); + } + + public Link toLink() { + return new Link(new LinkId(id), + new Username(creator), + new LinkUrl(url), + categoryIds.stream().map(CategoryId::new).collect(Collectors.toSet()), + tags.stream().map(TagEntity::toTag).collect(Collectors.toSet())); + } + + @Override + public String[] getHeaders() { + return new String[]{"id", "creator", "url", "categoryIds", "tagIds"}; + } + + @Override + public String toCSVString() { + return Integer.toString(id) + CSVSerializable.seperator + creator + CSVSerializable.seperator + url + CSVSerializable.seperator + String.join( + CSVSerializable.listSeperator, + categoryIds + .stream() + .map(Object::toString) + .collect(Collectors.toSet())) + CSVSerializable.seperator + String.join(CSVSerializable.listSeperator, + tags + .stream() + .map(TagEntity::toCSVString) + .collect( + Collectors.toSet())); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LinkEntity that = (LinkEntity) o; + + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (creator != null ? !creator.equals(that.creator) : that.creator != null) return false; + if (url != null ? !url.equals(that.url) : that.url != null) return false; + if (categoryIds != null ? !categoryIds.equals(that.categoryIds) : that.categoryIds != null) return false; + return tags != null ? tags.equals(that.tags) : that.tags == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (creator != null ? creator.hashCode() : 0); + result = 31 * result + (url != null ? url.hashCode() : 0); + result = 31 * result + (categoryIds != null ? categoryIds.hashCode() : 0); + result = 31 * result + (tags != null ? tags.hashCode() : 0); + return result; + } +} diff --git a/1-Adapter/src/main/java/persistence/tag/TagEntity.java b/1-Adapter/src/main/java/persistence/tag/TagEntity.java new file mode 100644 index 0000000..5c4abc4 --- /dev/null +++ b/1-Adapter/src/main/java/persistence/tag/TagEntity.java @@ -0,0 +1,73 @@ +package persistence.tag; + +import persistence.csv.CSVSerializable; +import persistence.errors.PersistenceError; +import tag.Tag; +import tag.TagName; + +import java.util.Optional; + +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); + } + + public TagEntity(String csvString) { + var splittedString = csvString.split(CSVSerializable.memberSeperator); + + if (splittedString.length == 0 || splittedString.length > 2) { + throw new PersistenceError(); + } + + this.name = splittedString[0]; + + if (splittedString.length == 2) { + this.additionalData = Optional.of(splittedString[1]); + } + } + + public TagEntity(Tag tag) { + this.name = tag.getName().name(); + this.additionalData = tag.getAdditionalData(); + + } + + public String toCSVString() { + return name + CSVSerializable.memberSeperator + additionalData.orElse(""); + } + + public Tag toTag(){ + return new Tag(new TagName(name),additionalData); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TagEntity tagEntity = (TagEntity) o; + + if (name != null ? !name.equals(tagEntity.name) : tagEntity.name != null) return false; + return additionalData != null + ? additionalData.equals(tagEntity.additionalData) + : tagEntity.additionalData == null; + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (additionalData != null ? additionalData.hashCode() : 0); + return result; + } +} diff --git a/1-Adapter/src/test/java/persistence/link/LinkEntityTest.java b/1-Adapter/src/test/java/persistence/link/LinkEntityTest.java new file mode 100644 index 0000000..ff6d4d6 --- /dev/null +++ b/1-Adapter/src/test/java/persistence/link/LinkEntityTest.java @@ -0,0 +1,45 @@ +package persistence.link; + +import org.junit.jupiter.api.Test; +import persistence.csv.CSVSerializable; +import persistence.tag.TagEntity; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class LinkEntityTest { + + @Test + void toCSVString() { + + var expected = + "21" + CSVSerializable.seperator + "hans" + CSVSerializable.seperator + "https://tea.filefighter.de" + + CSVSerializable.seperator + "1" + CSVSerializable.listSeperator + "2" + + CSVSerializable.listSeperator + "3" + CSVSerializable.seperator + "name" + CSVSerializable.memberSeperator + "hallo"; + + TagEntity tagEntity = new TagEntity("name", "hallo"); + Set categoryIds = Set.of(1, 2, 3); + Set tags = Set.of(tagEntity); + var actual = new LinkEntity(21, "hans", "https://tea.filefighter.de", categoryIds, tags).toCSVString(); + + assertEquals(expected, actual); + + } + + @Test + void fromCSVString() { + + var input = + "21" + CSVSerializable.seperator + "hans" + CSVSerializable.seperator + "https://tea.filefighter.de" + + CSVSerializable.seperator + "1" + CSVSerializable.listSeperator + "2" + + CSVSerializable.listSeperator + "3" + CSVSerializable.seperator + "name" + CSVSerializable.memberSeperator + "hallo"; + + TagEntity tagEntity = new TagEntity("name", "hallo"); + Set categoryIds = Set.of(1, 2, 3); + Set tags = Set.of(tagEntity); + var expected = new LinkEntity(21, "hans", "https://tea.filefighter.de", categoryIds, tags); + + assertEquals(expected, new LinkEntity(input.split(CSVSerializable.seperator))); + } +} diff --git a/3-Domain/src/main/java/tag/Tag.java b/3-Domain/src/main/java/tag/Tag.java index 8e6ac83..e345cbd 100644 --- a/3-Domain/src/main/java/tag/Tag.java +++ b/3-Domain/src/main/java/tag/Tag.java @@ -11,12 +11,25 @@ public class Tag { this.name = name; } + public Tag(TagName name, String additionalData) { + this.name = name; + this.additionalData = Optional.ofNullable(additionalData); + } + public Tag(TagName name, Optional additionalData) { this.name = name; this.additionalData = additionalData; } + public TagName getName() { + return name; + } + + public Optional getAdditionalData() { + return additionalData; + } + public Tag addAdditionalData(String additionalData) { - return new Tag(this.name, Optional.of(additionalData)); + return new Tag(this.name, additionalData); } }