]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/Evaluators.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.browsing.ui.graph.impl / src / org / simantics / browsing / ui / graph / impl / Evaluators.java
index 58d3cf504b273ecdbc01d90b3a303f685f1ddc0a..b0e09381fb351108321409da8e3c7e6286d2716b 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.browsing.ui.graph.impl;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.eclipse.jface.resource.ResourceManager;\r
-import org.simantics.browsing.ui.BuiltinKeys.CheckedStateKey;\r
-import org.simantics.browsing.ui.BuiltinKeys.ImageDecoratorKey;\r
-import org.simantics.browsing.ui.BuiltinKeys.ImagerKey;\r
-import org.simantics.browsing.ui.BuiltinKeys.LabelDecoratorKey;\r
-import org.simantics.browsing.ui.BuiltinKeys.LabelerKey;\r
-import org.simantics.browsing.ui.BuiltinKeys.ViewpointKey;\r
-import org.simantics.browsing.ui.CheckedState;\r
-import org.simantics.browsing.ui.NodeContext;\r
-import org.simantics.browsing.ui.PrimitiveQueryUpdater;\r
-import org.simantics.browsing.ui.Tester;\r
-import org.simantics.browsing.ui.common.EvaluatorData;\r
-import org.simantics.browsing.ui.common.EvaluatorData.Evaluator;\r
-import org.simantics.browsing.ui.common.EvaluatorData.EvaluatorTree;\r
-import org.simantics.browsing.ui.common.EvaluatorDataImpl;\r
-import org.simantics.browsing.ui.common.EvaluatorImpl;\r
-import org.simantics.browsing.ui.common.exception.InvalidBrowserIdException;\r
-import org.simantics.browsing.ui.common.extension.CheckedStateContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.ComparableContextContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.EvaluatorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.EvaluatorFactory;\r
-import org.simantics.browsing.ui.common.extension.ImageDecoratorContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.ImagerContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.LabelDecoratorContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.LabelerContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.common.extension.ViewpointContributionContributorBindingExtensionManager;\r
-import org.simantics.browsing.ui.content.CheckedStateFactory;\r
-import org.simantics.browsing.ui.content.ComparableContextFactory;\r
-import org.simantics.browsing.ui.content.ContributorBinding;\r
-import org.simantics.browsing.ui.content.ImageDecorator;\r
-import org.simantics.browsing.ui.content.ImageDecoratorFactory;\r
-import org.simantics.browsing.ui.content.Imager;\r
-import org.simantics.browsing.ui.content.ImagerFactory;\r
-import org.simantics.browsing.ui.content.LabelDecorator;\r
-import org.simantics.browsing.ui.content.LabelDecoratorFactory;\r
-import org.simantics.browsing.ui.content.Labeler;\r
-import org.simantics.browsing.ui.content.LabelerFactory;\r
-import org.simantics.browsing.ui.content.Viewpoint;\r
-import org.simantics.browsing.ui.content.ViewpointContributionFactory;\r
-import org.simantics.browsing.ui.content.ViewpointFactory;\r
-import org.simantics.browsing.ui.model.InvalidContribution;\r
-import org.simantics.browsing.ui.model.browsecontexts.BrowseContext;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.RequestProcessor;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.request.ReadRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.exception.ResourceNotFoundException;\r
-\r
-/**\r
- * An entry point for loading an EvaluatorData in a data-oriented fashion. Also\r
- * adds contributions made by extensions of the related extension points.\r
- * \r
- * @author Antti Villberg\r
- */\r
-public class Evaluators {\r
-\r
-    public static final boolean DEBUG = false;\r
-\r
-    public static void create(EvaluatorData data, final ResourceManager resourceManager,\r
-            final Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions,\r
-            final Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions,\r
-            final Set<ContributorBinding<LabelerFactory>> labelerContributions,\r
-            final Set<ContributorBinding<CheckedStateFactory>> checkStateContributions,\r
-            final Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions,\r
-            final Set<ContributorBinding<ImagerFactory>> imagerContributions,\r
-            final Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions) {\r
-\r
-        Map<Class<?>, Evaluator> evaluators = new HashMap<Class<?>, Evaluator>();\r
-\r
-        HashMap<String, ContributionViewpointFactory> viewpointFactories = new HashMap<String, ContributionViewpointFactory>();\r
-\r
-        for(final Map.Entry<String, Collection<ContributorBinding<ViewpointContributionFactory>>> entry : viewpointContributions.entrySet()) {\r
-            Collection<ViewpointContributionFactory> factories = new ArrayList<ViewpointContributionFactory>();\r
-            for(ContributorBinding<ViewpointContributionFactory> binding : entry.getValue()) factories.add(binding.getContributor().getFactory());\r
-            viewpointFactories.put(entry.getKey(), new ContributionViewpointFactory(entry.getKey(), factories));\r
-        }\r
-\r
-        for(final Map.Entry<String, Collection<ContributorBinding<ViewpointContributionFactory>>> entry : viewpointContributions.entrySet()) {\r
-            ContributionViewpointFactory factory = viewpointFactories.get(entry.getKey());\r
-            for(ContributorBinding<ViewpointContributionFactory> binding : entry.getValue()) {\r
-                Tester test = binding.getContributor().getNodeContextTester();\r
-                Class<?> clazz = binding.getContributor().getInputClass();\r
-                Evaluator evaluator = evaluators.get(clazz);\r
-                if(evaluator == null) {\r
-                    evaluator = data.newEvaluator();\r
-                    evaluators.put(clazz, evaluator);\r
-                }\r
-                if(test == null) {\r
-                    if (DEBUG)\r
-                        System.out.println("add root viewpoint " + factory + " to class " + clazz.getSimpleName());\r
-                    evaluator.addViewpoint(factory, binding.getPreference());\r
-                } else {\r
-                    if (DEBUG)\r
-                        System.out.println("add viewpoint " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                    EvaluatorTree<ViewpointFactory> branch = ((EvaluatorImpl)evaluator).getViewpointTree().addBranch(test);\r
-                    branch.addFactory(factory, binding.getPreference());\r
-                }\r
-            }\r
-        }\r
-\r
-        for(final ContributorBinding<ComparableContextFactory> binding : comparableContextContributions) {\r
-\r
-            ComparableContextFactory factory = binding.getContributor().getFactory();\r
-            Tester test = binding.getContributor().getNodeContextTester();\r
-            Class<?> clazz = binding.getContributor().getInputClass();\r
-            Evaluator evaluator = evaluators.get(clazz);\r
-            if(evaluator == null) {\r
-                evaluator = data.newEvaluator();\r
-                evaluators.put(clazz, evaluator);\r
-            }\r
-            if(test == null) {\r
-                if (DEBUG)\r
-                    System.out.println("add root comparable context " + factory + " to class " + clazz.getSimpleName());\r
-                evaluator.addComparableContext(factory, binding.getPreference());\r
-            } else {\r
-                if (DEBUG)\r
-                    System.out.println("add comparable context " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                EvaluatorTree<ComparableContextFactory> branch = ((EvaluatorImpl)evaluator).getComparableContextTree().addBranch(test);\r
-                branch.addFactory(factory, binding.getPreference());\r
-            }\r
-        }\r
-\r
-        for(final ContributorBinding<LabelerFactory> binding : labelerContributions) {\r
-\r
-            LabelerFactory factory = binding.getContributor().getFactory();\r
-            Tester test = binding.getContributor().getNodeContextTester();\r
-            Class<?> clazz = binding.getContributor().getInputClass();\r
-            Evaluator evaluator = evaluators.get(clazz);\r
-            if(evaluator == null) {\r
-                evaluator = data.newEvaluator();\r
-                evaluators.put(clazz, evaluator);\r
-            }\r
-            if(test == null) {\r
-                if (DEBUG)\r
-                    System.out.println("add root labeler " + factory + " to class " + clazz.getSimpleName());\r
-                evaluator.addLabeler(factory, binding.getPreference());\r
-            } else {\r
-                if (DEBUG)\r
-                    System.out.println("add labeler " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                EvaluatorTree<LabelerFactory> branch = ((EvaluatorImpl)evaluator).getLabelerTree().addBranch(test);\r
-                branch.addFactory(factory, binding.getPreference());\r
-            }\r
-        }\r
-\r
-        for(final ContributorBinding<CheckedStateFactory> binding : checkStateContributions) {\r
-\r
-            CheckedStateFactory factory = binding.getContributor().getFactory();\r
-            Tester test = binding.getContributor().getNodeContextTester();\r
-            Class<?> clazz = binding.getContributor().getInputClass();\r
-            Evaluator evaluator = evaluators.get(clazz);\r
-            if(evaluator == null) {\r
-                evaluator = data.newEvaluator();\r
-                evaluators.put(clazz, evaluator);\r
-            }\r
-            if(test == null) {\r
-                if (DEBUG)\r
-                    System.out.println("add root check state " + factory + " to class " + clazz.getSimpleName());\r
-                evaluator.addCheckState(factory, binding.getPreference());\r
-            } else {\r
-                if (DEBUG)\r
-                    System.out.println("add check state " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                EvaluatorTree<CheckedStateFactory> branch = ((EvaluatorImpl)evaluator).getCheckStateTree().addBranch(test);\r
-                branch.addFactory(factory, binding.getPreference());\r
-            }\r
-        }\r
-\r
-        for(final ContributorBinding<LabelDecoratorFactory> binding : labelDecoratorContributions) {\r
-\r
-            LabelDecoratorFactory factory = binding.getContributor().getFactory();\r
-            Tester test = binding.getContributor().getNodeContextTester();\r
-            Class<?> clazz = binding.getContributor().getInputClass();\r
-            Evaluator evaluator = evaluators.get(clazz);\r
-            if(evaluator == null) {\r
-                evaluator = data.newEvaluator();\r
-                evaluators.put(clazz, evaluator);\r
-            }\r
-            if(test == null) {\r
-                if (DEBUG)\r
-                    System.out.println("add root label decorator " + factory + " to class " + clazz.getSimpleName());\r
-                evaluator.addLabelDecorator(factory, binding.getPreference());\r
-            } else {\r
-                if (DEBUG)\r
-                    System.out.println("add label decorator " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                EvaluatorTree<LabelDecoratorFactory> branch = ((EvaluatorImpl)evaluator).getLabelDecoratorTree().addBranch(test);\r
-                branch.addFactory(factory, binding.getPreference());\r
-            }\r
-        }\r
-\r
-        for(final ContributorBinding<ImagerFactory> binding : imagerContributions) {\r
-\r
-            ImagerFactory factory = binding.getContributor().getFactory();\r
-            Tester test = binding.getContributor().getNodeContextTester();\r
-            Class<?> clazz = binding.getContributor().getInputClass();\r
-            Evaluator evaluator = evaluators.get(clazz);\r
-            if(evaluator == null) {\r
-                evaluator = data.newEvaluator();\r
-                evaluators.put(clazz, evaluator);\r
-            }\r
-            if(test == null) {\r
-                if (DEBUG)\r
-                    System.out.println("add root imager " + factory + " to class " + clazz.getSimpleName());\r
-                evaluator.addImager(factory, binding.getPreference());\r
-            } else {\r
-                if (DEBUG)\r
-                    System.out.println("add imager " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                EvaluatorTree<ImagerFactory> branch = ((EvaluatorImpl)evaluator).getImagerTree().addBranch(test);\r
-                branch.addFactory(factory, binding.getPreference());\r
-            }\r
-        }\r
-\r
-        for(final ContributorBinding<ImageDecoratorFactory> binding : imageDecoratorContributions) {\r
-\r
-            ImageDecoratorFactory factory = binding.getContributor().getFactory();\r
-            Tester test = binding.getContributor().getNodeContextTester();\r
-            Class<?> clazz = binding.getContributor().getInputClass();\r
-            Evaluator evaluator = evaluators.get(clazz);\r
-            if(evaluator == null) {\r
-                evaluator = data.newEvaluator();\r
-                evaluators.put(clazz, evaluator);\r
-            }\r
-            if(test == null) {\r
-                if (DEBUG)\r
-                    System.out.println("add root image decorator " + factory + " to class " + clazz.getSimpleName());\r
-                evaluator.addImageDecorator(factory, binding.getPreference());\r
-            } else {\r
-                if (DEBUG)\r
-                    System.out.println("add image decorator " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);\r
-                EvaluatorTree<ImageDecoratorFactory> branch = ((EvaluatorImpl)evaluator).getImageDecoratorTree().addBranch(test);\r
-                branch.addFactory(factory, binding.getPreference());\r
-            }\r
-        }\r
-\r
-        for(Map.Entry<Class<?>, Evaluator> entry : evaluators.entrySet()) {\r
-            data.addEvaluator(entry.getKey(), entry.getValue());\r
-        }\r
-\r
-    }\r
-\r
-    /**\r
-     * @param processor\r
-     * @param browseContexts\r
-     * @param resourceManager\r
-     * @param data\r
-     * @return the URIs of the actual set of browse contexts loaded by this\r
-     *         method. If an included browse context resource has no URI, it\r
-     *         will not be included in this set.\r
-     */\r
-    public static Set<String> loadModelled(\r
-            RequestProcessor processor, \r
-            final Set<String> browseContexts, \r
-            final ResourceManager resourceManager,\r
-            final EvaluatorDataImpl data,\r
-            final boolean useNodeBrowseContexts,\r
-            final boolean useNodeActionContexts) {\r
-\r
-        final Set<String> allBrowseContexts = new HashSet<String>(browseContexts);\r
-\r
-        // Create evaluator\r
-        final EvaluatorImpl eval = new EvaluatorImpl();\r
-        data.addEvaluator(Object.class, eval);  \r
-        \r
-        try {\r
-\r
-            // Load data for evaluator\r
-            processor.syncRequest(new ReadRequest() {\r
-                \r
-                @Override\r
-                public void run(ReadGraph graph) throws DatabaseException {\r
-\r
-                    // Map browse context names to resources\r
-                    Collection<Resource> browseContextResources = new ArrayList<Resource>(browseContexts.size());\r
-                    for(String browseContext : browseContexts) {\r
-                        try {\r
-                            browseContextResources.add(graph.getResource(browseContext));\r
-                        } catch(ResourceNotFoundException e) {\r
-                            // Expected result, if no modelled contributions exist.\r
-                            //System.err.println("Didn't find " + browseContext + " while loading model browser.");\r
-                        } catch(DatabaseException e) {\r
-                            System.err.println("Didn't find " + browseContext + " while loading model browser.");\r
-                            e.printStackTrace();\r
-                        }\r
-                    }\r
-\r
-                    // Load browse context\r
-                    try {\r
-                        final BrowseContext browseContext = \r
-                            BrowseContext.create(graph, browseContextResources);\r
-                        \r
-                        data.setBrowseContext(browseContext);\r
-\r
-                        // Get URI's for all found browse contexts to fill return value\r
-                        for (Resource context : BrowseContext.findSubcontexts(graph, browseContextResources)) {\r
-                            String uri = graph.getPossibleURI(context);\r
-                            if (uri != null)\r
-                                allBrowseContexts.add(uri);\r
-                        }\r
-\r
-                        // Fill evaluator\r
-                        eval.addLabeler(new LabelerFactory() {\r
-                            @Override\r
-                            public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context,\r
-                                    LabelerKey key) {\r
-                                return new EvaluatorLabeler(updater, context, key, browseContext, useNodeBrowseContexts);\r
-                            }\r
-                        }, 0.0);\r
-\r
-                        eval.addImager(new ImagerFactory() {\r
-                            @Override\r
-                            public Imager create(PrimitiveQueryUpdater updater, NodeContext context,\r
-                                    ImagerKey key) {\r
-                                return new EvaluatorImager(updater, context, key, browseContext, useNodeBrowseContexts);\r
-                            }\r
-                        }, 0.0);\r
-\r
-                        eval.addCheckState(new CheckedStateFactory() {\r
-\r
-                            @Override\r
-                            public CheckedState create(PrimitiveQueryUpdater updater,\r
-                                    NodeContext context, CheckedStateKey key) {\r
-                                return new EvaluatorCheckedState(updater, context, key, browseContext, useNodeBrowseContexts).getState();\r
-                            }\r
-                        }, 0.0);\r
-\r
-                        eval.addLabelDecorator(new LabelDecoratorFactory() {\r
-                            @Override\r
-                            public LabelDecorator create(PrimitiveQueryUpdater updater,\r
-                                    NodeContext context, LabelDecoratorKey key) {\r
-                                return new EvaluatorLabelDecorator(updater, context, key, browseContext, useNodeBrowseContexts);\r
-                            }\r
-                        }, 0.0);\r
-\r
-                        eval.addImageDecorator(new ImageDecoratorFactory() {\r
-                            @Override\r
-                            public ImageDecorator create(PrimitiveQueryUpdater updater,\r
-                                    NodeContext context, ImageDecoratorKey key) {\r
-                                return new EvaluatorImageDecorator(updater, context, key, browseContext, useNodeBrowseContexts);\r
-                            }\r
-                        }, 0.0);\r
-\r
-                        eval.addViewpoint(new ViewpointFactory() {\r
-                            @Override\r
-                            public Viewpoint create(PrimitiveQueryUpdater updater, \r
-                                    final NodeContext context,\r
-                                    ViewpointKey key) {\r
-                                return new EvaluatorViewpoint(updater, context, key, browseContext, useNodeBrowseContexts, useNodeActionContexts);\r
-                            }\r
-                        }, 0.0);\r
-                    } catch (InvalidContribution e) {\r
-                        e.printStackTrace();\r
-                        return;\r
-                    }\r
-\r
-                }\r
-\r
-            });\r
-\r
-        } catch (DatabaseException e) {\r
-\r
-            e.printStackTrace();\r
-\r
-        }\r
-\r
-        return allBrowseContexts;\r
-    }\r
-\r
-    public static void loadExtensions(RequestProcessor processor, final Set<String> browseContexts, final ResourceManager resourceManager,\r
-            final Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions,\r
-            final Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions,\r
-            final Set<ContributorBinding<LabelerFactory>> labelerContributions,\r
-            final Set<ContributorBinding<CheckedStateFactory>> checkStateContributions,\r
-            final Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions,\r
-            final Set<ContributorBinding<ImagerFactory>> imagerContributions,\r
-            final Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions) {\r
-\r
-        for(ContributorBinding<ViewpointContributionFactory> binding : ViewpointContributionContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            String viewpointId = binding.getContributor().getFactory().getViewpointId();\r
-            Collection<ContributorBinding<ViewpointContributionFactory>> viewpoints = viewpointContributions.get(viewpointId);\r
-            if(viewpoints == null) {\r
-                viewpoints = new ArrayList<ContributorBinding<ViewpointContributionFactory>>();\r
-                viewpointContributions.put(viewpointId, viewpoints);\r
-            }\r
-            viewpoints.add(binding);\r
-        }\r
-\r
-        for(final ContributorBinding<ComparableContextFactory> binding : ComparableContextContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            comparableContextContributions.add(binding);\r
-        }\r
-\r
-        for(final ContributorBinding<LabelerFactory> binding : LabelerContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            labelerContributions.add(binding);\r
-        }\r
-\r
-        for(final ContributorBinding<CheckedStateFactory> binding : CheckedStateContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            checkStateContributions.add(binding);\r
-        }\r
-\r
-        for(final ContributorBinding<LabelDecoratorFactory> binding : LabelDecoratorContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            labelDecoratorContributions.add(binding);\r
-        }\r
-\r
-        for(final ContributorBinding<ImagerFactory> binding : ImagerContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            imagerContributions.add(binding);\r
-        }\r
-\r
-        for(final ContributorBinding<ImageDecoratorFactory> binding : ImageDecoratorContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {\r
-            imageDecoratorContributions.add(binding);\r
-        }\r
-\r
-    }\r
-\r
-    public static EvaluatorData load(RequestProcessor processor, Set<String> browseContexts, ResourceManager resourceManager) throws InvalidBrowserIdException {\r
-        return load(processor, browseContexts, resourceManager, false, false);\r
-    }\r
-\r
-    public static EvaluatorData load(RequestProcessor processor, Set<String> browseContexts, ResourceManager resourceManager, boolean useNodeBrowseContexts, boolean useNodeActionContexts) throws InvalidBrowserIdException {\r
-\r
-        Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions = new HashMap<String, Collection<ContributorBinding<ViewpointContributionFactory>>>();\r
-        Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions = new HashSet<ContributorBinding<ComparableContextFactory>>();\r
-        Set<ContributorBinding<LabelerFactory>> labelerContributions = new HashSet<ContributorBinding<LabelerFactory>>();\r
-        Set<ContributorBinding<CheckedStateFactory>> checkStateContributions = new HashSet<ContributorBinding<CheckedStateFactory>>();\r
-        Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions = new HashSet<ContributorBinding<LabelDecoratorFactory>>();\r
-        Set<ContributorBinding<ImagerFactory>> imagerContributions = new HashSet<ContributorBinding<ImagerFactory>>();\r
-        Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions = new HashSet<ContributorBinding<ImageDecoratorFactory>>();\r
-\r
-        EvaluatorDataImpl data = new EvaluatorDataImpl();\r
-\r
-        // Load modelled contributions\r
-        Set<String> allBrowseContexts = loadModelled(processor, browseContexts, resourceManager, data, useNodeBrowseContexts, useNodeActionContexts);\r
-\r
-        // Load extension point contributions\r
-        loadExtensions(processor, allBrowseContexts, resourceManager, viewpointContributions, comparableContextContributions, labelerContributions, checkStateContributions, labelDecoratorContributions, imagerContributions, imageDecoratorContributions);\r
-\r
-        // Create contributed evaluators\r
-        create(data, resourceManager, viewpointContributions, comparableContextContributions, labelerContributions, checkStateContributions, labelDecoratorContributions, imagerContributions, imageDecoratorContributions);\r
-\r
-        // Create plugin evaluators for the contexts\r
-        for(EvaluatorFactory factory : EvaluatorBindingExtensionManager.getInstance().getBoundFactories(allBrowseContexts)) {\r
-            data.addEvaluator(factory.getClazz(), factory.create(allBrowseContexts));\r
-        }\r
-\r
-        return data;\r
-\r
-    }\r
-    \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.browsing.ui.graph.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.resource.ResourceManager;
+import org.simantics.browsing.ui.BuiltinKeys.CheckedStateKey;
+import org.simantics.browsing.ui.BuiltinKeys.ImageDecoratorKey;
+import org.simantics.browsing.ui.BuiltinKeys.ImagerKey;
+import org.simantics.browsing.ui.BuiltinKeys.LabelDecoratorKey;
+import org.simantics.browsing.ui.BuiltinKeys.LabelerKey;
+import org.simantics.browsing.ui.BuiltinKeys.ViewpointKey;
+import org.simantics.browsing.ui.CheckedState;
+import org.simantics.browsing.ui.NodeContext;
+import org.simantics.browsing.ui.PrimitiveQueryUpdater;
+import org.simantics.browsing.ui.Tester;
+import org.simantics.browsing.ui.common.EvaluatorData;
+import org.simantics.browsing.ui.common.EvaluatorData.Evaluator;
+import org.simantics.browsing.ui.common.EvaluatorData.EvaluatorTree;
+import org.simantics.browsing.ui.common.EvaluatorDataImpl;
+import org.simantics.browsing.ui.common.EvaluatorImpl;
+import org.simantics.browsing.ui.common.exception.InvalidBrowserIdException;
+import org.simantics.browsing.ui.common.extension.CheckedStateContributorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.ComparableContextContributorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.EvaluatorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.EvaluatorFactory;
+import org.simantics.browsing.ui.common.extension.ImageDecoratorContributorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.ImagerContributorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.LabelDecoratorContributorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.LabelerContributorBindingExtensionManager;
+import org.simantics.browsing.ui.common.extension.ViewpointContributionContributorBindingExtensionManager;
+import org.simantics.browsing.ui.content.CheckedStateFactory;
+import org.simantics.browsing.ui.content.ComparableContextFactory;
+import org.simantics.browsing.ui.content.ContributorBinding;
+import org.simantics.browsing.ui.content.ImageDecorator;
+import org.simantics.browsing.ui.content.ImageDecoratorFactory;
+import org.simantics.browsing.ui.content.Imager;
+import org.simantics.browsing.ui.content.ImagerFactory;
+import org.simantics.browsing.ui.content.LabelDecorator;
+import org.simantics.browsing.ui.content.LabelDecoratorFactory;
+import org.simantics.browsing.ui.content.Labeler;
+import org.simantics.browsing.ui.content.LabelerFactory;
+import org.simantics.browsing.ui.content.Viewpoint;
+import org.simantics.browsing.ui.content.ViewpointContributionFactory;
+import org.simantics.browsing.ui.content.ViewpointFactory;
+import org.simantics.browsing.ui.model.InvalidContribution;
+import org.simantics.browsing.ui.model.browsecontexts.BrowseContext;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.RequestProcessor;
+import org.simantics.db.Resource;
+import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.exception.ResourceNotFoundException;
+
+/**
+ * An entry point for loading an EvaluatorData in a data-oriented fashion. Also
+ * adds contributions made by extensions of the related extension points.
+ * 
+ * @author Antti Villberg
+ */
+public class Evaluators {
+
+    public static final boolean DEBUG = false;
+
+    public static void create(EvaluatorData data, final ResourceManager resourceManager,
+            final Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions,
+            final Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions,
+            final Set<ContributorBinding<LabelerFactory>> labelerContributions,
+            final Set<ContributorBinding<CheckedStateFactory>> checkStateContributions,
+            final Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions,
+            final Set<ContributorBinding<ImagerFactory>> imagerContributions,
+            final Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions) {
+
+        Map<Class<?>, Evaluator> evaluators = new HashMap<Class<?>, Evaluator>();
+
+        HashMap<String, ContributionViewpointFactory> viewpointFactories = new HashMap<String, ContributionViewpointFactory>();
+
+        for(final Map.Entry<String, Collection<ContributorBinding<ViewpointContributionFactory>>> entry : viewpointContributions.entrySet()) {
+            Collection<ViewpointContributionFactory> factories = new ArrayList<ViewpointContributionFactory>();
+            for(ContributorBinding<ViewpointContributionFactory> binding : entry.getValue()) factories.add(binding.getContributor().getFactory());
+            viewpointFactories.put(entry.getKey(), new ContributionViewpointFactory(entry.getKey(), factories));
+        }
+
+        for(final Map.Entry<String, Collection<ContributorBinding<ViewpointContributionFactory>>> entry : viewpointContributions.entrySet()) {
+            ContributionViewpointFactory factory = viewpointFactories.get(entry.getKey());
+            for(ContributorBinding<ViewpointContributionFactory> binding : entry.getValue()) {
+                Tester test = binding.getContributor().getNodeContextTester();
+                Class<?> clazz = binding.getContributor().getInputClass();
+                Evaluator evaluator = evaluators.get(clazz);
+                if(evaluator == null) {
+                    evaluator = data.newEvaluator();
+                    evaluators.put(clazz, evaluator);
+                }
+                if(test == null) {
+                    if (DEBUG)
+                        System.out.println("add root viewpoint " + factory + " to class " + clazz.getSimpleName());
+                    evaluator.addViewpoint(factory, binding.getPreference());
+                } else {
+                    if (DEBUG)
+                        System.out.println("add viewpoint " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                    EvaluatorTree<ViewpointFactory> branch = ((EvaluatorImpl)evaluator).getViewpointTree().addBranch(test);
+                    branch.addFactory(factory, binding.getPreference());
+                }
+            }
+        }
+
+        for(final ContributorBinding<ComparableContextFactory> binding : comparableContextContributions) {
+
+            ComparableContextFactory factory = binding.getContributor().getFactory();
+            Tester test = binding.getContributor().getNodeContextTester();
+            Class<?> clazz = binding.getContributor().getInputClass();
+            Evaluator evaluator = evaluators.get(clazz);
+            if(evaluator == null) {
+                evaluator = data.newEvaluator();
+                evaluators.put(clazz, evaluator);
+            }
+            if(test == null) {
+                if (DEBUG)
+                    System.out.println("add root comparable context " + factory + " to class " + clazz.getSimpleName());
+                evaluator.addComparableContext(factory, binding.getPreference());
+            } else {
+                if (DEBUG)
+                    System.out.println("add comparable context " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                EvaluatorTree<ComparableContextFactory> branch = ((EvaluatorImpl)evaluator).getComparableContextTree().addBranch(test);
+                branch.addFactory(factory, binding.getPreference());
+            }
+        }
+
+        for(final ContributorBinding<LabelerFactory> binding : labelerContributions) {
+
+            LabelerFactory factory = binding.getContributor().getFactory();
+            Tester test = binding.getContributor().getNodeContextTester();
+            Class<?> clazz = binding.getContributor().getInputClass();
+            Evaluator evaluator = evaluators.get(clazz);
+            if(evaluator == null) {
+                evaluator = data.newEvaluator();
+                evaluators.put(clazz, evaluator);
+            }
+            if(test == null) {
+                if (DEBUG)
+                    System.out.println("add root labeler " + factory + " to class " + clazz.getSimpleName());
+                evaluator.addLabeler(factory, binding.getPreference());
+            } else {
+                if (DEBUG)
+                    System.out.println("add labeler " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                EvaluatorTree<LabelerFactory> branch = ((EvaluatorImpl)evaluator).getLabelerTree().addBranch(test);
+                branch.addFactory(factory, binding.getPreference());
+            }
+        }
+
+        for(final ContributorBinding<CheckedStateFactory> binding : checkStateContributions) {
+
+            CheckedStateFactory factory = binding.getContributor().getFactory();
+            Tester test = binding.getContributor().getNodeContextTester();
+            Class<?> clazz = binding.getContributor().getInputClass();
+            Evaluator evaluator = evaluators.get(clazz);
+            if(evaluator == null) {
+                evaluator = data.newEvaluator();
+                evaluators.put(clazz, evaluator);
+            }
+            if(test == null) {
+                if (DEBUG)
+                    System.out.println("add root check state " + factory + " to class " + clazz.getSimpleName());
+                evaluator.addCheckState(factory, binding.getPreference());
+            } else {
+                if (DEBUG)
+                    System.out.println("add check state " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                EvaluatorTree<CheckedStateFactory> branch = ((EvaluatorImpl)evaluator).getCheckStateTree().addBranch(test);
+                branch.addFactory(factory, binding.getPreference());
+            }
+        }
+
+        for(final ContributorBinding<LabelDecoratorFactory> binding : labelDecoratorContributions) {
+
+            LabelDecoratorFactory factory = binding.getContributor().getFactory();
+            Tester test = binding.getContributor().getNodeContextTester();
+            Class<?> clazz = binding.getContributor().getInputClass();
+            Evaluator evaluator = evaluators.get(clazz);
+            if(evaluator == null) {
+                evaluator = data.newEvaluator();
+                evaluators.put(clazz, evaluator);
+            }
+            if(test == null) {
+                if (DEBUG)
+                    System.out.println("add root label decorator " + factory + " to class " + clazz.getSimpleName());
+                evaluator.addLabelDecorator(factory, binding.getPreference());
+            } else {
+                if (DEBUG)
+                    System.out.println("add label decorator " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                EvaluatorTree<LabelDecoratorFactory> branch = ((EvaluatorImpl)evaluator).getLabelDecoratorTree().addBranch(test);
+                branch.addFactory(factory, binding.getPreference());
+            }
+        }
+
+        for(final ContributorBinding<ImagerFactory> binding : imagerContributions) {
+
+            ImagerFactory factory = binding.getContributor().getFactory();
+            Tester test = binding.getContributor().getNodeContextTester();
+            Class<?> clazz = binding.getContributor().getInputClass();
+            Evaluator evaluator = evaluators.get(clazz);
+            if(evaluator == null) {
+                evaluator = data.newEvaluator();
+                evaluators.put(clazz, evaluator);
+            }
+            if(test == null) {
+                if (DEBUG)
+                    System.out.println("add root imager " + factory + " to class " + clazz.getSimpleName());
+                evaluator.addImager(factory, binding.getPreference());
+            } else {
+                if (DEBUG)
+                    System.out.println("add imager " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                EvaluatorTree<ImagerFactory> branch = ((EvaluatorImpl)evaluator).getImagerTree().addBranch(test);
+                branch.addFactory(factory, binding.getPreference());
+            }
+        }
+
+        for(final ContributorBinding<ImageDecoratorFactory> binding : imageDecoratorContributions) {
+
+            ImageDecoratorFactory factory = binding.getContributor().getFactory();
+            Tester test = binding.getContributor().getNodeContextTester();
+            Class<?> clazz = binding.getContributor().getInputClass();
+            Evaluator evaluator = evaluators.get(clazz);
+            if(evaluator == null) {
+                evaluator = data.newEvaluator();
+                evaluators.put(clazz, evaluator);
+            }
+            if(test == null) {
+                if (DEBUG)
+                    System.out.println("add root image decorator " + factory + " to class " + clazz.getSimpleName());
+                evaluator.addImageDecorator(factory, binding.getPreference());
+            } else {
+                if (DEBUG)
+                    System.out.println("add image decorator " + factory + " to class " + clazz.getSimpleName() + " with tester " + test);
+                EvaluatorTree<ImageDecoratorFactory> branch = ((EvaluatorImpl)evaluator).getImageDecoratorTree().addBranch(test);
+                branch.addFactory(factory, binding.getPreference());
+            }
+        }
+
+        for(Map.Entry<Class<?>, Evaluator> entry : evaluators.entrySet()) {
+            data.addEvaluator(entry.getKey(), entry.getValue());
+        }
+
+    }
+
+    /**
+     * @param processor
+     * @param browseContexts
+     * @param resourceManager
+     * @param data
+     * @return the URIs of the actual set of browse contexts loaded by this
+     *         method. If an included browse context resource has no URI, it
+     *         will not be included in this set.
+     */
+    public static Set<String> loadModelled(
+            RequestProcessor processor, 
+            final Set<String> browseContexts, 
+            final ResourceManager resourceManager,
+            final EvaluatorDataImpl data,
+            final boolean useNodeBrowseContexts,
+            final boolean useNodeActionContexts) {
+
+        final Set<String> allBrowseContexts = new HashSet<String>(browseContexts);
+
+        // Create evaluator
+        final EvaluatorImpl eval = new EvaluatorImpl();
+        data.addEvaluator(Object.class, eval);  
+        
+        try {
+
+            // Load data for evaluator
+            processor.syncRequest(new ReadRequest() {
+                
+                @Override
+                public void run(ReadGraph graph) throws DatabaseException {
+
+                    // Map browse context names to resources
+                    Collection<Resource> browseContextResources = new ArrayList<Resource>(browseContexts.size());
+                    for(String browseContext : browseContexts) {
+                        try {
+                            browseContextResources.add(graph.getResource(browseContext));
+                        } catch(ResourceNotFoundException e) {
+                            // Expected result, if no modelled contributions exist.
+                            //System.err.println("Didn't find " + browseContext + " while loading model browser.");
+                        } catch(DatabaseException e) {
+                            System.err.println("Didn't find " + browseContext + " while loading model browser.");
+                            e.printStackTrace();
+                        }
+                    }
+
+                    // Load browse context
+                    try {
+                        final BrowseContext browseContext = 
+                            BrowseContext.create(graph, browseContextResources);
+                        
+                        data.setBrowseContext(browseContext);
+
+                        // Get URI's for all found browse contexts to fill return value
+                        for (Resource context : BrowseContext.findSubcontexts(graph, browseContextResources)) {
+                            String uri = graph.getPossibleURI(context);
+                            if (uri != null)
+                                allBrowseContexts.add(uri);
+                        }
+
+                        // Fill evaluator
+                        eval.addLabeler(new LabelerFactory() {
+                            @Override
+                            public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context,
+                                    LabelerKey key) {
+                                return new EvaluatorLabeler(updater, context, key, browseContext, useNodeBrowseContexts);
+                            }
+                        }, 0.0);
+
+                        eval.addImager(new ImagerFactory() {
+                            @Override
+                            public Imager create(PrimitiveQueryUpdater updater, NodeContext context,
+                                    ImagerKey key) {
+                                return new EvaluatorImager(updater, context, key, browseContext, useNodeBrowseContexts);
+                            }
+                        }, 0.0);
+
+                        eval.addCheckState(new CheckedStateFactory() {
+
+                            @Override
+                            public CheckedState create(PrimitiveQueryUpdater updater,
+                                    NodeContext context, CheckedStateKey key) {
+                                return new EvaluatorCheckedState(updater, context, key, browseContext, useNodeBrowseContexts).getState();
+                            }
+                        }, 0.0);
+
+                        eval.addLabelDecorator(new LabelDecoratorFactory() {
+                            @Override
+                            public LabelDecorator create(PrimitiveQueryUpdater updater,
+                                    NodeContext context, LabelDecoratorKey key) {
+                                return new EvaluatorLabelDecorator(updater, context, key, browseContext, useNodeBrowseContexts);
+                            }
+                        }, 0.0);
+
+                        eval.addImageDecorator(new ImageDecoratorFactory() {
+                            @Override
+                            public ImageDecorator create(PrimitiveQueryUpdater updater,
+                                    NodeContext context, ImageDecoratorKey key) {
+                                return new EvaluatorImageDecorator(updater, context, key, browseContext, useNodeBrowseContexts);
+                            }
+                        }, 0.0);
+
+                        eval.addViewpoint(new ViewpointFactory() {
+                            @Override
+                            public Viewpoint create(PrimitiveQueryUpdater updater, 
+                                    final NodeContext context,
+                                    ViewpointKey key) {
+                                return new EvaluatorViewpoint(updater, context, key, browseContext, useNodeBrowseContexts, useNodeActionContexts);
+                            }
+                        }, 0.0);
+                    } catch (InvalidContribution e) {
+                        e.printStackTrace();
+                        return;
+                    }
+
+                }
+
+            });
+
+        } catch (DatabaseException e) {
+
+            e.printStackTrace();
+
+        }
+
+        return allBrowseContexts;
+    }
+
+    public static void loadExtensions(RequestProcessor processor, final Set<String> browseContexts, final ResourceManager resourceManager,
+            final Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions,
+            final Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions,
+            final Set<ContributorBinding<LabelerFactory>> labelerContributions,
+            final Set<ContributorBinding<CheckedStateFactory>> checkStateContributions,
+            final Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions,
+            final Set<ContributorBinding<ImagerFactory>> imagerContributions,
+            final Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions) {
+
+        for(ContributorBinding<ViewpointContributionFactory> binding : ViewpointContributionContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            String viewpointId = binding.getContributor().getFactory().getViewpointId();
+            Collection<ContributorBinding<ViewpointContributionFactory>> viewpoints = viewpointContributions.get(viewpointId);
+            if(viewpoints == null) {
+                viewpoints = new ArrayList<ContributorBinding<ViewpointContributionFactory>>();
+                viewpointContributions.put(viewpointId, viewpoints);
+            }
+            viewpoints.add(binding);
+        }
+
+        for(final ContributorBinding<ComparableContextFactory> binding : ComparableContextContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            comparableContextContributions.add(binding);
+        }
+
+        for(final ContributorBinding<LabelerFactory> binding : LabelerContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            labelerContributions.add(binding);
+        }
+
+        for(final ContributorBinding<CheckedStateFactory> binding : CheckedStateContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            checkStateContributions.add(binding);
+        }
+
+        for(final ContributorBinding<LabelDecoratorFactory> binding : LabelDecoratorContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            labelDecoratorContributions.add(binding);
+        }
+
+        for(final ContributorBinding<ImagerFactory> binding : ImagerContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            imagerContributions.add(binding);
+        }
+
+        for(final ContributorBinding<ImageDecoratorFactory> binding : ImageDecoratorContributorBindingExtensionManager.getInstance().getBoundContributions(browseContexts)) {
+            imageDecoratorContributions.add(binding);
+        }
+
+    }
+
+    public static EvaluatorData load(RequestProcessor processor, Set<String> browseContexts, ResourceManager resourceManager) throws InvalidBrowserIdException {
+        return load(processor, browseContexts, resourceManager, false, false);
+    }
+
+    public static EvaluatorData load(RequestProcessor processor, Set<String> browseContexts, ResourceManager resourceManager, boolean useNodeBrowseContexts, boolean useNodeActionContexts) throws InvalidBrowserIdException {
+
+        Map<String, Collection<ContributorBinding<ViewpointContributionFactory>>> viewpointContributions = new HashMap<String, Collection<ContributorBinding<ViewpointContributionFactory>>>();
+        Set<ContributorBinding<ComparableContextFactory>> comparableContextContributions = new HashSet<ContributorBinding<ComparableContextFactory>>();
+        Set<ContributorBinding<LabelerFactory>> labelerContributions = new HashSet<ContributorBinding<LabelerFactory>>();
+        Set<ContributorBinding<CheckedStateFactory>> checkStateContributions = new HashSet<ContributorBinding<CheckedStateFactory>>();
+        Set<ContributorBinding<LabelDecoratorFactory>> labelDecoratorContributions = new HashSet<ContributorBinding<LabelDecoratorFactory>>();
+        Set<ContributorBinding<ImagerFactory>> imagerContributions = new HashSet<ContributorBinding<ImagerFactory>>();
+        Set<ContributorBinding<ImageDecoratorFactory>> imageDecoratorContributions = new HashSet<ContributorBinding<ImageDecoratorFactory>>();
+
+        EvaluatorDataImpl data = new EvaluatorDataImpl();
+
+        // Load modelled contributions
+        Set<String> allBrowseContexts = loadModelled(processor, browseContexts, resourceManager, data, useNodeBrowseContexts, useNodeActionContexts);
+
+        // Load extension point contributions
+        loadExtensions(processor, allBrowseContexts, resourceManager, viewpointContributions, comparableContextContributions, labelerContributions, checkStateContributions, labelDecoratorContributions, imagerContributions, imageDecoratorContributions);
+
+        // Create contributed evaluators
+        create(data, resourceManager, viewpointContributions, comparableContextContributions, labelerContributions, checkStateContributions, labelDecoratorContributions, imagerContributions, imageDecoratorContributions);
+
+        // Create plugin evaluators for the contexts
+        for(EvaluatorFactory factory : EvaluatorBindingExtensionManager.getInstance().getBoundFactories(allBrowseContexts)) {
+            data.addEvaluator(factory.getClazz(), factory.create(allBrowseContexts));
+        }
+
+        return data;
+
+    }
+    
+}