KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > core > internal > runtime > AdapterManagerListener


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 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.core.internal.runtime;
12
13 import java.util.*;
14 import org.eclipse.core.runtime.*;
15
16 /**
17  * Portions of the AdapterManager that deal with the Eclipse extension registry
18  * were moved into this class.
19  *
20  * @since org.eclipse.core.runtime 3.2
21  */

22 public final class AdapterManagerListener implements IRegistryChangeListener, IAdapterManagerProvider {
23     public static final String JavaDoc ADAPTER_POINT_ID = "org.eclipse.core.runtime.adapters"; //$NON-NLS-1$
24

25     private AdapterManager theAdapterManager;
26
27     /**
28      * Constructs a new adapter manager.
29      */

30     public AdapterManagerListener() {
31         theAdapterManager = AdapterManager.getDefault();
32         theAdapterManager.registerLazyFactoryProvider(this);
33     }
34
35     /**
36      * Loads adapters registered with the adapters extension point from
37      * the plug-in registry. Note that the actual factory implementations
38      * are loaded lazily as they are needed.
39      */

40     public boolean addFactories(AdapterManager adapterManager) {
41         IExtensionPoint point = RegistryFactory.getRegistry().getExtensionPoint(ADAPTER_POINT_ID);
42         if (point == null)
43             return false;
44
45         boolean factoriesAdded = false;
46         IExtension[] extensions = point.getExtensions();
47         for (int i = 0; i < extensions.length; i++) {
48             IConfigurationElement[] elements = extensions[i].getConfigurationElements();
49             for (int j = 0; j < elements.length; j++) {
50                 AdapterFactoryProxy proxy = AdapterFactoryProxy.createProxy(elements[j]);
51                 if (proxy != null) {
52                     adapterManager.registerFactory(proxy, proxy.getAdaptableType());
53                     factoriesAdded = true;
54                 }
55             }
56         }
57         RegistryFactory.getRegistry().addRegistryChangeListener(this);
58         return factoriesAdded;
59     }
60
61     private void registerExtension(IExtension extension) {
62         IConfigurationElement[] elements = extension.getConfigurationElements();
63         for (int j = 0; j < elements.length; j++) {
64             AdapterFactoryProxy proxy = AdapterFactoryProxy.createProxy(elements[j]);
65             if (proxy != null)
66                 theAdapterManager.registerFactory(proxy, proxy.getAdaptableType());
67         }
68     }
69
70     /* (non-Javadoc)
71      * @see org.eclipse.core.runtime.IRegistryChangeListener#registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent)
72      */

73     public synchronized void registryChanged(IRegistryChangeEvent event) {
74         //find the set of changed adapter extensions
75
HashSet toRemove = null;
76         IExtensionDelta[] deltas = event.getExtensionDeltas();
77         boolean found = false;
78         for (int i = 0; i < deltas.length; i++) {
79             //we only care about extensions to the adapters extension point
80
if (!ADAPTER_POINT_ID.equals(deltas[i].getExtensionPoint().getUniqueIdentifier()))
81                 continue;
82             found = true;
83             if (deltas[i].getKind() == IExtensionDelta.ADDED)
84                 registerExtension(deltas[i].getExtension());
85             else {
86                 //create the hash set lazily
87
if (toRemove == null)
88                     toRemove = new HashSet();
89                 toRemove.add(deltas[i].getExtension().getUniqueIdentifier());
90             }
91         }
92         //need to discard cached state for the changed extensions
93
if (found)
94             theAdapterManager.flushLookup();
95         if (toRemove == null)
96             return;
97         //remove any factories belonging to extensions that are going away
98
for (Iterator it = theAdapterManager.getFactories().values().iterator(); it.hasNext();) {
99             for (Iterator it2 = ((List) it.next()).iterator(); it2.hasNext();) {
100                 IAdapterFactory factory = (IAdapterFactory) it2.next();
101                 if (factory instanceof AdapterFactoryProxy) {
102                     String JavaDoc ext = ((AdapterFactoryProxy) factory).getOwnerId();
103                     if (toRemove.contains(ext))
104                         it2.remove();
105                 }
106             }
107         }
108     }
109
110     /*
111      * Shuts down the listener by removing the registry change listener. Should only be
112      * invoked during platform shutdown.
113      */

114     public synchronized void stop() {
115         RegistryFactory.getRegistry().removeRegistryChangeListener(this);
116     }
117 }
118
Popular Tags