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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.browsing.ui.graph.impl;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
16 import java.util.HashMap;
\r
17 import java.util.HashSet;
\r
18 import java.util.Map;
\r
19 import java.util.Set;
\r
21 import org.eclipse.jface.resource.ResourceManager;
\r
22 import org.simantics.browsing.ui.BuiltinKeys.CheckedStateKey;
\r
23 import org.simantics.browsing.ui.BuiltinKeys.ImageDecoratorKey;
\r
24 import org.simantics.browsing.ui.BuiltinKeys.ImagerKey;
\r
25 import org.simantics.browsing.ui.BuiltinKeys.LabelDecoratorKey;
\r
26 import org.simantics.browsing.ui.BuiltinKeys.LabelerKey;
\r
27 import org.simantics.browsing.ui.BuiltinKeys.ViewpointKey;
\r
28 import org.simantics.browsing.ui.CheckedState;
\r
29 import org.simantics.browsing.ui.NodeContext;
\r
30 import org.simantics.browsing.ui.PrimitiveQueryUpdater;
\r
31 import org.simantics.browsing.ui.Tester;
\r
32 import org.simantics.browsing.ui.common.EvaluatorData;
\r
33 import org.simantics.browsing.ui.common.EvaluatorData.Evaluator;
\r
34 import org.simantics.browsing.ui.common.EvaluatorData.EvaluatorTree;
\r
35 import org.simantics.browsing.ui.common.EvaluatorDataImpl;
\r
36 import org.simantics.browsing.ui.common.EvaluatorImpl;
\r
37 import org.simantics.browsing.ui.common.exception.InvalidBrowserIdException;
\r
38 import org.simantics.browsing.ui.common.extension.CheckedStateContributorBindingExtensionManager;
\r
39 import org.simantics.browsing.ui.common.extension.ComparableContextContributorBindingExtensionManager;
\r
40 import org.simantics.browsing.ui.common.extension.EvaluatorBindingExtensionManager;
\r
41 import org.simantics.browsing.ui.common.extension.EvaluatorFactory;
\r
42 import org.simantics.browsing.ui.common.extension.ImageDecoratorContributorBindingExtensionManager;
\r
43 import org.simantics.browsing.ui.common.extension.ImagerContributorBindingExtensionManager;
\r
44 import org.simantics.browsing.ui.common.extension.LabelDecoratorContributorBindingExtensionManager;
\r
45 import org.simantics.browsing.ui.common.extension.LabelerContributorBindingExtensionManager;
\r
46 import org.simantics.browsing.ui.common.extension.ViewpointContributionContributorBindingExtensionManager;
\r
47 import org.simantics.browsing.ui.content.CheckedStateFactory;
\r
48 import org.simantics.browsing.ui.content.ComparableContextFactory;
\r
49 import org.simantics.browsing.ui.content.ContributorBinding;
\r
50 import org.simantics.browsing.ui.content.ImageDecorator;
\r
51 import org.simantics.browsing.ui.content.ImageDecoratorFactory;
\r
52 import org.simantics.browsing.ui.content.Imager;
\r
53 import org.simantics.browsing.ui.content.ImagerFactory;
\r
54 import org.simantics.browsing.ui.content.LabelDecorator;
\r
55 import org.simantics.browsing.ui.content.LabelDecoratorFactory;
\r
56 import org.simantics.browsing.ui.content.Labeler;
\r
57 import org.simantics.browsing.ui.content.LabelerFactory;
\r
58 import org.simantics.browsing.ui.content.Viewpoint;
\r
59 import org.simantics.browsing.ui.content.ViewpointContributionFactory;
\r
60 import org.simantics.browsing.ui.content.ViewpointFactory;
\r
61 import org.simantics.browsing.ui.model.InvalidContribution;
\r
62 import org.simantics.browsing.ui.model.browsecontexts.BrowseContext;
\r
63 import org.simantics.db.ReadGraph;
\r
64 import org.simantics.db.RequestProcessor;
\r
65 import org.simantics.db.Resource;
\r
66 import org.simantics.db.common.request.ReadRequest;
\r
67 import org.simantics.db.exception.DatabaseException;
\r
68 import org.simantics.db.exception.ResourceNotFoundException;
\r
71 * An entry point for loading an EvaluatorData in a data-oriented fashion. Also
\r
72 * adds contributions made by extensions of the related extension points.
\r
74 * @author Antti Villberg
\r
76 public class Evaluators {
\r
78 public static final boolean DEBUG = false;
\r
80 public static void create(EvaluatorData data, final ResourceManager resourceManager,
\r
81 final Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions,
\r
82 final Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions,
\r
83 final Set<ContributorBinding<LabelerFactory>> labelerContributions,
\r
84 final Set<ContributorBinding<CheckedStateFactory>> checkStateContributions,
\r
85 final Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions,
\r
86 final Set<ContributorBinding<ImagerFactory>> imagerContributions,
\r
87 final Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions) {
\r
89 Map<Class<?>, Evaluator> evaluators = new HashMap<Class<?>, Evaluator>();
\r
91 HashMap<String, ContributionViewpointFactory> viewpointFactories = new HashMap<String, ContributionViewpointFactory>();
\r
93 for(final Map.Entry<String, Collection<ContributorBinding<ViewpointContributionFactory>>> entry : viewpointContributions.entrySet()) {
\r
94 Collection<ViewpointContributionFactory> factories = new ArrayList<ViewpointContributionFactory>();
\r
95 for(ContributorBinding<ViewpointContributionFactory> binding : entry.getValue()) factories.add(binding.getContributor().getFactory());
\r
96 viewpointFactories.put(entry.getKey(), new ContributionViewpointFactory(entry.getKey(), factories));
\r
99 for(final Map.Entry<String, Collection<ContributorBinding<ViewpointContributionFactory>>> entry : viewpointContributions.entrySet()) {
\r
100 ContributionViewpointFactory factory = viewpointFactories.get(entry.getKey());
\r
101 for(ContributorBinding<ViewpointContributionFactory> binding : entry.getValue()) {
\r
102 Tester test = binding.getContributor().getNodeContextTester();
\r
103 Class<?> clazz = binding.getContributor().getInputClass();
\r
104 Evaluator evaluator = evaluators.get(clazz);
\r
105 if(evaluator == null) {
\r
106 evaluator = data.newEvaluator();
\r
107 evaluators.put(clazz, evaluator);
\r
111 System.out.println("add root viewpoint " + factory + " to class " + clazz.getSimpleName());
\r
112 evaluator.addViewpoint(factory, binding.getPreference());
\r
115 System.out.println("add viewpoint " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
116 EvaluatorTree<ViewpointFactory> branch = ((EvaluatorImpl)evaluator).getViewpointTree().addBranch(test);
\r
117 branch.addFactory(factory, binding.getPreference());
\r
122 for(final ContributorBinding<ComparableContextFactory> binding : comparableContextContributions) {
\r
124 ComparableContextFactory factory = binding.getContributor().getFactory();
\r
125 Tester test = binding.getContributor().getNodeContextTester();
\r
126 Class<?> clazz = binding.getContributor().getInputClass();
\r
127 Evaluator evaluator = evaluators.get(clazz);
\r
128 if(evaluator == null) {
\r
129 evaluator = data.newEvaluator();
\r
130 evaluators.put(clazz, evaluator);
\r
134 System.out.println("add root comparable context " + factory + " to class " + clazz.getSimpleName());
\r
135 evaluator.addComparableContext(factory, binding.getPreference());
\r
138 System.out.println("add comparable context " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
139 EvaluatorTree<ComparableContextFactory> branch = ((EvaluatorImpl)evaluator).getComparableContextTree().addBranch(test);
\r
140 branch.addFactory(factory, binding.getPreference());
\r
144 for(final ContributorBinding<LabelerFactory> binding : labelerContributions) {
\r
146 LabelerFactory factory = binding.getContributor().getFactory();
\r
147 Tester test = binding.getContributor().getNodeContextTester();
\r
148 Class<?> clazz = binding.getContributor().getInputClass();
\r
149 Evaluator evaluator = evaluators.get(clazz);
\r
150 if(evaluator == null) {
\r
151 evaluator = data.newEvaluator();
\r
152 evaluators.put(clazz, evaluator);
\r
156 System.out.println("add root labeler " + factory + " to class " + clazz.getSimpleName());
\r
157 evaluator.addLabeler(factory, binding.getPreference());
\r
160 System.out.println("add labeler " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
161 EvaluatorTree<LabelerFactory> branch = ((EvaluatorImpl)evaluator).getLabelerTree().addBranch(test);
\r
162 branch.addFactory(factory, binding.getPreference());
\r
166 for(final ContributorBinding<CheckedStateFactory> binding : checkStateContributions) {
\r
168 CheckedStateFactory factory = binding.getContributor().getFactory();
\r
169 Tester test = binding.getContributor().getNodeContextTester();
\r
170 Class<?> clazz = binding.getContributor().getInputClass();
\r
171 Evaluator evaluator = evaluators.get(clazz);
\r
172 if(evaluator == null) {
\r
173 evaluator = data.newEvaluator();
\r
174 evaluators.put(clazz, evaluator);
\r
178 System.out.println("add root check state " + factory + " to class " + clazz.getSimpleName());
\r
179 evaluator.addCheckState(factory, binding.getPreference());
\r
182 System.out.println("add check state " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
183 EvaluatorTree<CheckedStateFactory> branch = ((EvaluatorImpl)evaluator).getCheckStateTree().addBranch(test);
\r
184 branch.addFactory(factory, binding.getPreference());
\r
188 for(final ContributorBinding<LabelDecoratorFactory> binding : labelDecoratorContributions) {
\r
190 LabelDecoratorFactory factory = binding.getContributor().getFactory();
\r
191 Tester test = binding.getContributor().getNodeContextTester();
\r
192 Class<?> clazz = binding.getContributor().getInputClass();
\r
193 Evaluator evaluator = evaluators.get(clazz);
\r
194 if(evaluator == null) {
\r
195 evaluator = data.newEvaluator();
\r
196 evaluators.put(clazz, evaluator);
\r
200 System.out.println("add root label decorator " + factory + " to class " + clazz.getSimpleName());
\r
201 evaluator.addLabelDecorator(factory, binding.getPreference());
\r
204 System.out.println("add label decorator " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
205 EvaluatorTree<LabelDecoratorFactory> branch = ((EvaluatorImpl)evaluator).getLabelDecoratorTree().addBranch(test);
\r
206 branch.addFactory(factory, binding.getPreference());
\r
210 for(final ContributorBinding<ImagerFactory> binding : imagerContributions) {
\r
212 ImagerFactory factory = binding.getContributor().getFactory();
\r
213 Tester test = binding.getContributor().getNodeContextTester();
\r
214 Class<?> clazz = binding.getContributor().getInputClass();
\r
215 Evaluator evaluator = evaluators.get(clazz);
\r
216 if(evaluator == null) {
\r
217 evaluator = data.newEvaluator();
\r
218 evaluators.put(clazz, evaluator);
\r
222 System.out.println("add root imager " + factory + " to class " + clazz.getSimpleName());
\r
223 evaluator.addImager(factory, binding.getPreference());
\r
226 System.out.println("add imager " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
227 EvaluatorTree<ImagerFactory> branch = ((EvaluatorImpl)evaluator).getImagerTree().addBranch(test);
\r
228 branch.addFactory(factory, binding.getPreference());
\r
232 for(final ContributorBinding<ImageDecoratorFactory> binding : imageDecoratorContributions) {
\r
234 ImageDecoratorFactory factory = binding.getContributor().getFactory();
\r
235 Tester test = binding.getContributor().getNodeContextTester();
\r
236 Class<?> clazz = binding.getContributor().getInputClass();
\r
237 Evaluator evaluator = evaluators.get(clazz);
\r
238 if(evaluator == null) {
\r
239 evaluator = data.newEvaluator();
\r
240 evaluators.put(clazz, evaluator);
\r
244 System.out.println("add root image decorator " + factory + " to class " + clazz.getSimpleName());
\r
245 evaluator.addImageDecorator(factory, binding.getPreference());
\r
248 System.out.println("add image decorator " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
\r
249 EvaluatorTree<ImageDecoratorFactory> branch = ((EvaluatorImpl)evaluator).getImageDecoratorTree().addBranch(test);
\r
250 branch.addFactory(factory, binding.getPreference());
\r
254 for(Map.Entry<Class<?>, Evaluator> entry : evaluators.entrySet()) {
\r
255 data.addEvaluator(entry.getKey(), entry.getValue());
\r
262 * @param browseContexts
\r
263 * @param resourceManager
\r
265 * @return the URIs of the actual set of browse contexts loaded by this
\r
266 * method. If an included browse context resource has no URI, it
\r
267 * will not be included in this set.
\r
269 public static Set<String> loadModelled(
\r
270 RequestProcessor processor,
\r
271 final Set<String> browseContexts,
\r
272 final ResourceManager resourceManager,
\r
273 final EvaluatorDataImpl data,
\r
274 final boolean useNodeBrowseContexts,
\r
275 final boolean useNodeActionContexts) {
\r
277 final Set<String> allBrowseContexts = new HashSet<String>(browseContexts);
\r
279 // Create evaluator
\r
280 final EvaluatorImpl eval = new EvaluatorImpl();
\r
281 data.addEvaluator(Object.class, eval);
\r
285 // Load data for evaluator
\r
286 processor.syncRequest(new ReadRequest() {
\r
289 public void run(ReadGraph graph) throws DatabaseException {
\r
291 // Map browse context names to resources
\r
292 Collection<Resource> browseContextResources = new ArrayList<Resource>(browseContexts.size());
\r
293 for(String browseContext : browseContexts) {
\r
295 browseContextResources.add(graph.getResource(browseContext));
\r
296 } catch(ResourceNotFoundException e) {
\r
297 // Expected result, if no modelled contributions exist.
\r
298 //System.err.println("Didn't find " + browseContext + " while loading model browser.");
\r
299 } catch(DatabaseException e) {
\r
300 System.err.println("Didn't find " + browseContext + " while loading model browser.");
\r
301 e.printStackTrace();
\r
305 // Load browse context
\r
307 final BrowseContext browseContext =
\r
308 BrowseContext.create(graph, browseContextResources);
\r
310 data.setBrowseContext(browseContext);
\r
312 // Get URI's for all found browse contexts to fill return value
\r
313 for (Resource context : BrowseContext.findSubcontexts(graph, browseContextResources)) {
\r
314 String uri = graph.getPossibleURI(context);
\r
316 allBrowseContexts.add(uri);
\r
320 eval.addLabeler(new LabelerFactory() {
\r
322 public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context,
\r
324 return new EvaluatorLabeler(updater, context, key, browseContext, useNodeBrowseContexts);
\r
328 eval.addImager(new ImagerFactory() {
\r
330 public Imager create(PrimitiveQueryUpdater updater, NodeContext context,
\r
332 return new EvaluatorImager(updater, context, key, browseContext, useNodeBrowseContexts);
\r
336 eval.addCheckState(new CheckedStateFactory() {
\r
339 public CheckedState create(PrimitiveQueryUpdater updater,
\r
340 NodeContext context, CheckedStateKey key) {
\r
341 return new EvaluatorCheckedState(updater, context, key, browseContext, useNodeBrowseContexts).getState();
\r
345 eval.addLabelDecorator(new LabelDecoratorFactory() {
\r
347 public LabelDecorator create(PrimitiveQueryUpdater updater,
\r
348 NodeContext context, LabelDecoratorKey key) {
\r
349 return new EvaluatorLabelDecorator(updater, context, key, browseContext, useNodeBrowseContexts);
\r
353 eval.addImageDecorator(new ImageDecoratorFactory() {
\r
355 public ImageDecorator create(PrimitiveQueryUpdater updater,
\r
356 NodeContext context, ImageDecoratorKey key) {
\r
357 return new EvaluatorImageDecorator(updater, context, key, browseContext, useNodeBrowseContexts);
\r
361 eval.addViewpoint(new ViewpointFactory() {
\r
363 public Viewpoint create(PrimitiveQueryUpdater updater,
\r
364 final NodeContext context,
\r
365 ViewpointKey key) {
\r
366 return new EvaluatorViewpoint(updater, context, key, browseContext, useNodeBrowseContexts, useNodeActionContexts);
\r
369 } catch (InvalidContribution e) {
\r
370 e.printStackTrace();
\r
378 } catch (DatabaseException e) {
\r
380 e.printStackTrace();
\r
384 return allBrowseContexts;
\r
387 public static void loadExtensions(RequestProcessor processor, final Set<String> browseContexts, final ResourceManager resourceManager,
\r
388 final Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions,
\r
389 final Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions,
\r
390 final Set<ContributorBinding<LabelerFactory>> labelerContributions,
\r
391 final Set<ContributorBinding<CheckedStateFactory>> checkStateContributions,
\r
392 final Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions,
\r
393 final Set<ContributorBinding<ImagerFactory>> imagerContributions,
\r
394 final Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions) {
\r
396 for(ContributorBinding<ViewpointContributionFactory> binding : ViewpointContributionContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
397 String viewpointId = binding.getContributor().getFactory().getViewpointId();
\r
398 Collection<ContributorBinding<ViewpointContributionFactory>> viewpoints = viewpointContributions.get(viewpointId);
\r
399 if(viewpoints == null) {
\r
400 viewpoints = new ArrayList<ContributorBinding<ViewpointContributionFactory>>();
\r
401 viewpointContributions.put(viewpointId, viewpoints);
\r
403 viewpoints.add(binding);
\r
406 for(final ContributorBinding<ComparableContextFactory> binding : ComparableContextContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
407 comparableContextContributions.add(binding);
\r
410 for(final ContributorBinding<LabelerFactory> binding : LabelerContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
411 labelerContributions.add(binding);
\r
414 for(final ContributorBinding<CheckedStateFactory> binding : CheckedStateContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
415 checkStateContributions.add(binding);
\r
418 for(final ContributorBinding<LabelDecoratorFactory> binding : LabelDecoratorContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
419 labelDecoratorContributions.add(binding);
\r
422 for(final ContributorBinding<ImagerFactory> binding : ImagerContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
423 imagerContributions.add(binding);
\r
426 for(final ContributorBinding<ImageDecoratorFactory> binding : ImageDecoratorContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
\r
427 imageDecoratorContributions.add(binding);
\r
432 public static EvaluatorData load(RequestProcessor processor, Set<String> browseContexts, ResourceManager resourceManager) throws InvalidBrowserIdException {
\r
433 return load(processor, browseContexts, resourceManager, false, false);
\r
436 public static EvaluatorData load(RequestProcessor processor, Set<String> browseContexts, ResourceManager resourceManager, boolean useNodeBrowseContexts, boolean useNodeActionContexts) throws InvalidBrowserIdException {
\r
438 Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions = new HashMap<String, Collection<ContributorBinding<ViewpointContributionFactory>>>();
\r
439 Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions = new HashSet<ContributorBinding<ComparableContextFactory>>();
\r
440 Set<ContributorBinding<LabelerFactory>> labelerContributions = new HashSet<ContributorBinding<LabelerFactory>>();
\r
441 Set<ContributorBinding<CheckedStateFactory>> checkStateContributions = new HashSet<ContributorBinding<CheckedStateFactory>>();
\r
442 Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions = new HashSet<ContributorBinding<LabelDecoratorFactory>>();
\r
443 Set<ContributorBinding<ImagerFactory>> imagerContributions = new HashSet<ContributorBinding<ImagerFactory>>();
\r
444 Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions = new HashSet<ContributorBinding<ImageDecoratorFactory>>();
\r
446 EvaluatorDataImpl data = new EvaluatorDataImpl();
\r
448 // Load modelled contributions
\r
449 Set<String> allBrowseContexts = loadModelled(processor, browseContexts, resourceManager, data, useNodeBrowseContexts, useNodeActionContexts);
\r
451 // Load extension point contributions
\r
452 loadExtensions(processor, allBrowseContexts, resourceManager, viewpointContributions, comparableContextContributions, labelerContributions, checkStateContributions, labelDecoratorContributions, imagerContributions, imageDecoratorContributions);
\r
454 // Create contributed evaluators
\r
455 create(data, resourceManager, viewpointContributions, comparableContextContributions, labelerContributions, checkStateContributions, labelDecoratorContributions, imagerContributions, imageDecoratorContributions);
\r
457 // Create plugin evaluators for the contexts
\r
458 for(EvaluatorFactory factory : EvaluatorBindingExtensionManager.getInstance().getBoundFactories(allBrowseContexts)) {
\r
459 data.addEvaluator(factory.getClazz(), factory.create(allBrowseContexts));
\r