+ }\r
+\r
+ public static EdgeEnd toEdgeEnd(ReadGraph graph, Resource attachmentRelation, EdgeEnd defaultValue, DiagramResource DIA)\r
+ throws DatabaseException {\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasTailConnector))\r
+ return EdgeEnd.Begin;\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasHeadConnector))\r
+ return EdgeEnd.End;\r
+ return defaultValue;\r
+ }\r
+\r
+ public static Resource resolveFlagAttachment(ReadGraph graph, Resource connection, Resource flag, IModelingRules modelingRules, DiagramResource DIA) throws DatabaseException {\r
+ Type type = resolveFlagType(graph, connection, flag, modelingRules, DIA);\r
+ if (type != null) {\r
+ switch (type) {\r
+ case In: return DIA.HasPlainConnector;\r
+ case Out: return DIA.HasArrowConnector;\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private static Type resolveFlagType(ReadGraph graph, Resource connection, Resource flag, IModelingRules modelingRules, DiagramResource DIA) throws DatabaseException {\r
+ return readFlagType(graph, flag, DIA);\r
+ }\r
+\r
+ private static Type readFlagType(ReadGraph graph, Resource flag, DiagramResource DIA) throws DatabaseException {\r
+ Resource flagType = graph.getPossibleObject(flag, DIA.HasFlagType);\r
+ Type type = DiagramGraphUtil.toFlagType(DIA, flagType);\r
+ return type;\r
+ }\r
+\r
+ public static Statement findTerminalStatement(ReadGraph graph, Resource connection, Resource connector, StructuralResource2 STR)\r
+ throws DatabaseException {\r
+ for (Statement stm : graph.getStatements(connector, STR.Connects)) {\r
+ if (connection.equals(stm.getObject()))\r
+ continue;\r
+ return stm;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public static Resource getInverseAttachment(ReadGraph graph, Resource attachmentRelation, DiagramResource DIA)\r
+ throws DatabaseException {\r
+ Resource inverse = graph.getPossibleObject(attachmentRelation, DIA.HasInverseAttachment);\r
+ if (inverse != null)\r
+ return inverse;\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasHeadConnector))\r
+ return DIA.HasPlainConnector;\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasTailConnector))\r
+ return DIA.HasArrowConnector;\r
+ return null;\r
+ }\r
+\r
+ public static ILineEndStyle loadLineEndStyle(ReadGraph graph, Resource attachmentRelation, ILineEndStyle defaultValue)\r
+ throws DatabaseException {\r
+ ILineEndStyle style = graph.syncRequest(new LineEndStyle(attachmentRelation),\r
+ TransientCacheListener.<ILineEndStyle>instance());\r
+ return style != null ? style : defaultValue;\r
+ }\r
+\r
+ public static ILineEndStyle loadLineEndStyle(ReadGraph graph, Resource attachmentRelation, Resource connectionType, ILineEndStyle defaultValue)\r
+ throws DatabaseException {\r
+ if(connectionType != null) {\r
+ ILineEndStyle style = graph.syncRequest(new LineEndStyleWithType(attachmentRelation, connectionType),\r
+ TransientCacheListener.<ILineEndStyle>instance());\r
+ return style != null ? style : defaultValue;\r
+ } else {\r
+ ILineEndStyle style = graph.syncRequest(new LineEndStyle(attachmentRelation),\r
+ TransientCacheListener.<ILineEndStyle>instance());\r
+ return style != null ? style : defaultValue;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * A request for caching ILineEndStyle results.\r
+ */\r
+ public static class LineEndStyle extends UnaryRead<Resource, ILineEndStyle> {\r
+ public LineEndStyle(Resource attachmentRelation) {\r
+ super(attachmentRelation);\r
+ }\r
+ @Override\r
+ public ILineEndStyle perform(ReadGraph graph) throws DatabaseException {\r
+ return loadLineEndStyle0(graph, parameter);\r
+ }\r
+ }\r
+\r
+ public static class LineEndStyleWithType extends ResourceRead2<ILineEndStyle> {\r
+ public LineEndStyleWithType(Resource attachmentRelation, Resource connectionType) {\r
+ super(attachmentRelation, connectionType);\r
+ }\r
+ @Override\r
+ public ILineEndStyle perform(ReadGraph graph) throws DatabaseException {\r
+ return loadLineEndStyle0(graph, resource, resource2);\r
+ }\r
+ }\r
+ \r
+ private static ILineEndStyle loadLineEndStyle0(ReadGraph graph, Resource attachmentRelation)\r
+ throws DatabaseException {\r
+ ILineEndStyle style = graph.getPossibleAdapter(attachmentRelation, ILineEndStyle.class);\r
+ if (style != null)\r
+ return style;\r
+ DiagramResource DIA = DiagramResource.getInstance(graph);\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasHeadConnector))\r
+ return HEAD;\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasTailConnector))\r
+ return TAIL;\r
+ return null;\r
+ }\r
+\r
+ private static ILineEndStyle loadLineEndStyle0(ReadGraph graph, Resource attachmentRelation, Resource connectionType)\r
+ throws DatabaseException {\r
+ DiagramResource DIA = DiagramResource.getInstance(graph);\r
+ if (graph.isSubrelationOf(attachmentRelation, DIA.HasHeadConnector)) {\r
+ if(connectionType != null) {\r
+ G2DResource G2D = G2DResource.getInstance(graph);\r
+ Resource end = graph.getPossibleObject(connectionType, G2D.HasEndArrow);\r
+ if(end != null) {\r
+ Double size = graph.getPossibleRelatedValue(end, G2D.HasSize, Bindings.DOUBLE);\r
+ if(size == null) size = 0.0;\r
+ Double widthRatio = graph.getPossibleRelatedValue(end, G2D.HasWidthRatio, Bindings.DOUBLE);\r
+ if(widthRatio == null) widthRatio = 1.0;\r
+ Double space = graph.getPossibleRelatedValue(end, G2D.HasSpace, Bindings.DOUBLE);\r
+ if(space == null) space = 0.0;\r
+\r
+ Resource c = graph.getPossibleObject(end, G2D.HasColor);\r
+ Color color = null;\r
+ if (c != null) {\r
+ float[] col = graph.getPossibleValue(c, Bindings.FLOAT_ARRAY);\r
+ if (col != null && col.length >= 3) {\r
+ color = new Color(col[0], col[1], col[2]);\r
+ }\r
+ }\r
+\r
+ return new ArrowLineEndStyle(size, widthRatio*size, space, color);\r
+ }\r
+ }\r
+ }\r
+ return loadLineEndStyle0(graph, attachmentRelation);\r
+ }\r
+\r
+ /**\r
+ * @param graph\r
+ * @param canvas\r
+ * @param style\r
+ * @return\r
+ * @throws DatabaseException\r
+ */\r
+ public static StyledRouteGraphRenderer getRenderer(ReadGraph graph, ConnectionStyle style)\r
+ throws DatabaseException {\r
+ return graph.syncRequest(new Renderer(style),\r
+ TransientCacheListener.<StyledRouteGraphRenderer>instance());\r
+ }\r
+\r
+ /**\r
+ * A request for caching StyledRouteGraphRenderer results.\r
+ */\r
+ public static class Renderer extends UnaryRead<ConnectionStyle, StyledRouteGraphRenderer> {\r
+ public Renderer(ConnectionStyle style) {\r
+ super(style);\r
+ }\r
+ @Override\r
+ public StyledRouteGraphRenderer perform(ReadGraph graph) throws DatabaseException {\r
+ return new StyledRouteGraphRenderer(parameter);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param graph\r
+ * @param canvas\r
+ * @param modelingRules\r
+ * @param connection\r
+ * @return\r
+ * @throws DatabaseException\r
+ */\r
+ protected static ConnectionStyle readConnectionStyle(ReadGraph graph, IModelingRules modelingRules, Resource connection, StructuralResource2 STR) throws DatabaseException {\r
+ Resource connectionType = null;\r
+ if (modelingRules != null)\r
+ connectionType = modelingRules.getConnectionType(graph, connection);\r
+ if (connectionType == null)\r
+ connectionType = graph.getPossibleObject(connection, STR.HasConnectionType);\r
+ return readConnectionStyleFromConnectionType(graph, connectionType);\r
+ }\r
+\r
+ protected static ConnectionStyle readConnectionStyleFromConnectionType(ReadGraph graph, Resource connectionType) throws DatabaseException {\r
+ return graph.syncRequest(new ReadConnectionStyleFromConnectionType(connectionType),\r
+ TransientCacheListener.<ConnectionStyle>instance());\r
+ }\r
+\r
+ /**\r
+ * A request for caching ConnectionStyle results.\r
+ */\r
+ public static class ReadConnectionStyleFromConnectionType extends UnaryRead<Resource, ConnectionStyle> {\r
+ public ReadConnectionStyleFromConnectionType(Resource connectionType) {\r
+ super(connectionType);\r
+ }\r
+ @Override\r
+ public ConnectionStyle perform(ReadGraph graph) throws DatabaseException {\r
+ return readConnectionStyleFromConnectionType0(graph, parameter);\r
+ }\r
+ }\r
+\r
+ protected static ConnectionStyle readConnectionStyleFromConnectionType0(ReadGraph graph, Resource connectionType) throws DatabaseException {\r
+ ConnectionVisuals cv = null;\r
+ if (connectionType != null)\r
+ cv = graph.syncRequest(DiagramRequests.getConnectionVisuals(connectionType),\r
+ TransientCacheListener.<ConnectionVisuals>instance());\r
+\r
+ // Fixed style settings\r
+ Color branchPointColor = Color.BLACK;\r
+ double branchPointRadius = 0.5;\r
+ double degenerateLineLength = 0.8;\r
+\r
+ Color lineColor = cv != null ? cv.toColor() : null;\r
+ if (lineColor == null)\r
+ lineColor = Color.DARK_GRAY;\r
+ Stroke lineStroke = cv != null ? cv.stroke : null;\r
+ if (lineStroke == null)\r
+ lineStroke = new BasicStroke(0.1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10, null, 0);\r
+ Stroke routeLineStroke = GeometryUtils.scaleStrokeWidth(lineStroke, 2);\r
+\r
+ return new BasicConnectionStyle(\r
+ lineColor,\r
+ branchPointColor,\r
+ branchPointRadius,\r
+ lineStroke,\r
+ routeLineStroke,\r
+ degenerateLineLength);\r
+ }\r
+\r
+ public static void scheduleSynchronize(Session session, Resource connection, RouteGraphChangeEvent event) {\r
+ session.asyncRequest(RouteGraphConnection.synchronizer(connection, event));\r
+ }\r