diff options
author | cbateman | 2010-04-20 15:44:48 +0000 |
---|---|---|
committer | cbateman | 2010-04-20 15:44:48 +0000 |
commit | 96d175c458bda4eb42e9bce42c6ebd33f20d28a4 (patch) | |
tree | ab735a9c57f2f78d02138cd41860bc358eb80a16 | |
parent | 8ced2996e89211ecea3e07901d7c12bd46b7bd81 (diff) | |
download | webtools.jsf-96d175c458bda4eb42e9bce42c6ebd33f20d28a4.tar.gz webtools.jsf-96d175c458bda4eb42e9bce42c6ebd33f20d28a4.tar.xz webtools.jsf-96d175c458bda4eb42e9bce42c6ebd33f20d28a4.zip |
Scenario testing and bug fixes for context param defined facelet taglibs.
14 files changed, 683 insertions, 716 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF index d4176ab82..a53768edc 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF +++ b/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF @@ -19,7 +19,7 @@ Export-Package: org.eclipse.jst.jsf.common;x-internal:=true, org.eclipse.jst.jsf.common.internal.managedobject;x-internal:=true, org.eclipse.jst.jsf.common.internal.pde;x-internal:=true, org.eclipse.jst.jsf.common.internal.policy;x-internal:=true, - org.eclipse.jst.jsf.common.internal.resource;x-friends:="org.eclipse.jst.jsf.core.tests", + org.eclipse.jst.jsf.common.internal.resource;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.facelet.core.tests", org.eclipse.jst.jsf.common.internal.strategy;x-internal:=true, org.eclipse.jst.jsf.common.internal.types; x-friends:="org.eclipse.jst.jsf.core, diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java index 78265c40a..b69107d7f 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; @@ -35,27 +36,29 @@ import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.Reaso public class LifecycleListener extends ImmutableLifecycleListener implements IResourceChangeListener { - private static boolean ENABLE_TEST_TRACKING = false; - private static long _seqId; + private static boolean ENABLE_TEST_TRACKING = false; + private static long _seqId; - private final CopyOnWriteArrayList<IResource> _resources; + private final CopyOnWriteArrayList<IResource> _resources; final CopyOnWriteArrayList<IResourceLifecycleListener> _listeners; - private AtomicBoolean _isDisposed = new AtomicBoolean( - false); - private ITestTracker _testTracker; // == + private final AtomicBoolean _isDisposed = new AtomicBoolean(false); + private ITestTracker _testTracker; // == private final IWorkspace _workspace; - // null; - // initialized - // by - // setter - // injection + + // null; + // initialized + // by + // setter + // injection /** * Initialize an inactive lifecycle listener. A workspace listener will not * be installed by this constructor. The object created using this * constructor will not fire any events until addResource is called at least * once to add a target resource - * @param workspace the workspace to listen to for changes. + * + * @param workspace + * the workspace to listen to for changes. */ public LifecycleListener(final IWorkspace workspace) { @@ -68,7 +71,8 @@ public class LifecycleListener extends ImmutableLifecycleListener implements * Create a new lifecycle listener for the res * * @param res - * @param workspace the workspace to listen to for changes. + * @param workspace + * the workspace to listen to for changes. */ public LifecycleListener(final IResource res, final IWorkspace workspace) { @@ -79,9 +83,11 @@ public class LifecycleListener extends ImmutableLifecycleListener implements /** * @param resources - * @param workspace the workspace to listen to for changes. + * @param workspace + * the workspace to listen to for changes. */ - public LifecycleListener(final List<IResource> resources, final IWorkspace workspace) + public LifecycleListener(final List<IResource> resources, + final IWorkspace workspace) { this(workspace); _resources.addAll(resources); @@ -103,6 +109,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements { ENABLE_TEST_TRACKING = newValue; } + /** * Adds listener to the list of objects registered to receive lifecycle * events for this resource. Only adds the listener if it is not already in @@ -114,6 +121,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements * * @param listener */ + @Override public void addListener(final IResourceLifecycleListener listener) { if (isDisposed()) @@ -132,6 +140,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements * * @param listener */ + @Override public void removeListener(final IResourceLifecycleListener listener) { if (isDisposed()) @@ -191,8 +200,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements // remove the workspace listener if (_resources.size() == 0) { - _workspace.removeResourceChangeListener( - this); + _workspace.removeResourceChangeListener(this); } } } @@ -210,8 +218,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements { // remove first to minimize the chance that the listener will // be triggered during the remainder of dispose - _workspace.removeResourceChangeListener( - this); + _workspace.removeResourceChangeListener(this); _resources.clear(); } } @@ -239,85 +246,85 @@ public class LifecycleListener extends ImmutableLifecycleListener implements switch (event.getType()) { - case IResourceChangeEvent.PRE_CLOSE: - { - final IProject proj = (IProject) event.getResource(); + case IResourceChangeEvent.PRE_CLOSE: + { + final IProject proj = (IProject) event.getResource(); - // must use iterator to ensure copy on write behaviour - for (final IResource res : _resources) + // must use iterator to ensure copy on write behaviour + for (final IResource res : _resources) + { + if (proj == res || proj == res.getProject()) { - if (proj == res || proj == res.getProject()) - { - fireLifecycleEvent(new ResourceLifecycleEvent(res, - EventType.RESOURCE_INACCESSIBLE, - ReasonType.RESOURCE_PROJECT_CLOSED)); - } + fireLifecycleEvent(new ResourceLifecycleEvent(res, + EventType.RESOURCE_INACCESSIBLE, + ReasonType.RESOURCE_PROJECT_CLOSED)); } } + } break; - case IResourceChangeEvent.PRE_DELETE: - { - final IProject proj = (IProject) event.getResource(); + case IResourceChangeEvent.PRE_DELETE: + { + final IProject proj = (IProject) event.getResource(); - // must use iterator to ensure copy on write behaviour - for (final IResource res : _resources) + // must use iterator to ensure copy on write behaviour + for (final IResource res : _resources) + { + // if the resource being tracked is the resource being + // deleted, + // then fire a resource delete event + if (proj == res) { - // if the resource being tracked is the resource being - // deleted, - // then fire a resource delete event - if (proj == res) - { - fireLifecycleEvent(new ResourceLifecycleEvent(res, - EventType.RESOURCE_INACCESSIBLE, - ReasonType.RESOURCE_DELETED)); - } - // if the resource being tracked is a resource in the - // project being - // deleted, then fire a project deleted event - else if (proj == res.getProject()) - { - fireLifecycleEvent(new ResourceLifecycleEvent(res, - EventType.RESOURCE_INACCESSIBLE, - ReasonType.RESOURCE_PROJECT_DELETED)); - } + fireLifecycleEvent(new ResourceLifecycleEvent(res, + EventType.RESOURCE_INACCESSIBLE, + ReasonType.RESOURCE_DELETED)); + } + // if the resource being tracked is a resource in the + // project being + // deleted, then fire a project deleted event + else if (proj == res.getProject()) + { + fireLifecycleEvent(new ResourceLifecycleEvent(res, + EventType.RESOURCE_INACCESSIBLE, + ReasonType.RESOURCE_PROJECT_DELETED)); } } + } break; - case IResourceChangeEvent.POST_CHANGE: + case IResourceChangeEvent.POST_CHANGE: + { + for (final IResource res : _resources) { - for (final IResource res : _resources) + IResourceDelta delta = event.getDelta(); + + // long seqId2 = _seqId++; + // if (ENABLE_TEST_TRACKING && _testTracker != null) + // { + // _testTracker.fireEvent(Event.START_TRACKING, seqId2, + // "testFindMember"); + // } + // only care about post change events to resources + // that we are tracking + delta = delta.findMember(res.getFullPath()); + + if (delta != null) { - IResourceDelta delta = event.getDelta(); - - // long seqId2 = _seqId++; - // if (ENABLE_TEST_TRACKING && _testTracker != null) - // { - // _testTracker.fireEvent(Event.START_TRACKING, seqId2, - // "testFindMember"); - // } - // only care about post change events to resources - // that we are tracking - delta = delta.findMember(res.getFullPath()); - - if (delta != null) - { - visit(delta); - } - - // if (ENABLE_TEST_TRACKING && _testTracker != null) - // { - // _testTracker.fireEvent(Event.STOP_TRACKING, seqId2, - // "testFindMember"); - // } + visit(delta); } + + // if (ENABLE_TEST_TRACKING && _testTracker != null) + // { + // _testTracker.fireEvent(Event.STOP_TRACKING, seqId2, + // "testFindMember"); + // } } + } break; - default: - // do nothing - // we only handle these three + default: + // do nothing + // we only handle these three } if (ENABLE_TEST_TRACKING && _testTracker != null) @@ -357,27 +364,55 @@ public class LifecycleListener extends ImmutableLifecycleListener implements if (res.getType() == IResource.ROOT) { handleWorkspaceRoot(delta); + } else if (res instanceof IContainer) + { + handleContainer(delta, (IContainer) res); + } else + { + handleFile(delta, res); } + } - switch (delta.getKind()) + private void handleContainer(final IResourceDelta delta, final IContainer res) + { + for (final IResourceDelta childDelta : delta.getAffectedChildren()) { - case IResourceDelta.CHANGED: + if (childDelta.getResource().getType() == IResource.FILE + && childDelta.getKind() == IResourceDelta.ADDED) { - // the contents of the file have changed - if ((delta.getFlags() & IResourceDelta.CONTENT) != 0) - { - fireLifecycleEvent(new ResourceLifecycleEvent(res, - EventType.RESOURCE_CHANGED, - ReasonType.RESOURCE_CHANGED_CONTENTS)); - } + fireLifecycleEvent(new ResourceLifecycleEvent(childDelta.getResource(), + EventType.RESOURCE_ADDED, ReasonType.RESOURCE_ADDED)); } - break; - case IResourceDelta.REMOVED: + } + } + + private void handleFile(final IResourceDelta delta, final IResource res) + { + switch (delta.getKind()) + { + case IResourceDelta.ADDED: + { + fireLifecycleEvent(new ResourceLifecycleEvent(res, + EventType.RESOURCE_ADDED, ReasonType.RESOURCE_ADDED)); + } + break; + case IResourceDelta.CHANGED: + { + // the contents of the file have changed + if ((delta.getFlags() & IResourceDelta.CONTENT) != 0) { fireLifecycleEvent(new ResourceLifecycleEvent(res, - EventType.RESOURCE_INACCESSIBLE, - ReasonType.RESOURCE_DELETED)); + EventType.RESOURCE_CHANGED, + ReasonType.RESOURCE_CHANGED_CONTENTS)); } + } + break; + case IResourceDelta.REMOVED: + { + fireLifecycleEvent(new ResourceLifecycleEvent(res, + EventType.RESOURCE_INACCESSIBLE, + ReasonType.RESOURCE_DELETED)); + } break; } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java index 2dde95871..965585fec 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java @@ -215,6 +215,36 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana lifecycleListener.removeListener(listener); } + /** + * Add additional resources to the set to listen to. + * + * @param res + */ + protected final void addResource(final IResource res) + { + final LifecycleListener lifecycleListener = lazilyGetLifecycleListener(); + lifecycleListener.addResource(res); + } + + /** + * Remove a resource that is being listened to. Must not be used to remove + * internally added resources (i.e. only use this if you called addResource(res). + * + * @param res + */ + protected final void removeResource(final IResource res) + { + synchronized(this) + { + if (_perResourceObjects.keySet().contains(res)) + { + throw new IllegalArgumentException("Can't remove managed resources with this method"); //$NON-NLS-1$ + } + } + final LifecycleListener lifecycleListener = lazilyGetLifecycleListener(); + lifecycleListener.removeResource(res); + } + private synchronized LifecycleListener lazilyGetLifecycleListener() { if (_lifecycleListener == null) diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java index 51a5d4d1d..249dfaff9 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java @@ -22,6 +22,10 @@ abstract class LibraryOperation protected LibraryOperation(final IFaceletTagRecord changeRecord) { + if (changeRecord == null) + { + throw new NullPointerException(); + } _changeRecord = changeRecord; } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java index 39c297155..f8e10c4f3 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java @@ -15,18 +15,13 @@ import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jst.j2ee.model.IModelProvider; import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery; -import org.eclipse.jst.jsf.common.internal.managedobject.AbstractManagedObject; import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException; import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator; -import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener; -import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent; -import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType; import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.Listener.TaglibChangedEvent.CHANGE_TYPE; @@ -49,7 +44,7 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends private final IProject _project; private final Map<String, IFaceletTagRecord> _records; private final TagRecordFactory _factory; - private final TaglibFileManager _fileManager; + private final TaglibResourceManager _fileManager; /** * @param project @@ -68,8 +63,10 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends _project = project; _records = new HashMap<String, IFaceletTagRecord>(); _factory = factory; - _fileManager = new TaglibFileManager(project, - new LibraryChangeHandler(), webAppProvider, vcQuery, wsMediator); + WebappConfiguration webConfig = new WebappConfiguration(project, webAppProvider, + vcQuery, wsMediator); + _fileManager = new TaglibResourceManager(project, + new LibraryChangeHandler(), wsMediator, webConfig); } /* @@ -113,7 +110,7 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends TaglibFileTracker tracker = null; try { - tracker = _fileManager.getInstance(file); + tracker = (TaglibFileTracker) _fileManager.getInstance(file); } catch (final ManagedObjectException e) { FaceletCorePlugin.log("Creating record", e); //$NON-NLS-1$ @@ -137,6 +134,10 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends private IFaceletTagRecord createTagRecord(final IFile file) { InputStream is = null; + if (!file.isAccessible()) + { + return null; + } try { is = file.getContents(); @@ -144,7 +145,8 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends .toFile().getCanonicalPath()); loader.loadFromInputStream(is); final FaceletTaglib taglib = loader.getTaglib(); - if (taglib != null) + // if no valid namespace, don't create a record. + if (taglib != null && taglib.getNamespaceUri() != null && taglib.getNamespaceUri().trim().length()>0) { return _factory.createRecords(taglib); } @@ -169,82 +171,7 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends return null; } - static class TaglibFileTracker extends AbstractManagedObject implements - IResourceLifecycleListener - { - private final IFile _file; - String _uri; - private final AtomicLong _lastModifiedStamp = new AtomicLong(); - private TaglibFileManager _manager; - private final LibraryChangeHandler _handler; - - public TaglibFileTracker(final IFile file, - final TaglibFileManager manager, - final LibraryChangeHandler handler) - { - _manager = manager; - _manager.addListener(this); - _file = file; - _lastModifiedStamp.set(file.getModificationStamp()); - _handler = handler; - } - - public final void setUri(final String uri) - { - _uri = uri; - } - - @Override - public void checkpoint() - { - // nothing currently persisted - - } - - @Override - public void destroy() - { - // nothing currently persisted - } - - @Override - public void dispose() - { - _manager.removeListener(this); - _manager = null; - } - - public EventResult acceptEvent(final ResourceLifecycleEvent event) - { - if (!_file.equals(event.getAffectedResource())) - { - return EventResult.getDefaultEventResult(); - } - - final EventType eventType = event.getEventType(); - - switch (eventType) - { - case RESOURCE_ADDED: - // added resources kick an add event. - _handler.added(_file); - break; - case RESOURCE_CHANGED: - // changed resources kick a change event - _handler.changed(_uri, _file); - break; - case RESOURCE_INACCESSIBLE: - // removed resources kick a remove event - _handler.removed(_uri, _file); - break; - } - - return EventResult.getDefaultEventResult(); - } - - } - - class LibraryChangeHandler + class LibraryChangeHandler implements ILibraryChangeHandler { public void added(final IFile file) { @@ -252,7 +179,7 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends TaglibFileTracker tracker = null; try { - tracker = _fileManager.getInstance(file); + tracker = (TaglibFileTracker) _fileManager.getInstance(file); } catch (final ManagedObjectException e) { FaceletCorePlugin.log("Adding new library", e); //$NON-NLS-1$ @@ -276,21 +203,63 @@ public class ContextParamSpecifiedFaceletTaglibLocator extends public void removed(final String uri, final IFile file) { final IFaceletTagRecord tagRecord = _records.remove(uri); - fireChangeEvent(new TaglibChangedEvent( - ContextParamSpecifiedFaceletTaglibLocator.this, tagRecord, - null, CHANGE_TYPE.REMOVED)); + if (tagRecord != null) + { + fireChangeEvent(new TaglibChangedEvent( + ContextParamSpecifiedFaceletTaglibLocator.this, tagRecord, + null, CHANGE_TYPE.REMOVED)); + } } public void changed(final String uri, final IFile file) { final IFaceletTagRecord oldValue = _records.remove(uri); final IFaceletTagRecord newValue = createTagRecord(file); - if (newValue != null) + + if (oldValue == null) { - _records.put(uri, newValue); - fireChangeEvent(new TaglibChangedEvent( - ContextParamSpecifiedFaceletTaglibLocator.this, - oldValue, newValue, CHANGE_TYPE.CHANGED)); + // no oldValue, is newValue so ADD + if (newValue != null) + { + _records.put(uri, newValue); + fireChangeEvent(new TaglibChangedEvent( + ContextParamSpecifiedFaceletTaglibLocator.this, null, + newValue, CHANGE_TYPE.ADDED)); + } + } + // if there is an old value + else + { + // oldValue but no new value, so REMOVE + if (newValue == null) + { + fireChangeEvent(new TaglibChangedEvent( + ContextParamSpecifiedFaceletTaglibLocator.this, oldValue, + null, CHANGE_TYPE.REMOVED)); + + } + // both old and new value, so a change of some kind + else + { + _records.put(uri, newValue); + // if the namespaces match, then it's a simple change + if (oldValue.getURI() != null && oldValue.getURI().equals(newValue.getURI())) + { + fireChangeEvent(new TaglibChangedEvent( + ContextParamSpecifiedFaceletTaglibLocator.this, + oldValue, newValue, CHANGE_TYPE.CHANGED)); + } + // otherwise, it's a remove of old value and an add of new value + else + { + fireChangeEvent(new TaglibChangedEvent( + ContextParamSpecifiedFaceletTaglibLocator.this, oldValue, + null, CHANGE_TYPE.REMOVED)); + fireChangeEvent(new TaglibChangedEvent( + ContextParamSpecifiedFaceletTaglibLocator.this, null, + newValue, CHANGE_TYPE.ADDED)); + } + } } } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java index ba82f7578..6d55a8651 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java @@ -31,10 +31,7 @@ import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceLocator; import org.eclipse.jst.jsf.designtime.internal.resources.JarBasedJSFResourceLocator; import org.eclipse.jst.jsf.designtime.internal.resources.WorkspaceJSFResourceLocator; -/** - * @author cbateman - * - */ + /** * @author cbateman * diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java new file mode 100644 index 000000000..69d51f5b7 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java @@ -0,0 +1,37 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import org.eclipse.core.resources.IFile; + +/** + * A callback interface used declare library changes to a client. + * + * @author cbateman + * + */ +public interface ILibraryChangeHandler +{ + + /** + * Signal that the library defined in file with namespace uri has changed. + * + * @param uri + * @param file + */ + public abstract void changed(final String uri, final IFile file); + + /** + * Signal that the library defined in file with namespace uri has been + * removed as a library. This may or may not mean that file still exists. + * @param uri + * @param file + */ + public abstract void removed(final String uri, final IFile file); + + /** + * A new tag library defined in file has been added to the system. + * + * @param file + */ + public abstract void added(final IFile file); + +} diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java index 0673acf4e..f68ecf438 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java @@ -128,7 +128,8 @@ public class ProjectTaglibDescriptor implements IProjectTaglibDescriptor public void destroy() { - // do nothing + // call dispose; there is no persistent data to cleanup. + dispose(); } public void dispose() diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java index 742cd174a..b411d7ba9 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java @@ -1,6 +1,7 @@ package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; import java.io.InputStream; +import java.io.OutputStream; import java.util.Collections; import org.eclipse.emf.common.util.URI; @@ -19,7 +20,7 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.u * Loads the facelet taglib file model using EMF. * * @author cbateman - * + * */ public class TagModelLoader { @@ -36,10 +37,9 @@ public class TagModelLoader _resourceUri = resourceUri; _resSet = new ResourceSetImpl(); - _resSet.getPackageRegistry().put("http://java.sun.com/xml/ns/javaee", //$NON-NLS-1$ + _resSet.getPackageRegistry().put("http://java.sun.com/xml/ns/javaee", //$NON-NLS-1$ FaceletTaglibPackage.eINSTANCE); - _resSet.getPackageRegistry() - .put( + _resSet.getPackageRegistry().put( "http://java.sun.com/xml/ns/javaee/web-facelettaglibrary.xsd", //$NON-NLS-1$ FaceletTaglibPackage.eINSTANCE); final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData( @@ -55,23 +55,59 @@ public class TagModelLoader * @param is * @throws Exception */ - public void loadFromInputStream(InputStream is) throws Exception + public void loadFromInputStream(final InputStream is) throws Exception { - final Resource res = _resSet.createResource(URI.createFileURI(_resourceUri)); + final Resource res = _resSet.createResource(URI + .createFileURI(_resourceUri)); if (res != null) { res.load(is, Collections.EMPTY_MAP); final EObject eObject = res.getContents().get(0); - // assertTrue(eObject instanceof DocumentRoot); _docRoot = (DocumentRoot) eObject; _faceletTaglib = _docRoot.getFaceletTaglib(); + } else + { + // This is often caused if the extension of the file pointed to + // by _resourceUri wasn't initialized in extensionToFactoryMap. + throw new IllegalArgumentException("Could not create Resource"); //$NON-NLS-1$ } - else + } + + /** + * @param os + * @throws Exception + */ + public void save(final OutputStream os) throws Exception + { + final Resource res = _resSet.createResource(URI + .createFileURI(_resourceUri)); + if (res != null) + { + res.getContents().add(_docRoot); + res.save(os, Collections.EMPTY_MAP); + } else { throw new IllegalArgumentException("Could not create Resource"); //$NON-NLS-1$ } } - + + + /** + * @param faceletTaglib + */ + public final void setTaglib(FaceletTaglib faceletTaglib) + { + _faceletTaglib = faceletTaglib; + } + + /** + * @param docRoot + */ + public final void setDocRoot(DocumentRoot docRoot) + { + _docRoot = docRoot; + } + /** * @return the taglib or null if none has been loaded. */ @@ -79,7 +115,7 @@ public class TagModelLoader { return _faceletTaglib; } - + /** * @return the doc root or null if none has been loaded. */ diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileManager.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileManager.java deleted file mode 100644 index e0d11ac01..000000000 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileManager.java +++ /dev/null @@ -1,145 +0,0 @@ -package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; - -import java.util.List; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResourceChangeEvent; -import org.eclipse.core.resources.IResourceChangeListener; -import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.resources.IWorkspaceRunnable; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jst.j2ee.model.IModelProvider; -import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery; -import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator; -import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener; -import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager; -import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; -import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.ContextParamSpecifiedFaceletTaglibLocator.LibraryChangeHandler; -import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.ContextParamSpecifiedFaceletTaglibLocator.TaglibFileTracker; -import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.WebappListener; - -class TaglibFileManager extends - ResourceSingletonObjectManager<TaglibFileTracker, IFile> -{ - private final LibraryChangeHandler _handler; - private final WebappConfiguration _webAppConfiguration; - private final IResourceChangeListener _newFileListener; - - public TaglibFileManager(final IProject project, - final LibraryChangeHandler handler, - final IModelProvider webAppProvider, - final AbstractVirtualComponentQuery vcQuery, - final WorkspaceMediator wsMediator) - { - super(project.getWorkspace()); - _handler = handler; - _webAppConfiguration = new WebappConfiguration(project, webAppProvider, - vcQuery); - // TODO: fold into LifecycleListener - _newFileListener = new IResourceChangeListener() - { - public void resourceChanged(final IResourceChangeEvent event) - { - // if the event is post change && has the same parent - // project - if (event.getType() == IResourceChangeEvent.POST_CHANGE - && event.getDelta().findMember(project.getFullPath()) != null) - { - wsMediator.runInWorkspaceJob(new IWorkspaceRunnable() - { - - public void run(final IProgressMonitor monitor) - throws CoreException - { - for (final IFile file : _webAppConfiguration - .getFiles()) - { - final IResourceDelta delta = event.getDelta() - .findMember(file.getFullPath()); - - if (delta != null) - { - if (delta.getKind() == IResourceDelta.ADDED) - { - - _handler.added(file); - } - } - } - } - }, "Context param update"); //$NON-NLS-1$ - } - } - }; - - getWorkspace().addResourceChangeListener(_newFileListener); - } - - public List<IFile> getFiles() - { - return _webAppConfiguration.getFiles(); - } - - public void initFiles() - { - _webAppConfiguration.start(); - _webAppConfiguration.addListener(new WebappListener() - { - @Override - public void webappChanged(final WebappChangeEvent event) - { - for (final IFile file : event.getRemoved()) - { - TaglibFileTracker tracker; - try - { - tracker = getInstance(file); - _handler.removed(tracker._uri, file); - } catch (final ManagedObjectException e) - { - FaceletCorePlugin.log( - "While removing for webapp change", e); //$NON-NLS-1$ - } - } - - for (final IFile file : event.getAdded()) - { - _handler.added(file); - } - } - }); - } - - @Override - protected TaglibFileTracker createNewInstance(final IFile file) - { - return new TaglibFileTracker(file, this, _handler); - } - - public void addListener(final IResourceLifecycleListener listener) - { - super.addLifecycleEventListener(listener); - } - - public void removeListener(final IResourceLifecycleListener listener) - { - super.removeLifecycleEventListener(listener); - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager - * #dispose() - */ - @Override - public void dispose() - { - _webAppConfiguration.dispose(); - getWorkspace().removeResourceChangeListener(_newFileListener); - super.dispose(); - } -}
\ No newline at end of file diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java new file mode 100644 index 000000000..7d0c59325 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java @@ -0,0 +1,105 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import java.util.concurrent.atomic.AtomicLong; + +import org.eclipse.core.resources.IFile; +import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent; +import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType; + +class TaglibFileTracker extends TaglibResourceTracker +{ + private final IFile _file; + private String _uri; + private final AtomicLong _lastModifiedStamp = new AtomicLong(); + private TaglibResourceManager _manager; + private final ILibraryChangeHandler _handler; + + public TaglibFileTracker(final IFile file, final TaglibResourceManager manager, + final ILibraryChangeHandler handler) + { + _manager = manager; + _manager.addListener(this); + _file = file; + _lastModifiedStamp.set(file.getModificationStamp()); + _handler = handler; + } + + public String getUri() + { + return _uri; + } + + public final void setUri(final String uri) + { + _uri = uri; + } + + @Override + public void dispose() + { + _manager.removeListener(this); + _manager = null; + } + + @Override + public EventResult acceptEvent(final ResourceLifecycleEvent event) + { + if (!_file.equals(event.getAffectedResource())) + { + return EventResult.getDefaultEventResult(); + } + + final EventType eventType = event.getEventType(); + + switch (eventType) + { + case RESOURCE_ADDED: + // added resources kick an add event. + _handler.added(_file); + break; + case RESOURCE_CHANGED: + // changed resources kick a change event + _handler.changed(_uri, _file); + break; + case RESOURCE_INACCESSIBLE: + // removed resources kick a remove event + _handler.removed(_uri, _file); + break; + } + + return EventResult.getDefaultEventResult(); + } + +// private final static class HandleFileAddJob implements IWorkspaceRunnable +// { +// private final IResourceChangeEvent _event; +// private List<IFile> _files; +// private ILibraryChangeHandler _handler; +// +// private HandleFileAddJob(final IResourceChangeEvent event, final List<IFile> files, +// final ILibraryChangeHandler handler) +// { +// _event = event; +// _files = files; +// _handler = handler; +// } +// +// public void run(final IProgressMonitor monitor) +// throws CoreException +// { +// for (final IFile file : _files) +// { +// final IResourceDelta delta = _event.getDelta() +// .findMember(file.getFullPath()); +// +// if (delta != null) +// { +// if (delta.getKind() == IResourceDelta.ADDED) +// { +// _handler.added(file); +// } +// } +// } +// } +// } +}
\ No newline at end of file diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java new file mode 100644 index 000000000..7195e2af9 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java @@ -0,0 +1,126 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener; +import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager; +import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator; +import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; +import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.WebappListener; + +class TaglibResourceManager extends + ResourceSingletonObjectManager<TaglibResourceTracker, IResource> +{ + private ILibraryChangeHandler _handler; + private final WebappConfiguration _webAppConfiguration; +// private final IResourceChangeListener _newFileListener; + + public TaglibResourceManager(final IProject project, + final ILibraryChangeHandler handler, + final WorkspaceMediator wsMediator, + final WebappConfiguration webAppConfiguration) + { + super(project.getWorkspace()); + _handler = handler; + _webAppConfiguration = webAppConfiguration; + // TODO: fold into LifecycleListener +// _newFileListener = new IResourceChangeListener() +// { +// public void resourceChanged(final IResourceChangeEvent event) +// { +// // if the event is post change && has the same parent +// // project +// if (event.getType() == IResourceChangeEvent.POST_CHANGE +// && event.getDelta().findMember(project.getFullPath()) != null) +// { +// wsMediator.runInWorkspaceJob(new HandleFileAddJob(event), "Context param update"); //$NON-NLS-1$ +// } +// } +// }; + +// getWorkspace().addResourceChangeListener(_newFileListener); + } + + public List<IFile> getFiles() + { + return _webAppConfiguration.getFiles(); + } + + public void initFiles() + { + _webAppConfiguration.start(); + _webAppConfiguration.addListener(new WebappListener() + { + @Override + public void webappChanged(final WebappChangeEvent event) + { + for (final IFile file : event.getRemoved()) + { + TaglibFileTracker tracker; + // only fire removals on files that we are already managing: you can't remove + // a file that is not there. + if (isInstance(file)) + { + tracker = (TaglibFileTracker) unmanageResource(file); + _handler.removed(tracker.getUri(), file); + } + } + + for (final IFile file : event.getAdded()) + { + _handler.added(file); + } + } + }); + List<IFile> files = _webAppConfiguration.getFiles(); + for (final IFile file : files) + { + // add files to ensure we get add events for ones that don't exist. + try + { + getInstance(file); + } catch (ManagedObjectException e) + { + FaceletCorePlugin.log("While starting the taglib resource manager", e); //$NON-NLS-1$ + } + } + } + + @Override + protected TaglibResourceTracker createNewInstance(final IResource resource) + { + if (resource.getType() == IResource.FILE) + { + return new TaglibFileTracker((IFile) resource, this, _handler); + } + throw new IllegalArgumentException(); + } + + public void addListener(final IResourceLifecycleListener listener) + { + super.addLifecycleEventListener(listener); + } + + public void removeListener(final IResourceLifecycleListener listener) + { + super.removeLifecycleEventListener(listener); + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager + * #dispose() + */ + @Override + public void dispose() + { + _webAppConfiguration.dispose(); +// getWorkspace().removeResourceChangeListener(_newFileListener); + super.dispose(); + } +}
\ No newline at end of file diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceTracker.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceTracker.java new file mode 100644 index 000000000..2f43f2b2e --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceTracker.java @@ -0,0 +1,43 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import org.eclipse.jst.jsf.common.internal.managedobject.AbstractManagedObject; +import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener; +import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent; + +/** + * A managed object that tracks changes to a taglib resource. + * + * @author cbateman + * + */ +public class TaglibResourceTracker extends AbstractManagedObject implements + IResourceLifecycleListener +{ + + public EventResult acceptEvent(ResourceLifecycleEvent event) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void dispose() + { + // TODO Auto-generated method stub + + } + + @Override + public void checkpoint() + { + // nothing currently persisted + + } + + @Override + public void destroy() + { + // nothing currently persisted + } + +} diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java index bb397a98f..b291821c8 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java @@ -17,20 +17,21 @@ import java.util.List; import java.util.StringTokenizer; import java.util.concurrent.CopyOnWriteArrayList; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; -import org.eclipse.emf.common.notify.Notification; -import org.eclipse.emf.common.notify.impl.AdapterImpl; -import org.eclipse.emf.common.util.EList; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.jst.j2ee.common.ParamValue; -import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; import org.eclipse.jst.j2ee.model.IModelProvider; -import org.eclipse.jst.j2ee.webapplication.ContextParam; -import org.eclipse.jst.j2ee.webapplication.WebApp; +import org.eclipse.jst.javaee.web.IWebCommon; import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery; -import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; +import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener; +import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener; +import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent; +import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType; +import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.WebappListener.WebappChangeEvent; import org.eclipse.wst.common.componentcore.resources.IVirtualFile; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; @@ -43,7 +44,6 @@ import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; */ public class WebappConfiguration { - // TODO: move these to jsf core. /** * The param key for Facelet 1.x libraries declared in web.xml */ @@ -58,22 +58,29 @@ public class WebappConfiguration */ private final ContextParamAdapter _contextParamAdapter; private List<IFile> _cachedFiles; - private IModelProvider _modelProvider; - private AbstractVirtualComponentQuery _vcQuery; + private final IModelProvider _modelProvider; + private final AbstractVirtualComponentQuery _vcQuery; + private final LifecycleListener _lifecycleListener; + private final WorkspaceMediator _wsMediator; /** * @param project * @param modelProvider * @param vcQuery + * @param wsMediator */ public WebappConfiguration(final IProject project, final IModelProvider modelProvider, - final AbstractVirtualComponentQuery vcQuery) + final AbstractVirtualComponentQuery vcQuery, + final WorkspaceMediator wsMediator) { _project = project; + _vcQuery = vcQuery; + _lifecycleListener = new LifecycleListener(getWebXmlFile(project), + project.getWorkspace()); _contextParamAdapter = new ContextParamAdapter(); _modelProvider = modelProvider; - _vcQuery = vcQuery; + _wsMediator = wsMediator; } /** @@ -117,12 +124,15 @@ public class WebappConfiguration } } _cachedFiles = files; - return Collections.unmodifiableList(files); + return Collections.unmodifiableList(_cachedFiles); } - private Object getModelObject() + private IFile getWebXmlFile(final IProject project) { - return _modelProvider.getModelObject(); + final IVirtualFolder webContentFolder = _vcQuery + .getWebContentFolder(project); + final IContainer folder = webContentFolder.getUnderlyingFolder(); + return folder.getFile(new Path("WEB-INF/web.xml")); //$NON-NLS-1$ } /** @@ -130,136 +140,23 @@ public class WebappConfiguration */ public void start() { - final Object webAppObj = getModelObject(); - if (webAppObj != null) - { - if (webAppObj instanceof WebApp) - { - startLocatingJ2EEConfigs((WebApp) webAppObj); - } else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) - { - startLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp) webAppObj); - } - } else - { - FaceletCorePlugin - .log( - "Could not get webApp for project: " + _project, new Exception()); //$NON-NLS-1$ - } + _lifecycleListener.addListener(_contextParamAdapter); } /** * */ - public void dispose() - { - if (_contextParamAdapter != null) - { - final Object webAppObj = getModelObject(); - if (webAppObj != null) - { - if (webAppObj instanceof WebApp) - { - stopLocatingJ2EEConfigs((WebApp) webAppObj); - } else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) - { - stopLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp) webAppObj); - } - } else - { - FaceletCorePlugin - .log( - "Failed stopping locator for project: " + _project.getName() //$NON-NLS-1$ - , new Exception()); - } - } - } - - private void startLocatingJ2EEConfigs(final WebApp webApp) - { - webApp.eAdapters().add(_contextParamAdapter); - final EList contexts = webApp.getContexts(); - if (contexts != null) - { - final Iterator itContexts = contexts.iterator(); - while (itContexts.hasNext()) - { - final ContextParam contextParam = (ContextParam) itContexts - .next(); - contextParam.eAdapters().add(_contextParamAdapter); - } - } - final EList contextParams = webApp.getContextParams(); - if (contextParams != null) - { - final Iterator itContextParams = contextParams.iterator(); - while (itContextParams.hasNext()) - { - final ParamValue paramValue = (ParamValue) itContextParams - .next(); - paramValue.eAdapters().add(_contextParamAdapter); - } - } - } - - private void startLocatingJEEConfigs( - final org.eclipse.jst.javaee.web.WebApp webApp) - { - ((EObject) webApp).eAdapters().add(_contextParamAdapter); - // System.out.println(((EObject)webApp).eDeliver()); - final List params = webApp.getContextParams(); - if (params != null) - { - final Iterator itContexts = params.iterator(); - while (itContexts.hasNext()) - { - final EObject contextParam = (EObject) itContexts.next(); - contextParam.eAdapters().add(_contextParamAdapter); - } - } - } - - private void stopLocatingJ2EEConfigs(final WebApp webApp) + public void stop() { - webApp.eAdapters().remove(_contextParamAdapter); - final EList contexts = webApp.getContexts(); - if (contexts != null) - { - final Iterator itContexts = contexts.iterator(); - while (itContexts.hasNext()) - { - final ContextParam contextParam = (ContextParam) itContexts - .next(); - contextParam.eAdapters().remove(_contextParamAdapter); - } - } - final EList contextParams = webApp.getContextParams(); - if (contextParams != null) - { - final Iterator itContextParams = contextParams.iterator(); - while (itContextParams.hasNext()) - { - final ParamValue paramValue = (ParamValue) itContextParams - .next(); - paramValue.eAdapters().remove(_contextParamAdapter); - } - } + _lifecycleListener.removeListener(_contextParamAdapter); } - private void stopLocatingJEEConfigs( - final org.eclipse.jst.javaee.web.WebApp webApp) + /** + * + */ + public void dispose() { - ((EObject) webApp).eAdapters().remove(_contextParamAdapter); - final List contextParams = webApp.getContextParams(); - if (contextParams != null) - { - final Iterator itContextParams = contextParams.iterator(); - while (itContextParams.hasNext()) - { - final EObject paramValue = (EObject) itContextParams.next(); - paramValue.eAdapters().remove(_contextParamAdapter); - } - } + _lifecycleListener.dispose(); } /** @@ -278,7 +175,7 @@ public class WebappConfiguration * may be empty. */ public static List<String> getConfigFilesFromContextParam( - final IProject project, IModelProvider provider) + final IProject project, final IModelProvider provider) { List<String> filesList = Collections.EMPTY_LIST; // if (JSFAppConfigUtils.isValidJSFProject(project)) @@ -286,10 +183,7 @@ public class WebappConfiguration final Object webAppObj = provider.getModelObject(); if (webAppObj != null) { - if (webAppObj instanceof WebApp) - { - filesList = getConfigFilesForJ2EEApp((WebApp) webAppObj); - } else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) + if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) { filesList = getConfigFilesForJEEApp((org.eclipse.jst.javaee.web.WebApp) webAppObj); } @@ -305,6 +199,7 @@ public class WebappConfiguration String filesString = null; final List contextParams = webApp.getContextParams(); final Iterator itContextParams = contextParams.iterator(); + final List<String> fileStrings = new ArrayList<String>(); while (itContextParams.hasNext()) { final org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue) itContextParams @@ -315,64 +210,10 @@ public class WebappConfiguration JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME)) { filesString = paramValue.getParamValue(); - break; - } - } - return parseFilesString(filesString); - } - - private static List<String> getConfigFilesForJ2EEApp(final WebApp webApp) - { - List<String> filesList = new ArrayList<String>(); - - if (webApp != null) - { - String filesString = null; - // need to branch here due to model version differences - // (BugZilla #119442) - if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID) - { - final EList contexts = webApp.getContexts(); - final Iterator itContexts = contexts.iterator(); - while (itContexts.hasNext()) - { - final ContextParam contextParam = (ContextParam) itContexts - .next(); - if (contextParam.getParamName().equals( - FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME) - || contextParam.getParamName().equals( - JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME)) - // if (contextParam.getParamName().equals( - // FACELET_LIBRARIES_CONTEXT_PARAM_NAME)) - { - filesString = contextParam.getParamValue(); - break; - } - } - } else - { - final EList contextParams = webApp.getContextParams(); - final Iterator itContextParams = contextParams.iterator(); - while (itContextParams.hasNext()) - { - final ParamValue paramValue = (ParamValue) itContextParams - .next(); - if (paramValue.getName().equals( - FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME) - || paramValue.getName().equals( - JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME)) - // if (paramValue.getName().equals( - // FACELET_LIBRARIES_CONTEXT_PARAM_NAME)) - { - filesString = paramValue.getValue(); - break; - } - } + fileStrings.addAll(parseFilesString(filesString)); } - filesList = parseFilesString(filesString); } - - return filesList; + return fileStrings; } private static List<String> parseFilesString(final String filesString) @@ -398,7 +239,7 @@ public class WebappConfiguration * * @author Ian Trimble - Oracle */ - private class ContextParamAdapter extends AdapterImpl + private class ContextParamAdapter implements IResourceLifecycleListener { private final CopyOnWriteArrayList<WebappListener> _listeners = new CopyOnWriteArrayList<WebappListener>(); @@ -420,82 +261,6 @@ public class WebappConfiguration } } - /* - * (non-Javadoc) - * - * @see - * org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org. - * eclipse.emf.common.notify.Notification) - */ - @Override - public void notifyChanged(final Notification notification) - { - final Object objNotifier = notification.getNotifier(); - // System.out.println(objNotifier.toString()); - if (objNotifier instanceof WebApp - || objNotifier instanceof org.eclipse.jst.javaee.web.WebApp) - { - final int eventType = notification.getEventType(); - switch (eventType) - { - case Notification.ADD: - final Object objNewValue = notification.getNewValue(); - if (objNewValue instanceof ContextParam - || objNewValue instanceof org.eclipse.jst.javaee.core.ParamValue) - { - contextParamAdded((EObject) objNewValue); - } else if (objNewValue instanceof ParamValue) - { - paramValueAdded((EObject) objNewValue); - } - break; - case Notification.REMOVE: - final Object objOldValue = notification.getOldValue(); - if (objOldValue instanceof ContextParam - || objOldValue instanceof org.eclipse.jst.javaee.core.ParamValue) - { - contextParamRemoved((EObject) objOldValue); - } else if (objOldValue instanceof ParamValue) - { - paramValueRemoved((EObject) objOldValue); - } - break; - } - } - // else if (objNotifier instanceof ContextParam - // || objNotifier instanceof org.eclipse.jst.javaee.core.ParamValue) - // { - // if (notification.getEventType() != Notification.REMOVING_ADAPTER) - // { - // _listener - // .tagLibChanged(ContextParamSpecifiedFaceletTaglibLocator.this); - // } - // } - // else if (objNotifier instanceof ParamValue) - // { - // if (notification.getEventType() != Notification.REMOVING_ADAPTER) - // { - // _listener - // .tagLibChanged(ContextParamSpecifiedFaceletTaglibLocator.this); - // } - // } - } - - /** - * Called when a new ContextParam instance is added. - * - * @param contextParam - * ContextParam instance. - */ - protected void contextParamAdded(final EObject contextParam) - { - if (isConfigFilesContextParam(contextParam)) - { - checkAndFireFileChanges(); - } - contextParam.eAdapters().add(this); - } - private void checkAndFireFileChanges() { final List<IFile> oldFiles = _cachedFiles == null ? Collections.EMPTY_LIST @@ -528,116 +293,80 @@ public class WebappConfiguration } /** - * Called when a new ParamValue instance is added. - * - * @param paramValue - * ParamValue instance. - */ - protected void paramValueAdded(final EObject paramValue) - { - if (isConfigFilesParamValue(paramValue)) - { - checkAndFireFileChanges(); - } - paramValue.eAdapters().add(this); - } - - /** * Called when a ContextParam instance is removed. * * @param contextParam * ContextParam instance. */ - protected void contextParamRemoved(final EObject contextParam) + protected void processParamValue( + final org.eclipse.jst.javaee.core.ParamValue contextParam) { - if (isConfigFilesContextParam(contextParam)) - { - checkAndFireFileChanges(); - } - contextParam.eAdapters().remove(this); + checkAndFireFileChanges(); } - /** - * Called when a ParamValue instance is removed. - * - * @param paramValue - * ParamValue instance. - */ - protected void paramValueRemoved(final EObject paramValue) +// /** +// * Tests if the passed ContextParam instance is the JSF CONFIG_FILES +// * context parameter. +// * +// * @param contextParam +// * ContextParam instance. +// * @return true if the passed ContextParam instance is the JSF +// * CONFIG_FILES context parameter, else false +// */ +// protected boolean isConfigFilesContextParam( +// final org.eclipse.jst.javaee.core.ParamValue contextParam) +// { +// boolean isConfigFiles = false; +// if (contextParam != null) +// { +// final String name = contextParam.getParamName(); +// if (FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME.equals(name) +// || JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME +// .equals(name)) +// { +// isConfigFiles = true; +// } +// } +// return isConfigFiles; +// } + + public EventResult acceptEvent(final ResourceLifecycleEvent event) { - if (isConfigFilesParamValue(paramValue)) + // the event is only interesting if it is the web.xml + if (event.getAffectedResource() instanceof IFile + && "web.xml".equals(event.getAffectedResource().getProjectRelativePath().lastSegment())) //$NON-NLS-1$ { - checkAndFireFileChanges(); - } - paramValue.eAdapters().remove(this); - } - - /** - * Tests if the passed ContextParam instance is the JSF CONFIG_FILES - * context parameter. - * - * @param contextParam - * ContextParam instance. - * @return true if the passed ContextParam instance is the JSF - * CONFIG_FILES context parameter, else false - */ - protected boolean isConfigFilesContextParam(final EObject contextParam) - { - boolean isConfigFiles = false; - if (contextParam != null) - { - String name = null; - if (contextParam instanceof ContextParam) + if (event.getEventType() == EventType.RESOURCE_CHANGED) { - name = ((ContextParam) contextParam).getParamName(); - } else if (contextParam instanceof org.eclipse.jst.javaee.core.ParamValue) - { - name = ((org.eclipse.jst.javaee.core.ParamValue) contextParam) - .getParamName(); - } - - if (FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME.equals(name) - || JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME - .equals(name)) - { - isConfigFiles = true; + handleChange(); } } - return isConfigFiles; + return EventResult.getDefaultEventResult(); } - /** - * Tests if the passed ParamValue instance is the JSF CONFIG_FILES - * context parameter. - * - * @param paramVal - * as EObject ParamValue instance. - * @return true if the passed ParamValue instance is the JSF - * CONFIG_FILES context parameter, else false - */ - protected boolean isConfigFilesParamValue(final EObject paramVal) + private void handleChange() { - boolean isConfigFiles = false; - if (paramVal != null) + final IWorkspaceRunnable runnable = new IWorkspaceRunnable() { - String name = null; - if (paramVal instanceof ParamValue) - { - name = ((ParamValue) paramVal).getName(); - } else if (paramVal instanceof org.eclipse.jst.javaee.core.ParamValue) - { - name = ((org.eclipse.jst.javaee.core.ParamValue) paramVal) - .getParamName(); - } - - if (FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME.equals(name) - || JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME - .equals(name)) + public void run(final IProgressMonitor monitor) throws CoreException { - isConfigFiles = true; + final Object modelObject = _modelProvider.getModelObject(); + if (modelObject instanceof org.eclipse.jst.javaee.web.WebApp) + { + for (final org.eclipse.jst.javaee.core.ParamValue paramValue : ((IWebCommon) modelObject) + .getContextParams()) + { + processParamValue(paramValue); + } + } + // TODO: possibly handle facelets 1.0 in pre-2.5 webapps in + // the + // future + // if it's worth the complexity. + // SEE previous revs in CVS. } - } - return isConfigFiles; + }; + _wsMediator.runInWorkspaceJob(runnable, "Update web xml"); //$NON-NLS-1$ } } |