package org.simantics.event.view.handler; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.simantics.Simantics; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.VirtualGraph; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.service.VirtualGraphSupport; import org.simantics.layer0.Layer0; import org.simantics.utils.datastructures.Callback; import org.simantics.utils.ui.ErrorLogger; /** * @author Tuukka Lehtonen */ public class ClaimAction extends Action { protected final String virtualGraphId; protected final Resource subject; protected final String relationURI; protected final Resource object; /** * @param label * @param image * @param virtualGraphId * @param tagURI * @param tag true to add tag, false to remove tag * @param input */ public ClaimAction(String label, ImageDescriptor image, String virtualGraphId, Resource subject, String relationURI, Resource object) { super(label, image); this.virtualGraphId = virtualGraphId; this.subject = subject; this.relationURI = relationURI; this.object = object; } @Override public void run() { Session session = Simantics.peekSession(); if (session != null) { VirtualGraph vg = virtualGraphId == null ? null : session.getService(VirtualGraphSupport.class).getWorkspacePersistent(virtualGraphId); session.asyncRequest(new WriteRequest(vg) { @Override public void perform(WriteGraph graph) throws DatabaseException { claim(graph); } }, new Callback() { @Override public void run(DatabaseException parameter) { if (parameter != null) ErrorLogger.defaultLogError(parameter); } }); } } public void claim(WriteGraph graph) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); Resource relation = graph.getResource(relationURI); boolean functional = graph.isInstanceOf(relation, L0.FunctionalRelation); if (functional) graph.deny(subject, relation); graph.claim(subject, graph.getResource(relationURI), object); } }