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