Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbateman2010-04-20 15:44:48 +0000
committercbateman2010-04-20 15:44:48 +0000
commit96d175c458bda4eb42e9bce42c6ebd33f20d28a4 (patch)
treeab735a9c57f2f78d02138cd41860bc358eb80a16
parent8ced2996e89211ecea3e07901d7c12bd46b7bd81 (diff)
downloadwebtools.jsf-96d175c458bda4eb42e9bce42c6ebd33f20d28a4.tar.gz
webtools.jsf-96d175c458bda4eb42e9bce42c6ebd33f20d28a4.tar.xz
webtools.jsf-96d175c458bda4eb42e9bce42c6ebd33f20d28a4.zip
Scenario testing and bug fixes for context param defined facelet taglibs.
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF2
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java221
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceSingletonObjectManager.java30
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/LibraryOperation.java4
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ContextParamSpecifiedFaceletTaglibLocator.java159
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagIndex.java5
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ILibraryChangeHandler.java37
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java3
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagModelLoader.java56
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileManager.java145
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibFileTracker.java105
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceManager.java126
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TaglibResourceTracker.java43
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/WebappConfiguration.java463
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$
}
}

Back to the top