]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNElementRemover.java
Fix DNElementRemover to remove the actual component first if possible
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DNElementRemover.java
1 package org.simantics.district.network.ui;
2
3 import org.simantics.db.Resource;
4 import org.simantics.db.WriteGraph;
5 import org.simantics.db.common.utils.OrderedSetUtils;
6 import org.simantics.db.exception.DatabaseException;
7 import org.simantics.db.layer0.adapter.impl.EntityRemover;
8 import org.simantics.db.layer0.util.RemoverUtil;
9 import org.simantics.district.network.DistrictNetworkUtil;
10 import org.simantics.district.network.ontology.DistrictNetworkResource;
11 import org.simantics.layer0.Layer0;
12 import org.simantics.layer0.utils.binaryPredicates.OrderedSetElementsPredicate;
13 import org.simantics.modeling.ModelingResources;
14 import org.simantics.modeling.adapters.ElementRemover;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 public class DNElementRemover extends ElementRemover {
19
20     private static final Logger LOGGER = LoggerFactory.getLogger(DNElementRemover.class);
21
22     public DNElementRemover(Resource element) {
23         super(element);
24     }
25     
26     @Override
27     public void removeConnection(WriteGraph graph) throws DatabaseException {
28         throw new UnsupportedOperationException("Distrct network should not have STR.Connection resources! " + resource);
29     }
30     
31     @Override
32     public void removeElement(WriteGraph graph) throws DatabaseException {
33         
34         DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
35         
36         if (graph.isInstanceOf(resource, DN.Vertex)) {
37             graph.getObjects(resource, DN.HasEndVertex_Inverse).forEach(res -> {
38                 try {
39                     doRemove(graph, res);
40                 } catch (DatabaseException e) {
41                     LOGGER.error("Could not remove endvertex inverse for {}", resource, e);
42                 }
43             });
44             graph.getObjects(resource, DN.HasStartVertex_Inverse).forEach(res -> {
45                 try {
46                     doRemove(graph, res);
47                 } catch (DatabaseException e) {
48                     LOGGER.error("Could not remove startvertex inverse for {}", resource, e);
49                 }
50             });
51         }
52         doRemove(graph, resource);
53     }
54     
55     private static void doRemove(WriteGraph graph, Resource resource) throws DatabaseException {
56         // 1. Disconnect element from diagrams
57         for (Resource diagram : OrderedSetElementsPredicate.INSTANCE.getSubjects(graph, resource)) {
58             OrderedSetUtils.remove(graph, diagram, resource);
59         }
60
61         removePossibleMappedComponents(graph, resource);
62         
63         // 2. Delete element itself
64         EntityRemover.remove(graph, resource);
65
66         // 3. Recursively remove all related degenerate connections
67         // i.e. connections that only have one connector after remove the
68         // one connected to this removed element.
69     }
70
71     private static void removePossibleMappedComponents(WriteGraph graph, Resource resource) throws DatabaseException {
72         Boolean trackChangesEnabled = DistrictNetworkUtil.trackChangesEnabled(graph, graph.getPossibleObject(resource, Layer0.getInstance(graph).PartOf));
73         if (trackChangesEnabled) {
74             DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
75             Resource element = graph.getPossibleObject(resource, DN.MappedComponent);
76             if (element != null) {
77                 // get component
78                 ModelingResources MOD = ModelingResources.getInstance(graph);
79                 Resource component = graph.getPossibleObject(element, MOD.ElementToComponent);
80                 if (component != null)
81                     RemoverUtil.remove(graph, component);
82                 else
83                     RemoverUtil.remove(graph, element);
84             }
85         }
86     }
87
88 }