private FigureMovableImpl createFigure(InputStream is) throws Exception { FigureType figureType = unmarshall(is); Map<String, Vertex> vertices = new HashMap<String, Vertex>(); for (VertexType vertexType : figureType.getVertices()) { vertices.put(vertexType.getName(), createVertexFrom(vertexType)); } Map<String, Edge> edges = new HashMap<String, Edge>(); Map<Vertex, Set<Edge>> verticesEdges = new HashMap<Vertex, Set<Edge>>(); for (EdgeType edgeType : figureType.getEdges()) { Edge edge = createEdgeFrom(edgeType, vertices); putEdgeIntoVerticesEdgesMap(verticesEdges, edge.getA(), edge); putEdgeIntoVerticesEdgesMap(verticesEdges, edge.getB(), edge); edges.put(edgeType.getName(), edge); } Map<String, Face> faces = new HashMap<String, Face>(); for (FaceType faceType : figureType.getFaces()) { faces.put(faceType.getName(), createFaceFrom(faceType, edges, vertices, verticesEdges)); } Double givenPrecision = figureType.getPrecision(); double precision = (givenPrecision != null) ? givenPrecision : Pointable.PRECISION; return new FigureMovableImpl( new HashSet<Face>(faces.values()), new HashSet<Edge>(edges.values()), precision); }
private Face createFaceFrom( FaceType faceType, Map<String, Edge> edgesMap, Map<String, Vertex> vertices, Map<Vertex, Set<Edge>> verticesEdges) { Set<Edge> edges = new HashSet<Edge>(); String edgesAttr = faceType.getEdges(); String verticesAttr = faceType.getVertices(); if (edgesAttr != null) { String[] arrEdges = edgesAttr.split(","); for (int i = 0; i < arrEdges.length; i++) { String adgeName = arrEdges[i].trim(); Edge edge = edgesMap.get(adgeName); if (edge == null) { throw new IllegalArgumentException("No such edge defined - " + adgeName + "."); } edges.add(edge); } } else if (verticesAttr != null) { String[] arrVertexNames = verticesAttr.split(","); Vertex[] arrVertices = new Vertex[arrVertexNames.length]; for (int i = 0; i < arrVertexNames.length; i++) { String vertexName = arrVertexNames[i].trim(); Vertex vertex = vertices.get(vertexName); if (vertex == null) { throw new IllegalArgumentException("No such vertex defined - " + vertexName + "."); } arrVertices[i] = vertex; } for (int i = 0; i < arrVertices.length; i++) { Vertex v1 = arrVertices[i]; for (int j = (i + 1); j < arrVertices.length; j++) { Vertex v2 = arrVertices[j]; Set<Edge> edgeV1 = new HashSet<Edge>(verticesEdges.get(v1)); edgeV1.retainAll(verticesEdges.get(v2)); int size = edgeV1.size(); if (size == 1) { edges.add(edgeV1.iterator().next()); } else if (size > 1) { throw new IllegalArgumentException( "Between two vertices cannot be more than one edge."); } } } } else { throw new IllegalArgumentException( "Either 'edges' or 'vertices' attribute should be defined."); } return new Face(edges); }