]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.issues.ui.handler;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.simantics.Simantics;
7 import org.simantics.db.Resource;
8 import org.simantics.db.Session;
9 import org.simantics.db.VirtualGraph;
10 import org.simantics.db.WriteGraph;
11 import org.simantics.db.common.request.WriteRequest;
12 import org.simantics.db.common.utils.Logger;
13 import org.simantics.db.exception.DatabaseException;
14 import org.simantics.db.layer0.variable.Variable;
15 import org.simantics.db.service.VirtualGraphSupport;
16 import org.simantics.scl.runtime.SCLContext;
17 import org.simantics.scl.runtime.function.Function;
18
19 /**
20  * @author Tuukka Lehtonen
21  * @since 1.31.0
22  */
23 class FunctionHandler extends PreferenceHandler {
24
25     private String functionPropertyName;
26     private Object argument;
27
28     public FunctionHandler(String virtualGraphId, String functionPropertyName, Object argument) {
29         super(virtualGraphId, null, false);
30         this.functionPropertyName = functionPropertyName;
31         this.argument = argument;
32     }
33
34     public void execute(List<Variable> vars, List<Resource> resources) {
35         if (vars.isEmpty())
36             return;
37         Session session = Simantics.peekSession();
38         if (session == null)
39             return;
40
41         VirtualGraph vg = virtualGraphId == null ? null :
42                 session.getService(VirtualGraphSupport.class).getWorkspacePersistent(virtualGraphId);
43
44         session.asyncRequest(new WriteRequest(vg) {
45             @Override
46             public void perform(WriteGraph graph) throws DatabaseException {
47                 graph.markUndoPoint();
48                 execute(graph, vars, functionPropertyName);
49             }
50         }, e -> {
51             if (e != null)
52                 Logger.defaultLogError(e);
53         });
54     }
55
56     @SuppressWarnings({ "rawtypes", "unchecked" })
57     protected void execute(WriteGraph graph, List<Variable> vars, String functionPropertyName) throws DatabaseException {
58         List<Function> hiders = new ArrayList<>(vars.size());
59         for (Variable v : vars) {
60             Function f = v.getPossiblePropertyValue(graph, functionPropertyName);
61             if (f != null)
62                 hiders.add(f);
63         }
64         if (!hiders.isEmpty()) {
65             SCLContext ctx = SCLContext.getCurrent();
66             Object oldGraph = ctx.put("graph", graph);
67             try {
68                 for (Function f : hiders)
69                     f.apply(argument);
70             } catch (Throwable t) {
71                 throw new DatabaseException(t);
72             } finally {
73                 ctx.put("graph", oldGraph);
74             }
75         }
76     }
77
78 }