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;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.exception.ServiceException;
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;
import org.simantics.db.service.ClusteringSupport;
import org.simantics.db.service.CollectionSupport;
import org.simantics.db.service.DebugSupport;
+import org.simantics.db.service.GraphChangeListenerSupport;
import org.simantics.db.service.ManagementSupport;
import org.simantics.db.service.UndoRedoSupport;
import org.simantics.db.service.XSupport;
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 {
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())
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");
}
return result;
}
+
+ public static Resource getPossiblePredicateByNameFromType(ReadGraph graph, Resource type, String name) throws DatabaseException {
+ Map<String,Resource> domain = getDomainOf(graph, type);
+ return domain.get(name);
+ }
public static Resource getPossiblePredicateByName(ReadGraph graph, Resource instance, String predicateName) throws DatabaseException {
for(Resource type : graph.getPrincipalTypes(instance)) {
}
return false;
}
+
+ public static void addMetadataListener(ChangeListener listener) {
+ SimanticsInternal.getSession().getService(GraphChangeListenerSupport.class).addMetadataListener(listener);
+ }
+
+ public static void removeMetadataListener(ChangeListener listener) {
+ SimanticsInternal.getSession().getService(GraphChangeListenerSupport.class).removeMetadataListener(listener);
+ }
+
}