]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/modelBrowser/model/Experiment.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / modelBrowser / model / Experiment.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.modeling.ui.modelBrowser.model;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 import java.util.List;\r
18 import java.util.function.Supplier;\r
19 \r
20 import org.eclipse.jface.resource.ImageDescriptor;\r
21 import org.simantics.browsing.ui.NodeContext;\r
22 import org.simantics.browsing.ui.common.node.DeleteException;\r
23 import org.simantics.browsing.ui.common.node.IModifiable;\r
24 import org.simantics.browsing.ui.common.node.IRefreshable;\r
25 import org.simantics.browsing.ui.content.Labeler.Modifier;\r
26 import org.simantics.browsing.ui.graph.impl.LabelModifier;\r
27 import org.simantics.browsing.ui.graph.impl.LabelerUtil;\r
28 import org.simantics.db.ReadGraph;\r
29 import org.simantics.db.Resource;\r
30 import org.simantics.db.Session;\r
31 import org.simantics.db.Statement;\r
32 import org.simantics.db.common.ResourceArray;\r
33 import org.simantics.db.common.request.ReadRequest;\r
34 import org.simantics.db.common.request.ResourceRead;\r
35 import org.simantics.db.exception.DatabaseException;\r
36 import org.simantics.db.procedure.Listener;\r
37 import org.simantics.db.request.Read;\r
38 import org.simantics.document.DocumentResource;\r
39 import org.simantics.modeling.ui.Activator;\r
40 import org.simantics.simulation.ontology.SimulationResource;\r
41 import org.simantics.utils.ui.ErrorLogger;\r
42 \r
43 @Deprecated\r
44 public class Experiment extends Node implements INode2, IPathNode, IRefreshable, IModifiable, IDisposable {\r
45 \r
46     private static final String PENDING = "pending...";\r
47 \r
48     private static final Supplier<Boolean> DEFAULT_IS_DISPOSED = () -> false;\r
49 \r
50     Supplier<Boolean> isDisposed = DEFAULT_IS_DISPOSED;\r
51 \r
52     ResourceArray model;\r
53     Session session;\r
54     String name = PENDING;\r
55     Collection<Object> children = Collections.emptyList();\r
56     Runnable nameUpdater;\r
57     Runnable childrenUpdater;\r
58 \r
59     public Experiment(ReadGraph graph, Resource experiment) {\r
60         super(experiment);\r
61         this.session = graph.getSession();\r
62     }\r
63 \r
64     @Override\r
65     public int getCategory(Runnable updater, NodeContext context) {\r
66         return 0;\r
67     }\r
68 \r
69     @Override\r
70     public Collection<?> getChildren(final Runnable updater, NodeContext context) {\r
71         childrenUpdater = updater;\r
72 \r
73         if (children != Collections.emptyList())\r
74             return children;\r
75 \r
76         session.asyncRequest(new ReadRequest() {\r
77             @Override\r
78             public void run(ReadGraph graph) throws DatabaseException {\r
79                 List<Object> result = new ArrayList<Object>();\r
80                 try {\r
81                     for (Statement factory : findReportFactories(graph)) {\r
82                         result.add(new ReportFactory(graph, factory));\r
83                     }\r
84                     children = result;\r
85                 } catch (DatabaseException e) {\r
86                     children = result;\r
87                 }\r
88                 updater.run();\r
89             }\r
90         });\r
91         return children;\r
92     }\r
93 \r
94     @Override\r
95     public ImageDescriptor getImage(Runnable updater, NodeContext context) {\r
96         return Activator.EXPERIMENT_ICON;\r
97     }\r
98 \r
99     @Override\r
100     public String getLabel(ReadGraph graph) throws DatabaseException {\r
101         String name = LabelerUtil.safeStringRepresentation(graph, resource);\r
102         Resource initialState = graph.getPossibleObject(resource, SimulationResource.getInstance(graph).HasInitialState);\r
103         if (initialState != null)\r
104             name += " (" + LabelerUtil.safeStringRepresentation(graph, initialState) + ")";\r
105         return name;\r
106     }\r
107 \r
108     Read<String> labelRequest(Resource resource) {\r
109         return new ResourceRead<String>(resource) {\r
110             @Override\r
111             public String perform(ReadGraph graph) throws DatabaseException {\r
112                 return getLabel(graph);\r
113             }\r
114         };\r
115     }\r
116 \r
117     private class NameListener implements Listener<String> {\r
118         private final Object identity;\r
119         private final Resource resource;\r
120 \r
121         public NameListener(Object identity, Resource resource) {\r
122             assert identity != null;\r
123             assert resource != null;\r
124             this.identity = identity;\r
125             this.resource = resource;\r
126         }\r
127 \r
128         @Override\r
129         public int hashCode() {\r
130             return identity.hashCode() + 31 * resource.hashCode();\r
131         }\r
132 \r
133         @Override\r
134         public boolean equals(Object obj) {\r
135             if (this == obj)\r
136                 return true;\r
137             if (obj == null)\r
138                 return false;\r
139             if (getClass() != obj.getClass())\r
140                 return false;\r
141             NameListener other = (NameListener) obj;\r
142             return identity.equals(other.identity) && resource.equals(other.resource);\r
143         }\r
144 \r
145         @Override\r
146         public void exception(Throwable t) {\r
147             ErrorLogger.defaultLogError(t);\r
148         }\r
149         @Override\r
150         public boolean isDisposed() {\r
151             return isDisposed.get();\r
152         }\r
153         @Override\r
154         public void execute(String result) {\r
155             name = result;\r
156             nameUpdater.run();\r
157         }\r
158     }\r
159 \r
160     @Override\r
161     public String getLabel(final Runnable updater, NodeContext context) {\r
162         nameUpdater = updater;\r
163         if (name != PENDING)\r
164             return name;\r
165 \r
166         session.asyncRequest(labelRequest(resource), new NameListener(nameUpdater, resource));\r
167         return name;\r
168     }\r
169 \r
170     @Override\r
171     public Modifier getModifier(String columnId) {\r
172         return new LabelModifier(session, resource) {\r
173             @Override\r
174             public void run(DatabaseException ex) {\r
175                 if (ex == null) {\r
176                     refreshName();\r
177                 } else {\r
178                     super.run(ex);\r
179                 }\r
180             }\r
181         };\r
182     }\r
183 \r
184     @Override\r
185     public boolean hasChildren(Runnable updater, NodeContext context) {\r
186         return getChildren(updater, context).size() > 0;\r
187     }\r
188 \r
189     @SuppressWarnings("rawtypes")\r
190     @Override\r
191     public Object getAdapter(Class adapter) {\r
192         return super.getAdapter(adapter);\r
193     }\r
194 \r
195     @Override\r
196     public void refresh() {\r
197         refreshName();\r
198         refreshChildren();\r
199     }\r
200 \r
201     public void refreshName() {\r
202         this.name = PENDING;\r
203         if (nameUpdater != null)\r
204             nameUpdater.run();\r
205     }\r
206 \r
207     public void refreshChildren() {\r
208         this.children = Collections.emptyList();\r
209         if (childrenUpdater != null)\r
210             childrenUpdater.run();\r
211     }\r
212 \r
213     Collection<Statement> findReportFactories(ReadGraph g) throws DatabaseException {\r
214         DocumentResource DOC = DocumentResource.getInstance(g);\r
215         return g.getStatements(resource, DOC.HasReportFactory);\r
216     }\r
217 \r
218     @Override\r
219     public void handleDelete() throws DeleteException {\r
220     }\r
221 \r
222     @Override\r
223     public void setPath(ResourceArray path) {\r
224         this.model = path;\r
225     }\r
226 \r
227     @Override\r
228     public ResourceArray getPath() {\r
229         return model;\r
230     }\r
231 \r
232     public Resource getModel() {\r
233         return model.size() == 0 ? null : model.resources[0];\r
234     }\r
235 \r
236     @Override\r
237     public void setDisposedCallable(Supplier<Boolean> isDisposed) {\r
238         this.isDisposed = isDisposed;\r
239     }\r
240 \r
241 }