]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/extension/EvaluatorBindingExtensionManager.java
93e6d66e9d4b76799fd0fc7b9edaa74f212a79bc
[simantics/platform.git] / bundles / org.simantics.browsing.ui.common / src / org / simantics / browsing / ui / common / extension / EvaluatorBindingExtensionManager.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.common.extension;\r
13 \r
14 import java.util.Arrays;\r
15 import java.util.Collection;\r
16 import java.util.HashSet;\r
17 import java.util.Set;\r
18 \r
19 import org.eclipse.core.runtime.CoreException;\r
20 import org.eclipse.core.runtime.IConfigurationElement;\r
21 import org.eclipse.core.runtime.IExtension;\r
22 import org.eclipse.core.runtime.IExtensionPoint;\r
23 import org.eclipse.core.runtime.Platform;\r
24 import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;\r
25 import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;\r
26 import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;\r
27 import org.eclipse.core.runtime.dynamichelpers.IFilter;\r
28 import org.simantics.browsing.ui.common.Activator;\r
29 import org.simantics.browsing.ui.common.extension.internal.EvaluatorBindingExtension;\r
30 import org.simantics.browsing.ui.common.extension.internal.EvaluatorImplementationBinding;\r
31 import org.simantics.browsing.ui.common.extension.internal.EvaluatorReferenceBinding;\r
32 import org.simantics.utils.strings.StringUtils;\r
33 \r
34 /**\r
35  * @author Tuukka Lehtonen\r
36  */\r
37 public class EvaluatorBindingExtensionManager implements IExtensionChangeHandler {\r
38 \r
39     private final static String                NAMESPACE    = Activator.PLUGIN_ID;\r
40 \r
41     private final static String                EP_NAME      = "evaluatorBinding";\r
42 \r
43     private ExtensionTracker                   tracker;\r
44 \r
45     private EvaluatorBindingExtension[]            extensions   = new EvaluatorBindingExtension[0];\r
46 \r
47     private static EvaluatorBindingExtensionManager INSTANCE;\r
48 \r
49 \r
50     public static synchronized EvaluatorBindingExtensionManager getInstance() {\r
51         if (INSTANCE == null)\r
52             INSTANCE = new EvaluatorBindingExtensionManager();\r
53         return INSTANCE;\r
54     }\r
55 \r
56     public static synchronized void dispose() {\r
57         if (INSTANCE != null) {\r
58             INSTANCE.close();\r
59             INSTANCE = null;\r
60         }\r
61     }\r
62 \r
63 \r
64     private EvaluatorBindingExtensionManager() {\r
65         tracker = new ExtensionTracker();\r
66 \r
67         // Cache defined actions\r
68         IExtensionPoint expt = Platform.getExtensionRegistry().getExtensionPoint(NAMESPACE, EP_NAME);\r
69         loadExtensions(expt.getConfigurationElements());\r
70 \r
71         // Start tracking for new and removed extensions\r
72         IFilter filter = ExtensionTracker.createExtensionPointFilter(expt);\r
73         tracker.registerHandler(this, filter);\r
74     }\r
75 \r
76     private void close() {\r
77         tracker.close();\r
78         tracker = null;\r
79         extensions = new EvaluatorBindingExtension[0];\r
80     }\r
81 \r
82     public EvaluatorBindingExtension[] getExtensions() {\r
83         return extensions;\r
84     }\r
85 \r
86     private void loadExtensions(IConfigurationElement[] elements) {\r
87 \r
88         Set<EvaluatorBindingExtension> newExtensions = new HashSet<EvaluatorBindingExtension>(Arrays.asList(extensions));\r
89 \r
90         for (IConfigurationElement el : elements) {\r
91 \r
92             String browseContext = StringUtils.safeString(el.getAttribute("browseContext"));\r
93 \r
94             for(IConfigurationElement child : el.getChildren("reference")) {\r
95 \r
96                 String factoryId = StringUtils.safeString(child.getAttribute("id"));\r
97                 EvaluatorBindingExtension ext = new EvaluatorReferenceBinding(browseContext, factoryId);\r
98 \r
99                 // Start tracking the new extension object, its removal will be notified of\r
100                 // with removeExtension(extension, Object[]).\r
101                 tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG);\r
102 \r
103                 newExtensions.add(ext);\r
104 \r
105             }\r
106 \r
107             for(IConfigurationElement child : el.getChildren("implementation")) {\r
108 \r
109                 try {\r
110 \r
111                     EvaluatorFactory factory = (EvaluatorFactory)child.createExecutableExtension("class");\r
112                     EvaluatorBindingExtension ext = new EvaluatorImplementationBinding(browseContext, factory);\r
113 \r
114                     // Start tracking the new extension object, its removal will be notified of\r
115                     // with removeExtension(extension, Object[]).\r
116                     tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG);\r
117 \r
118                     newExtensions.add(ext);\r
119 \r
120                 } catch (CoreException e) {\r
121 \r
122                     System.out.println(" == Could not load ViewpointContributionFactory '" + child.getAttribute("class") + "' due to the following error: " + e.getMessage()  );\r
123 \r
124                 }\r
125 \r
126             }\r
127 \r
128         }\r
129 \r
130         // Atomic assignment\r
131         this.extensions = newExtensions.toArray(new EvaluatorBindingExtension[newExtensions.size()]);\r
132     }\r
133 \r
134     @Override\r
135     public void addExtension(IExtensionTracker tracker, IExtension extension) {\r
136         loadExtensions(extension.getConfigurationElements());\r
137     }\r
138 \r
139     @Override\r
140     public void removeExtension(IExtension extension, Object[] objects) {\r
141         Set<EvaluatorBindingExtension> newExtensions = new HashSet<EvaluatorBindingExtension>(Arrays.asList(extensions));\r
142 \r
143         for (Object o : objects) {\r
144             tracker.unregisterObject(extension, o);\r
145             newExtensions.remove(o);\r
146         }\r
147 \r
148         // Atomic assignment\r
149         this.extensions = newExtensions.toArray(new EvaluatorBindingExtension[newExtensions.size()]);\r
150     }\r
151 \r
152     public Collection<EvaluatorFactory> getBoundFactories(Set<String> browseContexts) {\r
153 \r
154 //        ArrayList<EvaluatorFactory> result = new ArrayList<EvaluatorFactory>();\r
155 //        for(EvaluatorBindingExtension binding : getExtensions()) {\r
156 //            if(browseContexts.contains(binding.browserId())) {\r
157 //                EvaluatorFactory factory = EvaluatorFactoryExtensionManager.getFactory(binding.factoryId());\r
158 //                result.add(factory);\r
159 //            }\r
160 //        }\r
161 //        return result;\r
162 \r
163         HashSet<EvaluatorFactory> result = new HashSet<EvaluatorFactory>();\r
164 \r
165         for(EvaluatorBindingExtension binding : getExtensions()) {\r
166             if(browseContexts.contains(binding.getBrowseContext())) {\r
167                 EvaluatorFactory factory = binding.getFactory();\r
168                 if(factory != null) {\r
169 //                    System.out.println("----------- Plugin contribution " + binding.getFactory());\r
170                     result.add(factory);\r
171                 } else {\r
172 //                    System.out.println("FAILED: ----------- No factory for " + binding);\r
173                 }\r
174 \r
175             }\r
176         }\r
177 \r
178         return result;\r
179 \r
180     }\r
181 \r
182 }\r