Enforce immutability via final and unmodifiableList.

This commit is contained in:
Holt59 2018-02-24 21:02:04 +01:00
parent 7640fa34c7
commit d00e012497
9 changed files with 504 additions and 498 deletions

View File

@ -2,9 +2,10 @@ package org.insa.algo.weakconnectivity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import org.insa.algo.AbstractAlgorithm; import org.insa.algo.AbstractAlgorithm;
import org.insa.algo.AbstractSolution.Status; import org.insa.algo.AbstractSolution.Status;
@ -12,7 +13,7 @@ import org.insa.graph.Arc;
import org.insa.graph.Graph; import org.insa.graph.Graph;
import org.insa.graph.Node; import org.insa.graph.Node;
public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<WeaklyConnectedComponentObserver>{ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<WeaklyConnectedComponentObserver> {
/** /**
* *
@ -25,12 +26,12 @@ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<Weakly
@Override @Override
public WeaklyConnectedComponentsSolution run() { public WeaklyConnectedComponentsSolution run() {
return (WeaklyConnectedComponentsSolution)super.run(); return (WeaklyConnectedComponentsSolution) super.run();
} }
@Override @Override
public WeaklyConnectedComponentsData getInstance() { public WeaklyConnectedComponentsData getInstance() {
return (WeaklyConnectedComponentsData)super.getInstance(); return (WeaklyConnectedComponentsData) super.getInstance();
} }
/** /**
@ -45,7 +46,8 @@ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<Weakly
} }
/** /**
* Notify all observers that a new node has been found for the current component. * Notify all observers that a new node has been found for the current
* component.
* *
* @param node New node found for the current component. * @param node New node found for the current component.
*/ */
@ -67,7 +69,8 @@ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<Weakly
} }
/** /**
* @return An adjacency list for the undirected graph equivalent to the stored graph. * @return An adjacency list for the undirected graph equivalent to the stored
* graph.
*/ */
protected ArrayList<HashSet<Integer>> createUndirectedGraph() { protected ArrayList<HashSet<Integer>> createUndirectedGraph() {
int nNodes = getInstance().getGraph().getNodes().size(); int nNodes = getInstance().getGraph().getNodes().size();
@ -89,8 +92,8 @@ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<Weakly
} }
/** /**
* Apply a breadth first search algorithm on the given undirected graph (adjacency list), * Apply a breadth first search algorithm on the given undirected graph
* starting at node cur, and marking nodes in marked. * (adjacency list), starting at node cur, and marking nodes in marked.
* *
* @param marked * @param marked
* @param cur * @param cur
@ -98,7 +101,7 @@ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<Weakly
* @return * @return
*/ */
protected ArrayList<Node> bfs(ArrayList<HashSet<Integer>> ugraph, boolean[] marked, int cur) { protected ArrayList<Node> bfs(ArrayList<HashSet<Integer>> ugraph, boolean[] marked, int cur) {
ArrayList<Node> nodes = getInstance().getGraph().getNodes(); List<Node> nodes = getInstance().getGraph().getNodes();
ArrayList<Node> component = new ArrayList<Node>(); ArrayList<Node> component = new ArrayList<Node>();
// Using a queue because we are doing a BFS // Using a queue because we are doing a BFS
@ -148,7 +151,8 @@ public class WeaklyConnectedComponentsAlgorithm extends AbstractAlgorithm<Weakly
components.add(this.bfs(ugraph, marked, cur)); components.add(this.bfs(ugraph, marked, cur));
// Find next non-marked // Find next non-marked
for (; cur < marked.length && marked[cur]; ++cur); for (; cur < marked.length && marked[cur]; ++cur)
;
} }
return new WeaklyConnectedComponentsSolution(getInstance(), Status.OPTIMAL, components); return new WeaklyConnectedComponentsSolution(getInstance(), Status.OPTIMAL, components);

View File

@ -1,20 +1,22 @@
package org.insa.graph; package org.insa.graph;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Arc { public class Arc {
// Destination node. // Destination node.
private Node origin, destination; private final Node origin, destination;
// Length of the road (in meters). // Length of the road (in meters).
private int length; private final int length;
// Road information. // Road information.
RoadInformation info; private final RoadInformation info;
// Segments. // Segments.
ArrayList<Point> points; private final ArrayList<Point> points;
/** /**
* @param dest * @param dest
@ -82,11 +84,12 @@ public class Arc {
} }
/** /**
* @return Points representing segments of this arc. This function may return an empty * @return Points representing segments of this arc. This function may return an
* ArrayList if the segments are stored in the reversed arc (for two-ways road). * empty ArrayList if the segments are stored in the reversed arc (for
* two-ways road).
*/ */
public ArrayList<Point> getPoints() { public List<Point> getPoints() {
return points; return Collections.unmodifiableList(points);
} }
} }

View File

@ -1,14 +1,16 @@
package org.insa.graph ; package org.insa.graph;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Graph { public class Graph {
// Map identifier. // Map identifier.
private int mapId; private final int mapId;
// Nodes of the graph. // Nodes of the graph.
private ArrayList<Node> nodes; private final ArrayList<Node> nodes;
/** /**
* @param mapId * @param mapId
@ -22,7 +24,9 @@ public class Graph {
/** /**
* @return Nodes of this graph. * @return Nodes of this graph.
*/ */
public ArrayList<Node> getNodes() { return nodes; } public List<Node> getNodes() {
return Collections.unmodifiableList(nodes);
}
/** /**
* Find the closet node to the given point. * Find the closet node to the given point.
@ -34,7 +38,7 @@ public class Graph {
public Node findClosestNode(Point point) { public Node findClosestNode(Point point) {
Node node = null; Node node = null;
double minDis = Double.POSITIVE_INFINITY; double minDis = Double.POSITIVE_INFINITY;
for (int n = 0 ; n < nodes.size(); ++n) { for (int n = 0; n < nodes.size(); ++n) {
double dis = point.distanceTo(nodes.get(n).getPoint()); double dis = point.distanceTo(nodes.get(n).getPoint());
if (dis < minDis) { if (dis < minDis) {
node = nodes.get(n); node = nodes.get(n);
@ -47,7 +51,9 @@ public class Graph {
/** /**
* @return Map ID of this graph. * @return Map ID of this graph.
*/ */
public int getMapId() { return mapId; } public int getMapId() {
return mapId;
}
/** /**
* @return Return the transpose graph of this graph. * @return Return the transpose graph of this graph.

View File

@ -1,21 +1,23 @@
package org.insa.graph; package org.insa.graph;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Node implements Comparable<Node> { public class Node implements Comparable<Node> {
// ID of the node. // ID of the node.
private int id; private final int id;
// Point of this graph. // Point of this graph.
private Point point; private final Point point;
// Successors. // Successors.
private ArrayList<Arc> successors; private final ArrayList<Arc> successors;
/** /**
* Create a new Node corresponding to the given Point with * Create a new Node corresponding to the given Point with an empty list of
* an empty list of successors. * successors.
* *
* @param point * @param point
*/ */
@ -37,17 +39,23 @@ public class Node implements Comparable<Node> {
/** /**
* @return ID of this node. * @return ID of this node.
*/ */
public int getId() { return id; } public int getId() {
return id;
}
/** /**
* @return List of successors of this node. * @return List of successors of this node.
*/ */
public ArrayList<Arc> getSuccessors() { return successors; } public List<Arc> getSuccessors() {
return Collections.unmodifiableList(successors);
}
/** /**
* @return Point of this node. * @return Point of this node.
*/ */
public Point getPoint() { return point; } public Point getPoint() {
return point;
}
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {

View File

@ -7,7 +7,7 @@ package org.insa.graph;
public class Point { public class Point {
// Earth radius, in meters; // Earth radius, in meters;
private static final double EARTH_RADIUS = 6378137.0 ; private static final double EARTH_RADIUS = 6378137.0;
/** /**
* Compute the distance between the two given points. * Compute the distance between the two given points.
@ -19,14 +19,14 @@ public class Point {
* @return * @return
*/ */
public static double distance(Point p1, Point p2) { public static double distance(Point p1, Point p2) {
double sinLat = Math.sin(Math.toRadians(p1.getLatitude()))*Math.sin(Math.toRadians(p2.getLatitude())); double sinLat = Math.sin(Math.toRadians(p1.getLatitude())) * Math.sin(Math.toRadians(p2.getLatitude()));
double cosLat = Math.cos(Math.toRadians(p1.getLatitude()))*Math.cos(Math.toRadians(p2.getLatitude())); double cosLat = Math.cos(Math.toRadians(p1.getLatitude())) * Math.cos(Math.toRadians(p2.getLatitude()));
double cosLong = Math.cos(Math.toRadians(p2.getLongitude() - p1.getLongitude())); double cosLong = Math.cos(Math.toRadians(p2.getLongitude() - p1.getLongitude()));
return EARTH_RADIUS * Math.acos(sinLat+cosLat*cosLong); return EARTH_RADIUS * Math.acos(sinLat + cosLat * cosLong);
} }
// Longitude and latitude of the point. // Longitude and latitude of the point.
private double longitude, latitude; private final double longitude, latitude;
/** /**
* *
@ -41,12 +41,16 @@ public class Point {
/** /**
* @return Longitude of this point (in degrees). * @return Longitude of this point (in degrees).
*/ */
public double getLongitude() { return longitude; } public double getLongitude() {
return longitude;
}
/** /**
* @return Latitude of this point (in degrees). * @return Latitude of this point (in degrees).
*/ */
public double getLatitude() { return latitude; } public double getLatitude() {
return latitude;
}
/** /**
* Compute the distance from this point to the given point * Compute the distance from this point to the given point

View File

@ -1,8 +1,7 @@
package org.insa.graph ; package org.insa.graph;
/** /**
* Class containing information for road that may be shared * Class containing information for road that may be shared by multiple arcs.
* by multiple arcs.
* *
*/ */
public class RoadInformation { public class RoadInformation {
@ -11,35 +10,20 @@ public class RoadInformation {
* Road type. * Road type.
*/ */
public enum RoadType { public enum RoadType {
MOTORWAY, MOTORWAY, TRUNK, PRIMARY, SECONDARY, MOTORWAY_LINK, TRUNK_LINK, PRIMARY_LINK, SECONDARY_LINK, TERTIARY, RESIDENTIAL, UNCLASSIFIED, ROAD, LIVING_STREET, SERVICE, ROUNDABOUT, COASTLINE
TRUNK,
PRIMARY,
SECONDARY,
MOTORWAY_LINK,
TRUNK_LINK,
PRIMARY_LINK,
SECONDARY_LINK,
TERTIARY,
RESIDENTIAL,
UNCLASSIFIED,
ROAD,
LIVING_STREET,
SERVICE,
ROUNDABOUT,
COASTLINE
} }
// Type of the road (see above). // Type of the road (see above).
private RoadType type; private final RoadType type;
// One way road? // One way road?
private boolean oneway; private final boolean oneway;
// Max speed in kilometers per hour. // Max speed in kilometers per hour.
private int maxSpeed; private final int maxSpeed;
// Name of the road. // Name of the road.
private String name; private final String name;
public RoadInformation(RoadType roadType, boolean isOneWay, int maxSpeed, String name) { public RoadInformation(RoadType roadType, boolean isOneWay, int maxSpeed, String name) {
this.type = roadType; this.type = roadType;
@ -51,22 +35,30 @@ public class RoadInformation {
/** /**
* @return Type of the road. * @return Type of the road.
*/ */
public RoadType getType() { return type; } public RoadType getType() {
return type;
}
/** /**
* @return true if this is a one-way road. * @return true if this is a one-way road.
*/ */
public boolean isOneWay() { return oneway; } public boolean isOneWay() {
return oneway;
}
/** /**
* @return Maximum speed for this road (in km/h). * @return Maximum speed for this road (in km/h).
*/ */
public int getMaximumSpeed() { return maxSpeed; } public int getMaximumSpeed() {
return maxSpeed;
}
/** /**
* @return Name of the road. * @return Name of the road.
*/ */
public String getName() { return name; } public String getName() {
return name;
}
@Override @Override
public String toString() { public String toString() {
@ -77,9 +69,7 @@ public class RoadInformation {
if (getType() == RoadType.MOTORWAY) { if (getType() == RoadType.MOTORWAY) {
typeAsString = "highway"; typeAsString = "highway";
} }
return typeAsString + " : " + getName() return typeAsString + " : " + getName() + " " + (isOneWay() ? " (oneway) " : "") + maxSpeed + " km/h (max.)";
+ " " + (isOneWay() ? " (oneway) " : "")
+ maxSpeed + " km/h (max.)";
} }
} }

View File

@ -11,9 +11,9 @@ import java.awt.event.MouseListener;
import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -238,14 +238,12 @@ public class BasicDrawing extends JPanel implements Drawing {
/** /**
* Draw the given arc. * Draw the given arc.
* *
* @param arc * @param arc Arc to draw.
* Arc to draw. * @param palette Palette to use to retrieve color and width for arc, or null to
* @param palette * use current settings.
* Palette to use to retrieve color and width for arc, or null to use
* current settings.
*/ */
public void drawArc(Arc arc, GraphPalette palette) { public void drawArc(Arc arc, GraphPalette palette) {
ArrayList<Point> pts = arc.getPoints(); List<Point> pts = arc.getPoints();
if (!pts.isEmpty()) { if (!pts.isEmpty()) {
if (palette != null) { if (palette != null) {
setColor(palette.getColorForType(arc.getInfo().getType())); setColor(palette.getColorForType(arc.getInfo().getType()));

View File

@ -1,7 +1,7 @@
package org.insa.graphics.drawing.utils; package org.insa.graphics.drawing.utils;
import java.awt.Color; import java.awt.Color;
import java.util.ArrayList; import java.util.List;
import org.insa.graph.Point; import org.insa.graph.Point;
import org.mapsforge.core.graphics.Canvas; import org.mapsforge.core.graphics.Canvas;
@ -41,7 +41,7 @@ public class PolylineAutoScaling extends Polyline {
/** /**
* @param points * @param points
*/ */
public void add(ArrayList<Point> points) { public void add(List<Point> points) {
for (Point point: points) { for (Point point: points) {
add(point); add(point);
} }

View File

@ -1,22 +1,15 @@
package org.insa.graph.io; package org.insa.graph.io;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.List;
import org.insa.graph.Graph; import org.insa.graph.Graph;
import org.insa.graph.Node; import org.insa.graph.Node;
import org.insa.graph.Point; import org.insa.graph.Point;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
public class BinaryGraphReaderTest { public class BinaryGraphReaderTest {
@ -38,7 +31,7 @@ public class BinaryGraphReaderTest {
@Test @Test
void testMidipNodes() { void testMidipNodes() {
ArrayList<Node> nodes = midip.getNodes(); List<Node> nodes = midip.getNodes();
assertEquals(nodes.size(), 150827); assertEquals(nodes.size(), 150827);