]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java
Better emptying of trash bin
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / Layer0Utils.java
index 6b9b2fc6502845763871aa1383d8d8a1835ef33b..56e1e11f23a10893b0b2818c31845e5bbe7d1c48 100644 (file)
@@ -73,6 +73,7 @@ import org.simantics.db.common.request.DelayedWriteRequest;
 import org.simantics.db.common.request.ObjectsWithType;
 import org.simantics.db.common.request.PossibleChild;
 import org.simantics.db.common.request.PossibleIndexRoot;
+import org.simantics.db.common.request.WriteRequest;
 import org.simantics.db.common.utils.NameUtils;
 import org.simantics.db.event.ChangeListener;
 import org.simantics.db.exception.CancelTransactionException;
@@ -83,6 +84,7 @@ import org.simantics.db.layer0.adapter.CopyHandler2;
 import org.simantics.db.layer0.adapter.GenericRelationIndex;
 import org.simantics.db.layer0.adapter.PasteHandler;
 import org.simantics.db.layer0.adapter.impl.DefaultPasteHandler;
+import org.simantics.db.layer0.adapter.impl.EntityRemover;
 import org.simantics.db.layer0.adapter.impl.TGRemover;
 import org.simantics.db.layer0.genericrelation.IndexedRelations;
 import org.simantics.db.layer0.internal.SimanticsInternal;
@@ -1247,9 +1249,11 @@ public class Layer0Utils {
         emptyTrashBin(monitor, SimanticsInternal.getSession(), SimanticsInternal.getProject());
     }
 
-    public static void emptyTrashBin(final IProgressMonitor monitor, Session session, final Resource project) throws ServiceException {
+    public static void emptyTrashBin(final IProgressMonitor monitor, Session session, final Resource project)
+            throws ServiceException {
         final SubMonitor mon = SubMonitor.convert(monitor, "Emptying Trash Bin...", 10000);
         try {
+            ArrayList<Resource> unhandled = new ArrayList<Resource>();
             session.syncRequest(new DelayedWriteRequest() {
                 @Override
                 public void perform(WriteGraph graph) throws DatabaseException {
@@ -1258,26 +1262,34 @@ public class Layer0Utils {
                     Layer0X L0X = Layer0X.getInstance(graph);
                     Resource parent = graph.getSingleObject(project, L0.PartOf);
                     Resource trashBin = Layer0Utils.getPossibleChild(graph, parent, "TrashBin");
-                    Collection<Resource> trashes = trashBin != null
-                            ? graph.getObjects(trashBin, L0.ConsistsOf)
-                            : Collections.<Resource>emptyList();
+                    Collection<Resource> trashes = trashBin != null ? graph.getObjects(trashBin, L0.ConsistsOf)
+                            : Collections.<Resource> emptyList();
                     if (trashes.isEmpty())
                         throw new CancelTransactionException();
                     mon.setWorkRemaining((2 + trashes.size()) * 1000);
-                    for(Resource trash : trashes) {
+                    for (Resource trash : trashes) {
                         if (mon.isCanceled())
                             throw new CancelTransactionException();
                         mon.subTask(NameUtils.getSafeName(graph, trash));
+                        boolean isIndexRoot = graph.isInstanceOf(trash, L0.IndexRoot);
                         TGRemover remo = new TGRemover(mon.newChild(1000, SubMonitor.SUPPRESS_ALL_LABELS), trash);
-                        remo.remove(graph);
-                        if(graph.isInstanceOf(trash, L0.IndexRoot)) {
-                               // TODO: this should be an utility 
-                                       GenericRelationIndex index = graph.adapt(L0X.DependenciesRelation, GenericRelationIndex.class);
-                                       IndexedRelations ir = graph.getService(IndexedRelations.class);
-                                       // Deletes index files
-                                       ir.reset(null, graph, L0X.DependenciesRelation, trash);
-                                       // Notifies DB listeners
-                                       index.reset(graph, trash);
+                        try {
+                            remo.remove(graph);
+                            unhandled.addAll(remo.getRoots());
+                        } catch (DatabaseException e) {
+                            // Something went wrong - try to remove this later
+                            // with EntityRemover
+                            unhandled.add(trash);
+                        }
+                        if (isIndexRoot) {
+                            // TODO: this should be an utility
+                            GenericRelationIndex index = graph.adapt(L0X.DependenciesRelation,
+                                    GenericRelationIndex.class);
+                            IndexedRelations ir = graph.getService(IndexedRelations.class);
+                            // Deletes index files
+                            ir.reset(null, graph, L0X.DependenciesRelation, trash);
+                            // Notifies DB listeners
+                            index.reset(graph, trash);
                         }
                     }
                     if (mon.isCanceled())
@@ -1286,6 +1298,15 @@ public class Layer0Utils {
                     mon.newChild(1000);
                 }
             });
+
+            session.syncRequest(new WriteRequest() {
+                @Override
+                public void perform(WriteGraph graph) throws DatabaseException {
+                    for (Resource r : unhandled)
+                        EntityRemover.remove(graph, r);
+                }
+            });
+
             if (mon.isCanceled())
                 return;
             mon.subTask("Purging Database");