X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2FDNElementRemover.java;fp=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2FDNElementRemover.java;h=06b31031f2efc794eca78c498aaaf5e0a1287e29;hb=eb4c9bb08ad1e7553fdca7581910fe5234e22c68;hp=2cbfe98e8b291c58bc2d5de04bef0d8c1943f50d;hpb=3803b2cf3450ba6e2ef59bc3c150057315f1e539;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNElementRemover.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNElementRemover.java index 2cbfe98e..06b31031 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNElementRemover.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNElementRemover.java @@ -1,61 +1,81 @@ -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. - } - -} +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.db.layer0.util.RemoverUtil; +import org.simantics.district.network.DistrictNetworkUtil; +import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; +import org.simantics.layer0.utils.binaryPredicates.OrderedSetElementsPredicate; +import org.simantics.modeling.adapters.ElementRemover; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DNElementRemover extends ElementRemover { + + private static final Logger LOGGER = LoggerFactory.getLogger(DNElementRemover.class); + + 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) { + LOGGER.error("Could not remove endvertex inverse for {}", resource, e); + } + }); + graph.getObjects(resource, DN.HasStartVertex_Inverse).forEach(res -> { + try { + doRemove(graph, res); + } catch (DatabaseException e) { + LOGGER.error("Could not remove startvertex inverse for {}", resource, e); + } + }); + } + 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); + } + + removePossibleMappedComponents(graph, 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. + } + + private static void removePossibleMappedComponents(WriteGraph graph, Resource resource) throws DatabaseException { + Boolean trackChangesEnabled = DistrictNetworkUtil.trackChangesEnabled(graph, graph.getPossibleObject(resource, Layer0.getInstance(graph).PartOf)); + if (trackChangesEnabled) { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + Resource mappedComponent = graph.getPossibleObject(resource, DN.MappedComponent); + if (mappedComponent != null) { + RemoverUtil.remove(graph, mappedComponent); + } + } + } + +}