]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/FunctionHandler.java
Allow overriding issue hidden-ness/hiding logic in inheriting ontologies
[simantics/platform.git] / bundles / org.simantics.issues.ui / src / org / simantics / issues / ui / handler / FunctionHandler.java
diff --git a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/FunctionHandler.java b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/FunctionHandler.java
new file mode 100644 (file)
index 0000000..38b2c93
--- /dev/null
@@ -0,0 +1,78 @@
+package org.simantics.issues.ui.handler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.common.utils.Logger;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.db.service.VirtualGraphSupport;
+import org.simantics.scl.runtime.SCLContext;
+import org.simantics.scl.runtime.function.Function;
+
+/**
+ * @author Tuukka Lehtonen
+ * @since 1.31.0
+ */
+class FunctionHandler extends PreferenceHandler {
+
+    private String functionPropertyName;
+    private Object argument;
+
+    public FunctionHandler(String virtualGraphId, String functionPropertyName, Object argument) {
+        super(virtualGraphId, null, false);
+        this.functionPropertyName = functionPropertyName;
+        this.argument = argument;
+    }
+
+    public void execute(List<Variable> vars, List<Resource> resources) {
+        if (vars.isEmpty())
+            return;
+        Session session = Simantics.peekSession();
+        if (session == null)
+            return;
+
+        VirtualGraph vg = virtualGraphId == null ? null :
+                session.getService(VirtualGraphSupport.class).getWorkspacePersistent(virtualGraphId);
+
+        session.asyncRequest(new WriteRequest(vg) {
+            @Override
+            public void perform(WriteGraph graph) throws DatabaseException {
+                graph.markUndoPoint();
+                execute(graph, vars, functionPropertyName);
+            }
+        }, e -> {
+            if (e != null)
+                Logger.defaultLogError(e);
+        });
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    protected void execute(WriteGraph graph, List<Variable> vars, String functionPropertyName) throws DatabaseException {
+        List<Function> hiders = new ArrayList<>(vars.size());
+        for (Variable v : vars) {
+            Function f = v.getPossiblePropertyValue(graph, functionPropertyName);
+            if (f != null)
+                hiders.add(f);
+        }
+        if (!hiders.isEmpty()) {
+            SCLContext ctx = SCLContext.getCurrent();
+            Object oldGraph = ctx.put("graph", graph);
+            try {
+                for (Function f : hiders)
+                    f.apply(argument);
+            } catch (Throwable t) {
+                throw new DatabaseException(t);
+            } finally {
+                ctx.put("graph", oldGraph);
+            }
+        }
+    }
+
+}
\ No newline at end of file