KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > ui > internal > components > registry > ExtensionPointManager


1 /*******************************************************************************
2  * Copyright (c) 2004, 2005 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.ui.internal.components.registry;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.Collection JavaDoc;
15 import java.util.HashMap JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Map JavaDoc;
19
20 import org.eclipse.core.runtime.IExtension;
21 import org.eclipse.core.runtime.IExtensionDelta;
22 import org.eclipse.core.runtime.IExtensionPoint;
23 import org.eclipse.core.runtime.IRegistryChangeEvent;
24 import org.eclipse.core.runtime.IRegistryChangeListener;
25 import org.eclipse.core.runtime.Platform;
26 import org.osgi.framework.Bundle;
27
28 /**
29  * @since 3.1
30  */

31 public class ExtensionPointManager {
32     
33     private String JavaDoc namespace;
34     private Map JavaDoc monitors = new HashMap JavaDoc();
35     private IRegistryChangeListener listener = new IRegistryChangeListener() {
36
37         public void registryChanged(IRegistryChangeEvent event) {
38             IExtensionDelta[] deltas = event.getExtensionDeltas();
39             
40             for (int i = 0; i < deltas.length; i++) {
41                 IExtensionDelta delta = deltas[i];
42                 
43                 // Ignore extension points for other plugins
44
IExtensionPoint point = delta.getExtensionPoint();
45                 if (!point.getNamespace().equals(namespace)) {
46                     continue;
47                 }
48                 
49                 String JavaDoc extensionPoint = point.getSimpleIdentifier();
50                 
51                 List JavaDoc listeners = (List JavaDoc)monitors.get(extensionPoint);
52                 if (listeners != null) {
53                     for (Iterator JavaDoc iter = listeners.iterator(); iter.hasNext();) {
54                         IExtensionPointMonitor monitor = (IExtensionPointMonitor) iter.next();
55                         
56                         notifyMonitor(monitor, delta.getExtension(), delta.getKind());
57                     }
58                 }
59             }
60         }
61         
62     };
63     
64     private static void notifyMonitor(IExtensionPointMonitor monitor, IExtension extension, int kind) {
65         if (kind == IExtensionDelta.ADDED) {
66             monitor.added(extension);
67         } else if (kind == IExtensionDelta.REMOVED) {
68             monitor.removed(extension);
69         }
70     }
71     
72     public ExtensionPointManager(Bundle bundle) {
73         this.namespace = bundle.getSymbolicName();
74         Platform.getExtensionRegistry().addRegistryChangeListener(listener);
75     }
76     
77     /**
78      * Cleans up this object
79      *
80      * @since 3.1
81      */

82     public void dispose() {
83         Collection JavaDoc extensionPoints = monitors.keySet();
84         for (Iterator JavaDoc iter = extensionPoints.iterator(); iter.hasNext();) {
85             String JavaDoc pointId = (String JavaDoc) iter.next();
86             
87             List JavaDoc listeners = (List JavaDoc)monitors.get(pointId);
88             
89             for (Iterator JavaDoc iter2 = listeners.iterator(); iter2.hasNext();) {
90                 IExtensionPointMonitor monitor = (IExtensionPointMonitor) iter2.next();
91                 
92                 loadExtensionPoint(pointId, monitor, IExtensionDelta.REMOVED);
93             }
94         }
95         
96         Platform.getExtensionRegistry().removeRegistryChangeListener(listener);
97     }
98     
99     /**
100      * Adds the given monitor. The monitor will be notified about all extensions that extend the
101      * given extension point.
102      *
103      * @param extensionPoint
104      * @param newMonitor
105      * @since 3.1
106      */

107     public void addMonitor(String JavaDoc extensionPoint, IExtensionPointMonitor newMonitor) {
108         List JavaDoc listeners = (List JavaDoc)monitors.get(extensionPoint);
109         
110         if (listeners == null) {
111             listeners = new ArrayList JavaDoc();
112         }
113         
114         if (listeners.contains(newMonitor)) {
115             return;
116         }
117         
118         listeners.add(newMonitor);
119         loadExtensionPoint(extensionPoint, newMonitor, IExtensionDelta.ADDED);
120     }
121     
122     /**
123      * Removes the monitor. oldMonitor.removed(...) will be called for
124      * any extension on which oldMonitor.added(...) had previously been called.
125      *
126      * @param extensionPoint
127      * @param oldMonitor
128      * @since 3.1
129      */

130     public void removeMonitor(String JavaDoc extensionPoint, IExtensionPointMonitor oldMonitor) {
131         List JavaDoc listeners = (List JavaDoc)monitors.get(extensionPoint);
132         
133         if (listeners == null) {
134             return;
135         }
136         
137         if (!listeners.contains(oldMonitor)) {
138             return;
139         }
140         
141         listeners.remove(oldMonitor);
142         if (listeners.isEmpty()) {
143             monitors.remove(extensionPoint);
144         }
145         
146         loadExtensionPoint(extensionPoint, oldMonitor, IExtensionDelta.REMOVED);
147     }
148     
149     private void loadExtensionPoint(String JavaDoc pointId, IExtensionPointMonitor monitor, int kind) {
150         
151         // Parse the extension point to construct a factory for all services
152
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(namespace, pointId);
153         
154         IExtension[] extensions = extensionPoint.getExtensions();
155         for (int i = 0; i < extensions.length; i++) {
156             IExtension extension = extensions[i];
157
158             notifyMonitor(monitor, extension, kind);
159         }
160     }
161     
162 }
163
Popular Tags