From 0784c6fd276be450d7a66c2a189480c49ebd2676 Mon Sep 17 00:00:00 2001
From: m19023837 <chadi.mansour@etu.univ-amu.fr>
Date: Fri, 18 Oct 2024 11:24:27 +0200
Subject: [PATCH] added all classes and is working correctly

---
 build.gradle                                  |  2 +-
 .../java/serializer/CircleSerializer.java     | 24 ++++++++++++++
 .../java/serializer/RectangleSerializer.java  | 25 +++++++++++++++
 src/main/java/serializer/ShapeReader.java     | 31 ++++++++++++++++---
 src/main/java/serializer/ShapeSerializer.java |  9 ++++++
 src/main/java/serializer/ShapeVisitor.java    | 10 ++++++
 src/main/java/serializer/ShapeWriter.java     | 30 ++++++++++++++++--
 src/main/java/shape/Circle.java               |  9 ++++++
 src/main/java/shape/Rectangle.java            | 14 +++++++++
 src/main/java/shape/Shape.java                |  2 ++
 10 files changed, 147 insertions(+), 9 deletions(-)
 create mode 100644 src/main/java/serializer/CircleSerializer.java
 create mode 100644 src/main/java/serializer/RectangleSerializer.java
 create mode 100644 src/main/java/serializer/ShapeSerializer.java
 create mode 100644 src/main/java/serializer/ShapeVisitor.java

diff --git a/build.gradle b/build.gradle
index de962db..1234c51 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 0000000..f507696
--- /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 0000000..de8c663
--- /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 54540cc..d01759c 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 0000000..fe6fc76
--- /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 0000000..c5266b5
--- /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 6a76ef8..b5c4856 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 e543fbe..d5b8ec6 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 97ac381..eec8077 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 98f44a7..6b0bdb2 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);
 }
-- 
GitLab