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);
}
}