KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > java > plugin > registry > xml > PluginRegistryImpl


1 /*****************************************************************************
2  * Java Plug-in Framework (JPF)
3  * Copyright (C) 2004-2007 Dmitry Olshansky
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *****************************************************************************/

19 package org.java.plugin.registry.xml;
20
21 import java.net.URL JavaDoc;
22 import java.util.Collection JavaDoc;
23 import java.util.Collections JavaDoc;
24 import java.util.HashMap JavaDoc;
25 import java.util.HashSet JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.LinkedList JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.Map JavaDoc;
30 import java.util.Set JavaDoc;
31 import java.util.Map.Entry;
32
33 import org.apache.commons.logging.Log;
34 import org.apache.commons.logging.LogFactory;
35 import org.java.plugin.PathResolver;
36 import org.java.plugin.registry.Extension;
37 import org.java.plugin.registry.ExtensionPoint;
38 import org.java.plugin.registry.IntegrityCheckReport;
39 import org.java.plugin.registry.ManifestProcessingException;
40 import org.java.plugin.registry.PluginDescriptor;
41 import org.java.plugin.registry.PluginFragment;
42 import org.java.plugin.registry.PluginPrerequisite;
43 import org.java.plugin.registry.PluginRegistry;
44 import org.java.plugin.registry.Version;
45 import org.java.plugin.registry.IntegrityCheckReport.ReportItem;
46 import org.java.plugin.registry.xml.IntegrityChecker.ReportItemImpl;
47 import org.java.plugin.util.ExtendedProperties;
48
49 /**
50  * This is an implementation of plug-in registry of XML syntax plug-in
51  * manifests. Manifests should be prepared according to
52  * <a HREF="{@docRoot}/../plugin_1_0.dtd">plug-in DTD</a>.
53  * <p>
54  * <b>Configuration parameters</b>
55  * <p>
56  * This registry implementation supports following configuration parameters:
57  * <dl>
58  * <dt>isValidating</dt>
59  * <dd>Regulates is registry should use validating parser when loading
60  * plug-in manifests. The default parameter value is <code>true</code>.</dd>
61  * <dt>stopOnError</dt>
62  * <dd>Regulates is registry should stop and throw RuntimeException if an
63  * error occurred while {@link PluginRegistry#register(URL[]) registering}
64  * or {@link PluginRegistry#unregister(String[]) un-registering} plug-ins.
65  * If this is <code>false</code>, the registration errors will be stored
66  * in the internal report that is available with
67  * {@link PluginRegistry#checkIntegrity(PathResolver)} method.
68  * The default parameter value is <code>false</code>.</dd>
69  * </dl>
70  *
71  * @see org.java.plugin.ObjectFactory#createRegistry()
72  *
73  * @version $Id: PluginRegistryImpl.java,v 1.17 2007/01/05 14:05:23 ddimon Exp $
74  */

75 public final class PluginRegistryImpl implements PluginRegistry {
76     static final String JavaDoc PACKAGE_NAME = "org.java.plugin.registry.xml"; //$NON-NLS-1$
77
private static final char UNIQUE_SEPARATOR = '@';
78     private static final Log log = LogFactory.getLog(PluginRegistryImpl.class);
79
80     private final List JavaDoc registrationReport = new LinkedList JavaDoc(); // <ReportItemImpl>
81
private final Map JavaDoc registeredPlugins = new HashMap JavaDoc(); // <pluginId, PluginDescriptorImpl>
82
private final Map JavaDoc registeredFragments = new HashMap JavaDoc(); // <fragmentId, PluginFragmentImpl>
83
private final List JavaDoc listeners = Collections.synchronizedList(new LinkedList JavaDoc()); // <EventListener>
84
private ManifestParser manifestParser;
85     private boolean stopOnError = false;
86     
87     /**
88      * Creates plug-in registry object.
89      */

90     public PluginRegistryImpl() {
91         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
92                 null, ReportItem.ERROR_NO_ERROR, "registryStart", null)); //$NON-NLS-1$
93
}
94
95     /**
96      * @see org.java.plugin.registry.PluginRegistry#configure(
97      * ExtendedProperties)
98      */

99     public void configure(final ExtendedProperties config) {
100         stopOnError = "true".equalsIgnoreCase( //$NON-NLS-1$
101
config.getProperty("stopOnError", "false")); //$NON-NLS-1$ //$NON-NLS-2$
102
boolean isValidating = !"false".equalsIgnoreCase( //$NON-NLS-1$
103
config.getProperty("isValidating", "true")); //$NON-NLS-1$ //$NON-NLS-2$
104
manifestParser = new ManifestParser(isValidating);
105         log.info("configured, stopOnError=" + stopOnError //$NON-NLS-1$
106
+ ", isValidating=" + isValidating); //$NON-NLS-1$
107
}
108     
109     /**
110      * @see org.java.plugin.registry.PluginRegistry#readManifestInfo(
111      * java.net.URL)
112      */

113     public ManifestInfo readManifestInfo(final URL JavaDoc url)
114             throws ManifestProcessingException {
115         try {
116             return new ManifestInfoImpl(manifestParser.parseManifestInfo(url));
117         } catch (Exception JavaDoc e) {
118             throw new ManifestProcessingException(PACKAGE_NAME,
119                         "manifestParsingError", url, e); //$NON-NLS-1$
120
}
121     }
122
123     /**
124      * General algorithm:
125      * <ol>
126      * <li>Collect all currently registered extension points.</li>
127      * <li>Parse given URL's as XML content files and separate them on plug-in
128      * and plug-in fragment descriptors.</li>
129      * <li>Process new plug-in descriptors first:
130      * <ol>
131      * <li>Instantiate new PluginDescriptorImpl object.</li>
132      * <li>Handle versions correctly - register new descriptor as most
133      * recent version or as an old version.</li>
134      * <li>If other versions of the same plug-in already registered, take
135      * their fragments and register them with this version.</li>
136      * </ol>
137      * </li>
138      * <li>Process new plug-in fragments next:
139      * <ol>
140      * <li>Instantiate new PluginFragmentImpl object.</li>
141      * <li>Check if older version of the same fragment already registered.
142      * If yes, un-register it and move to old plug-in fragments
143      * collection.</li>
144      * <li>Register new fragment with all matches plug-in descriptors (if
145      * this fragment is of most recent version).</li>
146      * </ol>
147      * </li>
148      * <li>Notify collected extension points about potential changes in
149      * extensions set.</li>
150      * <li>Propagate events about registry changes.</li>
151      * </ol>
152      * @see org.java.plugin.registry.PluginRegistry#register(java.net.URL[])
153      */

154     public Map JavaDoc register(final URL JavaDoc[] manifests)
155             throws ManifestProcessingException {
156         // collecting registered extension points and extensions
157
List JavaDoc registeredPoints = new LinkedList JavaDoc(); //<ExtensionPointImpl>
158
Map JavaDoc registeredExtensions = new HashMap JavaDoc(); //<extensionUid, ExtensionImpl>
159
for (Iterator JavaDoc it = registeredPlugins.values().iterator();
160                 it.hasNext();) {
161             for (Iterator JavaDoc it2 = ((PluginDescriptor) it.next())
162                     .getExtensionPoints().iterator();
163                     it2.hasNext();) {
164                 ExtensionPoint point = (ExtensionPoint) it2.next();
165                 registeredPoints.add(point);
166                 for (Iterator JavaDoc it3 = point.getConnectedExtensions().iterator();
167                         it3.hasNext();) {
168                     Extension ext = (Extension) it3.next();
169                     registeredExtensions.put(ext.getUniqueId(), ext);
170                 }
171             }
172         }
173         Map JavaDoc result = new HashMap JavaDoc(manifests.length); //<URL, PluginDescriptor or PluginFragment>
174
Map JavaDoc plugins = new HashMap JavaDoc(); //<URL, ModelPluginDescriptor>
175
Map JavaDoc fragments = new HashMap JavaDoc(); //<URL, ModelPluginFrafment>
176
// parsing given manifests
177
registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
178                 null, ReportItem.ERROR_NO_ERROR, "manifestsParsingStart", null)); //$NON-NLS-1$
179
for (int i = 0; i < manifests.length; i++) {
180             URL JavaDoc url = manifests[i];
181             ModelPluginManifest model;
182             try {
183                 model = manifestParser.parseManifest(url);
184             } catch (Exception JavaDoc e) {
185                 log.error("can't parse manifest file " + url, e); //$NON-NLS-1$
186
if (stopOnError) {
187                     throw new ManifestProcessingException(PACKAGE_NAME,
188                             "manifestParsingError", url, e); //$NON-NLS-1$
189
}
190                 registrationReport.add(new ReportItemImpl(
191                         ReportItem.SEVERITY_ERROR, null,
192                         ReportItem.ERROR_MANIFEST_PROCESSING_FAILED,
193                         "manifestParsingError", new Object JavaDoc[] {url, e})); //$NON-NLS-1$
194
continue;
195             }
196             if (model instanceof ModelPluginFragment) {
197                 fragments.put(url, model);
198                 continue;
199             }
200             if (!(model instanceof ModelPluginDescriptor)) {
201                 log.warn("URL " + url //$NON-NLS-1$
202
+ " points to XML document of unknown type"); //$NON-NLS-1$
203
continue;
204             }
205             plugins.put(url, model);
206         }
207         if (log.isDebugEnabled()) {
208             log.debug("manifest files parsed, plugins.size=" + plugins.size() //$NON-NLS-1$
209
+ ", fragments.size=" + fragments.size()); //$NON-NLS-1$
210
}
211         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
212                 null, ReportItem.ERROR_NO_ERROR, "manifestsParsingFinish", //$NON-NLS-1$
213
new Object JavaDoc[] {new Integer JavaDoc(plugins.size()),
214                 new Integer JavaDoc(fragments.size())}));
215         checkVersions(plugins);
216         if (log.isDebugEnabled()) {
217             log.debug("plug-ins versions checked, plugins.size=" //$NON-NLS-1$
218
+ plugins.size());
219         }
220         checkVersions(fragments);
221         if (log.isDebugEnabled()) {
222             log.debug("plug-in fragments versions checked, fragments.size=" //$NON-NLS-1$
223
+ fragments.size());
224         }
225         RegistryChangeDataImpl registryChangeData =
226             new RegistryChangeDataImpl();
227         // registering new plug-ins
228
registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
229                 null, ReportItem.ERROR_NO_ERROR,
230                 "registeringPluginsStart", null)); //$NON-NLS-1$
231
for (Iterator JavaDoc it = plugins.entrySet().iterator(); it.hasNext();) {
232             Map.Entry JavaDoc entry = (Entry) it.next();
233             URL JavaDoc url = (URL JavaDoc) entry.getKey();
234             PluginDescriptor descr = registerPlugin(url,
235                     (ModelPluginDescriptor) entry.getValue(),
236                     registryChangeData);
237             if (descr != null) {
238                 result.put(url, descr);
239             }
240         }
241         plugins.clear();
242         // registering new plug-in fragments
243
registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
244                 null, ReportItem.ERROR_NO_ERROR,
245                 "registeringFragmentsStart", null)); //$NON-NLS-1$
246
for (Iterator JavaDoc it = fragments.entrySet().iterator(); it.hasNext();) {
247             Map.Entry JavaDoc entry = (Entry) it.next();
248             URL JavaDoc url = (URL JavaDoc) entry.getKey();
249             PluginFragment fragment =
250                 registerFragment(url, (ModelPluginFragment) entry.getValue(),
251                         registryChangeData);
252             if (fragment != null) {
253                 result.put(url, fragment);
254             }
255         }
256         fragments.clear();
257         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
258                 null, ReportItem.ERROR_NO_ERROR,
259                 "registeringPluginsFinish", //$NON-NLS-1$
260
new Integer JavaDoc(registeredPlugins.size())));
261         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
262                 null, ReportItem.ERROR_NO_ERROR,
263                 "registeringFragmentsFinish", //$NON-NLS-1$
264
new Integer JavaDoc(registeredFragments.size())));
265         log.info("plug-in and fragment descriptors registered - " //$NON-NLS-1$
266
+ result.size());
267         dump();
268         if (result.isEmpty()) {
269             return result;
270         }
271         // notify all interested members that plug-ins set has been changed
272
for (Iterator JavaDoc it = registeredPoints.iterator(); it.hasNext();) {
273             ((ExtensionPointImpl) it.next()).registryChanged();
274         }
275         for (Iterator JavaDoc it = registeredExtensions.values().iterator();
276                 it.hasNext();) {
277             ((ExtensionImpl) it.next()).registryChanged();
278         }
279         if (!listeners.isEmpty() || log.isDebugEnabled()) {
280             // analyze changes in extensions set
281
for (Iterator JavaDoc it = registeredPlugins.values().iterator();
282                     it.hasNext();) {
283                 for (Iterator JavaDoc it2 = ((PluginDescriptor) it.next())
284                         .getExtensionPoints().iterator();
285                         it2.hasNext();) {
286                     for (Iterator JavaDoc it3 = ((ExtensionPoint) it2.next())
287                             .getConnectedExtensions().iterator();
288                             it3.hasNext();) {
289                         Extension ext = (Extension) it3.next();
290                         if (!registeredExtensions.containsKey(
291                                 ext.getUniqueId())) {
292                             registryChangeData.putAddedExtension(
293                                     ext.getUniqueId(),
294                                     makeUniqueId(ext.getExtendedPluginId(),
295                                             ext.getExtendedPointId()));
296                         } else {
297                             registeredExtensions.remove(ext.getUniqueId());
298                             if (registryChangeData.modifiedPlugins().contains(
299                                     ext.getDeclaringPluginDescriptor().getId())
300                                     || registryChangeData.modifiedPlugins()
301                                         .contains(ext.getExtendedPluginId())) {
302                                 registryChangeData.putModifiedExtension(
303                                         ext.getUniqueId(),
304                                         makeUniqueId(ext.getExtendedPluginId(),
305                                                 ext.getExtendedPointId()));
306                             }
307                         }
308                     }
309                 }
310             }
311             for (Iterator JavaDoc it = registeredExtensions.values().iterator();
312                     it.hasNext();) {
313                 Extension ext = (Extension) it.next();
314                 registryChangeData.putRemovedExtension(ext.getUniqueId(),
315                         makeUniqueId(ext.getExtendedPluginId(),
316                                 ext.getExtendedPointId()));
317             }
318             // fire event
319
fireEvent(registryChangeData);
320         }
321         return result;
322     }
323     
324     private void checkVersions(final Map JavaDoc plugins)
325             throws ManifestProcessingException {
326         Map JavaDoc versions = new HashMap JavaDoc(); //<ID, [Version, URL]>
327
Set JavaDoc toBeRemovedUrls = new HashSet JavaDoc(); //<URL>
328
for (Iterator JavaDoc it = plugins.entrySet().iterator(); it.hasNext();) {
329             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
330             URL JavaDoc url = (URL JavaDoc) entry.getKey();
331             ModelPluginManifest model = (ModelPluginManifest) entry.getValue();
332             if (registeredPlugins.containsKey(model.getId())) {
333                 if (stopOnError) {
334                     throw new ManifestProcessingException(PACKAGE_NAME,
335                             "duplicatePlugin", //$NON-NLS-1$
336
model.getId());
337                 }
338                 it.remove();
339                 registrationReport.add(new ReportItemImpl(
340                         ReportItem.SEVERITY_ERROR, null,
341                         ReportItem.ERROR_MANIFEST_PROCESSING_FAILED,
342                         "duplicatedPluginId", model.getId())); //$NON-NLS-1$
343
continue;
344             }
345             if (registeredFragments.containsKey(model.getId())) {
346                 if (stopOnError) {
347                     throw new ManifestProcessingException(PACKAGE_NAME,
348                             "duplicatePluginFragment", //$NON-NLS-1$
349
model.getId());
350                 }
351                 it.remove();
352                 registrationReport.add(new ReportItemImpl(
353                         ReportItem.SEVERITY_ERROR, null,
354                         ReportItem.ERROR_MANIFEST_PROCESSING_FAILED,
355                         "duplicatedFragmentId", model.getId())); //$NON-NLS-1$
356
continue;
357             }
358             Object JavaDoc[] version = (Object JavaDoc[]) versions.get(model.getId());
359             if (version == null) {
360                 versions.put(model.getId(),
361                         new Object JavaDoc[] {model.getVersion(), url});
362                 continue;
363             }
364             if (((Version) version[0]).compareTo(model.getVersion()) < 0) {
365                 toBeRemovedUrls.add(version[1]);
366                 versions.put(model.getId(),
367                         new Object JavaDoc[] {model.getVersion(), url});
368             } else {
369                 toBeRemovedUrls.add(url);
370             }
371         }
372         versions.clear();
373         for (Iterator JavaDoc it = toBeRemovedUrls.iterator(); it.hasNext();) {
374             URL JavaDoc url = (URL JavaDoc) it.next();
375             plugins.remove(url);
376             log.warn("ignoring duplicated manifest " + url); //$NON-NLS-1$
377
}
378         toBeRemovedUrls.clear();
379     }
380
381     private PluginDescriptor registerPlugin(final URL JavaDoc url,
382             final ModelPluginDescriptor model,
383             final RegistryChangeDataImpl registryChangeData)
384             throws ManifestProcessingException {
385         if (log.isDebugEnabled()) {
386             log.debug("registering plug-in, URL - " + url); //$NON-NLS-1$
387
}
388         PluginDescriptorImpl result = null;
389         try {
390             result = new PluginDescriptorImpl(this, model, url);
391             registryChangeData.addedPlugins().add(result.getId());
392             // applying fragments to the new plug-in
393
for (Iterator JavaDoc it = registeredFragments.values().iterator();
394                     it.hasNext();) {
395                 PluginFragmentImpl fragment = (PluginFragmentImpl) it.next();
396                 if (fragment.matches(result)) {
397                     result.registerFragment(fragment);
398                 }
399             }
400             registrationReport.add(new ReportItemImpl(
401                     ReportItem.SEVERITY_INFO, null,
402                     ReportItem.ERROR_NO_ERROR,
403                     "pluginRegistered", result.getUniqueId())); //$NON-NLS-1$
404
} catch (ManifestProcessingException mpe) {
405             log.error("failed registering plug-in, URL - " + url, mpe); //$NON-NLS-1$
406
if (stopOnError) {
407                 throw mpe;
408             }
409             registrationReport.add(new ReportItemImpl(
410                     ReportItem.SEVERITY_ERROR, null,
411                     ReportItem.ERROR_MANIFEST_PROCESSING_FAILED,
412                     "pluginRegistrationFailed", new Object JavaDoc[] {url, mpe})); //$NON-NLS-1$
413
return null;
414         }
415         registeredPlugins.put(result.getId(), result);
416         return result;
417     }
418
419     private PluginFragment registerFragment(final URL JavaDoc url,
420             final ModelPluginFragment model,
421             final RegistryChangeDataImpl registryChangeData)
422             throws ManifestProcessingException {
423         if (log.isDebugEnabled()) {
424             log.debug("registering plug-in fragment descriptor, URL - " + url); //$NON-NLS-1$
425
}
426         PluginFragmentImpl result = null;
427         try {
428             result = new PluginFragmentImpl(this, model, url);
429             // register fragment with all matches plug-ins
430
boolean isRegistered = false;
431             PluginDescriptorImpl descr =
432                 (PluginDescriptorImpl) getPluginDescriptor(
433                         result.getPluginId());
434             if (result.matches(descr)) {
435                 descr.registerFragment(result);
436                 if (!registryChangeData.addedPlugins().contains(
437                         descr.getId())) {
438                     registryChangeData.modifiedPlugins().add(descr.getId());
439                 }
440                 isRegistered = true;
441             }
442             if (!isRegistered) {
443                 log.warn("no matching plug-ins found for fragment " //$NON-NLS-1$
444
+ result.getUniqueId());
445                 registrationReport.add(new ReportItemImpl(
446                         ReportItem.SEVERITY_WARNING, null,
447                         ReportItem.ERROR_NO_ERROR,
448                         "noMatchingPluginFound", result.getUniqueId())); //$NON-NLS-1$
449
}
450             registrationReport.add(new ReportItemImpl(
451                     ReportItem.SEVERITY_INFO, null,
452                     ReportItem.ERROR_NO_ERROR,
453                     "fragmentRegistered", result.getUniqueId())); //$NON-NLS-1$
454
} catch (ManifestProcessingException mpe) {
455             log.error("failed registering plug-in fragment descriptor, URL - " //$NON-NLS-1$
456
+ url, mpe);
457             if (stopOnError) {
458                 throw mpe;
459             }
460             registrationReport.add(new ReportItemImpl(
461                     ReportItem.SEVERITY_ERROR, null,
462                     ReportItem.ERROR_MANIFEST_PROCESSING_FAILED,
463                     "fragmentRegistrationFailed", new Object JavaDoc[] {url, mpe})); //$NON-NLS-1$
464
return null;
465         }
466         registeredFragments.put(result.getId(), result);
467         return result;
468     }
469
470     /**
471      * @see org.java.plugin.registry.PluginRegistry#unregister(java.lang.String[])
472      */

473     public Collection JavaDoc unregister(final String JavaDoc[] ids) {
474         // collecting registered extension points and extensions
475
List JavaDoc registeredPoints = new LinkedList JavaDoc(); //<ExtensionPointImpl>
476
Map JavaDoc registeredExtensions = new HashMap JavaDoc(); //<extensionUid, ExtensionImpl>
477
for (Iterator JavaDoc it = registeredPlugins.values().iterator();
478                 it.hasNext();) {
479             for (Iterator JavaDoc it2 = ((PluginDescriptor) it.next())
480                     .getExtensionPoints().iterator();
481                     it2.hasNext();) {
482                 ExtensionPoint point = (ExtensionPoint) it2.next();
483                 registeredPoints.add(point);
484                 for (Iterator JavaDoc it3 = point.getConnectedExtensions().iterator();
485                         it3.hasNext();) {
486                     Extension ext = (Extension) it3.next();
487                     registeredExtensions.put(ext.getUniqueId(), ext);
488                 }
489             }
490         }
491         Set JavaDoc result = new HashSet JavaDoc();
492         RegistryChangeDataImpl registryChangeData =
493             new RegistryChangeDataImpl();
494         // collect objects to be unregistered
495
registrationReport.add(new ReportItemImpl(
496                 ReportItem.SEVERITY_INFO, null,
497                 ReportItem.ERROR_NO_ERROR, "unregisteringPrepare", null)); //$NON-NLS-1$
498
Map JavaDoc removingPlugins = new HashMap JavaDoc();
499         Map JavaDoc removingFragments = new HashMap JavaDoc();
500         for (int i = 0; i < ids.length; i++) {
501             PluginDescriptor descr =
502                 (PluginDescriptor) registeredPlugins.get(ids[i]);
503             if (descr != null) {
504                 for (Iterator JavaDoc it = getDependingPlugins(descr).iterator();
505                         it.hasNext();) {
506                     PluginDescriptor depDescr = (PluginDescriptor) it.next();
507                     removingPlugins.put(depDescr.getId(), depDescr);
508                     registryChangeData.removedPlugins().add(depDescr.getId());
509                 }
510                 removingPlugins.put(descr.getId(), descr);
511                 registryChangeData.removedPlugins().add(descr.getId());
512                 continue;
513             }
514             PluginFragment fragment =
515                 (PluginFragment) registeredFragments.get(ids[i]);
516             if (fragment != null) {
517                 removingFragments.put(fragment.getId(), fragment);
518                 continue;
519             }
520             registrationReport.add(new ReportItemImpl(
521                     ReportItem.SEVERITY_WARNING, null,
522                     ReportItem.ERROR_NO_ERROR,
523                     "pluginToUngregisterNotFound", ids[i])); //$NON-NLS-1$
524
}
525         // collect fragments for removing plug-ins
526
for (Iterator JavaDoc it = removingPlugins.values().iterator(); it.hasNext();) {
527             PluginDescriptor descr = (PluginDescriptor) it.next();
528             for (Iterator JavaDoc it2 = descr.getFragments().iterator();
529                     it2.hasNext();) {
530                 PluginFragment fragment = (PluginFragment) it2.next();
531                 if (removingFragments.containsKey(fragment.getId())) {
532                     continue;
533                 }
534                 removingFragments.put(fragment.getId(), fragment);
535             }
536         }
537         // notify about plug-ins removal first
538
fireEvent(registryChangeData);
539         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
540                 null, ReportItem.ERROR_NO_ERROR,
541                 "unregisteringFragmentsStart", null)); //$NON-NLS-1$
542
for (Iterator JavaDoc it = removingFragments.values().iterator();
543                 it.hasNext();) {
544             PluginFragmentImpl fragment = (PluginFragmentImpl) it.next();
545             unregisterFragment(fragment);
546             if (!removingPlugins.containsKey(fragment.getPluginId())) {
547                 registryChangeData.modifiedPlugins().add(
548                         fragment.getPluginId());
549             }
550             result.add(fragment.getUniqueId());
551         }
552         removingFragments.clear();
553         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
554                 null, ReportItem.ERROR_NO_ERROR,
555                 "unregisteringPluginsStart", null)); //$NON-NLS-1$
556
for (Iterator JavaDoc it = removingPlugins.values().iterator(); it.hasNext();) {
557             PluginDescriptorImpl descr = (PluginDescriptorImpl) it.next();
558             unregisterPlugin(descr);
559             result.add(descr.getUniqueId());
560         }
561         removingPlugins.clear();
562         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
563                 null, ReportItem.ERROR_NO_ERROR,
564                 "unregisteringPluginsFinish", //$NON-NLS-1$
565
new Integer JavaDoc(registeredPlugins.size())));
566         registrationReport.add(new ReportItemImpl(ReportItem.SEVERITY_INFO,
567                 null, ReportItem.ERROR_NO_ERROR,
568                 "unregisteringFragmentsFinish", //$NON-NLS-1$
569
new Integer JavaDoc(registeredFragments.size())));
570         log.info("plug-in and fragment descriptors unregistered - " //$NON-NLS-1$
571
+ result.size());
572         dump();
573         if (result.isEmpty()) {
574             return result;
575         }
576         // notify all interested members that plug-ins set has been changed
577
for (Iterator JavaDoc it = registeredPoints.iterator(); it.hasNext();) {
578             ((ExtensionPointImpl) it.next()).registryChanged();
579         }
580         for (Iterator JavaDoc it = registeredExtensions.values().iterator();
581                 it.hasNext();) {
582             ((ExtensionImpl) it.next()).registryChanged();
583         }
584         if (!listeners.isEmpty() || log.isDebugEnabled()) {
585             // analyze changes in extensions set
586
for (Iterator JavaDoc it = registeredPlugins.values().iterator();
587                     it.hasNext();) {
588                 for (Iterator JavaDoc it2 = ((PluginDescriptor) it.next())
589                         .getExtensionPoints().iterator();
590                         it2.hasNext();) {
591                     for (Iterator JavaDoc it3 = ((ExtensionPoint) it2.next())
592                             .getConnectedExtensions().iterator();
593                             it3.hasNext();) {
594                         Extension ext = (Extension) it3.next();
595                         if (!registeredExtensions.containsKey(
596                                 ext.getUniqueId())) {
597                             registryChangeData.putAddedExtension(
598                                     ext.getUniqueId(),
599                                     makeUniqueId(ext.getExtendedPluginId(),
600                                             ext.getExtendedPointId()));
601                         } else {
602                             registeredExtensions.remove(ext.getUniqueId());
603                             if (registryChangeData.modifiedPlugins().contains(
604                                     ext.getDeclaringPluginDescriptor().getId())
605                                     || registryChangeData.modifiedPlugins()
606                                         .contains(ext.getExtendedPluginId())) {
607                                 registryChangeData.putModifiedExtension(
608                                         ext.getUniqueId(),
609                                         makeUniqueId(ext.getExtendedPluginId(),
610                                                 ext.getExtendedPointId()));
611                             }
612                         }
613                     }
614                 }
615             }
616             for (Iterator JavaDoc it = registeredExtensions.values().iterator();
617                     it.hasNext();) {
618                 Extension ext = (Extension) it.next();
619                 registryChangeData.putRemovedExtension(ext.getUniqueId(),
620                         makeUniqueId(ext.getExtendedPluginId(),
621                                 ext.getExtendedPointId()));
622             }
623             // fire event
624
fireEvent(registryChangeData);
625         }
626         return result;
627     }
628     
629     private void unregisterPlugin(final PluginDescriptorImpl descr) {
630         registeredPlugins.remove(descr.getId());
631         registrationReport.add(new ReportItemImpl(
632                 ReportItem.SEVERITY_INFO, null,
633                 ReportItem.ERROR_NO_ERROR,
634                 "pluginUnregistered", descr.getUniqueId())); //$NON-NLS-1$
635
}
636     
637     private void unregisterFragment(final PluginFragmentImpl fragment) {
638         PluginDescriptorImpl descr =
639             (PluginDescriptorImpl) registeredPlugins.get(
640                     fragment.getPluginId());
641         if (descr != null) {
642             descr.unregisterFragment(fragment);
643         }
644         registeredFragments.remove(fragment.getId());
645         registrationReport.add(new ReportItemImpl(
646                 ReportItem.SEVERITY_INFO, null,
647                 ReportItem.ERROR_NO_ERROR,
648                 "fragmentUnregistered", fragment.getUniqueId())); //$NON-NLS-1$
649
}
650
651     private void dump() {
652         if (!log.isDebugEnabled()) {
653             return;
654         }
655         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
656         buf.append("PLUG-IN REGISTRY DUMP:\r\n") //$NON-NLS-1$
657
.append("-------------- DUMP BEGIN -----------------\r\n") //$NON-NLS-1$
658
.append("\tPlug-ins: " + registeredPlugins.size() //$NON-NLS-1$
659
+ "\r\n"); //$NON-NLS-1$
660
for (Iterator JavaDoc it = registeredPlugins.values().iterator();
661                 it.hasNext();) {
662             buf.append("\t\t") //$NON-NLS-1$
663
.append(it.next())
664                 .append("\r\n"); //$NON-NLS-1$
665
}
666         buf.append("\tFragments: " + registeredFragments.size() //$NON-NLS-1$
667
+ "\r\n"); //$NON-NLS-1$
668
for (Iterator JavaDoc it = registeredFragments.values().iterator();
669                 it.hasNext();) {
670             buf.append("\t\t") //$NON-NLS-1$
671
.append(it.next())
672                 .append("\r\n"); //$NON-NLS-1$
673
}
674         buf.append("Memory TOTAL/FREE/MAX: ") //$NON-NLS-1$
675
.append(Runtime.getRuntime().totalMemory())
676             .append("/") //$NON-NLS-1$
677
.append(Runtime.getRuntime().freeMemory())
678             .append("/") //$NON-NLS-1$
679
.append(Runtime.getRuntime().maxMemory())
680             .append("\r\n"); //$NON-NLS-1$
681
buf.append("-------------- DUMP END -----------------\r\n"); //$NON-NLS-1$
682
log.debug(buf.toString());
683     }
684     
685     /**
686      * @see org.java.plugin.registry.PluginRegistry#getExtensionPoint(
687      * java.lang.String, java.lang.String)
688      */

689     public ExtensionPoint getExtensionPoint(final String JavaDoc pluginId,
690             final String JavaDoc pointId) {
691         PluginDescriptor descriptor =
692             (PluginDescriptor) registeredPlugins.get(pluginId);
693         if (descriptor == null) {
694             throw new IllegalArgumentException JavaDoc("unknown plug-in ID " //$NON-NLS-1$
695
+ pluginId + " provided for extension point " + pointId); //$NON-NLS-1$
696
}
697         for (Iterator JavaDoc it = descriptor.getExtensionPoints().iterator();
698                 it.hasNext();) {
699             ExtensionPoint point = (ExtensionPoint) it.next();
700             if (point.getId().equals(pointId)) {
701                 if (point.isValid()) {
702                     return point;
703                 }
704                 log.warn("extension point " + point.getUniqueId() //$NON-NLS-1$
705
+ " is invalid and ignored by registry"); //$NON-NLS-1$
706
break;
707             }
708         }
709         throw new IllegalArgumentException JavaDoc("unknown extension point ID - " //$NON-NLS-1$
710
+ makeUniqueId(pluginId, pointId));
711     }
712
713     /**
714      * @see org.java.plugin.registry.PluginRegistry#getExtensionPoint(java.lang.String)
715      */

716     public ExtensionPoint getExtensionPoint(final String JavaDoc uniqueId) {
717         return getExtensionPoint(extractPluginId(uniqueId),
718                 extractId(uniqueId));
719     }
720
721     /**
722      * @see org.java.plugin.registry.PluginRegistry#isExtensionPointAvailable(
723      * java.lang.String, java.lang.String)
724      */

725     public boolean isExtensionPointAvailable(final String JavaDoc pluginId,
726             final String JavaDoc pointId) {
727         PluginDescriptor descriptor =
728             (PluginDescriptor) registeredPlugins.get(pluginId);
729         if (descriptor == null) {
730             return false;
731         }
732         for (Iterator JavaDoc it = descriptor.getExtensionPoints().iterator();
733                 it.hasNext();) {
734             ExtensionPoint point = (ExtensionPoint) it.next();
735             if (point.getId().equals(pointId)) {
736                 return point.isValid();
737             }
738         }
739         return false;
740     }
741
742     /**
743      * @see org.java.plugin.registry.PluginRegistry#isExtensionPointAvailable(
744      * java.lang.String)
745      */

746     public boolean isExtensionPointAvailable(final String JavaDoc uniqueId) {
747         return isExtensionPointAvailable(extractPluginId(uniqueId),
748                 extractId(uniqueId));
749     }
750
751     /**
752      * @see org.java.plugin.registry.PluginRegistry#getPluginDescriptor(java.lang.String)
753      */

754     public PluginDescriptor getPluginDescriptor(final String JavaDoc pluginId) {
755         PluginDescriptor result =
756             (PluginDescriptor) registeredPlugins.get(pluginId);
757         if (result == null) {
758             throw new IllegalArgumentException JavaDoc("unknown plug-in ID - " //$NON-NLS-1$
759
+ pluginId);
760         }
761         return result;
762     }
763
764     /**
765      * @see org.java.plugin.registry.PluginRegistry#isPluginDescriptorAvailable(java.lang.String)
766      */

767     public boolean isPluginDescriptorAvailable(final String JavaDoc pluginId) {
768         return registeredPlugins.containsKey(pluginId);
769     }
770
771     /**
772      * @see org.java.plugin.registry.PluginRegistry#getPluginDescriptors()
773      */

774     public Collection JavaDoc getPluginDescriptors() {
775         return registeredPlugins.isEmpty() ? Collections.EMPTY_LIST
776                 : Collections.unmodifiableCollection(
777                         registeredPlugins.values());
778     }
779
780     /**
781      * @see org.java.plugin.registry.PluginRegistry#getPluginFragments()
782      */

783     public Collection JavaDoc getPluginFragments() {
784         return registeredFragments.isEmpty() ? Collections.EMPTY_LIST
785                 : Collections.unmodifiableCollection(
786                         registeredFragments.values());
787     }
788
789     /**
790      * @see org.java.plugin.registry.PluginRegistry#getDependingPlugins(
791      * org.java.plugin.registry.PluginDescriptor)
792      */

793     public Collection JavaDoc getDependingPlugins(final PluginDescriptor descr) {
794         Map JavaDoc result = new HashMap JavaDoc();
795         for (Iterator JavaDoc it = getPluginDescriptors().iterator();
796                 it.hasNext();) {
797             PluginDescriptor dependedDescr = (PluginDescriptor) it.next();
798             if (dependedDescr.getId().equals(descr.getId())) {
799                 continue;
800             }
801             for (Iterator JavaDoc it2 = dependedDescr.getPrerequisites().iterator();
802                     it2.hasNext();) {
803                 PluginPrerequisite pre = (PluginPrerequisite) it2.next();
804                 if (!pre.getPluginId().equals(descr.getId())
805                         || !pre.matches()) {
806                     continue;
807                 }
808                 if (!result.containsKey(dependedDescr.getId())) {
809                     result.put(dependedDescr.getId(), dependedDescr);
810                     for (Iterator JavaDoc it3 =
811                             getDependingPlugins(dependedDescr).iterator();
812                             it3.hasNext();) {
813                         PluginDescriptor descriptor =
814                             (PluginDescriptor) it3.next();
815                         if (!result.containsKey(descriptor.getId())) {
816                             result.put(descriptor.getId(), descriptor);
817                         }
818                     }
819                 }
820                 break;
821             }
822         }
823         return result.values();
824     }
825
826     /**
827      * @see org.java.plugin.registry.PluginRegistry#checkIntegrity(
828      * org.java.plugin.PathResolver)
829      */

830     public IntegrityCheckReport checkIntegrity(
831             final PathResolver pathResolver) {
832         return checkIntegrity(pathResolver, false);
833     }
834     
835     /**
836      * @see org.java.plugin.registry.PluginRegistry#checkIntegrity(
837      * org.java.plugin.PathResolver, boolean)
838      */

839     public IntegrityCheckReport checkIntegrity(final PathResolver pathResolver,
840             final boolean includeRegistrationReport) {
841         IntegrityChecker intergityCheckReport = new IntegrityChecker(this,
842                 includeRegistrationReport ? registrationReport
843                         : Collections.EMPTY_LIST);
844         intergityCheckReport.doCheck(pathResolver);
845         return intergityCheckReport;
846     }
847
848     /**
849      * @see org.java.plugin.registry.PluginRegistry#getRegistrationReport()
850      */

851     public IntegrityCheckReport getRegistrationReport() {
852         return new IntegrityChecker(this, registrationReport);
853     }
854     
855     /**
856      * @see org.java.plugin.registry.PluginRegistry#makeUniqueId(
857      * java.lang.String, java.lang.String)
858      */

859     public String JavaDoc makeUniqueId(final String JavaDoc pluginId, final String JavaDoc id) {
860         return pluginId + UNIQUE_SEPARATOR + id;
861     }
862
863     /**
864      * @see org.java.plugin.registry.PluginRegistry#makeUniqueId(
865      * java.lang.String, org.java.plugin.registry.Version)
866      */

867     public String JavaDoc makeUniqueId(final String JavaDoc pluginId, final Version version) {
868         return pluginId + UNIQUE_SEPARATOR + version;
869     }
870     
871     /**
872      * @see org.java.plugin.registry.PluginRegistry#extractPluginId(java.lang.String)
873      */

874     public String JavaDoc extractPluginId(final String JavaDoc uniqueId) {
875         int p = uniqueId.indexOf(UNIQUE_SEPARATOR);
876         if ((p <= 0) || (p >= (uniqueId.length() - 1))) {
877             throw new IllegalArgumentException JavaDoc("invalid unique ID - " //$NON-NLS-1$
878
+ uniqueId);
879         }
880         return uniqueId.substring(0, p);
881     }
882
883     /**
884      * @see org.java.plugin.registry.PluginRegistry#extractId(java.lang.String)
885      */

886     public String JavaDoc extractId(final String JavaDoc uniqueId) {
887         int p = uniqueId.indexOf(UNIQUE_SEPARATOR);
888         if ((p <= 0) || (p >= (uniqueId.length() - 1))) {
889             throw new IllegalArgumentException JavaDoc("invalid unique ID - " //$NON-NLS-1$
890
+ uniqueId);
891         }
892         return uniqueId.substring(p + 1);
893     }
894
895     /**
896      * @see org.java.plugin.registry.PluginRegistry#extractVersion(java.lang.String)
897      */

898     public Version extractVersion(final String JavaDoc uniqueId) {
899         int p = uniqueId.indexOf(UNIQUE_SEPARATOR);
900         if ((p <= 0) || (p >= (uniqueId.length() - 1))) {
901             throw new IllegalArgumentException JavaDoc("invalid unique ID - " //$NON-NLS-1$
902
+ uniqueId);
903         }
904         return Version.parse(uniqueId.substring(p + 1));
905     }
906
907     /**
908      * @see org.java.plugin.registry.PluginRegistry#registerListener(
909      * org.java.plugin.registry.PluginRegistry.RegistryChangeListener)
910      */

911     public void registerListener(final RegistryChangeListener listener) {
912         if (listeners.contains(listener)) {
913             throw new IllegalArgumentException JavaDoc("listener " + listener //$NON-NLS-1$
914
+ " already registered"); //$NON-NLS-1$
915
}
916         listeners.add(listener);
917     }
918
919     /**
920      * @see org.java.plugin.registry.PluginRegistry#unregisterListener(
921      * org.java.plugin.registry.PluginRegistry.RegistryChangeListener)
922      */

923     public void unregisterListener(final RegistryChangeListener listener) {
924         if (!listeners.remove(listener)) {
925             log.warn("unknown listener " + listener); //$NON-NLS-1$
926
}
927     }
928     
929     void fireEvent(final RegistryChangeDataImpl data) {
930         data.dump();
931         if (listeners.isEmpty()) {
932             return;
933         }
934         // make local copy
935
RegistryChangeListener[] arr =
936             (RegistryChangeListener[]) listeners.toArray(
937                 new RegistryChangeListener[listeners.size()]);
938         data.beforeEventFire();
939         if (log.isDebugEnabled()) {
940             log.debug("propagating registry change event"); //$NON-NLS-1$
941
}
942         for (int i = 0; i < arr.length; i++) {
943             arr[i].registryChanged(data);
944         }
945         if (log.isDebugEnabled()) {
946             log.debug("registry change event propagated"); //$NON-NLS-1$
947
}
948         data.afterEventFire();
949     }
950     
951     private static final class RegistryChangeDataImpl
952             implements RegistryChangeData {
953         private Set JavaDoc addedPlugins;
954         private Set JavaDoc removedPlugins;
955         private Set JavaDoc modifiedPlugins;
956         private Map JavaDoc addedExtensions;
957         private Map JavaDoc removedExtensions;
958         private Map JavaDoc modifiedExtensions;
959         
960         protected RegistryChangeDataImpl() {
961             reset();
962         }
963         
964         private void reset() {
965             addedPlugins = new HashSet JavaDoc();
966             removedPlugins = new HashSet JavaDoc();
967             modifiedPlugins = new HashSet JavaDoc();
968             addedExtensions = new HashMap JavaDoc();
969             removedExtensions = new HashMap JavaDoc();
970             modifiedExtensions = new HashMap JavaDoc();
971         }
972         
973         protected void beforeEventFire() {
974             addedPlugins = Collections.unmodifiableSet(addedPlugins);
975             removedPlugins = Collections.unmodifiableSet(removedPlugins);
976             modifiedPlugins = Collections.unmodifiableSet(modifiedPlugins);
977             addedExtensions = Collections.unmodifiableMap(addedExtensions);
978             removedExtensions = Collections.unmodifiableMap(removedExtensions);
979             modifiedExtensions =
980                 Collections.unmodifiableMap(modifiedExtensions);
981         }
982         
983         protected void afterEventFire() {
984             reset();
985         }
986         
987         protected void dump() {
988             Log logger = LogFactory.getLog(getClass());
989             if (!logger.isDebugEnabled()) {
990                 return;
991             }
992             StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
993             buf.append("PLUG-IN REGISTRY CHANGES DUMP:\r\n") //$NON-NLS-1$
994
.append("-------------- DUMP BEGIN -----------------\r\n") //$NON-NLS-1$
995
.append("\tAdded plug-ins: " + addedPlugins.size() //$NON-NLS-1$
996
+ "\r\n"); //$NON-NLS-1$
997
for (Iterator JavaDoc it = addedPlugins.iterator();
998                     it.hasNext();) {
999                 buf.append("\t\t") //$NON-NLS-1$
1000
.append(it.next())
1001                    .append("\r\n"); //$NON-NLS-1$
1002
}
1003            buf.append("\tRemoved plug-ins: " + removedPlugins.size() //$NON-NLS-1$
1004
+ "\r\n"); //$NON-NLS-1$
1005
for (Iterator JavaDoc it = removedPlugins.iterator();
1006                    it.hasNext();) {
1007                buf.append("\t\t") //$NON-NLS-1$
1008
.append(it.next())
1009                .append("\r\n"); //$NON-NLS-1$
1010
}
1011            buf.append("\tModified plug-ins: " + modifiedPlugins.size() //$NON-NLS-1$
1012
+ "\r\n"); //$NON-NLS-1$
1013
for (Iterator JavaDoc it = modifiedPlugins.iterator();
1014                    it.hasNext();) {
1015                buf.append("\t\t") //$NON-NLS-1$
1016
.append(it.next())
1017                .append("\r\n"); //$NON-NLS-1$
1018
}
1019            buf.append("\tAdded extensions: " + addedExtensions.size() //$NON-NLS-1$
1020
+ "\r\n"); //$NON-NLS-1$
1021
for (Iterator JavaDoc it = addedExtensions.entrySet().iterator();
1022                    it.hasNext();) {
1023                buf.append("\t\t") //$NON-NLS-1$
1024
.append(it.next())
1025                    .append("\r\n"); //$NON-NLS-1$
1026
}
1027            buf.append("\tRemoved extensions: " + removedExtensions.size() //$NON-NLS-1$
1028
+ "\r\n"); //$NON-NLS-1$
1029
for (Iterator JavaDoc it = removedExtensions.entrySet().iterator();
1030                    it.hasNext();) {
1031                buf.append("\t\t") //$NON-NLS-1$
1032
.append(it.next())
1033                .append("\r\n"); //$NON-NLS-1$
1034
}
1035            buf.append("\tModified extensions: " + modifiedExtensions.size() //$NON-NLS-1$
1036
+ "\r\n"); //$NON-NLS-1$
1037
for (Iterator JavaDoc it = modifiedExtensions.entrySet().iterator();
1038                    it.hasNext();) {
1039                buf.append("\t\t") //$NON-NLS-1$
1040
.append(it.next())
1041                .append("\r\n"); //$NON-NLS-1$
1042
}
1043            buf.append("Memory TOTAL/FREE/MAX: ") //$NON-NLS-1$
1044
.append(Runtime.getRuntime().totalMemory())
1045                .append("/") //$NON-NLS-1$
1046
.append(Runtime.getRuntime().freeMemory())
1047                .append("/") //$NON-NLS-1$
1048
.append(Runtime.getRuntime().maxMemory())
1049                .append("\r\n"); //$NON-NLS-1$
1050
buf.append("-------------- DUMP END -----------------\r\n"); //$NON-NLS-1$
1051
logger.debug(buf.toString());
1052        }
1053        
1054        /**
1055         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#addedPlugins()
1056         */

1057        public Set JavaDoc addedPlugins() {
1058            return addedPlugins;
1059        }
1060        
1061        /**
1062         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1063         * removedPlugins()
1064         */

1065        public Set JavaDoc removedPlugins() {
1066            return removedPlugins;
1067        }
1068
1069        /**
1070         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1071         * modifiedPlugins()
1072         */

1073        public Set JavaDoc modifiedPlugins() {
1074            return modifiedPlugins;
1075        }
1076        
1077        void putAddedExtension(final String JavaDoc extensionUid,
1078                final String JavaDoc extensionPointUid) {
1079            addedExtensions.put(extensionUid, extensionPointUid);
1080        }
1081
1082        /**
1083         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1084         * addedExtensions()
1085         */

1086        public Set JavaDoc addedExtensions() {
1087            return addedExtensions.keySet();
1088        }
1089
1090        /**
1091         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1092         * addedExtensions(java.lang.String)
1093         */

1094        public Set JavaDoc addedExtensions(final String JavaDoc extensionPointUid) {
1095            Set JavaDoc result = new HashSet JavaDoc();
1096            for (Iterator JavaDoc it = addedExtensions.entrySet().iterator();
1097                    it.hasNext();) {
1098                Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
1099                if (entry.getValue().equals(extensionPointUid)) {
1100                    result.add(entry.getKey());
1101                }
1102            }
1103            return Collections.unmodifiableSet(result);
1104        }
1105        
1106        void putRemovedExtension(final String JavaDoc extensionUid,
1107                final String JavaDoc extensionPointUid) {
1108            removedExtensions.put(extensionUid, extensionPointUid);
1109        }
1110        
1111        /**
1112         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1113         * removedExtensions()
1114         */

1115        public Set JavaDoc removedExtensions() {
1116            return removedExtensions.keySet();
1117        }
1118
1119        /**
1120         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1121         * removedExtensions(java.lang.String)
1122         */

1123        public Set JavaDoc removedExtensions(final String JavaDoc extensionPointUid) {
1124            Set JavaDoc result = new HashSet JavaDoc();
1125            for (Iterator JavaDoc it = removedExtensions.entrySet().iterator();
1126                    it.hasNext();) {
1127                Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
1128                if (entry.getValue().equals(extensionPointUid)) {
1129                    result.add(entry.getKey());
1130                }
1131            }
1132            return Collections.unmodifiableSet(result);
1133        }
1134        
1135        void putModifiedExtension(final String JavaDoc extensionUid,
1136                final String JavaDoc extensionPointUid) {
1137            modifiedExtensions.put(extensionUid, extensionPointUid);
1138        }
1139
1140        /**
1141         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1142         * modifiedExtensions()
1143         */

1144        public Set JavaDoc modifiedExtensions() {
1145            return modifiedExtensions.keySet();
1146        }
1147
1148        /**
1149         * @see org.java.plugin.registry.PluginRegistry.RegistryChangeData#
1150         * modifiedExtensions(java.lang.String)
1151         */

1152        public Set JavaDoc modifiedExtensions(final String JavaDoc extensionPointUid) {
1153            Set JavaDoc result = new HashSet JavaDoc();
1154            for (Iterator JavaDoc it = modifiedExtensions.entrySet().iterator();
1155                    it.hasNext();) {
1156                Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
1157                if (entry.getValue().equals(extensionPointUid)) {
1158                    result.add(entry.getKey());
1159                }
1160            }
1161            return Collections.unmodifiableSet(result);
1162        }
1163    }
1164    
1165    private static final class ManifestInfoImpl implements ManifestInfo {
1166        private final ModelManifestInfo model;
1167
1168        ManifestInfoImpl(final ModelManifestInfo aModel) {
1169            model = aModel;
1170        }
1171        
1172        /**
1173         * @see org.java.plugin.registry.PluginRegistry.ManifestInfo#getId()
1174         */

1175        public String JavaDoc getId() {
1176            return model.getId();
1177        }
1178
1179        /**
1180         * @see org.java.plugin.registry.PluginRegistry.ManifestInfo#
1181         * getVersion()
1182         */

1183        public Version getVersion() {
1184            return model.getVersion();
1185        }
1186
1187        /**
1188         * @see org.java.plugin.registry.PluginRegistry.ManifestInfo#
1189         * getVendor()
1190         */

1191        public String JavaDoc getVendor() {
1192            return model.getVendor();
1193        }
1194
1195        /**
1196         * @see org.java.plugin.registry.PluginRegistry.ManifestInfo#
1197         * getPluginId()
1198         */

1199        public String JavaDoc getPluginId() {
1200            return model.getPluginId();
1201        }
1202
1203        /**
1204         * @see org.java.plugin.registry.PluginRegistry.ManifestInfo#
1205         * getPluginVersion()
1206         */

1207        public Version getPluginVersion() {
1208            return model.getPluginVersion();
1209        }
1210
1211        /**
1212         * @see org.java.plugin.registry.PluginRegistry.ManifestInfo#
1213         * getMatchingRule()
1214         */

1215        public String JavaDoc getMatchingRule() {
1216            return model.getMatch();
1217        }
1218    }
1219}
1220
Popular Tags