From cfecc02cad61871bb25a6115de9710e63614e3ae Mon Sep 17 00:00:00 2001 From: Daniel Langbein Date: Sat, 7 Dec 2024 12:09:18 +0100 Subject: [PATCH 1/3] import news example b --- ueb07_news_example_b/src/client/Client.java | 31 ++++++++ ueb07_news_example_b/src/model/Article.java | 54 +++++++++++++ ueb07_news_example_b/src/model/Image.java | 79 +++++++++++++++++++ .../src/model/NewsCollection.java | 58 ++++++++++++++ ueb07_news_example_b/src/model/NewsItem.java | 32 ++++++++ 5 files changed, 254 insertions(+) create mode 100644 ueb07_news_example_b/src/client/Client.java create mode 100644 ueb07_news_example_b/src/model/Article.java create mode 100644 ueb07_news_example_b/src/model/Image.java create mode 100644 ueb07_news_example_b/src/model/NewsCollection.java create mode 100644 ueb07_news_example_b/src/model/NewsItem.java diff --git a/ueb07_news_example_b/src/client/Client.java b/ueb07_news_example_b/src/client/Client.java new file mode 100644 index 00000000..94f2afd4 --- /dev/null +++ b/ueb07_news_example_b/src/client/Client.java @@ -0,0 +1,31 @@ +package client; + +import model.Article; +import model.Image; +import model.NewsCollection; + +public class Client { + + public static void main(String[] args) { + NewsCollection masterCollection = new NewsCollection("Daily news"); + + Article changedArticle = new Article("Harder, Better, Faster, Stronger. Doping controls loosened","ups"); + + masterCollection.addItem(new NewsCollection("Sports") + .addItem(changedArticle) + .addItem(new Image("Athletic cat contest", 800, 600, "zdf"))) + .addItem(new NewsCollection("Local news") + .addItem(new Article("Missing Cat missed.", "mfg")) + .addItem(new Article("Corrupted local politician selling cats.", "ard")) + .addItem(new Image("Missing cat", 1280, 720, "anonymous"))); + + System.out.println("\n===List===\n"); + System.out.print(masterCollection.getOverviewInformation()); + System.out.println("\n===Contents===\n"); + System.out.print(masterCollection.getDetailedInformation()); + System.out.println("\n===After change===\n"); + + changedArticle.setTitle("Harder, Better, Faster, Stronger? Doping controls loosened"); + masterCollection.addItem(new Image("A tasty cat", 640, 480, "alf")); + } +} diff --git a/ueb07_news_example_b/src/model/Article.java b/ueb07_news_example_b/src/model/Article.java new file mode 100644 index 00000000..0d821a38 --- /dev/null +++ b/ueb07_news_example_b/src/model/Article.java @@ -0,0 +1,54 @@ +package model; + +public class Article extends NewsItem { + private String author; + private String content; + + // Fill in dummy content + { + content = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, " + + "sed diam nonumy eirmod tempor invidunt ut labore et dolore " + + "magna aliquyam erat, sed diam voluptua."; + } + + /** + * Creates an article with the given title and author. + * @param title + * @param author + */ + public Article(String title, String author) { + this.title = title; + this.author = author; + } + + /** + * Get the author of the article. + * @return author + */ + public String getAuthor() { + return author; + } + + /** + * Get the content of the article. + * @return + */ + public String getContent() { + return content; + } + + @Override + public String getOverviewInformation() { + return "Article: " + this.getTitle() + ", Author: " + this.getAuthor(); + } + + @Override + public String getDetailedInformation() { + StringBuilder builder = new StringBuilder(); + builder.append("###" + this.getTitle() + "###"); + builder.append("\n"); + builder.append(this.getContent()); + builder.append("\n"); + return builder.toString(); + } +} diff --git a/ueb07_news_example_b/src/model/Image.java b/ueb07_news_example_b/src/model/Image.java new file mode 100644 index 00000000..00307bad --- /dev/null +++ b/ueb07_news_example_b/src/model/Image.java @@ -0,0 +1,79 @@ +package model; + +public class Image extends NewsItem { + private String author; + private int width; + private int height; + + /** + * Creates an image with the given title and author and a resolution + * defined by width and height. + * @param title + * @param width + * @param height + * @param author + */ + public Image(String title, int width, int height, String author) { + this.title = title; + this.width = width; + this.height = height; + this.author = author; + } + + /** + * Get the author of the image. + * @return author + */ + public String getAuthor() { + return author; + } + + /** + * Get the width of the image. + * @return width + */ + public int getWidth() { + return width; + } + + /** + * Get the height of the image. + * @return height + */ + public int getHeight() { + return height; + } + + /** + * Renders the image as String and return the rendered image. + * @return String representing the rendered image + */ + public String renderToString() { + /* + * Dummy implementation + */ + return " /\\_/\\ \n( o.o )\n > ^ < "; + } + + /** + * Print a list showing information about all directly or transitively + * referenced items in the given collection. + */ + @Override + public String getOverviewInformation() { + return "Image: " + this.getTitle() + + ", Resolution: " + this.getWidth() + + "x" + this.getHeight() + + ", Author: " + this.getAuthor(); + } + + @Override + public String getDetailedInformation() { + StringBuilder builder = new StringBuilder(); + builder.append("###" + this.getTitle() + "###"); + builder.append("\n"); + builder.append(renderToString()); + builder.append("\n"); + return builder.toString(); + } +} diff --git a/ueb07_news_example_b/src/model/NewsCollection.java b/ueb07_news_example_b/src/model/NewsCollection.java new file mode 100644 index 00000000..eab02042 --- /dev/null +++ b/ueb07_news_example_b/src/model/NewsCollection.java @@ -0,0 +1,58 @@ +package model; + +import java.util.LinkedList; +import java.util.List; + +public class NewsCollection extends NewsItem { + + private List newsItems = new LinkedList(); + + public NewsCollection(String topic) { + this.title = topic; + } + + /** + * Get the list of items stored in this collection. + * @return items stored in this collection + */ + public List getNewsItems() { + return newsItems; + } + + /** + * Store another item to this collection. + * @param item + * @return this collection (enables method chaining) + */ + public NewsCollection addItem(NewsItem item) { + newsItems.add(item); + return this; + } + + /** + * Print a list showing information about all directly or transitively + * referenced items in the given collection. + */ + public String getOverviewInformation() { + StringBuilder builder = new StringBuilder(); + builder.append("###" + this.getTitle() + "###"); + builder.append("\n"); + for (NewsItem item : this.getNewsItems()) { + builder.append(item.getOverviewInformation()); + builder.append("\n"); + } + return builder.toString(); + } + + @Override + public String getDetailedInformation() { + StringBuilder builder = new StringBuilder(); + builder.append("###" + this.getTitle() + "###"); + builder.append("\n"); + for (NewsItem item : this.getNewsItems()) { + builder.append(item.getDetailedInformation()); + builder.append("\n"); + } + return builder.toString(); + } +} diff --git a/ueb07_news_example_b/src/model/NewsItem.java b/ueb07_news_example_b/src/model/NewsItem.java new file mode 100644 index 00000000..e7b7a86a --- /dev/null +++ b/ueb07_news_example_b/src/model/NewsItem.java @@ -0,0 +1,32 @@ +package model; + +public abstract class NewsItem { + + protected String title; + + public NewsItem() { + super(); + } + + /** + * Get the topic of the collection. + * @return + */ + public String getTitle() { + return title; + } + + public void setTitle(String newTitle) { + title = newTitle; + } + + /** + * Get overview information about the news item. + */ + public abstract String getOverviewInformation(); + + /** + * Get the contents of the news item. + */ + public abstract String getDetailedInformation(); +} \ No newline at end of file From 49a4e61738f8fbef971e680556b1ad22105aa4a6 Mon Sep 17 00:00:00 2001 From: Daniel Langbein Date: Sat, 7 Dec 2024 12:02:24 +0100 Subject: [PATCH 2/3] .idea --- ueb07_news_example/.gitignore | 1 + ueb07_news_example/.idea/.gitignore | 8 ++++++++ ueb07_news_example/.idea/misc.xml | 6 ++++++ ueb07_news_example/.idea/modules.xml | 8 ++++++++ ueb07_news_example/.idea/vcs.xml | 6 ++++++ ueb07_news_example/ueb07_news_example.iml | 11 +++++++++++ 6 files changed, 40 insertions(+) create mode 100644 ueb07_news_example/.gitignore create mode 100644 ueb07_news_example/.idea/.gitignore create mode 100644 ueb07_news_example/.idea/misc.xml create mode 100644 ueb07_news_example/.idea/modules.xml create mode 100644 ueb07_news_example/.idea/vcs.xml create mode 100644 ueb07_news_example/ueb07_news_example.iml diff --git a/ueb07_news_example/.gitignore b/ueb07_news_example/.gitignore new file mode 100644 index 00000000..6a3417b8 --- /dev/null +++ b/ueb07_news_example/.gitignore @@ -0,0 +1 @@ +/out/ diff --git a/ueb07_news_example/.idea/.gitignore b/ueb07_news_example/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/ueb07_news_example/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/ueb07_news_example/.idea/misc.xml b/ueb07_news_example/.idea/misc.xml new file mode 100644 index 00000000..a6e1098c --- /dev/null +++ b/ueb07_news_example/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ueb07_news_example/.idea/modules.xml b/ueb07_news_example/.idea/modules.xml new file mode 100644 index 00000000..86099071 --- /dev/null +++ b/ueb07_news_example/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ueb07_news_example/.idea/vcs.xml b/ueb07_news_example/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/ueb07_news_example/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ueb07_news_example/ueb07_news_example.iml b/ueb07_news_example/ueb07_news_example.iml new file mode 100644 index 00000000..c90834f2 --- /dev/null +++ b/ueb07_news_example/ueb07_news_example.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file From b1b8db80658bdb47876273d812171a5c28e5b05b Mon Sep 17 00:00:00 2001 From: Daniel Langbein Date: Sat, 7 Dec 2024 12:04:43 +0100 Subject: [PATCH 3/3] ueb07 a) --- ueb07_news_example/src/client/Client.java | 12 +++-- ueb07_news_example/src/model/Article.java | 22 +++----- .../src/model/DetailedPrinter.java | 50 ++++++++++++++++++ ueb07_news_example/src/model/Image.java | 27 ++-------- .../src/model/NewsCollection.java | 34 +++--------- ueb07_news_example/src/model/NewsItem.java | 12 +---- .../src/model/NewsItemVisitor.java | 7 +++ .../src/model/OverviewPrinter.java | 52 +++++++++++++++++++ 8 files changed, 135 insertions(+), 81 deletions(-) create mode 100644 ueb07_news_example/src/model/DetailedPrinter.java create mode 100644 ueb07_news_example/src/model/NewsItemVisitor.java create mode 100644 ueb07_news_example/src/model/OverviewPrinter.java diff --git a/ueb07_news_example/src/client/Client.java b/ueb07_news_example/src/client/Client.java index 94f2afd4..a5eaafc6 100644 --- a/ueb07_news_example/src/client/Client.java +++ b/ueb07_news_example/src/client/Client.java @@ -1,8 +1,6 @@ package client; -import model.Article; -import model.Image; -import model.NewsCollection; +import model.*; public class Client { @@ -20,9 +18,13 @@ public class Client { .addItem(new Image("Missing cat", 1280, 720, "anonymous"))); System.out.println("\n===List===\n"); - System.out.print(masterCollection.getOverviewInformation()); + StringBuilder sb = new StringBuilder(); + masterCollection.accept(new OverviewPrinter(sb)); + System.out.print(sb); System.out.println("\n===Contents===\n"); - System.out.print(masterCollection.getDetailedInformation()); + sb = new StringBuilder(); + masterCollection.accept(new DetailedPrinter(sb)); + System.out.print(sb); System.out.println("\n===After change===\n"); changedArticle.setTitle("Harder, Better, Faster, Stronger? Doping controls loosened"); diff --git a/ueb07_news_example/src/model/Article.java b/ueb07_news_example/src/model/Article.java index 0d821a38..faa5a65f 100644 --- a/ueb07_news_example/src/model/Article.java +++ b/ueb07_news_example/src/model/Article.java @@ -20,7 +20,12 @@ public class Article extends NewsItem { this.title = title; this.author = author; } - + + @Override + public void accept(NewsItemVisitor visitor) { + visitor.visit(this); + } + /** * Get the author of the article. * @return author @@ -36,19 +41,4 @@ public class Article extends NewsItem { public String getContent() { return content; } - - @Override - public String getOverviewInformation() { - return "Article: " + this.getTitle() + ", Author: " + this.getAuthor(); - } - - @Override - public String getDetailedInformation() { - StringBuilder builder = new StringBuilder(); - builder.append("###" + this.getTitle() + "###"); - builder.append("\n"); - builder.append(this.getContent()); - builder.append("\n"); - return builder.toString(); - } } diff --git a/ueb07_news_example/src/model/DetailedPrinter.java b/ueb07_news_example/src/model/DetailedPrinter.java new file mode 100644 index 00000000..9976ceb6 --- /dev/null +++ b/ueb07_news_example/src/model/DetailedPrinter.java @@ -0,0 +1,50 @@ +package model; + +public class DetailedPrinter implements NewsItemVisitor { + StringBuilder sb; + + public DetailedPrinter(StringBuilder sb) { + this.sb = sb; + } + + /** + * Print details about news article. + */ + @Override + public void visit(final Article article) { + sb.append("###") + .append(article.getTitle()) + .append("###"); + sb.append("\n"); + sb.append(article.getContent()); + sb.append("\n"); + } + + /** + * Print details about image. + */ + @Override + public void visit(final Image image) { + sb.append("###") + .append(image.getTitle()) + .append("###"); + sb.append("\n"); + sb.append(image.renderToString()); + sb.append("\n"); + } + + /** + * Print details about news collection. + */ + @Override + public void visit(final NewsCollection collection) { + sb.append("###") + .append(collection.getTitle()) + .append("###"); + sb.append("\n"); + for (NewsItem item : collection.getNewsItems()) { + item.accept(this); + sb.append("\n"); + } + } +} diff --git a/ueb07_news_example/src/model/Image.java b/ueb07_news_example/src/model/Image.java index 00307bad..b4fc4c2c 100644 --- a/ueb07_news_example/src/model/Image.java +++ b/ueb07_news_example/src/model/Image.java @@ -19,6 +19,11 @@ public class Image extends NewsItem { this.height = height; this.author = author; } + + @Override + public void accept(NewsItemVisitor visitor) { + visitor.visit(this); + } /** * Get the author of the image. @@ -54,26 +59,4 @@ public class Image extends NewsItem { */ return " /\\_/\\ \n( o.o )\n > ^ < "; } - - /** - * Print a list showing information about all directly or transitively - * referenced items in the given collection. - */ - @Override - public String getOverviewInformation() { - return "Image: " + this.getTitle() - + ", Resolution: " + this.getWidth() - + "x" + this.getHeight() - + ", Author: " + this.getAuthor(); - } - - @Override - public String getDetailedInformation() { - StringBuilder builder = new StringBuilder(); - builder.append("###" + this.getTitle() + "###"); - builder.append("\n"); - builder.append(renderToString()); - builder.append("\n"); - return builder.toString(); - } } diff --git a/ueb07_news_example/src/model/NewsCollection.java b/ueb07_news_example/src/model/NewsCollection.java index eab02042..d74e2900 100644 --- a/ueb07_news_example/src/model/NewsCollection.java +++ b/ueb07_news_example/src/model/NewsCollection.java @@ -10,7 +10,12 @@ public class NewsCollection extends NewsItem { public NewsCollection(String topic) { this.title = topic; } - + + @Override + public void accept(NewsItemVisitor visitor) { + visitor.visit(this); + } + /** * Get the list of items stored in this collection. * @return items stored in this collection @@ -28,31 +33,4 @@ public class NewsCollection extends NewsItem { newsItems.add(item); return this; } - - /** - * Print a list showing information about all directly or transitively - * referenced items in the given collection. - */ - public String getOverviewInformation() { - StringBuilder builder = new StringBuilder(); - builder.append("###" + this.getTitle() + "###"); - builder.append("\n"); - for (NewsItem item : this.getNewsItems()) { - builder.append(item.getOverviewInformation()); - builder.append("\n"); - } - return builder.toString(); - } - - @Override - public String getDetailedInformation() { - StringBuilder builder = new StringBuilder(); - builder.append("###" + this.getTitle() + "###"); - builder.append("\n"); - for (NewsItem item : this.getNewsItems()) { - builder.append(item.getDetailedInformation()); - builder.append("\n"); - } - return builder.toString(); - } } diff --git a/ueb07_news_example/src/model/NewsItem.java b/ueb07_news_example/src/model/NewsItem.java index e7b7a86a..66e55c1b 100644 --- a/ueb07_news_example/src/model/NewsItem.java +++ b/ueb07_news_example/src/model/NewsItem.java @@ -8,6 +8,8 @@ public abstract class NewsItem { super(); } + public abstract void accept(NewsItemVisitor visitor); + /** * Get the topic of the collection. * @return @@ -19,14 +21,4 @@ public abstract class NewsItem { public void setTitle(String newTitle) { title = newTitle; } - - /** - * Get overview information about the news item. - */ - public abstract String getOverviewInformation(); - - /** - * Get the contents of the news item. - */ - public abstract String getDetailedInformation(); } \ No newline at end of file diff --git a/ueb07_news_example/src/model/NewsItemVisitor.java b/ueb07_news_example/src/model/NewsItemVisitor.java new file mode 100644 index 00000000..795c5dda --- /dev/null +++ b/ueb07_news_example/src/model/NewsItemVisitor.java @@ -0,0 +1,7 @@ +package model; + +public interface NewsItemVisitor { + void visit(final Article article); + void visit(final Image image); + void visit(final NewsCollection collection); +} diff --git a/ueb07_news_example/src/model/OverviewPrinter.java b/ueb07_news_example/src/model/OverviewPrinter.java new file mode 100644 index 00000000..0bed39cc --- /dev/null +++ b/ueb07_news_example/src/model/OverviewPrinter.java @@ -0,0 +1,52 @@ +package model; + +public class OverviewPrinter implements NewsItemVisitor { + final StringBuilder sb; + + /** + * @param sb StringBuilder to print overview into. + */ + public OverviewPrinter(StringBuilder sb) { + this.sb = sb; + } + + /** + * Print overview about news article. + */ + @Override + public void visit(final Article article) { + sb.append("Article: ") + .append(article.getTitle()) + .append(", Author: ") + .append(article.getAuthor()); + } + + /** + * Print overview about image. + */ + @Override + public void visit(final Image image) { + sb.append("Image: ") + .append(image.getTitle()) + .append(", Resolution: ") + .append(image.getWidth()) + .append("x") + .append(image.getHeight()) + .append(", Author: ") + .append(image.getAuthor()); + } + + /** + * Print overview about news collection. + */ + @Override + public void visit(final NewsCollection collection) { + sb.append("###") + .append(collection.getTitle()) + .append("###\n"); + for (NewsItem item : collection.getNewsItems()) { + item.accept(this); + sb.append("\n"); + } + } +}