Mega Code Archive

 
Categories / Java / Development Class
 

Saving and restoring the state of a pretend CAD system

// : c12:CADState.java // Saving and restoring the state of a pretend CAD system. // {Clean: CADState.out} //package c12; // From 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002 // www.BruceEckel.com. See copyright notice in CopyRight.txt. import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Random; abstract class Shape implements Serializable {   public static final int RED = 1, BLUE = 2, GREEN = 3;   private int xPos, yPos, dimension;   private static Random r = new Random();   private static int counter = 0;   public abstract void setColor(int newColor);   public abstract int getColor();   public Shape(int xVal, int yVal, int dim) {     xPos = xVal;     yPos = yVal;     dimension = dim;   }   public String toString() {     return getClass() + "color[" + getColor() + "] xPos[" + xPos         + "] yPos[" + yPos + "] dim[" + dimension + "]\n";   }   public static Shape randomFactory() {     int xVal = r.nextInt(100);     int yVal = r.nextInt(100);     int dim = r.nextInt(100);     switch (counter++ % 3) {     default:     case 0:       return new Circle(xVal, yVal, dim);     case 1:       return new Square(xVal, yVal, dim);     case 2:       return new Line(xVal, yVal, dim);     }   } } class Circle extends Shape {   private static int color = RED;   public Circle(int xVal, int yVal, int dim) {     super(xVal, yVal, dim);   }   public void setColor(int newColor) {     color = newColor;   }   public int getColor() {     return color;   } } class Square extends Shape {   private static int color;   public Square(int xVal, int yVal, int dim) {     super(xVal, yVal, dim);     color = RED;   }   public void setColor(int newColor) {     color = newColor;   }   public int getColor() {     return color;   } } class Line extends Shape {   private static int color = RED;   public static void serializeStaticState(ObjectOutputStream os)       throws IOException {     os.writeInt(color);   }   public static void deserializeStaticState(ObjectInputStream os)       throws IOException {     color = os.readInt();   }   public Line(int xVal, int yVal, int dim) {     super(xVal, yVal, dim);   }   public void setColor(int newColor) {     color = newColor;   }   public int getColor() {     return color;   } } public class CADState {   public static void main(String[] args) throws Exception {     List shapeTypes, shapes;     if (args.length == 0) {       shapeTypes = new ArrayList();       shapes = new ArrayList();       // Add references to the class objects:       shapeTypes.add(Circle.class);       shapeTypes.add(Square.class);       shapeTypes.add(Line.class);       // Make some shapes:       for (int i = 0; i < 10; i++)         shapes.add(Shape.randomFactory());       // Set all the static colors to GREEN:       for (int i = 0; i < 10; i++)         ((Shape) shapes.get(i)).setColor(Shape.GREEN);       // Save the state vector:       ObjectOutputStream out = new ObjectOutputStream(           new FileOutputStream("CADState.out"));       out.writeObject(shapeTypes);       Line.serializeStaticState(out);       out.writeObject(shapes);     } else { // There's a command-line argument       ObjectInputStream in = new ObjectInputStream(new FileInputStream(           args[0]));       // Read in the same order they were written:       shapeTypes = (List) in.readObject();       Line.deserializeStaticState(in);       shapes = (List) in.readObject();     }     // Display the shapes:     System.out.println(shapes);   } } ///:~