Programming Assignment 4
Wrapper Classes, Generating Scalable Vector Graphics
Code Skeleton
The following is the code skeleton I sent to the class. It is translated from the UML diagram given in the assignment, plus a couple of comments. As I mentioned in class, you're encouraged to write more fields and methods, such as a name field for the Shape class and constructors for every class.
public class LastFirst4 {
public static void main(String[] args) {
// check command line
// open file
// read SVG header
// while file has more tokens
// read command token
// read line, rect, or circle attributes
// do
// read tokenOne
// if tokenOne is not "end"
// read tokenTwo
// add style
// while tokenOne is not "end"
// render SVG to "System.out"
}
}
class Svg {
private ArrayList<Shape> shapes = new ArrayList<Shape>();
private double height;
private double width;
void addShape(Shape shape) {
// add "shape" to the "shapes" list
}
void render(PrintStream out) {
// render this "Svg" to "out" e.g.,
// <svg width='300.0' height='300.0'>
// <rect x='5.0' y='5.0' width='290.0' height='290.0' style='fill:#f8f8f8;'/>
// </svg>
}
}
abstract class Shape {
private ArrayList<String> styles = new ArrayList<String>();
public void addStyle(String key, String value) {
// add to the "styles" list.
}
void render(PrintStream out) {
// render this "Shape" to "out" e.g.,
// <rect x='5.0' y='5.0' width='290.0' height='290.0' style='fill:#f8f8f8;'/>
}
abstract void renderAttributes(PrintStream out);
}
class Line extends Shape {
private double x1;
private double y1;
private double x2;
private double y2;
void renderAttributes(PrintStream out) {
// render class fields as attributes to "out" e.g.,
// x1='5.0' y1='295.0' x2='295.0' y2='5.0'
}
}
class Rectangle extends Shape {
private double x;
private double y;
private double width;
private double height;
void renderAttributes(PrintStream out) {
// render class fields as attributes to "out" e.g.,
// x='5.0' y='5.0' width='290.0' height='290.0'
}
}
class Circle extends Shape {
private double cx;
private double cy;
private double r;
void renderAttributes(PrintStream out) {
// render class fields as attributes to "out" e.g.,
// cx='150.0' cy='150.0' r='75.0'
}
}
Let's use the following as an example input file.
First read the SVG header,
// read SVG header, --> "svg 300 300"
Create a Svg object, something like:
Svg mySvg = new Svg(width, height);
Then read the shapes.
Try to read a shape command and its attributes:
// while file has more tokens --> true // read command token --> "rect" // read shape attributes --> "5 5 290 290" // :
Create a Rectangle object, something like:
Rect myRect = new Rect(x, y, width, height);
Add myRect to mySvg, something like:
mySvg.addShape(myRect);
Then read the shape styles:
Iteration #1:
// do // read tokenOne --> "stroke" // if tokenOne is not "end" --> true // read tokenTwo --> "#c0c0c0" // add style --> "stroke:#c0c0c0" // while tokenOne is not "end" --> true
Add a style to myRect object, something like:
myRect.addStyle("stroke", "#c0c0c0");Iteration #2:
// do // read tokenOne --> "stroke-width" // if tokenOne is not "end" --> true // read tokenTwo --> "2" // add style --> "stroke-width:2" // while tokenOne is not "end" --> true
Add a style to myRect object, something like:
myRect.addStyle("stroke-width", "2");Iteration #3:
// do // read tokenOne --> "end" // if tokenOne is not "end" --> false // read tokenTwo // add style // while tokenOne is not "end" --> false
Try to read shape command and shape attributes:
// while file has more tokens --> false
After the while loop ends.
// render SVG to "System.out"
We get: