]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/extension/internal/ContributorExtensionManager.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.common / src / org / simantics / browsing / ui / common / extension / internal / ContributorExtensionManager.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.internal;\r
13 \r
14 import java.util.Arrays;\r
15 import java.util.HashSet;\r
16 import java.util.Set;\r
17 \r
18 import org.eclipse.core.runtime.CoreException;\r
19 import org.eclipse.core.runtime.IConfigurationElement;\r
20 import org.eclipse.core.runtime.IExtension;\r
21 import org.eclipse.core.runtime.IExtensionPoint;\r
22 import org.eclipse.core.runtime.Platform;\r
23 import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;\r
24 import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;\r
25 import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;\r
26 import org.eclipse.core.runtime.dynamichelpers.IFilter;\r
27 import org.simantics.browsing.ui.common.Activator;\r
28 import org.simantics.browsing.ui.common.ErrorLogger;\r
29 import org.simantics.browsing.ui.content.Contributor;\r
30 import org.simantics.utils.strings.StringUtils;\r
31 \r
32 /**\r
33  * @author Tuukka Lehtonen\r
34  */\r
35 public abstract class ContributorExtensionManager<Factory> implements IExtensionChangeHandler {\r
36 \r
37     private final static String                NAMESPACE    = Activator.PLUGIN_ID;\r
38 \r
39     private ExtensionTracker                   tracker;\r
40 \r
41     @SuppressWarnings("unchecked")\r
42     ContributorExtension<Factory>[]            extensions   = new ContributorExtension[0];\r
43 \r
44     abstract public String getExtensionPointName();\r
45 \r
46     ContributorExtensionManager() {\r
47         tracker = new ExtensionTracker();\r
48 \r
49         // Cache defined actions\r
50         IExtensionPoint expt = Platform.getExtensionRegistry().getExtensionPoint(NAMESPACE, getExtensionPointName());\r
51         loadExtensions(expt.getConfigurationElements());\r
52 \r
53         // Start tracking for new and removed extensions\r
54         IFilter filter = ExtensionTracker.createExtensionPointFilter(expt);\r
55         tracker.registerHandler(this, filter);\r
56     }\r
57 \r
58     @SuppressWarnings("unchecked")\r
59     void close() {\r
60         tracker.close();\r
61         tracker = null;\r
62         extensions = new ContributorExtension[0];\r
63     }\r
64 \r
65     public ContributorExtension<Factory>[] getExtensions() {\r
66         return extensions;\r
67     }\r
68 \r
69     @SuppressWarnings("unchecked")\r
70     private void loadExtensions(IConfigurationElement[] elements) {\r
71 \r
72         Set<ContributorExtension<Factory>> newExtensions = new HashSet<ContributorExtension<Factory>>(Arrays.asList(extensions));\r
73 \r
74         for (IConfigurationElement el : elements) {\r
75             try {\r
76 \r
77                 String id = StringUtils.safeString(el.getAttribute("id"));\r
78                 Contributor<Factory> factory = (Contributor<Factory>)el.createExecutableExtension("class");\r
79                 ContributorExtension<Factory> ext = new ContributorExtensionImpl<Factory>(id, factory);\r
80 \r
81                 // Start tracking the new extension object, its removal will be notified of\r
82                 // with removeExtension(extension, Object[]).\r
83                 tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG);\r
84 \r
85                 newExtensions.add(ext);\r
86             } catch (CoreException e) {\r
87                 ErrorLogger.defaultLogError("Failed to initialize " + getExtensionPointName() + " extension \"" + el.getName()\r
88                         + "\" with name \"" + el.getAttribute("name") + "\": "\r
89                         + e.getMessage(), e);\r
90             }\r
91         }\r
92 \r
93         // Atomic assignment\r
94         this.extensions = newExtensions.toArray(new ContributorExtension[newExtensions.size()]);\r
95     }\r
96 \r
97     @Override\r
98     public void addExtension(IExtensionTracker tracker, IExtension extension) {\r
99         loadExtensions(extension.getConfigurationElements());\r
100     }\r
101 \r
102     @SuppressWarnings("unchecked")\r
103     @Override\r
104     public void removeExtension(IExtension extension, Object[] objects) {\r
105         Set<ContributorExtension<Factory>> newExtensions = new HashSet<ContributorExtension<Factory>>(Arrays.asList(extensions));\r
106 \r
107         for (Object o : objects) {\r
108             tracker.unregisterObject(extension, o);\r
109             newExtensions.remove(o);\r
110         }\r
111 \r
112         // Atomic assignment\r
113         this.extensions = newExtensions.toArray(new ContributorExtension[newExtensions.size()]);\r
114     }\r
115 \r
116 }\r