--- /dev/null
+package org.simantics.district.network.ui;\r
+\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.utils.OrderedSetUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.impl.EntityRemover;\r
+import org.simantics.district.network.ontology.DistrictNetworkResource;\r
+import org.simantics.layer0.utils.binaryPredicates.OrderedSetElementsPredicate;\r
+import org.simantics.modeling.adapters.ElementRemover;\r
+\r
+public class DNElementRemover extends ElementRemover {\r
+\r
+ public DNElementRemover(Resource element) {\r
+ super(element);\r
+ }\r
+ \r
+ @Override\r
+ public void removeConnection(WriteGraph graph) throws DatabaseException {\r
+ throw new UnsupportedOperationException("Distrct network should not have STR.Connection resources! " + resource);\r
+ }\r
+ \r
+ @Override\r
+ public void removeElement(WriteGraph graph) throws DatabaseException {\r
+ \r
+ DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);\r
+ \r
+ if (graph.isInstanceOf(resource, DN.Vertex)) {\r
+ graph.getObjects(resource, DN.HasEndVertex_Inverse).forEach(res -> {\r
+ try {\r
+ doRemove(graph, res);\r
+ } catch (DatabaseException e) {\r
+ e.printStackTrace();\r
+ }\r
+ });\r
+ graph.getObjects(resource, DN.HasStartVertex_Inverse).forEach(res -> {\r
+ try {\r
+ doRemove(graph, res);\r
+ } catch (DatabaseException e) {\r
+ e.printStackTrace();\r
+ }\r
+ });\r
+ }\r
+ doRemove(graph, resource);\r
+ }\r
+ \r
+ private static void doRemove(WriteGraph graph, Resource resource) throws DatabaseException {\r
+ // 1. Disconnect element from diagrams\r
+ for (Resource diagram : OrderedSetElementsPredicate.INSTANCE.getSubjects(graph, resource)) {\r
+ OrderedSetUtils.remove(graph, diagram, resource);\r
+ }\r
+\r
+ // 2. Delete element itself\r
+ EntityRemover.remove(graph, resource);\r
+\r
+ // 3. Recursively remove all related degenerate connections\r
+ // i.e. connections that only have one connector after remove the\r
+ // one connected to this removed element.\r
+ }\r
+\r
+}\r