]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/contribution/FinalLabelerContributionImpl.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.graph.impl / src / org / simantics / browsing / ui / graph / impl / contribution / FinalLabelerContributionImpl.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.browsing.ui.graph.impl.contribution;\r
13 \r
14 import java.util.Collections;\r
15 import java.util.Map;\r
16 \r
17 import org.simantics.Simantics;\r
18 import org.simantics.browsing.ui.BuiltinKeys;\r
19 import org.simantics.browsing.ui.BuiltinKeys.LabelerKey;\r
20 import org.simantics.browsing.ui.DataSource;\r
21 import org.simantics.browsing.ui.GraphExplorer.ModificationContext;\r
22 import org.simantics.browsing.ui.NodeContext;\r
23 import org.simantics.browsing.ui.PrimitiveQueryUpdater;\r
24 import org.simantics.browsing.ui.common.labelers.LabelerContent;\r
25 import org.simantics.browsing.ui.common.labelers.LabelerStub;\r
26 import org.simantics.browsing.ui.common.node.IModifiableNode;\r
27 import org.simantics.browsing.ui.graph.impl.request.ResourceQuery;\r
28 import org.simantics.db.ReadGraph;\r
29 import org.simantics.db.UndoContext;\r
30 import org.simantics.db.common.utils.Logger;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.db.layer0.exception.InvalidVariableException;\r
33 import org.simantics.db.layer0.exception.PendingVariableException;\r
34 import org.simantics.db.procedure.Listener;\r
35 import org.simantics.db.procedure.Procedure;\r
36 import org.simantics.db.request.Read;\r
37 import org.simantics.utils.ui.ErrorLogger;\r
38 \r
39 public abstract class FinalLabelerContributionImpl extends LabelerStub {\r
40 \r
41     protected final PrimitiveQueryUpdater       updater;\r
42     private final ResourceQuery<LabelerContent> labelQuery;\r
43 \r
44     final protected NodeContext                context;\r
45     final private BuiltinKeys.LabelerKey    key;\r
46 \r
47     public Object getIdentity(LabelerKey key) {\r
48         return key;\r
49     }\r
50 \r
51     public FinalLabelerContributionImpl(final PrimitiveQueryUpdater updater, final NodeContext context, final LabelerKey key) {\r
52 \r
53         this.updater = updater;\r
54         this.context = context;\r
55         this.key = key;\r
56 \r
57         labelQuery = new ResourceQuery<LabelerContent>(getIdentity(key), context) {\r
58 \r
59             @Override\r
60             public LabelerContent perform(ReadGraph graph) throws DatabaseException {\r
61                 try {\r
62                     int cat = category(graph, context);\r
63                     Map<String, String> lbls = labels(graph, context);\r
64                     // Make sure that null is not returned.\r
65                     if (lbls == null)\r
66                         throw new NullPointerException("FinalLabelerContributionImpl.labels is not allowed to return null, but " + FinalLabelerContributionImpl.this.getClass() + " just did it");\r
67                     return new LabelerContent(cat, lbls);\r
68                 } catch (PendingVariableException e) {\r
69                     return LabelerContent.NO_CONTENT;\r
70                 } catch (InvalidVariableException e) {\r
71                     //ErrorLogger.defaultLogError("FinalLabelerContributionImpl.labelQuery failed due to invalid variable.", e);\r
72                     return LabelerContent.NO_CONTENT;\r
73                 } catch (DatabaseException e) {\r
74                     throw e;\r
75                 } catch (Throwable t) {\r
76                     ErrorLogger.defaultLogError("FinalLabelerContributionImpl.labelQuery produced unexpected exception.", t);\r
77                     return LabelerContent.NO_CONTENT;\r
78                 }\r
79             }\r
80 \r
81             @Override\r
82             public String toString() {\r
83                 return FinalLabelerContributionImpl.this + " with context " + context;\r
84             }\r
85 \r
86         };\r
87 \r
88     }\r
89 \r
90     protected Procedure<LabelerContent> createProcedure() {\r
91 \r
92         return new Procedure<LabelerContent>() {\r
93 \r
94             @Override\r
95             public void execute(LabelerContent result) {\r
96                 replaceResult(result);\r
97             }\r
98 \r
99             @Override\r
100             public void exception(Throwable t) {\r
101                 ErrorLogger.defaultLogError("FinalLabelerContributionImpl.labelQuery failed, see exception for details.", t);\r
102             }\r
103 \r
104         };\r
105 \r
106     }\r
107 \r
108     protected void replaceResult(LabelerContent result) {\r
109         setContent(result);\r
110         updater.scheduleReplace(context, key, this);\r
111     }\r
112 \r
113     @Override\r
114     public Map<String, String> getLabels() {\r
115 \r
116         if (content == LabelerContent.NO_CONTENT) {\r
117 \r
118             final DataSource<ReadGraph> source = updater.getDataSource(ReadGraph.class);\r
119             assert(source != null);\r
120 \r
121             final Procedure<LabelerContent> procedure = createProcedure();\r
122             \r
123             source.schedule(graph -> {\r
124                 if(procedure instanceof Listener<?>)\r
125                     graph.asyncRequest(labelQuery, (Listener<LabelerContent>)procedure);\r
126                 else\r
127                     graph.asyncRequest(labelQuery, procedure);\r
128             });\r
129 \r
130         }\r
131 \r
132         if(content == null) return Collections.emptyMap();\r
133 \r
134         return content.labels;\r
135 \r
136     }\r
137 \r
138     @Override\r
139     public Modifier getModifier(final ModificationContext modificationContext, final String columnKey) {\r
140         \r
141         Object obj = context.getConstant(BuiltinKeys.INPUT);\r
142         if (obj instanceof IModifiableNode) {\r
143             return ((IModifiableNode) obj).getModifier(columnKey);\r
144         }\r
145         try {\r
146                         return Simantics.getSession().syncRequest(new Read<Modifier>() {\r
147 \r
148                                 @Override\r
149                                 public Modifier perform(ReadGraph graph) throws DatabaseException {\r
150                                     UndoContext undoContext = null == modificationContext ? null :\r
151                                         (UndoContext)modificationContext.getAdapter(UndoContext.class);\r
152                                         return FinalLabelerContributionImpl.this.getModifier(graph, undoContext, context, columnKey);\r
153                                 }\r
154                                 \r
155                         });\r
156                 } catch (DatabaseException e) {\r
157                         Logger.defaultLogError(e);\r
158                         return null;\r
159                 }\r
160         \r
161     }\r
162 \r
163     // OVERRIDE\r
164 \r
165     public Modifier getModifier(ReadGraph graph, UndoContext undoContext, NodeContext context, String columnKey) throws DatabaseException {\r
166         return null;\r
167     }\r
168 \r
169     public abstract Map<String, String> labels(ReadGraph graph, NodeContext context) throws DatabaseException;\r
170 \r
171     public abstract int category(ReadGraph graph, NodeContext context) throws DatabaseException;\r
172 \r
173 }\r