diff options
author | cbateman | 2010-04-05 22:01:10 +0000 |
---|---|---|
committer | cbateman | 2010-04-05 22:01:10 +0000 |
commit | 9c1f6987c43b0834125d610173686a5383091a65 (patch) | |
tree | 402d45c0ea83ad93c4f2ec8fa6f671cff6b50459 | |
parent | 3e0e379b6796766f5ccceceaf5f8c02c299478c8 (diff) | |
download | webtools.jsf-9c1f6987c43b0834125d610173686a5383091a65.tar.gz webtools.jsf-9c1f6987c43b0834125d610173686a5383091a65.tar.xz webtools.jsf-9c1f6987c43b0834125d610173686a5383091a65.zip |
Add substantial test coverage to the existing Facelet library location mechanism. Also makes major additions to the mock workspace context framework.
38 files changed, 1004 insertions, 3052 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 d1bae9bef..48d19dbd9 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 @@ -11,7 +11,8 @@ Export-Package: org.eclipse.jst.jsf.common;x-internal:=true, org.eclipse.jst.jsf.common.facet.libraryprovider;x-internal:=true, org.eclipse.jst.jsf.common.facet.libraryprovider.jsf;x-internal:=true, org.eclipse.jst.jsf.common.internal;x-friends:="org.eclipse.jst.jsf.core", - org.eclipse.jst.jsf.common.internal.locator;x-internal:=true, + org.eclipse.jst.jsf.common.internal.componentcore, + org.eclipse.jst.jsf.common.internal.locator;x-friends:="org.eclipse.jst.jsf.facelet.core,org.eclipse.jst.jsf.facelet.core.tests", 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, diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/componentcore/AbstractVirtualComponentQuery.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/componentcore/AbstractVirtualComponentQuery.java new file mode 100644 index 000000000..ae797b30f --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/componentcore/AbstractVirtualComponentQuery.java @@ -0,0 +1,51 @@ +package org.eclipse.jst.jsf.common.internal.componentcore; + +import org.eclipse.core.resources.IProject; +import org.eclipse.wst.common.componentcore.ComponentCore; +import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; +import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; + +/** + * Wraps parts of the component core in a way that always PDE-free injection + * during test. + * + * @author cbateman + * + */ +public abstract class AbstractVirtualComponentQuery +{ + /** + * TODO: reconcile with duplicate. This was taken from JSFAppConfigUtils. + * + * Gets an IVirtualFolder instance which represents the root context's web + * content folder. + * + * @param project + * IProject instance for which to get the folder. + * @return IVirtualFolder instance which represents the root context's web + * content folder. + */ + public abstract IVirtualFolder getWebContentFolder(IProject project); + + /** + * The default implementation that makes static calls to ComponentCore. + * @author cbateman + * + */ + public static class DefaultVirtualComponentQuery extends + AbstractVirtualComponentQuery + { + @Override + public IVirtualFolder getWebContentFolder(IProject project) + { + IVirtualFolder folder = null; + IVirtualComponent component = ComponentCore + .createComponent(project); + if (component != null) + { + folder = component.getRootFolder(); + } + return folder; + } + } +} diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocator.java index 240657a97..4c654e2bf 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocator.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocator.java @@ -93,7 +93,7 @@ public abstract class AbstractLocator<LOCATORTYPE, CONTEXTTYPE, IDTYPE> { return doLocate(context); } - throw new IllegalArgumentException("Locator not started"); //$NON-NLS-1$ + throw new IllegalStateException("Locator not started"); //$NON-NLS-1$ } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocatorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocatorProvider.java new file mode 100644 index 000000000..edd77dc23 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/AbstractLocatorProvider.java @@ -0,0 +1,72 @@ +package org.eclipse.jst.jsf.common.internal.locator; + +import java.util.Collections; +import java.util.List; + +/** + * The super-class of all ILocatorProvider's. + * + * @author cbateman + * @param <LOCATORTYPE> + * + */ +public abstract class AbstractLocatorProvider<LOCATORTYPE> implements ILocatorProvider<LOCATORTYPE> +{ + private boolean _isInit = false; + + public void initialize() + { + doInitialize(); + _isInit = true; + } + + /** + * Overrride to do the init. You can override initialize if you want to + */ + protected abstract void doInitialize(); + + public List<? extends LOCATORTYPE> getLocators() + { + if (!_isInit) + { + throw new IllegalStateException( + "initialize must be called before getLocators"); //$NON-NLS-1$ + } + return doGetLocators(); + } + + /** + * @return the locators. + */ + protected abstract List<? extends LOCATORTYPE> doGetLocators(); + + /** + * A default implementation of the provider that simply sits on a list + * of a locators. + * + * @param <LOCATORTYPE> + */ + public static class DefaultLocatorProvider<LOCATORTYPE> extends AbstractLocatorProvider<LOCATORTYPE> + { + private final List<LOCATORTYPE> _locators; + + /** + * @param locators + */ + public DefaultLocatorProvider(List<LOCATORTYPE> locators) + { + _locators = locators; + } + @Override + protected void doInitialize() + { + // nothing to do. + } + + @Override + protected List<? extends LOCATORTYPE> doGetLocators() + { + return Collections.unmodifiableList(_locators); + } + } +} diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/ILocatorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/ILocatorProvider.java new file mode 100644 index 000000000..57472ad8e --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/locator/ILocatorProvider.java @@ -0,0 +1,25 @@ +package org.eclipse.jst.jsf.common.internal.locator; + +import java.util.List; + +/** + * An object that provides zero or more locators to a client. + * + * @author cbateman + * @param <LOCATORTYPE> + * + */ +public interface ILocatorProvider<LOCATORTYPE> +{ + /** + * Must be called before getLocators is called. Implementations MUST + * support multiple calls to initialize on the same instance but need not + * do anything on any of them. + */ + void initialize(); + + /** + * @return the list of locators. + */ + List<? extends LOCATORTYPE> getLocators(); +} diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java index faa337a4b..a8ac64359 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/AbstractManagedObject.java @@ -10,24 +10,64 @@ *******************************************************************************/ package org.eclipse.jst.jsf.common.internal.managedobject; +import java.util.concurrent.atomic.AtomicBoolean; + + /** * Sub-class for managed objects. + * + */ +/** + * @author cbateman * */ -public abstract class AbstractManagedObject implements IManagedObject +public abstract class AbstractManagedObject implements IManagedObject { - /* (non-Javadoc) - * @see org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#dispose() + /** + * Flag for checking disposal. + */ + protected final AtomicBoolean _isDisposed = new AtomicBoolean(false); + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#dispose + * () */ public abstract void dispose(); - /* (non-Javadoc) - * @see org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#checkpoint() + public boolean isDisposed() + { + return _isDisposed.get(); + } + + /** + * Checks if this object is disposed and throws IllegalStateException if it + * is. + */ + protected final void assertNotDisposed() + { + if (isDisposed()) + { + throw new IllegalStateException(this.toString() + " is disposed"); //$NON-NLS-1$ + } + } + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#checkpoint + * () */ public abstract void checkpoint(); - /* (non-Javadoc) - * @see org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#destroy() + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject#destroy + * () */ public abstract void destroy(); diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.java index b4e7e7542..2c43679c9 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/IManagedObject.java @@ -14,30 +14,35 @@ package org.eclipse.jst.jsf.common.internal.managedobject; * Represents an object that wishes to be managed by the framework. * * Clients should not implement: sub-class AbstractManagedObject instead. - * + * */ -public interface IManagedObject +public interface IManagedObject { /** - * Called by the object client to indicate is finished with the object. - * The object should save any data it may want between sessions, perhaps - * by calling its checkpoint, before cleaning held resources and clearing + * Called by the object client to indicate is finished with the object. The + * object should save any data it may want between sessions, perhaps by + * calling its checkpoint, before cleaning held resources and clearing * memory references. */ void dispose(); - + + /** + * @return true if dispose has been successfully called on the object. + */ + boolean isDisposed(); + /** * Called to indicate that the object should remove all its data from both - * memory and persistent storage. This differentiates it from dispose in + * memory and persistent storage. This differentiates it from dispose in * that it signals that this object and its associated state will never * again be loaded for associated objects. */ void destroy(); - + /** - * Indicates that an object should flush cached data and make durable - * any data it might want between sessions. It does not indicate a - * disposal of the object. + * Indicates that an object should flush cached data and make durable any + * data it might want between sessions. It does not indicate a disposal of + * the object. */ void checkpoint(); } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.java index f98fe9dda..569517099 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/managedobject/ObjectManager.java @@ -10,30 +10,44 @@ *******************************************************************************/ package org.eclipse.jst.jsf.common.internal.managedobject; + /** * An abstraction for a manager that manages managed objects based on a KEYTYPE * * @author cbateman - * + * * @param <T> - * @param <KEYTYPE> + * @param <KEYTYPE> */ -public abstract class ObjectManager<T extends IManagedObject, KEYTYPE> +public abstract class ObjectManager<T extends IManagedObject, KEYTYPE> extends + AbstractManagedObject { + /** - * A valid instance of T for the key. The instance of T may be unique on - * a per-key basis or may not. - * + * A valid instance of T for the key. The instance of T may be unique on a + * per-key basis or may not. + * * @param key * @return an instance of the managed object associated with key - * @throws ManagedObjectException if an error occurs during construction + * @throws ManagedObjectException + * if an error occurs during construction */ public abstract T getInstance(KEYTYPE key) throws ManagedObjectException; + @Override + public abstract void destroy(); + + @Override + public abstract void checkpoint(); + + @Override + public abstract void dispose(); + /** * Indicates a problem that occurred during a managed object operation + * * @author cbateman - * + * */ public static class ManagedObjectException extends Exception { @@ -54,7 +68,7 @@ public abstract class ObjectManager<T extends IManagedObject, KEYTYPE> * @param message * @param cause */ - public ManagedObjectException(String message, Throwable cause) + public ManagedObjectException(final String message, final Throwable cause) { super(message, cause); } @@ -62,7 +76,7 @@ public abstract class ObjectManager<T extends IManagedObject, KEYTYPE> /** * @param message */ - public ManagedObjectException(String message) + public ManagedObjectException(final String message) { super(message); } @@ -70,7 +84,7 @@ public abstract class ObjectManager<T extends IManagedObject, KEYTYPE> /** * @param cause */ - public ManagedObjectException(Throwable cause) + public ManagedObjectException(final Throwable cause) { super(cause); } 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 7655cf2a4..78265c40a 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 @@ -19,7 +19,7 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.jst.jsf.common.internal.ITestTracker; import org.eclipse.jst.jsf.common.internal.ITestTracker.Event; import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener.EventResult; @@ -43,6 +43,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements private AtomicBoolean _isDisposed = new AtomicBoolean( false); private ITestTracker _testTracker; // == + private final IWorkspace _workspace; // null; // initialized // by @@ -54,33 +55,37 @@ public class LifecycleListener extends ImmutableLifecycleListener implements * 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. */ - public LifecycleListener() + public LifecycleListener(final IWorkspace workspace) { _resources = new CopyOnWriteArrayList<IResource>(); _listeners = new CopyOnWriteArrayList<IResourceLifecycleListener>(); + _workspace = workspace; } /** * Create a new lifecycle listener for the res * * @param res + * @param workspace the workspace to listen to for changes. */ - public LifecycleListener(final IResource res) + public LifecycleListener(final IResource res, final IWorkspace workspace) { - this(); + this(workspace); _resources.add(res); - ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + workspace.addResourceChangeListener(this); } /** * @param resources + * @param workspace the workspace to listen to for changes. */ - public LifecycleListener(final List<IResource> resources) + public LifecycleListener(final List<IResource> resources, final IWorkspace workspace) { - this(); + this(workspace); _resources.addAll(resources); - ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + workspace.addResourceChangeListener(this); } /** @@ -160,7 +165,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements // and is now greater, make sure the listener is added if (preSize == 0 && _resources.size() > 0) { - ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + _workspace.addResourceChangeListener(this); } } } @@ -186,7 +191,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements // remove the workspace listener if (_resources.size() == 0) { - ResourcesPlugin.getWorkspace().removeResourceChangeListener( + _workspace.removeResourceChangeListener( this); } } @@ -205,7 +210,7 @@ public class LifecycleListener extends ImmutableLifecycleListener implements { // remove first to minimize the chance that the listener will // be triggered during the remainder of dispose - ResourcesPlugin.getWorkspace().removeResourceChangeListener( + _workspace.removeResourceChangeListener( this); _resources.clear(); } 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 903acc128..2dde95871 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 @@ -11,12 +11,13 @@ package org.eclipse.jst.jsf.common.internal.resource; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Set; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject; import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager; import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType; @@ -38,20 +39,42 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana { // lazily initialized private LifecycleListener _lifecycleListener; - private final Map<RESOURCE, ManagedResourceObject> _perResourceObjects; + final Map<RESOURCE, ManagedResourceObject<MANAGEDOBJECT>> _perResourceObjects; + private final IWorkspace _workspace; /** * Default constructor + * @param workspace */ - protected ResourceSingletonObjectManager() + protected ResourceSingletonObjectManager(final IWorkspace workspace) { - _perResourceObjects = new HashMap<RESOURCE, ManagedResourceObject>(); + _workspace = workspace; + _perResourceObjects = new HashMap<RESOURCE, ManagedResourceObject<MANAGEDOBJECT>>(); + } + + /** + * @return the workspace + */ + protected final IWorkspace getWorkspace() + { + return _workspace; + } + + + /** + * @return an unmodifiable view on the map of currently managed objects keyed + * by the resource they are mapped to. + */ + protected final Map<RESOURCE, ManagedResourceObject<MANAGEDOBJECT>> getPerResourceObjects() + { + return Collections.unmodifiableMap(_perResourceObjects); } @Override public final MANAGEDOBJECT getInstance(final RESOURCE key) throws ManagedObjectException { + assertNotDisposed(); synchronized(this) { runBeforeGetInstance(key); @@ -70,7 +93,7 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana } runAfterGetInstance(key); - return managedResObject.getManagedObject(); + return (MANAGEDOBJECT) managedResObject.getManagedObject(); } } @@ -105,6 +128,7 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana */ public synchronized boolean isInstance(RESOURCE resource) { + assertNotDisposed(); return _perResourceObjects.containsKey(resource); } @@ -115,8 +139,8 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana */ public synchronized Collection<RESOURCE> getManagedResources() { - final Set resources = new HashSet(_perResourceObjects.keySet()); - return resources; + assertNotDisposed(); + return new HashSet(_perResourceObjects.keySet()); } /** * Should be called by concrete classes to indicate they have created a new @@ -131,11 +155,12 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana { final LifecycleListener listener = lazilyGetLifecycleListener(); listener.addResource(resource); - final MyLifecycleEventListener eventListener = new MyLifecycleEventListener( - managedObject, resource); + final MyLifecycleEventListener<RESOURCE, MANAGEDOBJECT> eventListener = + new MyLifecycleEventListener<RESOURCE, MANAGEDOBJECT>( + this, managedObject, resource); listener.addListener(eventListener); - final ManagedResourceObject managedResourceObject = new ManagedResourceObject( + final ManagedResourceObject<MANAGEDOBJECT> managedResourceObject = new ManagedResourceObject<MANAGEDOBJECT>( managedObject, eventListener); _perResourceObjects.put(resource, managedResourceObject); return managedResourceObject; @@ -147,8 +172,10 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana * manageResource is called). * * @param resource + * @return the managed object that has just be disassociated from the resource. + * The object is not disposed, destroyed or checkpointed before being returned. */ - protected final synchronized void unmanageResource(final RESOURCE resource) + protected final synchronized MANAGEDOBJECT unmanageResource(final RESOURCE resource) { final ManagedResourceObject managedResourceObject = _perResourceObjects.remove(resource); @@ -160,6 +187,7 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana } listener.removeResource(resource); + return (MANAGEDOBJECT) managedResourceObject.getManagedObject(); } /** @@ -170,6 +198,7 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana protected final void addLifecycleEventListener( final IResourceLifecycleListener listener) { + assertNotDisposed(); final LifecycleListener lifecycleListener = lazilyGetLifecycleListener(); lifecycleListener.addListener(listener); } @@ -190,12 +219,12 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana { if (_lifecycleListener == null) { - _lifecycleListener = new LifecycleListener(); + _lifecycleListener = new LifecycleListener(_workspace); } return _lifecycleListener; } - private class ManagedResourceObject + /*package*/ static class ManagedResourceObject<MANAGEDOBJECT extends IManagedObject> { private final MANAGEDOBJECT _managedObject; private final MyLifecycleEventListener _eventListener; @@ -218,17 +247,20 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana } } - private class MyLifecycleEventListener implements + private static class MyLifecycleEventListener<RESOURCE extends IResource, MANAGEDOBJECT extends IManagedObject> implements IResourceLifecycleListener { private final RESOURCE _resource; private final MANAGEDOBJECT _managedObject; + private final ResourceSingletonObjectManager<MANAGEDOBJECT, RESOURCE> _target; - private MyLifecycleEventListener(final MANAGEDOBJECT managedObject, + private MyLifecycleEventListener(final ResourceSingletonObjectManager<MANAGEDOBJECT, RESOURCE> target, + final MANAGEDOBJECT managedObject, final RESOURCE resource) { _resource = resource; _managedObject = managedObject; + _target = target; } public EventResult acceptEvent(final ResourceLifecycleEvent event) @@ -259,10 +291,57 @@ public abstract class ResourceSingletonObjectManager<MANAGEDOBJECT extends IMana // unmanage gets called if it blows up. finally { - unmanageResource(_resource); + _target.unmanageResource(_resource); } } return result; } } + + + /** + * Unmanages all resources and calls checkpoint and dispose on all managed + * objects. After this call, other methods my throw exception is called. + * + * Sub-class may override, but should always call dispose after disposing + * their own specialized state. + */ + @Override + public void dispose() + { + if (_isDisposed.compareAndSet(false, true)) + { + // TODO: implement a better lock strategy on resource manager + synchronized (this) + { + Map<RESOURCE, ManagedResourceObject<MANAGEDOBJECT>> copy = new HashMap<RESOURCE, ManagedResourceObject<MANAGEDOBJECT>>( + getPerResourceObjects()); + + for (Map.Entry<RESOURCE, ManagedResourceObject<MANAGEDOBJECT>> entry : copy.entrySet()) + { + RESOURCE res = entry.getKey(); + MANAGEDOBJECT unmanagedResource = unmanageResource(res); + unmanagedResource.checkpoint(); + unmanagedResource.dispose(); + } + _perResourceObjects.clear(); + if (_lifecycleListener != null) + { + _lifecycleListener.dispose(); + } + } + } + } + + @Override + public void destroy() + { + // do nothing by default + } + + @Override + public void checkpoint() + { + // do nothing by default + } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java index 4cc953df5..415894c19 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/DefaultJSFAppConfigLocater.java @@ -23,6 +23,7 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; +import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery; import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.eclipse.wst.common.componentcore.resources.IVirtualResource; @@ -134,7 +135,7 @@ public class DefaultJSFAppConfigLocater extends WebContentRelativeJSFAppConfigLo if (defConfigPath == null) { IProject project = manager.getProject(); if (project != null) { - IVirtualFolder webContentFolder = JSFAppConfigUtils.getWebContentFolder(project); + IVirtualFolder webContentFolder = new DefaultVirtualComponentQuery().getWebContentFolder(project); if (webContentFolder != null) { IVirtualResource defConfigFile = webContentFolder.findMember(DEF_APPCONFIGRESOURCE_FILENAME); if (defConfigFile != null) { diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java index c74b44e08..38dd45a08 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JSFAppConfigUtils.java @@ -41,12 +41,11 @@ import org.eclipse.jst.j2ee.model.ModelProviderManager; import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit; import org.eclipse.jst.j2ee.webapplication.ContextParam; import org.eclipse.jst.j2ee.webapplication.WebApp; +import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery; import org.eclipse.jst.jsf.core.IJSFCoreConstants; import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; import org.eclipse.jst.jsf.core.internal.Messages; import org.eclipse.osgi.util.NLS; -import org.eclipse.wst.common.componentcore.ComponentCore; -import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.eclipse.wst.common.project.facet.core.IFacetedProject; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; @@ -170,14 +169,10 @@ public class JSFAppConfigUtils { * @param project IProject instance for which to get the folder. * @return IVirtualFolder instance which represents the root context's * web content folder. + * @deprecated Call DefaultVirtualComponentQuery.getWebContentFolder instead */ public static IVirtualFolder getWebContentFolder(IProject project) { - IVirtualFolder folder = null; - IVirtualComponent component = ComponentCore.createComponent(project); - if (component != null) { - folder = component.getRootFolder(); - } - return folder; + return new DefaultVirtualComponentQuery().getWebContentFolder(project); } /** diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java index 4359d216c..3f53e57a1 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/WebContentRelativeJSFAppConfigLocater.java @@ -17,6 +17,7 @@ import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.eclipse.wst.common.componentcore.resources.IVirtualResource; @@ -40,7 +41,7 @@ public abstract class WebContentRelativeJSFAppConfigLocater extends AbstractJSFA */ public void locateProviders() { IProject project = manager.getProject(); - IVirtualFolder webContentFolder = JSFAppConfigUtils.getWebContentFolder(project); + IVirtualFolder webContentFolder = new DefaultVirtualComponentQuery().getWebContentFolder(project); if (webContentFolder != null) { List filenames = getFilenames(); Iterator itFilenames = filenames.iterator(); diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java index 003fdf983..5b10e9c30 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java @@ -232,7 +232,7 @@ public final class DesignTimeApplicationManager _project = project; _locator = new MyExternalContextFactoryLocator(); _isDisposed = new AtomicBoolean(); - _lifecycleListener = new LifecycleListener(_project); + _lifecycleListener = new LifecycleListener(_project, ResourcesPlugin.getWorkspace()); _lifecycleListener.addListener(new IResourceLifecycleListener() { public EventResult acceptEvent(final ResourceLifecycleEvent event) diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java index b669ad19d..33b69146e 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java @@ -141,7 +141,7 @@ public class JSPModelProcessor { if (LIFECYCLE_LISTENER == null) { - LIFECYCLE_LISTENER = new LifecycleListener(file); + LIFECYCLE_LISTENER = new LifecycleListener(file, ResourcesPlugin.getWorkspace()); } else { diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java index 4a70ce062..c819690d3 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java @@ -24,6 +24,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IStorage; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.jdt.core.JavaModelException; @@ -146,7 +147,7 @@ class ResourceBundleMapSource extends AbstractMap implements IMapSourceInfo if (bundleFileCache == null) { bundleFileCache = new HashMap<String, BundleFileCacheInfo>(); - final LifecycleListener listener = new LifecycleListener(project); + final LifecycleListener listener = new LifecycleListener(project, ResourcesPlugin.getWorkspace()); listener.addListener(new IResourceLifecycleListener() { public EventResult acceptEvent(final ResourceLifecycleEvent event) @@ -208,7 +209,7 @@ class ResourceBundleMapSource extends AbstractMap implements IMapSourceInfo { bundleRes = (IFile) storage.getAdapter(IFile.class); // if file is removed, clear the bundle from the store. - final LifecycleListener listener = new LifecycleListener(bundleRes); + final LifecycleListener listener = new LifecycleListener(bundleRes, ResourcesPlugin.getWorkspace()); listener.addListener(new IResourceLifecycleListener() { public EventResult acceptEvent(final ResourceLifecycleEvent event) diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java index e247b3725..d5f29ca60 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java +++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/view/model/jsp/registry/TLDRegistryManager.java @@ -61,6 +61,7 @@ public final class TLDRegistryManager extends private TLDRegistryManager() { + super(ResourcesPlugin.getWorkspace()); final ISaveParticipant participant = new MyWorkspaceSaveParticipant(); try diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs index ddb8182d7..c5df725d2 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ -#Fri Mar 12 08:05:32 PST 2010 +#Thu Apr 01 09:26:55 PDT 2010 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 @@ -13,7 +13,7 @@ org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=warning org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecation=error org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/facelet-taglib.xsd b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/facelet-taglib.xsd deleted file mode 100644 index 0184ab54c..000000000 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/facelet-taglib.xsd +++ /dev/null @@ -1,509 +0,0 @@ -<?xml version = "1.0" encoding = "UTF-8"?> - -<xsd:schema - targetNamespace="http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0" - elementFormDefault="qualified" - attributeFormDefault="unqualified" - version="2.0" xmlns:javaee="http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xml="http://www.w3.org/XML/1998/namespace"> - <xsd:include schemaLocation="javaee_5.xsd"/> - - <xsd:annotation> - <xsd:documentation> - - DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - - Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved. - - The contents of this file are subject to the terms of either the - GNU General Public License Version 2 only ("GPL") or the Common - Development and Distribution License("CDDL") (collectively, the - "License"). You may not use this file except in compliance with - the License. You can obtain a copy of the License at - https://glassfish.dev.java.net/public/CDDL+GPL.html or - glassfish/bootstrap/legal/LICENSE.txt. See the License for the - specific language governing permissions and limitations under the - License. - - When distributing the software, include this License Header - Notice in each file and include the License file at - glassfish/bootstrap/legal/LICENSE.txt. Sun designates this - particular file as subject to the "Classpath" exception as - provided by Sun in the GPL Version 2 section of the License file - that accompanied this code. If applicable, add the following - below the License Header, with the fields enclosed by brackets [] - replaced by your own identifying information: - "Portions Copyrighted [year] [name of copyright owner]" - - Contributor(s): - - If you wish your version of this file to be governed by only the - CDDL or only the GPL Version 2, indicate your decision by adding - "[Contributor] elects to include this software in this - distribution under the [CDDL or GPL Version 2] license." If you - don't indicate a single choice of license, a recipient has the - option to distribute your version of this file under either the - CDDL, the GPL Version 2 or to extend the choice of license to its - licensees as provided above. However, if you add GPL Version 2 - code and therefore, elected the GPL Version 2 license, then the - option applies only if the new code is made subject to such - option by the copyright holder. - - </xsd:documentation> - </xsd:annotation> - -<xsd:annotation> - <xsd:documentation> - - <![CDATA[ - - The XML Schema for the Tag Libraries in the JavaServer Faces - Standard Facelets View Declaration Language (Facelets VDL) - (Version 2.0). - - JSF 2.0 Facelet Tag Libraries that wish to conform to this - schema must declare it in the following manner. - - <facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibary_2_0.xsd" - version="2.0"> - - ... - - </facelet-taglib> - - The instance documents may indicate the published - version of the schema using xsi:schemaLocation attribute - for javaee namespace with the following location: - - http://java.sun.com/xml/ns/javaee/web-facelettaglibary_2_0.xsd - - ]]> - - </xsd:documentation> - </xsd:annotation> - - - - <xsd:element name="facelet-taglib" type="javaee:facelet-taglibType"> - <xsd:unique name="facelet-taglib-tagname-uniqueness"> - <xsd:annotation> - <xsd:documentation> - - tag-names must be unique within a document. - </xsd:documentation> - </xsd:annotation> - <xsd:selector xpath="javaee:tag"/> - <xsd:field xpath="javaee:tag-name"/> - </xsd:unique> - <xsd:unique name="faces-config-behavior-ID-uniqueness"> - <xsd:annotation> - <xsd:documentation> - - Behavior IDs must be unique within a document. - </xsd:documentation> - </xsd:annotation> - <xsd:selector xpath="javaee:behavior"/> - <xsd:field xpath="javaee:behavior-id"/> - </xsd:unique> - <xsd:unique name="faces-config-converter-ID-uniqueness"> - <xsd:annotation> - <xsd:documentation> - - Converter IDs must be unique within a document. - </xsd:documentation> - </xsd:annotation> - <xsd:selector xpath="javaee:converter"/> - <xsd:field xpath="javaee:converter-id"/> - </xsd:unique> - <xsd:unique name="faces-config-validator-ID-uniqueness"> - <xsd:annotation> - <xsd:documentation> - - Validator IDs must be unique within a document. - </xsd:documentation> - </xsd:annotation> - <xsd:selector xpath="javaee:validator"/> - <xsd:field xpath="javaee:validator-id"/> - </xsd:unique> - </xsd:element> - <xsd:complexType name="facelet-taglibType"> - <xsd:annotation> - <xsd:documentation> - The top level XML element in a facelet tag library XML file. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:choice> - <xsd:element name="library-class" - type="javaee:fully-qualified-classType"/> - <xsd:sequence> - <xsd:element name="namespace" type="javaee:string"/> - <xsd:element minOccurs="0" maxOccurs="1" - name="composite-library-name" - type="javaee:fully-qualified-classType"/> - <xsd:choice minOccurs="0" maxOccurs="unbounded"> - <xsd:element name="tag" - type="javaee:facelet-taglib-tagType"/> - <xsd:element name="function" - type="javaee:facelet-taglib-functionType"/> - - </xsd:choice> - </xsd:sequence> - </xsd:choice> - <xsd:element name="taglib-extension" - type="javaee:facelet-taglib-extensionType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - <xsd:attribute name="version" - type="javaee:facelet-taglib-versionType" - use="required"/> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-extensionType"> - <xsd:annotation> - <xsd:documentation> - Extension element for facelet-taglib. It may contain - implementation specific content. - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:any namespace="##any" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - - <xsd:complexType name="facelet-taglib-tagType"> - <xsd:annotation> - <xsd:documentation> - If the tag library XML file contains individual tag - declarations rather than pointing to a library-class or a - declaring a composite-library name, the individual tags are - enclosed in tag elements. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element name="tag-name" - type="javaee:facelet-taglib-canonical-nameType"/> - <xsd:choice> - <xsd:element name="handler-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="behavior" - type="javaee:facelet-taglib-tag-behaviorType"/> - <xsd:element name="component" - type="javaee:facelet-taglib-tag-componentType"/> - <xsd:element name="converter" - type="javaee:facelet-taglib-tag-converterType"/> - <xsd:element name="validator" - type="javaee:facelet-taglib-tag-validatorType"/> - <xsd:element name="source" type="javaee:string"/> - </xsd:choice> - <xsd:element name="attribute" - type="javaee:facelet-taglib-tag-attributeType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="tag-extension" - type="javaee:facelet-taglib-tag-extensionType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:complexType> - - <!-- **************************************************** --> - - <xsd:complexType name="facelet-taglib-tag-attributeType"> - <xsd:annotation> - <xsd:documentation> - - The attribute element defines an attribute for the nesting - tag. The attribute element may have several subelements - defining: - - description a description of the attribute - - name the name of the attribute - - required whether the attribute is required or - optional - - type the type of the attribute - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element name="name" - type="javaee:xsdNMTOKENType"/> - <xsd:element name="required" - type="javaee:generic-booleanType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - Defines if the nesting attribute is required or - optional. - - If not present then the default is "false", i.e - the attribute is optional. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:choice> - <xsd:element name="type" - type="javaee:fully-qualified-classType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - Defines the Java type of the attributes - value. If this element is omitted, the - expected type is assumed to be - "java.lang.Object". - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="method-signature" - type="javaee:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - Defines the method signature for a MethodExpression- - enabled attribute. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - </xsd:choice> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - - - <xsd:complexType name="facelet-taglib-tag-extensionType"> - <xsd:annotation> - <xsd:documentation> - Extension element for tag It may contain - implementation specific content. - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:any namespace="##any" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - - <xsd:complexType name="facelet-taglib-functionType"> - <xsd:annotation> - <xsd:documentation> - If the tag library XML file contains individual function - declarations rather than pointing to a library-class or a - declaring a composite-library name, the individual functions are - enclosed in function elements. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element name="function-name" type="javaee:string"/> - <xsd:element name="function-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="function-signature" type="javaee:string"/> - </xsd:sequence> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-tag-behaviorType"> - <xsd:annotation> - <xsd:documentation> - Within a tag element, the behavior element encapsulates - information specific to a JSF Behavior. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element minOccurs="1" maxOccurs="1" - name="behavior-id" type="javaee:string"/> - <xsd:element minOccurs="0" maxOccurs="1" - name="handler-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="behavior-extension" - type="javaee:facelet-taglib-tag-behavior-extensionType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-tag-behavior-extensionType"> - <xsd:annotation> - <xsd:documentation> - Extension element for behavior. It may contain - implementation specific content. - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:any namespace="##any" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-tag-componentType"> - <xsd:annotation> - <xsd:documentation> - Within a tag element, the component element encapsulates - information specific to a JSF UIComponent. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element name="component-type" type="javaee:string"/> - <xsd:element minOccurs="0" maxOccurs="1" - name="renderer-type" type="javaee:string"/> - <xsd:element minOccurs="0" maxOccurs="1" - name="handler-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="component-extension" - type="javaee:facelet-taglib-tag-component-extensionType" - minOccurs="0" - maxOccurs="unbounded"/> - - </xsd:sequence> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-tag-component-extensionType"> - <xsd:annotation> - <xsd:documentation> - Extension element for component It may contain - implementation specific content. - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:any namespace="##any" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - - <xsd:complexType name="facelet-taglib-tag-converterType"> - <xsd:annotation> - <xsd:documentation> - Within a tag element, the converter element encapsulates - information specific to a JSF Converter. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element minOccurs="1" maxOccurs="1" - name="converter-id" type="javaee:string"/> - <xsd:element minOccurs="0" maxOccurs="1" - name="handler-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="converter-extension" - type="javaee:facelet-taglib-tag-converter-extensionType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-tag-converter-extensionType"> - <xsd:annotation> - <xsd:documentation> - Extension element for converter It may contain - implementation specific content. - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:any namespace="##any" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - - <xsd:complexType name="facelet-taglib-tag-validatorType"> - <xsd:annotation> - <xsd:documentation> - Within a tag element, the validator element encapsulates - information specific to a JSF Validator. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element minOccurs="1" maxOccurs="1" - name="validator-id" type="javaee:string"/> - <xsd:element minOccurs="0" maxOccurs="1" - name="handler-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="validator-extension" - type="javaee:facelet-taglib-tag-validator-extensionType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:complexType> - <xsd:complexType name="facelet-taglib-tag-validator-extensionType"> - <xsd:annotation> - <xsd:documentation> - Extension element for validator It may contain - implementation specific content. - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:any namespace="##any" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - - <!-- **************************************************** --> - <xsd:simpleType name="facelet-taglib-versionType"> - <xsd:annotation> - <xsd:documentation> - This type contains the recognized versions of - facelet-taglib supported. - </xsd:documentation> - </xsd:annotation> - <xsd:restriction base="xsd:token"> - <xsd:enumeration value="2.0"/> - </xsd:restriction> - </xsd:simpleType> - - <xsd:complexType name="facelet-taglib-canonical-nameType"> - - <xsd:annotation> - <xsd:documentation> - - Defines the canonical name of a tag or attribute being - defined. - - The name must conform to the lexical rules for an NCName - - </xsd:documentation> - </xsd:annotation> - - <xsd:simpleContent> - <xsd:extension base="xsd:NCName"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -</xsd:schema> diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/javaee_5.xsd b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/javaee_5.xsd deleted file mode 100644 index 52b390a4d..000000000 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/javaee_5.xsd +++ /dev/null @@ -1,2099 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsd:schema - targetNamespace="http://java.sun.com/xml/ns/javaee" - xmlns:javaee="http://java.sun.com/xml/ns/javaee" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - elementFormDefault="qualified" - attributeFormDefault="unqualified" - version="5"> - <xsd:annotation> - <xsd:documentation> - @(#)javaee_5.xsds 1.65 06/02/17 - </xsd:documentation> - </xsd:annotation> - - <xsd:annotation> - <xsd:documentation> - - DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - - Copyright 2003-2009 Sun Microsystems, Inc. All rights reserved. - - The contents of this file are subject to the terms of either the - GNU General Public License Version 2 only ("GPL") or the Common - Development and Distribution License("CDDL") (collectively, the - "License"). You may not use this file except in compliance with - the License. You can obtain a copy of the License at - https://glassfish.dev.java.net/public/CDDL+GPL.html or - glassfish/bootstrap/legal/LICENSE.txt. See the License for the - specific language governing permissions and limitations under the - License. - - When distributing the software, include this License Header - Notice in each file and include the License file at - glassfish/bootstrap/legal/LICENSE.txt. Sun designates this - particular file as subject to the "Classpath" exception as - provided by Sun in the GPL Version 2 section of the License file - that accompanied this code. If applicable, add the following - below the License Header, with the fields enclosed by brackets [] - replaced by your own identifying information: - "Portions Copyrighted [year] [name of copyright owner]" - - Contributor(s): - - If you wish your version of this file to be governed by only the - CDDL or only the GPL Version 2, indicate your decision by adding - "[Contributor] elects to include this software in this - distribution under the [CDDL or GPL Version 2] license." If you - don't indicate a single choice of license, a recipient has the - option to distribute your version of this file under either the - CDDL, the GPL Version 2 or to extend the choice of license to its - licensees as provided above. However, if you add GPL Version 2 - code and therefore, elected the GPL Version 2 license, then the - option applies only if the new code is made subject to such - option by the copyright holder. - - </xsd:documentation> - </xsd:annotation> -<xsd:annotation> -<xsd:documentation> - -The following definitions that appear in the common -shareable schema(s) of J2EE deployment descriptors should be -interpreted with respect to the context they are included: - -Deployment Component may indicate one of the following: - j2ee application; - application client; - web application; - enterprise bean; - resource adapter; - -Deployment File may indicate one of the following: - ear file; - war file; - jar file; - rar file; - -</xsd:documentation> -</xsd:annotation> - - <xsd:import namespace="http://www.w3.org/XML/1998/namespace" - schemaLocation="http://www.w3.org/2001/xml.xsd"/> - - - -<!-- **************************************************** --> - - <xsd:group name="descriptionGroup"> - <xsd:annotation> - <xsd:documentation> - - This group keeps the usage of the contained description related - elements consistent across Java EE deployment descriptors. - - All elements may occur multiple times with different languages, - to support localization of the content. - - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="display-name" - type="javaee:display-nameType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="icon" - type="javaee:iconType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:group> - -<!-- **************************************************** --> - - <xsd:complexType name="descriptionType"> - <xsd:annotation> - <xsd:documentation> - - The description type is used by a description element to - provide text describing the parent element. The elements - that use this type should include any information that the - Deployment Component's Deployment File file producer wants - to provide to the consumer of the Deployment Component's - Deployment File (i.e., to the Deployer). Typically, the - tools used by such a Deployment File consumer will display - the description when processing the parent element that - contains the description. - - The lang attribute defines the language that the - description is provided in. The default value is "en" (English). - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="javaee:xsdStringType"> - <xsd:attribute ref="xml:lang"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:simpleType name="dewey-versionType"> - <xsd:annotation> - <xsd:documentation> - - This type defines a dewey decimal that is used - to describe versions of documents. - - </xsd:documentation> - </xsd:annotation> - - <xsd:restriction base="xsd:token"> - <xsd:pattern value="\.?[0-9]+(\.[0-9]+)*"/> - </xsd:restriction> - </xsd:simpleType> - -<!-- **************************************************** --> - - <xsd:complexType name="display-nameType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The display-name type contains a short name that is intended - to be displayed by tools. It is used by display-name - elements. The display name need not be unique. - - Example: - - ... - <display-name xml:lang="en"> - Employee Self Service - </display-name> - - The value of the xml:lang attribute is "en" (English) by default. - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="javaee:string"> - <xsd:attribute ref="xml:lang"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="ejb-linkType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The ejb-linkType is used by ejb-link - elements in the ejb-ref or ejb-local-ref elements to specify - that an EJB reference is linked to enterprise bean. - - The value of the ejb-link element must be the ejb-name of an - enterprise bean in the same ejb-jar file or in another ejb-jar - file in the same Java EE application unit. - - Alternatively, the name in the ejb-link element may be - composed of a path name specifying the ejb-jar containing the - referenced enterprise bean with the ejb-name of the target - bean appended and separated from the path name by "#". The - path name is relative to the Deployment File containing - Deployment Component that is referencing the enterprise - bean. This allows multiple enterprise beans with the same - ejb-name to be uniquely identified. - - Examples: - - <ejb-link>EmployeeRecord</ejb-link> - - <ejb-link>../products/product.jar#ProductEJB</ejb-link> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="ejb-local-refType"> - <xsd:annotation> - <xsd:documentation> - - The ejb-local-refType is used by ejb-local-ref elements for - the declaration of a reference to an enterprise bean's local - home or to the local business interface of a 3.0 bean. - The declaration consists of: - - - an optional description - - the EJB reference name used in the code of the Deployment - Component that's referencing the enterprise bean. - - the optional expected type of the referenced enterprise bean - - the optional expected local interface of the referenced - enterprise bean or the local business interface of the - referenced enterprise bean. - - the optional expected local home interface of the referenced - enterprise bean. Not applicable if this ejb-local-ref refers - to the local business interface of a 3.0 bean. - - optional ejb-link information, used to specify the - referenced enterprise bean - - optional elements to define injection of the named enterprise - bean into a component field or property. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="ejb-ref-name" - type="javaee:ejb-ref-nameType"/> - <xsd:element name="ejb-ref-type" - type="javaee:ejb-ref-typeType" - minOccurs="0"/> - <xsd:element name="local-home" - type="javaee:local-homeType" - minOccurs="0"/> - <xsd:element name="local" - type="javaee:localType" - minOccurs="0"/> - <xsd:element name="ejb-link" - type="javaee:ejb-linkType" - minOccurs="0"/> - <xsd:group ref="javaee:resourceGroup"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="ejb-ref-nameType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The ejb-ref-name element contains the name of an EJB - reference. The EJB reference is an entry in the - Deployment Component's environment and is relative to the - java:comp/env context. The name must be unique within the - Deployment Component. - - It is recommended that name is prefixed with "ejb/". - - Example: - - <ejb-ref-name>ejb/Payroll</ejb-ref-name> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:jndi-nameType"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="ejb-ref-typeType"> - <xsd:annotation> - <xsd:documentation> - - The ejb-ref-typeType contains the expected type of the - referenced enterprise bean. - - The ejb-ref-type designates a value - that must be one of the following: - - Entity - Session - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="Entity"/> - <xsd:enumeration value="Session"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="ejb-refType"> - <xsd:annotation> - <xsd:documentation> - - The ejb-refType is used by ejb-ref elements for the - declaration of a reference to an enterprise bean's home or - to the remote business interface of a 3.0 bean. - The declaration consists of: - - - an optional description - - the EJB reference name used in the code of - the Deployment Component that's referencing the enterprise - bean. - - the optional expected type of the referenced enterprise bean - - the optional remote interface of the referenced enterprise bean - or the remote business interface of the referenced enterprise - bean - - the optional expected home interface of the referenced - enterprise bean. Not applicable if this ejb-ref - refers to the remote business interface of a 3.0 bean. - - optional ejb-link information, used to specify the - referenced enterprise bean - - optional elements to define injection of the named enterprise - bean into a component field or property - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="ejb-ref-name" - type="javaee:ejb-ref-nameType"/> - <xsd:element name="ejb-ref-type" - type="javaee:ejb-ref-typeType" - minOccurs="0"/> - <xsd:element name="home" - type="javaee:homeType" - minOccurs="0"/> - <xsd:element name="remote" - type="javaee:remoteType" - minOccurs="0"/> - <xsd:element name="ejb-link" - type="javaee:ejb-linkType" - minOccurs="0"/> - <xsd:group ref="javaee:resourceGroup"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="emptyType"> - <xsd:annotation> - <xsd:documentation> - - This type is used to designate an empty - element when used. - - </xsd:documentation> - </xsd:annotation> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="env-entry-type-valuesType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - This type contains the fully-qualified Java type of the - environment entry value that is expected by the - application's code. - - The following are the legal values of env-entry-type-valuesType: - - java.lang.Boolean - java.lang.Byte - java.lang.Character - java.lang.String - java.lang.Short - java.lang.Integer - java.lang.Long - java.lang.Float - java.lang.Double - - Example: - - <env-entry-type>java.lang.Boolean</env-entry-type> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="java.lang.Boolean"/> - <xsd:enumeration value="java.lang.Byte"/> - <xsd:enumeration value="java.lang.Character"/> - <xsd:enumeration value="java.lang.String"/> - <xsd:enumeration value="java.lang.Short"/> - <xsd:enumeration value="java.lang.Integer"/> - <xsd:enumeration value="java.lang.Long"/> - <xsd:enumeration value="java.lang.Float"/> - <xsd:enumeration value="java.lang.Double"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="env-entryType"> - <xsd:annotation> - <xsd:documentation> - - The env-entryType is used to declare an application's - environment entry. The declaration consists of an optional - description, the name of the environment entry, a type - (optional if the value is injected, otherwise required), and - an optional value. - - It also includes optional elements to define injection of - the named resource into fields or JavaBeans properties. - - If a value is not specified and injection is requested, - no injection will occur and no entry of the specified name - will be created. This allows an initial value to be - specified in the source code without being incorrectly - changed when no override has been specified. - - If a value is not specified and no injection is requested, - a value must be supplied during deployment. - - This type is used by env-entry elements. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="env-entry-name" - type="javaee:jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The env-entry-name element contains the name of a - Deployment Component's environment entry. The name - is a JNDI name relative to the java:comp/env - context. The name must be unique within a - Deployment Component. The uniqueness - constraints must be defined within the declared - context. - - Example: - - <env-entry-name>minAmount</env-entry-name> - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="env-entry-type" - type="javaee:env-entry-type-valuesType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The env-entry-type element contains the Java language - type of the environment entry. If an injection target - is specified for the environment entry, the type may - be omitted, or must match the type of the injection - target. If no injection target is specified, the type - is required. - - Example: - - <env-entry-type>java.lang.Integer</env-entry-type> - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="env-entry-value" - type="javaee:xsdStringType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The env-entry-value designates the value of a - Deployment Component's environment entry. The value - must be a String that is valid for the - constructor of the specified type that takes a - single String parameter, or for java.lang.Character, - a single character. - - Example: - - <env-entry-value>100.00</env-entry-value> - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:group ref="javaee:resourceGroup"/> - - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="fully-qualified-classType"> - <xsd:annotation> - <xsd:documentation> - - The elements that use this type designate the name of a - Java class or interface. The name is in the form of a - "binary name", as defined in the JLS. This is the form - of name used in Class.forName(). Tools that need the - canonical name (the name used in source code) will need - to convert this binary name to the canonical name. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="generic-booleanType"> - <xsd:annotation> - <xsd:documentation> - - This type defines four different values which can designate - boolean values. This includes values yes and no which are - not designated by xsd:boolean - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="true"/> - <xsd:enumeration value="false"/> - <xsd:enumeration value="yes"/> - <xsd:enumeration value="no"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="homeType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The homeType defines the fully-qualified name of - an enterprise bean's home interface. - - Example: - - <home>com.aardvark.payroll.PayrollHome</home> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:fully-qualified-classType"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="iconType"> - <xsd:annotation> - <xsd:documentation> - - The icon type contains small-icon and large-icon elements - that specify the file names for small and large GIF, JPEG, - or PNG icon images used to represent the parent element in a - GUI tool. - - The xml:lang attribute defines the language that the - icon file names are provided in. Its value is "en" (English) - by default. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="small-icon" type="javaee:pathType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The small-icon element contains the name of a file - containing a small (16 x 16) icon image. The file - name is a relative path within the Deployment - Component's Deployment File. - - The image may be in the GIF, JPEG, or PNG format. - The icon can be used by tools. - - Example: - - <small-icon>employee-service-icon16x16.jpg</small-icon> - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="large-icon" type="javaee:pathType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The large-icon element contains the name of a file - containing a large - (32 x 32) icon image. The file name is a relative - path within the Deployment Component's Deployment - File. - - The image may be in the GIF, JPEG, or PNG format. - The icon can be used by tools. - - Example: - - <large-icon>employee-service-icon32x32.jpg</large-icon> - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - </xsd:sequence> - - <xsd:attribute ref="xml:lang"/> - <xsd:attribute name="id" type="xsd:ID"/> - - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="injection-targetType"> - <xsd:annotation> - <xsd:documentation> - - An injection target specifies a class and a name within - that class into which a resource should be injected. - - The injection target class specifies the fully qualified - class name that is the target of the injection. The - Java EE specifications describe which classes can be an - injection target. - - The injection target name specifies the target within - the specified class. The target is first looked for as a - JavaBeans property name. If not found, the target is - looked for as a field name. - - The specified resource will be injected into the target - during initialization of the class by either calling the - set method for the target property or by setting a value - into the named field. - - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="injection-target-class" - type="javaee:fully-qualified-classType"/> - <xsd:element name="injection-target-name" - type="javaee:java-identifierType"/> - </xsd:sequence> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="java-identifierType"> - <xsd:annotation> - <xsd:documentation> - - The java-identifierType defines a Java identifier. - The users of this type should further verify that - the content does not contain Java reserved keywords. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:pattern value="($|_|\p{L})(\p{L}|\p{Nd}|_|$)*"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="java-typeType"> - <xsd:annotation> - <xsd:documentation> - - This is a generic type that designates a Java primitive - type or a fully qualified name of a Java interface/type, - or an array of such types. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:pattern value="[^\p{Z}]*"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - - The jndi-nameType type designates a JNDI name in the - Deployment Component's environment and is relative to the - java:comp/env context. A JNDI name must be unique within the - Deployment Component. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:group name="jndiEnvironmentRefsGroup"> - <xsd:annotation> - <xsd:documentation> - - This group keeps the usage of the contained JNDI environment - reference elements consistent across Java EE deployment descriptors. - - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="env-entry" - type="javaee:env-entryType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="ejb-ref" - type="javaee:ejb-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="ejb-local-ref" - type="javaee:ejb-local-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="resource-ref" - type="javaee:resource-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="resource-env-ref" - type="javaee:resource-env-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="message-destination-ref" - type="javaee:message-destination-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="persistence-context-ref" - type="javaee:persistence-context-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="persistence-unit-ref" - type="javaee:persistence-unit-refType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="post-construct" - type="javaee:lifecycle-callbackType" - minOccurs="0" maxOccurs="unbounded"/> - <xsd:element name="pre-destroy" - type="javaee:lifecycle-callbackType" - minOccurs="0" maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:group> - -<!-- **************************************************** --> - - <xsd:complexType name="lifecycle-callbackType"> - <xsd:annotation> - <xsd:documentation> - - The lifecycle-callback type specifies a method on a - class to be called when a lifecycle event occurs. - Note that each class may have only one lifecycle callback - method for any given event and that the method may not - be overloaded. - - If the lifefycle-callback-class element is missing then - the class defining the callback is assumed to be the - component class in scope at the place in the descriptor - in which the callback definition appears. - - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="lifecycle-callback-class" - type="javaee:fully-qualified-classType" - minOccurs="0"/> - <xsd:element name="lifecycle-callback-method" - type="javaee:java-identifierType"/> - </xsd:sequence> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="listenerType"> - <xsd:annotation> - <xsd:documentation> - - The listenerType indicates the deployment properties for a web - application listener bean. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element name="listener-class" - type="javaee:fully-qualified-classType"> - <xsd:annotation> - <xsd:documentation> - - The listener-class element declares a class in the - application must be registered as a web - application listener bean. The value is the fully - qualified classname of the listener class. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="local-homeType"> - <xsd:annotation> - <xsd:documentation> - - The local-homeType defines the fully-qualified - name of an enterprise bean's local home interface. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:fully-qualified-classType"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="localType"> - <xsd:annotation> - <xsd:documentation> - - The localType defines the fully-qualified name of an - enterprise bean's local interface. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:fully-qualified-classType"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="message-destination-linkType"> - <xsd:annotation> - <xsd:documentation> - - The message-destination-linkType is used to link a message - destination reference or message-driven bean to a message - destination. - - The Assembler sets the value to reflect the flow of messages - between producers and consumers in the application. - - The value must be the message-destination-name of a message - destination in the same Deployment File or in another - Deployment File in the same Java EE application unit. - - Alternatively, the value may be composed of a path name - specifying a Deployment File containing the referenced - message destination with the message-destination-name of the - destination appended and separated from the path name by - "#". The path name is relative to the Deployment File - containing Deployment Component that is referencing the - message destination. This allows multiple message - destinations with the same name to be uniquely identified. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="message-destination-refType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The message-destination-ref element contains a declaration - of Deployment Component's reference to a message destination - associated with a resource in Deployment Component's - environment. It consists of: - - - an optional description - - the message destination reference name - - an optional message destination type - - an optional specification as to whether - the destination is used for - consuming or producing messages, or both. - if not specified, "both" is assumed. - - an optional link to the message destination - - optional injection targets - - The message destination type must be supplied unless an - injection target is specified, in which case the type - of the target is used. If both are specified, the type - must be assignment compatible with the type of the injection - target. - - Examples: - - <message-destination-ref> - <message-destination-ref-name>jms/StockQueue - </message-destination-ref-name> - <message-destination-type>javax.jms.Queue - </message-destination-type> - <message-destination-usage>Consumes - </message-destination-usage> - <message-destination-link>CorporateStocks - </message-destination-link> - </message-destination-ref> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="message-destination-ref-name" - type="javaee:jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - - The message-destination-ref-name element specifies - the name of a message destination reference; its - value is the environment entry name used in - Deployment Component code. The name is a JNDI name - relative to the java:comp/env context and must be - unique within an ejb-jar (for enterprise beans) or a - Deployment File (for others). - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="message-destination-type" - type="javaee:message-destination-typeType" - minOccurs="0"/> - <xsd:element name="message-destination-usage" - type="javaee:message-destination-usageType" - minOccurs="0"/> - <xsd:element name="message-destination-link" - type="javaee:message-destination-linkType" - minOccurs="0"/> - - <xsd:group ref="javaee:resourceGroup"/> - - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="message-destination-typeType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The message-destination-typeType specifies the type of - the destination. The type is specified by the Java interface - expected to be implemented by the destination. - - Example: - - <message-destination-type>javax.jms.Queue - </message-destination-type> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:fully-qualified-classType"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="message-destination-usageType"> - <xsd:annotation> - <xsd:documentation> - - The message-destination-usageType specifies the use of the - message destination indicated by the reference. The value - indicates whether messages are consumed from the message - destination, produced for the destination, or both. The - Assembler makes use of this information in linking producers - of a destination with its consumers. - - The value of the message-destination-usage element must be - one of the following: - Consumes - Produces - ConsumesProduces - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="Consumes"/> - <xsd:enumeration value="Produces"/> - <xsd:enumeration value="ConsumesProduces"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="message-destinationType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The message-destinationType specifies a message - destination. The logical destination described by this - element is mapped to a physical destination by the Deployer. - - The message destination element contains: - - - an optional description - - an optional display-name - - an optional icon - - a message destination name which must be unique - among message destination names within the same - Deployment File. - - an optional mapped name - - Example: - - <message-destination> - <message-destination-name>CorporateStocks - </message-destination-name> - </message-destination> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:group ref="javaee:descriptionGroup"/> - <xsd:element name="message-destination-name" - type="javaee:string"> - <xsd:annotation> - <xsd:documentation> - - The message-destination-name element specifies a - name for a message destination. This name must be - unique among the names of message destinations - within the Deployment File. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="mapped-name" - type="javaee:xsdStringType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - A product specific name that this message destination - should be mapped to. Each message-destination-ref - element that references this message destination will - define a name in the namespace of the referencing - component. (It's a name in the JNDI java:comp/env - namespace.) Many application servers provide a way to - map these local names to names of resources known to the - application server. This mapped name is often a global - JNDI name, but may be a name of any form. Each of the - local names should be mapped to this same global name. - - Application servers are not required to support any - particular form or type of mapped name, nor the ability - to use mapped names. The mapped name is - product-dependent and often installation-dependent. No - use of a mapped name is portable. - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="param-valueType"> - <xsd:annotation> - <xsd:documentation> - - This type is a general type that can be used to declare - parameter/value lists. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="param-name" - type="javaee:string"> - <xsd:annotation> - <xsd:documentation> - - The param-name element contains the name of a - parameter. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="param-value" - type="javaee:xsdStringType"> - <xsd:annotation> - <xsd:documentation> - - The param-value element contains the value of a - parameter. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="pathType"> - <xsd:annotation> - <xsd:documentation> - - The elements that use this type designate either a relative - path or an absolute path starting with a "/". - - In elements that specify a pathname to a file within the - same Deployment File, relative filenames (i.e., those not - starting with "/") are considered relative to the root of - the Deployment File's namespace. Absolute filenames (i.e., - those starting with "/") also specify names in the root of - the Deployment File's namespace. In general, relative names - are preferred. The exception is .war files where absolute - names are preferred for consistency with the Servlet API. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="persistence-context-refType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The persistence-context-ref element contains a declaration - of Deployment Component's reference to a persistence context - associated within a Deployment Component's - environment. It consists of: - - - an optional description - - the persistence context reference name - - an optional persistence unit name. If not specified, - the default persistence unit is assumed. - - an optional specification as to whether - the persistence context type is Transaction or - Extended. If not specified, Transaction is assumed. - - an optional list of persistence properties - - optional injection targets - - Examples: - - <persistence-context-ref> - <persistence-context-ref-name>myPersistenceContext - </persistence-context-ref-name> - </persistence-context-ref> - - <persistence-context-ref> - <persistence-context-ref-name>myPersistenceContext - </persistence-context-ref-name> - <persistence-unit-name>PersistenceUnit1 - </persistence-unit-name> - <persistence-context-type>Extended</persistence-context-type> - </persistence-context-ref> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="persistence-context-ref-name" - type="javaee:jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - - The persistence-context-ref-name element specifies - the name of a persistence context reference; its - value is the environment entry name used in - Deployment Component code. The name is a JNDI name - relative to the java:comp/env context. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="persistence-unit-name" - type="javaee:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The Application Assembler(or BeanProvider) may use the - following syntax to avoid the need to rename persistence - units to have unique names within a Java EE application. - - The Application Assembler specifies the pathname of the - root of the persistence.xml file for the referenced - persistence unit and appends the name of the persistence - unit separated from the pathname by #. The pathname is - relative to the referencing application component jar file. - In this manner, multiple persistence units with the same - persistence unit name may be uniquely identified when the - Application Assembler cannot change persistence unit names. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="persistence-context-type" - type="javaee:persistence-context-typeType" - minOccurs="0"/> - - <xsd:element name="persistence-property" - type="javaee:propertyType" - minOccurs="0" - maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation> - - Used to specify properties for the container or persistence - provider. Vendor-specific properties may be included in - the set of properties. Properties that are not recognized - by a vendor must be ignored. Entries that make use of the - namespace javax.persistence and its subnamespaces must not - be used for vendor-specific properties. The namespace - javax.persistence is reserved for use by the specification. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:group ref="javaee:resourceGroup"/> - - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="persistence-context-typeType"> - <xsd:annotation> - <xsd:documentation> - - The persistence-context-typeType specifies the transactional - nature of a persistence context reference. - - The value of the persistence-context-type element must be - one of the following: - Transaction - Extended - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="Transaction"/> - <xsd:enumeration value="Extended"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="persistence-unit-refType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The persistence-unit-ref element contains a declaration - of Deployment Component's reference to a persistence unit - associated within a Deployment Component's - environment. It consists of: - - - an optional description - - the persistence unit reference name - - an optional persistence unit name. If not specified, - the default persistence unit is assumed. - - optional injection targets - - Examples: - - <persistence-unit-ref> - <persistence-unit-ref-name>myPersistenceUnit - </persistence-unit-ref-name> - </persistence-unit-ref> - - <persistence-unit-ref> - <persistence-unit-ref-name>myPersistenceUnit - </persistence-unit-ref-name> - <persistence-unit-name>PersistenceUnit1 - </persistence-unit-name> - </persistence-unit-ref> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="persistence-unit-ref-name" - type="javaee:jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - - The persistence-unit-ref-name element specifies - the name of a persistence unit reference; its - value is the environment entry name used in - Deployment Component code. The name is a JNDI name - relative to the java:comp/env context. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="persistence-unit-name" - type="javaee:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The Application Assembler(or BeanProvider) may use the - following syntax to avoid the need to rename persistence - units to have unique names within a Java EE application. - - The Application Assembler specifies the pathname of the - root of the persistence.xml file for the referenced - persistence unit and appends the name of the persistence - unit separated from the pathname by #. The pathname is - relative to the referencing application component jar file. - In this manner, multiple persistence units with the same - persistence unit name may be uniquely identified when the - Application Assembler cannot change persistence unit names. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:group ref="javaee:resourceGroup"/> - - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="propertyType"> - <xsd:annotation> - <xsd:documentation> - - Specifies a name/value pair. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="name" - type="javaee:xsdStringType"> - </xsd:element> - <xsd:element name="value" - type="javaee:xsdStringType"> - </xsd:element> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="remoteType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The remote element contains the fully-qualified name - of the enterprise bean's remote interface. - - Example: - - <remote>com.wombat.empl.EmployeeService</remote> - - ]]> - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:fully-qualified-classType"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="res-authType"> - <xsd:annotation> - <xsd:documentation> - - The res-authType specifies whether the Deployment Component - code signs on programmatically to the resource manager, or - whether the Container will sign on to the resource manager - on behalf of the Deployment Component. In the latter case, - the Container uses information that is supplied by the - Deployer. - - The value must be one of the two following: - - Application - Container - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="Application"/> - <xsd:enumeration value="Container"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="res-sharing-scopeType"> - <xsd:annotation> - <xsd:documentation> - - The res-sharing-scope type specifies whether connections - obtained through the given resource manager connection - factory reference can be shared. The value, if specified, - must be one of the two following: - - Shareable - Unshareable - - The default value is Shareable. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:string"> - <xsd:enumeration value="Shareable"/> - <xsd:enumeration value="Unshareable"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="resource-env-refType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The resource-env-refType is used to define - resource-env-type elements. It contains a declaration of a - Deployment Component's reference to an administered object - associated with a resource in the Deployment Component's - environment. It consists of an optional description, the - resource environment reference name, and an optional - indication of the resource environment reference type - expected by the Deployment Component code. - - It also includes optional elements to define injection of - the named resource into fields or JavaBeans properties. - - The resource environment type must be supplied unless an - injection target is specified, in which case the type - of the target is used. If both are specified, the type - must be assignment compatible with the type of the injection - target. - - Example: - - <resource-env-ref> - <resource-env-ref-name>jms/StockQueue - </resource-env-ref-name> - <resource-env-ref-type>javax.jms.Queue - </resource-env-ref-type> - </resource-env-ref> - - ]]> - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="resource-env-ref-name" - type="javaee:jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - - The resource-env-ref-name element specifies the name - of a resource environment reference; its value is - the environment entry name used in - the Deployment Component code. The name is a JNDI - name relative to the java:comp/env context and must - be unique within a Deployment Component. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="resource-env-ref-type" - type="javaee:fully-qualified-classType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The resource-env-ref-type element specifies the type - of a resource environment reference. It is the - fully qualified name of a Java language class or - interface. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:group ref="javaee:resourceGroup"/> - - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="resource-refType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The resource-refType contains a declaration of a - Deployment Component's reference to an external resource. It - consists of an optional description, the resource manager - connection factory reference name, an optional indication of - the resource manager connection factory type expected by the - Deployment Component code, an optional type of authentication - (Application or Container), and an optional specification of - the shareability of connections obtained from the resource - (Shareable or Unshareable). - - It also includes optional elements to define injection of - the named resource into fields or JavaBeans properties. - - The connection factory type must be supplied unless an - injection target is specified, in which case the type - of the target is used. If both are specified, the type - must be assignment compatible with the type of the injection - target. - - Example: - - <resource-ref> - <res-ref-name>jdbc/EmployeeAppDB</res-ref-name> - <res-type>javax.sql.DataSource</res-type> - <res-auth>Container</res-auth> - <res-sharing-scope>Shareable</res-sharing-scope> - </resource-ref> - - ]]> - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="res-ref-name" - type="javaee:jndi-nameType"> - <xsd:annotation> - <xsd:documentation> - - The res-ref-name element specifies the name of a - resource manager connection factory reference. - The name is a JNDI name relative to the - java:comp/env context. - The name must be unique within a Deployment File. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="res-type" - type="javaee:fully-qualified-classType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The res-type element specifies the type of the data - source. The type is specified by the fully qualified - Java language class or interface - expected to be implemented by the data source. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="res-auth" - type="javaee:res-authType" - minOccurs="0"/> - - <xsd:element name="res-sharing-scope" - type="javaee:res-sharing-scopeType" - minOccurs="0"/> - - <xsd:group ref="javaee:resourceGroup"/> - - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:group name="resourceGroup"> - <xsd:annotation> - <xsd:documentation> - - This group collects elements that are common to all the - JNDI resource elements. - - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="mapped-name" - type="javaee:xsdStringType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - A product specific name that this resource should be - mapped to. The name of this resource, as defined by the - resource's name element or defaulted, is a name that is - local to the application component using the resource. - (It's a name in the JNDI java:comp/env namespace.) Many - application servers provide a way to map these local - names to names of resources known to the application - server. This mapped name is often a global JNDI name, - but may be a name of any form. - - Application servers are not required to support any - particular form or type of mapped name, nor the ability - to use mapped names. The mapped name is - product-dependent and often installation-dependent. No - use of a mapped name is portable. - - ]]> - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="injection-target" - type="javaee:injection-targetType" - minOccurs="0" - maxOccurs="unbounded"/> - </xsd:sequence> - </xsd:group> - -<!-- **************************************************** --> - - <xsd:complexType name="role-nameType"> - <xsd:annotation> - <xsd:documentation> - - The role-nameType designates the name of a security role. - - The name must conform to the lexical rules for a token. - - </xsd:documentation> - </xsd:annotation> - - <xsd:simpleContent> - <xsd:restriction base="javaee:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="run-asType"> - <xsd:annotation> - <xsd:documentation> - - The run-asType specifies the run-as identity to be - used for the execution of a component. It contains an - optional description, and the name of a security role. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="role-name" - type="javaee:role-nameType"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="security-role-refType"> - <xsd:annotation> - <xsd:documentation> - - The security-role-refType contains the declaration of a - security role reference in a component's or a - Deployment Component's code. The declaration consists of an - optional description, the security role name used in the - code, and an optional link to a security role. If the - security role is not specified, the Deployer must choose an - appropriate security role. - - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="role-name" - type="javaee:role-nameType"> - <xsd:annotation> - <xsd:documentation> - - The value of the role-name element must be the String used - as the parameter to the - EJBContext.isCallerInRole(String roleName) method or the - HttpServletRequest.isUserInRole(String role) method. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <xsd:element name="role-link" - type="javaee:role-nameType" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The role-link element is a reference to a defined - security role. The role-link element must contain - the name of one of the security roles defined in the - security-role elements. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="security-roleType"> - <xsd:annotation> - <xsd:documentation> - <![CDATA[ - - The security-roleType contains the definition of a security - role. The definition consists of an optional description of - the security role, and the security role name. - - Example: - - <security-role> - <description> - This role includes all employees who are authorized - to access the employee service application. - </description> - <role-name>employee</role-name> - </security-role> - - ]]> - </xsd:documentation> - </xsd:annotation> - - <xsd:sequence> - <xsd:element name="description" - type="javaee:descriptionType" - minOccurs="0" - maxOccurs="unbounded"/> - <xsd:element name="role-name" - type="javaee:role-nameType"/> - </xsd:sequence> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="string"> - <xsd:annotation> - <xsd:documentation> - - This is a special string datatype that is defined by Java EE as - a base type for defining collapsed strings. When schemas - require trailing/leading space elimination as well as - collapsing the existing whitespace, this base type may be - used. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:token"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="true-falseType"> - <xsd:annotation> - <xsd:documentation> - - This simple type designates a boolean with only two - permissible values - - - true - - false - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:restriction base="javaee:xsdBooleanType"> - <xsd:pattern value="(true|false)"/> - </xsd:restriction> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="url-patternType"> - <xsd:annotation> - <xsd:documentation> - - The url-patternType contains the url pattern of the mapping. - It must follow the rules specified in Section 11.2 of the - Servlet API Specification. This pattern is assumed to be in - URL-decoded form and must not contain CR(#xD) or LF(#xA). - If it contains those characters, the container must inform - the developer with a descriptive error message. - The container must preserve all characters including whitespaces. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:string"/> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdAnyURIType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:anyURI. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:anyURI"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdBooleanType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:boolean. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:boolean"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdIntegerType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:integer. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:integer"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdNMTOKENType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:NMTOKEN. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:NMTOKEN"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdNonNegativeIntegerType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:nonNegativeInteger. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:nonNegativeInteger"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdPositiveIntegerType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:positiveInteger. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:positiveInteger"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdQNameType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:QName. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:QName"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -<!-- **************************************************** --> - - <xsd:complexType name="xsdStringType"> - <xsd:annotation> - <xsd:documentation> - - This type adds an "id" attribute to xsd:string. - - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:string"> - <xsd:attribute name="id" type="xsd:ID"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - -</xsd:schema> - diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java index 35487a771..278fdd1d8 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java @@ -4,6 +4,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.EMFPlugin; import org.eclipse.emf.common.util.ResourceLocator; +import org.osgi.framework.BundleContext; /** * The activator class controls the plug-in life cycle @@ -74,6 +75,7 @@ public class FaceletCorePlugin extends EMFPlugin */ public static class Implementation extends EclipsePlugin { + private BundleContext context = null; /** * Creates an instance. * <!-- begin-user-doc --> @@ -88,6 +90,21 @@ public class FaceletCorePlugin extends EMFPlugin // plugin = this; } + + @Override + public void start(BundleContext bundleContext) throws Exception + { + super.start(bundleContext); + this.context = bundleContext; + } + + /** + * @return the bundle context. + */ + public BundleContext getBundleContext() + { + return this.context; + } } @@ -98,6 +115,10 @@ public class FaceletCorePlugin extends EMFPlugin */ public static Implementation getDefault() { + if (plugin == null) + { + return new Implementation(); + } return plugin; } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java index 7dd30ba81..0732f1954 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/NamespaceCMAdapter.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.core.resources.IProject; import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject; @@ -19,6 +20,7 @@ import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; private final Namespace _ns; private final Map<String, ElementCMAdapter> _elements; private final FaceletDocumentFactory _factory; + private final AtomicBoolean _isDisposed = new AtomicBoolean(false); public NamespaceCMAdapter(final Namespace ns, final IProject project) { @@ -204,7 +206,10 @@ import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; } public void dispose() { - _elements.clear(); + if (_isDisposed.compareAndSet(false, true)) + { + _elements.clear(); + } } public void checkpoint() @@ -219,4 +224,9 @@ import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; } + public boolean isDisposed() + { + return _isDisposed.get(); + } + } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java index 126098fe4..b7b2b21db 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java @@ -16,6 +16,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.jface.util.SafeRunnable; @@ -394,6 +395,11 @@ public class MDExternalMetadataStrategy extends ResourceSingletonObjectManager<MDExternalMetadataStrategy, IProject> { + protected MySingletonManager() + { + super(ResourcesPlugin.getWorkspace()); + } + @Override protected MDExternalMetadataStrategy createNewInstance( final IProject resource) @@ -402,4 +408,9 @@ public class MDExternalMetadataStrategy extends } } + + public boolean isDisposed() + { + return _isDisposed.get(); + } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java index 239cb6f88..aff143bf0 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletRegistryManager.java @@ -1,6 +1,7 @@ package org.eclipse.jst.jsf.facelet.core.internal.registry; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager; import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry; import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory; @@ -21,7 +22,7 @@ public final class FaceletRegistryManager extends /** * @return the singleton instance */ - private static FaceletRegistryManager getGlobalManager() + private static FaceletRegistryManager getGlobalManager(final IWorkspace workspace) { if (FaceletCoreTraceOptions.TRACE_REGISTRYMANAGER) { @@ -33,16 +34,16 @@ public final class FaceletRegistryManager extends { if (INSTANCE == null) { - INSTANCE = new FaceletRegistryManager(); + INSTANCE = new FaceletRegistryManager(workspace); } return INSTANCE; } } - private FaceletRegistryManager() + private FaceletRegistryManager(final IWorkspace workspace) { - // do nothing + super(workspace); } @Override @@ -90,7 +91,7 @@ public final class FaceletRegistryManager extends { try { - return getGlobalManager().getInstance(project); + return getGlobalManager(project.getWorkspace()).getInstance(project); } catch (ManagedObjectException e) { @@ -101,7 +102,7 @@ public final class FaceletRegistryManager extends @Override public boolean isInstance(IProject project) { - return getGlobalManager().isInstance(project); + return getGlobalManager(project.getWorkspace()).isInstance(project); } public String getDisplayName() diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java index 1d0d8ce3b..d3e786cb3 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/FaceletTagRegistry.java @@ -130,7 +130,7 @@ public final class FaceletTagRegistry extends AbstractTagRegistry implements + _project)); } - final FaceletTagIndex index = FaceletTagIndex.getInstance(); + final FaceletTagIndex index = FaceletTagIndex.getInstance(_project.getWorkspace()); IProjectTaglibDescriptor tagDesc; try @@ -237,7 +237,7 @@ public final class FaceletTagRegistry extends AbstractTagRegistry implements if (flushCaches) { - FaceletTagIndex.getInstance().flush(_project); + FaceletTagIndex.getInstance(_project.getWorkspace()).flush(_project); } // if we aren't flushing caches, then check point the // current namespace data, so it isn't lost when we clear @@ -351,7 +351,7 @@ public final class FaceletTagRegistry extends AbstractTagRegistry implements { if (_listener != null) { - FaceletTagIndex index = FaceletTagIndex.getInstance(); + FaceletTagIndex index = FaceletTagIndex.getInstance(_project.getWorkspace()); try { IProjectTaglibDescriptor instance = index.getInstance(_project); diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractProjectTaglibDescriptorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractProjectTaglibDescriptorFactory.java new file mode 100644 index 000000000..47866c0d0 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/AbstractProjectTaglibDescriptorFactory.java @@ -0,0 +1,16 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import org.eclipse.core.resources.IProject; + +/** + * The base class for all impls of IProjectTaglibDescriptorFactory. + * + * @author cbateman + * + */ +public abstract class AbstractProjectTaglibDescriptorFactory implements IProjectTaglibDescriptorFactory +{ + + public abstract IProjectTaglibDescriptor create(IProject project, + TagRecordFactory factory); +} 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 d1f7956e6..42fc69e0e 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 @@ -12,7 +12,6 @@ package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; import java.io.IOException; import java.io.InputStream; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,7 +22,13 @@ 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.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +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.IResourceLifecycleListener; @@ -44,7 +49,7 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F * * TODO:merge back with common code in JSFAppConfig framework */ -/* package */class ContextParamSpecifiedFaceletTaglibLocator extends +public class ContextParamSpecifiedFaceletTaglibLocator extends AbstractFaceletTaglibLocator { private static final String ID = ContextParamSpecifiedFaceletTaglibLocator.class.getCanonicalName(); @@ -54,15 +59,22 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F private final TagRecordFactory _factory; private final TaglibFileManager _fileManager; + /** + * @param project + * @param factory + * @param webAppProvider + * @param vcQuery + */ public ContextParamSpecifiedFaceletTaglibLocator(final IProject project, - final TagRecordFactory factory) + final TagRecordFactory factory, final IModelProvider webAppProvider, + final AbstractVirtualComponentQuery vcQuery) { super(ID, DISPLAYNAME); _project = project; _records = new HashMap<String, IFaceletTagRecord>(); _factory = factory; _fileManager = new TaglibFileManager(project, - new LibraryChangeHandler()); + new LibraryChangeHandler(), webAppProvider, vcQuery); } /* @@ -88,16 +100,12 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F public void stop() { _fileManager.dispose(); + super.stop(); } @Override - protected Map<String, ? extends IFaceletTagRecord> doLocate(IProject context) - { - return findInWebRoot(); - } - - private Map<String, ? extends IFaceletTagRecord> findInWebRoot() + protected Map<String, ? extends IFaceletTagRecord> doLocate(final IProject context) { final List<IFile> files = _fileManager.getFiles(); @@ -140,7 +148,7 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F is = file.getContents(); final TagModelLoader loader = new TagModelLoader(file.getFullPath().toFile().getCanonicalPath()); loader.loadFromInputStream(is); - FaceletTaglib taglib = loader.getTaglib(); + final FaceletTaglib taglib = loader.getTaglib(); if (taglib != null) { return _factory.createRecords(taglib); @@ -177,10 +185,12 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F private final IResourceChangeListener _newFileListener; public TaglibFileManager(final IProject project, - final LibraryChangeHandler handler) + final LibraryChangeHandler handler, final IModelProvider webAppProvider, + final AbstractVirtualComponentQuery vcQuery) { + super(project.getWorkspace()); _handler = handler; - _webAppConfiguration = new WebappConfiguration(project); + _webAppConfiguration = new WebappConfiguration(project, webAppProvider, vcQuery); // TODO: fold into LifecycleListener _newFileListener = new IResourceChangeListener() { @@ -192,24 +202,35 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F && event.getDelta().findMember( project.getFullPath()) != null) { - for (final IFile file : _webAppConfiguration.getFiles()) + new WorkspaceJob("Context param update") //$NON-NLS-1$ { - final IResourceDelta delta = event.getDelta() - .findMember(file.getFullPath()); - - if (delta != null) + + @Override + public IStatus runInWorkspace(IProgressMonitor monitor) + throws CoreException { - if (delta.getKind() == IResourceDelta.ADDED) + for (final IFile file : _webAppConfiguration.getFiles()) { - _handler.added(file); + final IResourceDelta delta = event.getDelta() + .findMember(file.getFullPath()); + + if (delta != null) + { + if (delta.getKind() == IResourceDelta.ADDED) + { + + _handler.added(file); + } + } } + return Status.OK_STATUS; } - } + }.schedule(); } } }; - ResourcesPlugin.getWorkspace().addResourceChangeListener( + getWorkspace().addResourceChangeListener( _newFileListener); } @@ -224,7 +245,7 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F _webAppConfiguration.addListener(new WebappListener() { @Override - public void webappChanged(WebappChangeEvent event) + public void webappChanged(final WebappChangeEvent event) { for (final IFile file : event.getRemoved()) { @@ -234,7 +255,7 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F tracker = getInstance(file); _handler.removed(tracker._uri, file); } - catch (ManagedObjectException e) + catch (final ManagedObjectException e) { FaceletCorePlugin.log("While removing for webapp change", e); //$NON-NLS-1$ } @@ -264,19 +285,16 @@ import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.F super.removeLifecycleEventListener(listener); } + /* (non-Javadoc) + * @see org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager#dispose() + */ + @Override public void dispose() { - ResourcesPlugin.getWorkspace().removeResourceChangeListener( - _newFileListener); - - final Collection<IFile> managedResources = getManagedResources(); - - for (final IFile file : managedResources) - { - unmanageResource(file); - } - _webAppConfiguration.dispose(); + getWorkspace().removeResourceChangeListener( + _newFileListener); + super.dispose(); } } 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 fb1b457aa..3a26292ac 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 @@ -7,40 +7,127 @@ * * Contributors: * Cameron Bateman - initial API and implementation - *******************************************************************************/ + *******************************************************************************/ package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.jst.j2ee.model.ModelProviderManager; +import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery; +import org.eclipse.jst.jsf.common.internal.locator.AbstractLocatorProvider; import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager; /** * @author cbateman + * + */ +/** + * @author cbateman * */ -public class FaceletTagIndex extends ResourceSingletonObjectManager<IProjectTaglibDescriptor, IProject> +public class FaceletTagIndex extends +ResourceSingletonObjectManager<IProjectTaglibDescriptor, IProject> { - private final static FaceletTagIndex INSTANCE = new FaceletTagIndex(); + private IProjectTaglibDescriptorFactory _factory; /** + * @param ws + * @param factory + */ + public FaceletTagIndex(final IWorkspace ws, final IProjectTaglibDescriptorFactory factory) + { + super(ws); + _factory = factory; + } + + private static FaceletTagIndex INSTANCE; + + /** + * @param ws * @return the singleton instance */ - public static FaceletTagIndex getInstance() + public static synchronized FaceletTagIndex getInstance(final IWorkspace ws) { + if (INSTANCE == null) + { + INSTANCE = new FaceletTagIndex(ws, new DefaultProjectTaglibDescriptorFactory()); + + } return INSTANCE; } @Override - protected IProjectTaglibDescriptor createNewInstance(IProject project) + protected IProjectTaglibDescriptor createNewInstance(final IProject project) { - return new ProjectTaglibDescriptor(project); + final TagRecordFactory factory = new TagRecordFactory(project); + + return _factory.create(project, factory); } - + /** * Force a project to refresh its tag index info + * * @param project */ public void flush(final IProject project) { unmanageResource(project); } + + /** + * The default factory for creating per-project tag descriptors. + * @author cbateman + * + */ + public static class DefaultProjectTaglibDescriptorFactory extends AbstractProjectTaglibDescriptorFactory + { + @Override + public IProjectTaglibDescriptor create(IProject project, + TagRecordFactory factory) + { + final List<AbstractFaceletTaglibLocator> locators = new ArrayList<AbstractFaceletTaglibLocator>(); + locators.add(new JarFileFaceletTaglibLocator(factory)); + locators.add(new ContextParamSpecifiedFaceletTaglibLocator(project, + factory, ModelProviderManager.getModelProvider(project), + new DefaultVirtualComponentQuery())); + LocatorProvider provider = new LocatorProvider(locators); + return new ProjectTaglibDescriptor(project, factory, provider); + } + } + + /** + * The locator provider used by the tag index. + * + * @author cbateman + * + */ + public static class LocatorProvider extends + AbstractLocatorProvider<AbstractFaceletTaglibLocator> + { + private final List<AbstractFaceletTaglibLocator> _locators; + + /** + * @param locators + */ + public LocatorProvider(final List<AbstractFaceletTaglibLocator> locators) + { + _locators = locators; + } + + @Override + protected void doInitialize() + { + // nothing to do + } + + @Override + protected List<? extends AbstractFaceletTaglibLocator> doGetLocators() + { + return Collections.unmodifiableList(_locators); + } + } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java index cfa997144..f289e7b38 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/FaceletTagRecord.java @@ -15,10 +15,19 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglibTag; -abstract class FaceletTagRecord implements IFaceletTagRecord +/** + * Super of all facelet tag records. + * + * @author cbateman + * + */ +public abstract class FaceletTagRecord implements IFaceletTagRecord { private final CopyOnWriteArrayList<ITagRecordChangeListener> _listeners; + /** + * + */ public FaceletTagRecord() { _listeners = new CopyOnWriteArrayList<ITagRecordChangeListener>(); @@ -34,6 +43,9 @@ abstract class FaceletTagRecord implements IFaceletTagRecord _listeners.remove(listener); } + /** + * @param event + */ protected void fireEvent(final TagRecordChangeEvent event) { for (final ITagRecordChangeListener listener : _listeners) diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java index 040adaf7b..8ea718090 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IFaceletTagRecord.java @@ -61,14 +61,17 @@ public interface IFaceletTagRecord extends Serializable /** * Indicates that a tag record has changed */ - static class TagRecordChangeEvent extends EventObject + public static class TagRecordChangeEvent extends EventObject { /** * */ private static final long serialVersionUID = 5655356157624922019L; - TagRecordChangeEvent(IFaceletTagRecord source) + /** + * @param source + */ + public TagRecordChangeEvent(IFaceletTagRecord source) { super(source); } @@ -78,8 +81,11 @@ public interface IFaceletTagRecord extends Serializable * A listener for tag record change events. * */ - interface ITagRecordChangeListener + public interface ITagRecordChangeListener { + /** + * @param event + */ public void changed(final TagRecordChangeEvent event); } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptorFactory.java new file mode 100644 index 000000000..039d9268e --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/IProjectTaglibDescriptorFactory.java @@ -0,0 +1,22 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import org.eclipse.core.resources.IProject; + +/** + * Implemented by factories that create new IProjectTaglibDescriptor objects. + * + * @author cbateman + * + */ +public interface IProjectTaglibDescriptorFactory +{ + /** + * @param project + * @param factory + * @param jarProvider + * @param webAppProvider + * @param vcQuery + * @return a new taglib descriptor. + */ + IProjectTaglibDescriptor create(final IProject project, final TagRecordFactory factory); +} diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java index 2e9d5db08..78c50f8bf 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/JarFileFaceletTaglibLocator.java @@ -13,6 +13,7 @@ package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; @@ -57,14 +58,25 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator private static final String ID = JarFileFaceletTaglibLocator.class .getCanonicalName(); private final TagRecordFactory _factory; - private Map<String, IFaceletTagRecord> _records; + private final Map<String, IFaceletTagRecord> _records; private final SimpleStrategyComposite<JarEntry, JarEntry, JarEntry, String, TaglibFinder<JarEntry, JarEntry>> _finder; + private final IJarProvider _provider; /** * @param factory */ public JarFileFaceletTaglibLocator(final TagRecordFactory factory) { + this(factory, new DefaultJarProvider()); + } + + /** + * @param factory + * @param jarProvider + */ + public JarFileFaceletTaglibLocator(final TagRecordFactory factory, + IJarProvider jarProvider) + { super(ID, DISPLAYNAME); _factory = factory; _records = new HashMap<String, IFaceletTagRecord>(); @@ -75,74 +87,20 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator _finder = new SimpleStrategyComposite<JarEntry, JarEntry, JarEntry, String, TaglibFinder<JarEntry, JarEntry>>( finders); - + _provider = jarProvider; } @Override public Map<String, ? extends IFaceletTagRecord> doLocate( final IProject project) { - try - { - return findInJars(project); - } catch (JavaModelException e) - { - FaceletCorePlugin - .log( - "Couldn't locate jar file taglibs: " + project.getProject(), e); //$NON-NLS-1$ - } - return Collections.EMPTY_MAP; - } - - private Map<String, ? extends IFaceletTagRecord> findInJars( - final IProject project) throws JavaModelException - { - final IJavaProject javaProject = JavaCore.create(project); - - final IClasspathEntry[] entries = javaProject - .getResolvedClasspath(true); - final List<FaceletTaglib> tagLibsFound = new ArrayList<FaceletTaglib>(); - for (final IClasspathEntry entry : entries) - { - switch (entry.getEntryKind()) - { - // this entry describes a source root in its project - case IClasspathEntry.CPE_SOURCE: + final Collection<JarFile> jars = _provider.getJars(project); - break; - // - this entry describes a folder or JAR containing - // binaries - case IClasspathEntry.CPE_LIBRARY: - { - tagLibsFound.addAll(processJar(entry)); - } - break; - // - this entry describes another project - case IClasspathEntry.CPE_PROJECT: - // { - // final IPath pathToProject = entry.getPath(); - // IWorkspace wkspace = ResourcesPlugin.getWorkspace(); - // IResource res = - // wkspace.getRoot().findMember(pathToProject); - // if (res instanceof IProject) - // { - // tagLibsFound.addAll(); - // } - // } - break; - // - this entry describes a project or library indirectly - // via a - // classpath variable in the first segment of the path * - case IClasspathEntry.CPE_VARIABLE: - break; - // - this entry describes set of entries referenced - // indirectly - // via a classpath container - case IClasspathEntry.CPE_CONTAINER: - break; - } + for (final JarFile jarFile : jars) + { + tagLibsFound.addAll(processJar(jarFile)); } for (final FaceletTaglib tag : tagLibsFound) @@ -157,50 +115,17 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator return _records; } - /** - * TODO: Merge into JSFAppConfigUtils. - * - * @param entry - * @return - */ - private static JarFile getJarFileFromCPE(final IClasspathEntry entry) - throws IOException - { - if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) - { - IPath libraryPath = entry.getPath(); - if (libraryPath.getFileExtension() != null - && libraryPath.getFileExtension().length() > 0) - { - final IWorkspaceRoot workspaceRoot = ResourcesPlugin - .getWorkspace().getRoot(); - if (libraryPath.getDevice() == null - && workspaceRoot.getProject(libraryPath.segment(0)) - .exists()) - { - libraryPath = workspaceRoot.getFile(libraryPath) - .getLocation(); - } - final String libraryPathString = libraryPath.toString(); - return new JarFile(libraryPathString); - } - } - return null; - } /** * @param entry * @param defaultDtdStream */ - private List<FaceletTaglib> processJar(final IClasspathEntry entry) + private List<FaceletTaglib> processJar(final JarFile jarFile) { - JarFile jarFile = null; final List<FaceletTaglib> tagLibsFound = new ArrayList<FaceletTaglib>(); try { - jarFile = getJarFileFromCPE(entry); - if (jarFile != null) { final Enumeration<JarEntry> jarEntries = jarFile.entries(); @@ -221,7 +146,8 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator try { is = jarFile.getInputStream(jarEntry); - TagModelLoader loader = new TagModelLoader(jarEntry.getName()); + TagModelLoader loader = new TagModelLoader( + jarEntry.getName()); loader.loadFromInputStream(is); FaceletTaglib tagLib = loader.getTaglib(); @@ -235,8 +161,7 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator .log( "Error initializing facelet registry entry", //$NON-NLS-1$ e); - } - finally + } finally { if (is != null) { @@ -247,10 +172,6 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator } } } - } catch (final IOException e) - { - FaceletCorePlugin.log( - "Error opening classpath jar file: " + entry, e); //$NON-NLS-1$ } finally { if (jarFile != null) @@ -266,4 +187,126 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator } return tagLibsFound; } + + /** + * Provider of jars for use by the locator. Exists to abstract the locator + * from JDT for test purposes. + * + */ + public interface IJarProvider + { + /** + * @param project + * @return a list of valid jar files. + */ + Collection<JarFile> getJars(final IProject project); + } + + private static class DefaultJarProvider implements IJarProvider + { + public Collection<JarFile> getJars(final IProject project) + { + final IJavaProject javaProject = JavaCore.create(project); + + IClasspathEntry[] entries = null; + try + { + entries = javaProject.getResolvedClasspath(true); + } catch (JavaModelException e1) + { + FaceletCorePlugin.log("Getting resolved classpath entries", e1); //$NON-NLS-1$ + } + + if (entries == null || entries.length == 0) + { + return Collections.EMPTY_LIST; + } + final List<JarFile> jars = new ArrayList<JarFile>(); + for (final IClasspathEntry entry : entries) + { + + switch (entry.getEntryKind()) + { + // this entry describes a source root in its project + case IClasspathEntry.CPE_SOURCE: + + break; + // - this entry describes a folder or JAR containing + // binaries + case IClasspathEntry.CPE_LIBRARY: + { + JarFile jarFileFromCPE; + try + { + jarFileFromCPE = getJarFileFromCPE(entry); + if (jarFileFromCPE != null) + { + jars.add(jarFileFromCPE); + } + } catch (IOException e) + { + FaceletCorePlugin.log("Getting jar from CPE", e); //$NON-NLS-1$ + } + } + break; + // - this entry describes another project + case IClasspathEntry.CPE_PROJECT: + // { + // final IPath pathToProject = entry.getPath(); + // IWorkspace wkspace = ResourcesPlugin.getWorkspace(); + // IResource res = + // wkspace.getRoot().findMember(pathToProject); + // if (res instanceof IProject) + // { + // tagLibsFound.addAll(); + // } + // } + break; + // - this entry describes a project or library indirectly + // via a + // classpath variable in the first segment of the path * + case IClasspathEntry.CPE_VARIABLE: + break; + // - this entry describes set of entries referenced + // indirectly + // via a classpath container + case IClasspathEntry.CPE_CONTAINER: + break; + } + } + return jars; + } + + /** + * TODO: Merge into JSFAppConfigUtils. + * + * @param entry + * @return + */ + private static JarFile getJarFileFromCPE(final IClasspathEntry entry) + throws IOException + { + if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) + { + IPath libraryPath = entry.getPath(); + if (libraryPath.getFileExtension() != null + && libraryPath.getFileExtension().length() > 0) + { + final IWorkspaceRoot workspaceRoot = ResourcesPlugin + .getWorkspace().getRoot(); + if (libraryPath.getDevice() == null + && workspaceRoot.getProject(libraryPath.segment(0)) + .exists()) + { + libraryPath = workspaceRoot.getFile(libraryPath) + .getLocation(); + } + final String libraryPathString = libraryPath.toString(); + return new JarFile(libraryPathString); + } + } + return null; + } + + } } 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 3f87846f3..0673acf4e 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 @@ -10,82 +10,60 @@ *******************************************************************************/ package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.jem.internal.proxy.core.IConfigurationContributor; -import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry; -import org.eclipse.jem.internal.proxy.ide.IDERegistration; -import org.eclipse.jst.jsf.core.JSFVersion; +import org.eclipse.jst.jsf.common.internal.locator.ILocatorProvider; import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; -import org.eclipse.jst.jsf.facelet.core.internal.registry.ELProxyContributor; -import org.eclipse.jst.jsf.facelet.core.internal.registry.ServletBeanProxyContributor; -class ProjectTaglibDescriptor implements IProjectTaglibDescriptor +/** + * Taglib descriptor for a project. + * + * @author cbateman + * + */ +public class ProjectTaglibDescriptor implements IProjectTaglibDescriptor { - private ProxyFactoryRegistry _registry; private final AtomicInteger _isInitialized = new AtomicInteger( 0); private final IProject _project; - private final List<AbstractFaceletTaglibLocator> _locators; + private final ILocatorProvider<AbstractFaceletTaglibLocator> _locatorProvider; private final MyChangeListener _libChangeListener; private final Map<String, IFaceletTagRecord> _tagRecords; - - public ProjectTaglibDescriptor(final IProject project) + private final TagRecordFactory _factory; + private final AtomicBoolean _isDisposed = new AtomicBoolean(false); + + /** + * @param project + * @param factory + * @param locatorProvider + */ + public ProjectTaglibDescriptor(final IProject project, final TagRecordFactory factory, + final ILocatorProvider<AbstractFaceletTaglibLocator> locatorProvider) { _project = project; - _locators = new ArrayList<AbstractFaceletTaglibLocator>(); _tagRecords = new HashMap<String, IFaceletTagRecord>(); - - try - { - _registry = createProxyRegistry(_project); - } - catch (final CoreException e) - { - FaceletCorePlugin.log("While creatinng proxy", e); //$NON-NLS-1$ - } - - final TagRecordFactory factory = new TagRecordFactory(project, - _registry); - _locators.add(new JarFileFaceletTaglibLocator(factory)); - _locators.add(new ContextParamSpecifiedFaceletTaglibLocator(_project, - factory)); - + _locatorProvider = locatorProvider; + _locatorProvider.initialize(); + _factory = factory; _libChangeListener = new MyChangeListener(); } - private static ProxyFactoryRegistry createProxyRegistry( - final IProject project) throws CoreException - { - final IConfigurationContributor[] contributor = new IConfigurationContributor[] - { new ServletBeanProxyContributor(JSFVersion.V1_1), - new ELProxyContributor(project) }; - - return IDERegistration.startAnImplementation(contributor, false, - project, project.getName(), FaceletCorePlugin.PLUGIN_ID, - new NullProgressMonitor()); - } - private void initialize() { if (_isInitialized.addAndGet(1) == 1) { synchronized (this) { - - for (final AbstractFaceletTaglibLocator locator : _locators) + for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators()) { SafeRunner.run(new ISafeRunnable() { @@ -95,7 +73,6 @@ class ProjectTaglibDescriptor implements IProjectTaglibDescriptor .log( "While locating facelet libraries on project: " + _project.getName(), new Exception(exception)); //$NON-NLS-1$ } - public void run() throws Exception { locator.addListener(_libChangeListener); @@ -130,7 +107,7 @@ class ProjectTaglibDescriptor implements IProjectTaglibDescriptor public void addListener(final Listener listener) { - for (final AbstractFaceletTaglibLocator locator : _locators) + for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators()) { locator.addListener(listener); } @@ -138,7 +115,7 @@ class ProjectTaglibDescriptor implements IProjectTaglibDescriptor public void removeListener(final Listener listener) { - for (final AbstractFaceletTaglibLocator locator : _locators) + for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators()) { locator.removeListener(listener); } @@ -146,27 +123,31 @@ class ProjectTaglibDescriptor implements IProjectTaglibDescriptor public void checkpoint() { - // TODO Auto-generated method stub + // do nothing } public void destroy() { - // TODO Auto-generated method stub + // do nothing } public void dispose() { - if (_registry != null) + if (_isDisposed.compareAndSet(false, true)) { - _registry.terminateRegistry(false); - - for (final AbstractFaceletTaglibLocator locator : _locators) + for (final AbstractFaceletTaglibLocator locator : _locatorProvider.getLocators()) { locator.stop(); } + _factory.dispose(); } } + public boolean isDisposed() + { + return _isDisposed.get(); + } + private class MyChangeListener extends Listener { @Override diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java index 9dba15b63..c93bf93b2 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/TagRecordFactory.java @@ -12,61 +12,121 @@ package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jem.internal.proxy.core.ICallbackRegistry; +import org.eclipse.jem.internal.proxy.core.IConfigurationContributor; import org.eclipse.jem.internal.proxy.core.ProxyFactoryRegistry; +import org.eclipse.jem.internal.proxy.ide.IDERegistration; +import org.eclipse.jst.jsf.core.JSFVersion; import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; +import org.eclipse.jst.jsf.facelet.core.internal.registry.ELProxyContributor; +import org.eclipse.jst.jsf.facelet.core.internal.registry.ServletBeanProxyContributor; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib.FaceletTaglib; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletLibraryClassTagLib; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletXMLDefnTaglib; -/*package*/class TagRecordFactory +/** + * Creates new tag records for a project. + * + */ +public class TagRecordFactory { - private final ProxyFactoryRegistry _registry; - private final IProject _project; + private final ProxyFactoryRegistry _registry; + private final IProject _project; - public TagRecordFactory(final IProject project, - final ProxyFactoryRegistry registry) + /** + * @param project + */ + public TagRecordFactory(final IProject project) { - _registry = registry; _project = project; + ProxyFactoryRegistry registry = NULL_REGISTRY; + try + { + registry = createProxyRegistry(_project); + } catch (final Exception e) + { + FaceletCorePlugin.log("While creatinng proxy", e); //$NON-NLS-1$ + } + _registry = registry; } + /** + * @param taglibDefn + * @return the new tag record + */ public IFaceletTagRecord createRecords(final FaceletTaglib taglibDefn) { - IFaceletTagRecord retValue = null; + IFaceletTagRecord retValue = null; if (taglibDefn instanceof FaceletLibraryClassTagLib) { if (_registry != NULL_REGISTRY) { final LibraryClassBasedTagRecord record = new LibraryClassBasedTagRecord( - _registry, (FaceletLibraryClassTagLib) taglibDefn, _project); + _registry, (FaceletLibraryClassTagLib) taglibDefn, + _project); try { record.initURI(); retValue = record; - } - catch (CoreException e) + } catch (CoreException e) { - FaceletCorePlugin.log("While creating record: "+record, e); //$NON-NLS-1$ + FaceletCorePlugin + .log("While creating record: " + record, e); //$NON-NLS-1$ } } - } - else if (taglibDefn instanceof FaceletXMLDefnTaglib) + } else if (taglibDefn instanceof FaceletXMLDefnTaglib) { throw new UnsupportedOperationException(); -// final XMLBasedTagRecord record = new XMLBasedTagRecord( -// (FaceletXMLDefnTaglib) taglibDefn); -// retValue = record; - } - else + // final XMLBasedTagRecord record = new XMLBasedTagRecord( + // (FaceletXMLDefnTaglib) taglibDefn); + // retValue = record; + } else { final XMLBasedTagRecord record = new XMLBasedTagRecord(taglibDefn); - retValue = record; + retValue = record; } return retValue; } + /** + * Dispose the registry. + */ + public void dispose() + { + if (_registry != null && _registry != NULL_REGISTRY) + { + SafeRunner.run(new ISafeRunnable() + { + + public void run() throws Exception + { + _registry.terminateRegistry(false); + } + + public void handleException(Throwable e) + { + FaceletCorePlugin.log("While creatinng proxy", e); //$NON-NLS-1$ + } + }); + } + } + + private static ProxyFactoryRegistry createProxyRegistry( + final IProject project) throws CoreException + { + final IConfigurationContributor[] contributor = new IConfigurationContributor[] + { new ServletBeanProxyContributor(JSFVersion.V1_1), + new ELProxyContributor(project) }; + + return IDERegistration.startAnImplementation(contributor, false, + project, project.getName(), FaceletCorePlugin.PLUGIN_ID, + new NullProgressMonitor()); + } + private final static NullProxyFactoryRegistry NULL_REGISTRY = new NullProxyFactoryRegistry(); private static class NullProxyFactoryRegistry extends ProxyFactoryRegistry 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 e65ba9a4d..bb397a98f 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 @@ -19,7 +19,6 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; @@ -28,12 +27,9 @@ 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.model.ModelProviderManager; -import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit; import org.eclipse.jst.j2ee.webapplication.ContextParam; import org.eclipse.jst.j2ee.webapplication.WebApp; -import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; -import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils; +import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery; import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration.WebappListener.WebappChangeEvent; import org.eclipse.wst.common.componentcore.resources.IVirtualFile; @@ -48,22 +44,36 @@ import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; public class WebappConfiguration { // TODO: move these to jsf core. - private static final String FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME = "facelets.LIBRARIES"; //$NON-NLS-1$ - private static final String JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME = "javax.faces.FACELETS_LIBRARIES"; //$NON-NLS-1$ - private final IProject _project; + /** + * The param key for Facelet 1.x libraries declared in web.xml + */ + public static final String FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME = "facelets.LIBRARIES"; //$NON-NLS-1$ + /** + * The param key for Facelet 2.0 libraries declared in web.xml + */ + public static final String JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME = "javax.faces.FACELETS_LIBRARIES"; //$NON-NLS-1$ + private final IProject _project; /** * Cached instance of ContextParamAdapter. */ private final ContextParamAdapter _contextParamAdapter; - private List<IFile> _cachedFiles; + private List<IFile> _cachedFiles; + private IModelProvider _modelProvider; + private AbstractVirtualComponentQuery _vcQuery; /** * @param project + * @param modelProvider + * @param vcQuery */ - /*package*/ WebappConfiguration(final IProject project) + public WebappConfiguration(final IProject project, + final IModelProvider modelProvider, + final AbstractVirtualComponentQuery vcQuery) { _project = project; _contextParamAdapter = new ContextParamAdapter(); + _modelProvider = modelProvider; + _vcQuery = vcQuery; } /** @@ -73,7 +83,7 @@ public class WebappConfiguration { _contextParamAdapter.addListener(listener); } - + /** * @param listener */ @@ -83,19 +93,19 @@ public class WebappConfiguration } /** - * @return the list of IFile's + * @return the list of IFile's */ public List<IFile> getFiles() { - final IVirtualFolder folder = JSFAppConfigUtils - .getWebContentFolder(_project); + final IVirtualFolder folder = _vcQuery.getWebContentFolder(_project); if (folder == null) { return Collections.emptyList(); } - final List<String> filenames = getConfigFilesFromContextParam(_project); + final List<String> filenames = getConfigFilesFromContextParam(_project, + _modelProvider); final List<IFile> files = new ArrayList<IFile>(); for (final String filename : filenames) @@ -112,9 +122,7 @@ public class WebappConfiguration private Object getModelObject() { - final IModelProvider provider = ModelProviderManager - .getModelProvider(_project); - return provider.getModelObject(); + return _modelProvider.getModelObject(); } /** @@ -128,13 +136,11 @@ public class WebappConfiguration if (webAppObj instanceof WebApp) { startLocatingJ2EEConfigs((WebApp) webAppObj); - } - else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) + } else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) { startLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp) webAppObj); } - } - else + } else { FaceletCorePlugin .log( @@ -155,20 +161,17 @@ public class WebappConfiguration if (webAppObj instanceof WebApp) { stopLocatingJ2EEConfigs((WebApp) webAppObj); - } - else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) + } else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) { stopLocatingJEEConfigs((org.eclipse.jst.javaee.web.WebApp) webAppObj); } - } - else + } else { FaceletCorePlugin .log( "Failed stopping locator for project: " + _project.getName() //$NON-NLS-1$ , new Exception()); } - //_contextParamAdapter.dispose(); } } @@ -269,26 +272,24 @@ public class WebappConfiguration * @param project * IProject instance for which to get the context parameter's * value. + * @param provider * @return List of application configuration file names as listed in the JSF * CONFIG_FILES context parameter ("javax.faces.CONFIG_FILES"); list * may be empty. */ public static List<String> getConfigFilesFromContextParam( - final IProject project) + final IProject project, IModelProvider provider) { List<String> filesList = Collections.EMPTY_LIST; - if (JSFAppConfigUtils.isValidJSFProject(project)) + // if (JSFAppConfigUtils.isValidJSFProject(project)) { - final IModelProvider provider = ModelProviderManager - .getModelProvider(project); final Object webAppObj = provider.getModelObject(); if (webAppObj != null) { if (webAppObj instanceof WebApp) { - filesList = getConfigFilesForJ2EEApp(project); - } - else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) + filesList = getConfigFilesForJ2EEApp((WebApp) webAppObj); + } else if (webAppObj instanceof org.eclipse.jst.javaee.web.WebApp) { filesList = getConfigFilesForJEEApp((org.eclipse.jst.javaee.web.WebApp) webAppObj); } @@ -309,8 +310,8 @@ public class WebappConfiguration final org.eclipse.jst.javaee.core.ParamValue paramValue = (org.eclipse.jst.javaee.core.ParamValue) itContextParams .next(); if (paramValue.getParamName().equals( - FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME)|| - paramValue.getParamName().equals( + FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME) + || paramValue.getParamName().equals( JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME)) { filesString = paramValue.getParamValue(); @@ -320,89 +321,63 @@ public class WebappConfiguration return parseFilesString(filesString); } - private static List<String> getConfigFilesForJ2EEApp(final IProject project) + private static List<String> getConfigFilesForJ2EEApp(final WebApp webApp) { - List filesList = new ArrayList(); - final WebArtifactEdit webArtifactEdit = WebArtifactEdit - .getWebArtifactEditForRead(project); - if (webArtifactEdit != null) + List<String> filesList = new ArrayList<String>(); + + if (webApp != null) { - try + String filesString = null; + // need to branch here due to model version differences + // (BugZilla #119442) + if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID) { - WebApp webApp = null; - try - { - webApp = webArtifactEdit.getWebApp(); - } - catch (final ClassCastException cce) - { - // occasionally thrown from WTP code in RC3 and possibly - // later - JSFCorePlugin.log(IStatus.ERROR, cce.getLocalizedMessage(), - cce); - return filesList; - } - if (webApp != null) + final EList contexts = webApp.getContexts(); + final Iterator itContexts = contexts.iterator(); + while (itContexts.hasNext()) { - String filesString = null; - // need to branch here due to model version differences - // (BugZilla #119442) - if (webApp.getVersionID() == J2EEVersionConstants.WEB_2_3_ID) + 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)) { - 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; - } - } + filesString = contextParam.getParamValue(); + break; } - else + } + } 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)) { - 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; - } - } + filesString = paramValue.getValue(); + break; } - filesList = parseFilesString(filesString); } } - finally - { - webArtifactEdit.dispose(); - } + filesList = parseFilesString(filesString); } return filesList; } - private static List parseFilesString(final String filesString) + private static List<String> parseFilesString(final String filesString) { - final List filesList = new ArrayList(); + final List<String> filesList = new ArrayList<String>(); if (filesString != null && filesString.trim().length() > 0) { final StringTokenizer stFilesString = new StringTokenizer( @@ -463,29 +438,27 @@ public class WebappConfiguration 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); - } + 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); - } + 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; } } @@ -525,7 +498,8 @@ public class WebappConfiguration private void checkAndFireFileChanges() { - final List<IFile> oldFiles = _cachedFiles; + final List<IFile> oldFiles = _cachedFiles == null ? Collections.EMPTY_LIST + : _cachedFiles; final List<IFile> newFiles = getFiles(); final List<IFile> filesAdded = new ArrayList<IFile>(); @@ -616,15 +590,15 @@ public class WebappConfiguration if (contextParam instanceof ContextParam) { name = ((ContextParam) contextParam).getParamName(); - } - else if (contextParam instanceof org.eclipse.jst.javaee.core.ParamValue) + } 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)) + if (FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME.equals(name) + || JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME + .equals(name)) { isConfigFiles = true; } @@ -650,15 +624,15 @@ public class WebappConfiguration if (paramVal instanceof ParamValue) { name = ((ParamValue) paramVal).getName(); - } - else if (paramVal instanceof org.eclipse.jst.javaee.core.ParamValue) + } 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)) + if (FACELET_10_LIBRARIES_CONTEXT_PARAM_NAME.equals(name) + || JSF20_FACELET_LIBRARIES_CONTEXT_PARAM_NAME + .equals(name)) { isConfigFiles = true; } diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java index 79d79401c..1c911170b 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/XMLBasedTagRecord.java @@ -69,6 +69,10 @@ public class XMLBasedTagRecord extends FaceletTagRecord if (tagDefn == null && _tagIndexByName.size() < _taglibDefn.getTag().size()) { tagDefn = findTag(name); + if (tagDefn != null) + { + _tagIndexByName.put(name, tagDefn); + } } return tagDefn; diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java index 9f5a8d770..7e35aa641 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/validation/TaglibValidator.java @@ -16,6 +16,7 @@ import java.io.InputStream; import javax.xml.parsers.ParserConfigurationException; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -24,7 +25,8 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ISchedulingRule; -import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils; +import org.eclipse.jst.j2ee.model.ModelProviderManager; +import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery; import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.TagModelParser; import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration; @@ -102,8 +104,8 @@ public class TaglibValidator implements IValidatorJob private boolean shouldValidate(IFile currentFile) { - final IVirtualFolder folder = JSFAppConfigUtils - .getWebContentFolder(currentFile.getProject()); + final IProject project = currentFile.getProject(); + final IVirtualFolder folder = new DefaultVirtualComponentQuery().getWebContentFolder(project); final IPath filePath = currentFile.getProjectRelativePath(); final IPath webFolderPath = folder.getUnderlyingFolder().getProjectRelativePath(); boolean isInValidPath = ViewUtil.isFaceletVDLFile(currentFile) @@ -111,7 +113,7 @@ public class TaglibValidator implements IValidatorJob if (isInValidPath) { - for (final String configuredPath : WebappConfiguration.getConfigFilesFromContextParam(currentFile.getProject())) + for (final String configuredPath : WebappConfiguration.getConfigFilesFromContextParam(project, ModelProviderManager.getModelProvider(project))) { final IPath path = webFolderPath.append(configuredPath); if (path.equals(filePath)) diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java index ea2f5b816..870fc8da7 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java +++ b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/tagregistry/ProjectTracker.java @@ -17,6 +17,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; 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; @@ -43,7 +44,7 @@ class ProjectTracker public ProjectTracker(final IWorkspaceRoot root, final ProjectAdvisor projectAdvisor) { _root = root; - _lifecycleListener = new LifecycleListener(); + _lifecycleListener = new LifecycleListener(ResourcesPlugin.getWorkspace()); _resourceChangeListener = new ResourceChangeListener(); _myListeners = new CopyOnWriteArrayList<ProjectTrackingListener>(); if (projectAdvisor != null) |