diff --git a/build.gradle b/build.gradle index de962db55c356a9bc2a541b01ca3cf8f500408ac..1234c51ddf3043c5066dddfa0e4c084dc4708a76 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ dependencies { testImplementation 'org.hamcrest:hamcrest-library:1.3' } -mainClassName = "state.App" +mainClassName = "serializer.App" test { diff --git a/src/main/java/serializer/CircleSerializer.java b/src/main/java/serializer/CircleSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..f5076969081b9e294ea90ff04ac9dd787fbc8d37 --- /dev/null +++ b/src/main/java/serializer/CircleSerializer.java @@ -0,0 +1,24 @@ +package serializer; + +import shape.Circle; + +public class CircleSerializer implements ShapeSerializer<Circle> { + @Override + public String code() { + return "Circle"; + } + + @Override + public String serialize(Circle shape) { + return String.format("%f %f %f", shape.getX(), shape.getY(), shape.getRadius()); + } + + @Override + public Circle unserialize(String s) { + String[] split = s.split(" "); + double x = Double.parseDouble(split[0]); + double y = Double.parseDouble(split[1]); + double radius = Double.parseDouble(split[2]); + return new Circle(x, y, radius); + } +} diff --git a/src/main/java/serializer/RectangleSerializer.java b/src/main/java/serializer/RectangleSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..de8c663256f0749c17a8aa520ab6334af04c0222 --- /dev/null +++ b/src/main/java/serializer/RectangleSerializer.java @@ -0,0 +1,25 @@ +package serializer; + +import shape.Rectangle; + +public class RectangleSerializer implements ShapeSerializer<Rectangle> { + @Override + public String code() { + return "Rectangle"; + } + + @Override + public String serialize(Rectangle shape) { + return String.format("%f %f %f %f", shape.getX(), shape.getY(), shape.getWidth(), shape.getHeight()); + } + + @Override + public Rectangle unserialize(String s) { + String[] split = s.split(" "); + double x = Double.parseDouble(split[0]); + double y = Double.parseDouble(split[1]); + double width = Double.parseDouble(split[2]); + double height = Double.parseDouble(split[3]); + return new Rectangle(x, y, width, height); + } +} diff --git a/src/main/java/serializer/ShapeReader.java b/src/main/java/serializer/ShapeReader.java index 54540cca74b29246f5f44d2344925d4792a3e4a0..d01759ccaa43c5cdf1d0cc6785851f2597260499 100644 --- a/src/main/java/serializer/ShapeReader.java +++ b/src/main/java/serializer/ShapeReader.java @@ -1,19 +1,40 @@ package serializer; +import shape.Circle; import shape.Shape; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class ShapeReader { + + private static final Map<String, ShapeSerializer<?>> serializers = new HashMap<>(); + + static { + serializers.put("circle", new CircleSerializer()); + serializers.put("rectangle", new RectangleSerializer()); + } public static List<Shape> read(File file) throws IOException { - BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); - /*for(String line : bufferedReader.lines().toList()) { - System.out.println(line); - }*/ - return null; + List<Shape> shapes = new ArrayList<>(); + try(BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) { + String line ; + while ((line = bufferedReader.readLine()) != null) { + String[] parts = line.split(" ",2); + String code = parts[0]; + String data = parts[1]; + ShapeSerializer<?> serializer = serializers.get(code); + if (serializer != null) { + Shape shape = serializer.unserialize(data); + shapes.add(shape); + } + } + return shapes; + } } } diff --git a/src/main/java/serializer/ShapeSerializer.java b/src/main/java/serializer/ShapeSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..fe6fc76f9990b777dc87b5fbac6e43895cdd1dae --- /dev/null +++ b/src/main/java/serializer/ShapeSerializer.java @@ -0,0 +1,9 @@ +package serializer; + +import shape.Shape; + +public interface ShapeSerializer<S extends Shape> { + String code(); + String serialize(S shape); + S unserialize(String s); +} diff --git a/src/main/java/serializer/ShapeVisitor.java b/src/main/java/serializer/ShapeVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..c5266b5736f3f221899ea46f0bea596cbaeded4a --- /dev/null +++ b/src/main/java/serializer/ShapeVisitor.java @@ -0,0 +1,10 @@ +package serializer; + +import shape.Circle; +import shape.Rectangle; + + +public interface ShapeVisitor { + void visit(Circle circle); + void visit(Rectangle rectangle); +} diff --git a/src/main/java/serializer/ShapeWriter.java b/src/main/java/serializer/ShapeWriter.java index 6a76ef8f7616a2a5ec8e21e533b3b09060e6d2c3..b5c4856dea8284cb0f0fbcdb62f36ad3b09b1dcd 100644 --- a/src/main/java/serializer/ShapeWriter.java +++ b/src/main/java/serializer/ShapeWriter.java @@ -1,5 +1,7 @@ package serializer; +import shape.Circle; +import shape.Rectangle; import shape.Shape; import java.io.File; @@ -7,9 +9,31 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.List; -public class ShapeWriter { +public class ShapeWriter implements ShapeVisitor { + + private PrintWriter printWriter; + + public ShapeWriter(PrintWriter printWriter) { + this.printWriter = printWriter; + } + public static void write (File file, List<Shape> shapes) throws IOException { - PrintWriter printWriter = new PrintWriter(file); - printWriter.println("Coucou"); + try(PrintWriter printWriter = new PrintWriter(file)){ + ShapeWriter shapeWriter = new ShapeWriter(printWriter); + + for (Shape shape : shapes) { + shape.accept(shapeWriter); + } + } + } + + @Override + public void visit(Circle circle) { + printWriter.printf("Circle %f %f %f%n", circle.getX(), circle.getY(), circle.getRadius()); + } + + @Override + public void visit(Rectangle rectangle) { + printWriter.printf("Rectangle %f %f %f %f%n", rectangle.getX(), rectangle.getY(), rectangle.getWidth() ,rectangle.getHeight()); } } diff --git a/src/main/java/shape/Circle.java b/src/main/java/shape/Circle.java index e543fbeda13c5e9c7671717d1c4ef4330381b395..d5b8ec6d2664625c0ee2b4ab35248bc069fe8440 100644 --- a/src/main/java/shape/Circle.java +++ b/src/main/java/shape/Circle.java @@ -2,6 +2,7 @@ package shape; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; +import serializer.ShapeVisitor; public class Circle implements Shape { @@ -45,6 +46,11 @@ public class Circle implements Shape { return isFinished; } + @Override + public void accept(ShapeVisitor visitor) { + visitor.visit(this); + } + public void setX(double x) { this.x = x; } @@ -75,4 +81,7 @@ public class Circle implements Shape { this.radius = width/2; } + public double getRadius() { + return radius; + } } diff --git a/src/main/java/shape/Rectangle.java b/src/main/java/shape/Rectangle.java index 97ac3810301cdc5efcd0a5fe20bccbaa0a663bed..eec807712ab82e97f192f3608cdcecff6c331102 100644 --- a/src/main/java/shape/Rectangle.java +++ b/src/main/java/shape/Rectangle.java @@ -3,6 +3,7 @@ package shape; import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; +import serializer.ShapeVisitor; public class Rectangle implements Shape{ @@ -47,6 +48,11 @@ public class Rectangle implements Shape{ return isFinished; } + @Override + public void accept(ShapeVisitor visitor) { + visitor.visit(this); + } + public void updateSize(double newX, double newY) { this.width = Math.abs(newX - this.x); @@ -85,4 +91,12 @@ public class Rectangle implements Shape{ if(width < 0 ){ this.x += width;} if(height < 0){ this.y += height;} } + + public double getWidth() { + return width; + } + + public double getHeight() { + return height; + } } diff --git a/src/main/java/shape/Shape.java b/src/main/java/shape/Shape.java index 98f44a7342664012421c4c93d0cf5e461202623a..6b0bdb29815a9104d65532cb9dd22c476b13f64d 100644 --- a/src/main/java/shape/Shape.java +++ b/src/main/java/shape/Shape.java @@ -3,10 +3,12 @@ package shape; import javafx.geometry.Point2D; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; +import serializer.ShapeVisitor; public interface Shape { void paint(GraphicsContext graphicsContext); boolean contains(double x, double y); void translate(double dx, double dy); boolean isFinished(); + void accept(ShapeVisitor visitor); }