]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.issues.common/src/org/simantics/issues/common/HideFunction.java
Allow overriding issue hidden-ness/hiding logic in inheriting ontologies
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / HideFunction.java
1 package org.simantics.issues.common;
2
3 import java.util.Objects;
4
5 import org.simantics.databoard.util.ObjectUtils;
6 import org.simantics.db.Resource;
7 import org.simantics.db.VirtualGraph;
8 import org.simantics.db.WriteGraph;
9 import org.simantics.db.common.CommentMetadata;
10 import org.simantics.db.common.request.WriteRequest;
11 import org.simantics.db.common.utils.NameUtils;
12 import org.simantics.db.exception.DatabaseException;
13 import org.simantics.db.exception.RuntimeDatabaseException;
14 import org.simantics.db.service.VirtualGraphSupport;
15 import org.simantics.issues.ontology.IssueResource;
16 import org.simantics.scl.runtime.SCLContext;
17 import org.simantics.scl.runtime.function.FunctionImpl1;
18
19 /**
20  * @author Tuukka Lehtonen
21  * @since 1.31.0
22  */
23 class HideFunction extends FunctionImpl1<Boolean, Boolean> {
24
25     private Resource[] issues;
26
27     public HideFunction(Resource... issues) {
28         this.issues = issues;
29     }
30
31     @Override
32     public Boolean apply(Boolean hide) {
33         try {
34             WriteGraph graph = Objects.requireNonNull((WriteGraph) SCLContext.getCurrent().get("graph"));
35             IssueResource ISSUE = IssueResource.getInstance(graph);
36             boolean changed = false;
37             for (Resource issue : issues)
38                 changed |= tag(graph, issue, ISSUE.Hidden, hide);
39             return changed;
40         } catch (DatabaseException e) {
41             throw new RuntimeDatabaseException(e);
42         }
43     }
44
45     private static boolean tag(WriteGraph graph, Resource r, Resource tagRel, boolean tag) throws DatabaseException {
46         boolean isTagged = graph.hasStatement(r, tagRel);
47         if (tag && !isTagged) {
48             // If r is virtual, we perform tagging in the same vg
49             VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);
50             VirtualGraph vg = vgs.getGraph(graph, r);
51             if (vg != null) {
52                 graph.sync(new WriteRequest(vg) {
53                     @Override
54                     public void perform(WriteGraph graph) throws DatabaseException {
55                         graph.claim(r, tagRel, tagRel, r);
56                         CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
57                         graph.addMetadata(cm.add(ObjectUtils.toString("Marking " + NameUtils.getSafeLabel(graph, r) + " to " + NameUtils.getSafeName(graph, tagRel))));
58                     }
59                 });
60             } else {
61                 graph.claim(r, tagRel, tagRel, r);
62                 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
63                 graph.addMetadata(cm.add(ObjectUtils.toString("Marking " + NameUtils.getSafeLabel(graph, r) + " to " + NameUtils.getSafeName(graph, tagRel))));
64             }
65             return true;
66         } else if (!tag && isTagged) {
67             graph.deny(r, tagRel, tagRel, r);
68             CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
69             graph.addMetadata(cm.add(ObjectUtils.toString("Denying " + NameUtils.getSafeLabel(graph, r) + " to " + NameUtils.getSafeName(graph, tagRel))));
70             return true;
71         }
72
73         return false;
74     }
75
76 }