X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Futil%2FLayer0Utils.java;h=56e1e11f23a10893b0b2818c31845e5bbe7d1c48;hp=6b9b2fc6502845763871aa1383d8d8a1835ef33b;hb=60ef4f8b863d892019a61978a63119dc1ebd852f;hpb=bdab0adcee131a18290393e1c2fca72de48c10d2 diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java index 6b9b2fc65..56e1e11f2 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java @@ -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 unhandled = new ArrayList(); 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 trashes = trashBin != null - ? graph.getObjects(trashBin, L0.ConsistsOf) - : Collections.emptyList(); + Collection trashes = trashBin != null ? graph.getObjects(trashBin, L0.ConsistsOf) + : Collections. 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");