diff options
author | cbateman | 2010-05-18 19:07:32 +0000 |
---|---|---|
committer | cbateman | 2010-05-18 19:07:32 +0000 |
commit | 4a097395c1d2e9b96f6502380acca4724d3e0297 (patch) | |
tree | b6ef134ac034179995fec99b867dd7148f816f6a /jsf | |
parent | 7218b6fe58082f63cbc1d0426a39da69401c842f (diff) | |
download | webtools.jsf-4a097395c1d2e9b96f6502380acca4724d3e0297.tar.gz webtools.jsf-4a097395c1d2e9b96f6502380acca4724d3e0297.tar.xz webtools.jsf-4a097395c1d2e9b96f6502380acca4724d3e0297.zip |
PMC approved fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=313206.
Diffstat (limited to 'jsf')
9 files changed, 299 insertions, 23 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractRegistryReader.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractRegistryReader.java index 1773efbc8..5fcfe431e 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractRegistryReader.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractRegistryReader.java @@ -4,6 +4,10 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.SafeRunner; +import org.eclipse.jst.jsf.common.JSFCommonPlugin; + /** * A utility base class that simplifies the reading and caching of extension * point information. @@ -39,7 +43,18 @@ public abstract class AbstractRegistryReader<T> { if (_isInitialized.compareAndSet(false, true)) { - initialize(); + SafeRunner.run(new ISafeRunnable() + { + public void run() throws Exception + { + initialize(); + } + + public void handleException(Throwable exception) + { + JSFCommonPlugin.log(exception); + } + }); } return _extensions; } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractSimpleClassExtensionRegistryReader.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractSimpleClassExtensionRegistryReader.java index d65643be9..288d1d2e0 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractSimpleClassExtensionRegistryReader.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/pde/AbstractSimpleClassExtensionRegistryReader.java @@ -58,6 +58,10 @@ public abstract class AbstractSimpleClassExtensionRegistryReader<T> extends final List<SortableExecutableExtension<T>> result = new ArrayList<SortableExecutableExtension<T>>(); final IExtensionPoint extensionPoint = Platform.getExtensionRegistry() .getExtensionPoint(getExtPtNamespace(), getExtPtId()); + if (extensionPoint == null) + { + return; + } IExtension[] extensions = extensionPoint.getExtensions(); for (int i = 0; i < extensions.length; i++) { diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties index c6957e618..f0b7de2bc 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties @@ -28,3 +28,5 @@ _UI_AttributeUsage_REQUIRED_literal = REQUIRED _UI_AttributeUsage_FIXED_literal = FIXED _UI_AttributeUsage_PROHIBITED_literal = PROHIBITED _UI_AttributeData_description_feature = Description + +extension-point.name = testProjectTaglibDescriptorFactory
\ No newline at end of file diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml index 946f89743..d17c4c5f3 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <plugin> + <extension-point id="projectTaglibDescriptorFactory" name="%extension-point.name" schema="schema/testProjectTaglibDescriptorFactory.exsd"/> <extension point="org.eclipse.jst.jsf.core.tagregistry"> <tagRegistry diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/schema/testProjectTaglibDescriptorFactory.exsd b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/schema/testProjectTaglibDescriptorFactory.exsd new file mode 100644 index 000000000..48cb7e1bb --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/schema/testProjectTaglibDescriptorFactory.exsd @@ -0,0 +1,102 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.jst.jsf.facelet.core" xmlns="http://www.w3.org/2001/XMLSchema"> +<annotation> + <appInfo> + <meta.schema plugin="org.eclipse.jst.jsf.facelet.core" id="jsfAppConfigManagerFactory" name="JSF App Config Manager Factory"/> + </appInfo> + <documentation> + internal... not provisional API + </documentation> + </annotation> + + <element name="extension"> + <annotation> + <appInfo> + <meta.element /> + </appInfo> + </annotation> + <complexType> + <sequence> + <element ref="factory"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + + </documentation> + <appInfo> + <meta.attribute translatable="true"/> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <element name="factory"> + <complexType> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn=":org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.IProjectTaglibDescriptorFactory"/> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appInfo> + <meta.section type="since"/> + </appInfo> + <documentation> + [Enter the first release in which this extension point appears.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="examples"/> + </appInfo> + <documentation> + [Enter extension point usage example here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="apiinfo"/> + </appInfo> + <documentation> + [Enter API information here.] + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="implementation"/> + </appInfo> + <documentation> + [Enter information about supplied implementation of this extension point.] + </documentation> + </annotation> + + +</schema> diff --git a/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ExtensionBasedTagDescriptorFactoryProviderStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ExtensionBasedTagDescriptorFactoryProviderStrategy.java new file mode 100644 index 000000000..1c61b9c93 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ExtensionBasedTagDescriptorFactoryProviderStrategy.java @@ -0,0 +1,69 @@ +package org.eclipse.jst.jsf.facelet.core.internal.registry.taglib; + +import java.util.List; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader; +import org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy; +import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager; +import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin; + +/** + * Extension-based strategy for returning {@link IJSFAppConfigManager}s + * + */ +public class ExtensionBasedTagDescriptorFactoryProviderStrategy implements + ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory> +{ + private static IProjectTaglibDescriptorFactory EXT_PT_BASED_FACTORY; + static + { + final ProjectTaglibDescriptorFactoryExtensionPointReader reader = new ProjectTaglibDescriptorFactoryExtensionPointReader(); + final List<IProjectTaglibDescriptorFactory> res = reader + .getExtensions(); + if (res != null && res.size() > 0) + {// return first + EXT_PT_BASED_FACTORY = res.get(0); + } + } + + public IProjectTaglibDescriptorFactory perform(final IProject input) + throws Exception + { + return EXT_PT_BASED_FACTORY != null ? EXT_PT_BASED_FACTORY + : getNoResult(); + } + + private static class ProjectTaglibDescriptorFactoryExtensionPointReader + extends + AbstractSimpleClassExtensionRegistryReader<IProjectTaglibDescriptorFactory> + { + private static final String EXT_PT_ID = "projectTaglibDescriptorFactory"; //$NON-NLS-1$ + private static final String EXT_PT_ELEMENT = "factory"; //$NON-NLS-1$ + private static final String EXT_PT_ATTR = "class"; //$NON-NLS-1$ + + protected ProjectTaglibDescriptorFactoryExtensionPointReader() + { + super( + FaceletCorePlugin.PLUGIN_ID, + EXT_PT_ID, + EXT_PT_ELEMENT, + EXT_PT_ATTR, + new CompareOrgEclipseJstContributorsLastComparator<IProjectTaglibDescriptorFactory>()); + } + + @Override + protected void handleLoadFailure(final CoreException ce) + { + org.eclipse.jst.jsf.core.internal.JSFCorePlugin + .log(ce, + "Error loading ProjectTaglibDescriptorFactory from extension"); //$NON-NLS-1$ + } + } + + public IProjectTaglibDescriptorFactory getNoResult() + { + return null; + } +} 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 35c4e011e..cdef395f4 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 @@ -28,11 +28,12 @@ import org.eclipse.jst.jsf.common.internal.resource.DefaultJarLocator; import org.eclipse.jst.jsf.common.internal.resource.JavaCoreMediator; import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager; import org.eclipse.jst.jsf.common.internal.resource.WorkspaceMediator; +import org.eclipse.jst.jsf.common.internal.strategy.AbstractTestableExtensibleDefaultProviderSelectionStrategy; +import org.eclipse.jst.jsf.common.internal.strategy.ISimpleStrategy; import org.eclipse.jst.jsf.designtime.internal.resources.IJSFResourceLocator; import org.eclipse.jst.jsf.designtime.internal.resources.JarBasedJSFResourceLocator; import org.eclipse.jst.jsf.designtime.internal.resources.WorkspaceJSFResourceLocator; - /** * @author cbateman * @@ -40,17 +41,25 @@ import org.eclipse.jst.jsf.designtime.internal.resources.WorkspaceJSFResourceLoc public class FaceletTagIndex extends ResourceSingletonObjectManager<IProjectTaglibDescriptor, IProject> { - private final IProjectTaglibDescriptorFactory _factory; + private ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory> _tagDescriptorFactoryProvider; /** * @param ws - * @param factory */ - public FaceletTagIndex(final IWorkspace ws, - final IProjectTaglibDescriptorFactory factory) + public FaceletTagIndex(final IWorkspace ws) { super(ws); - _factory = factory; + _tagDescriptorFactoryProvider = new ProjectTaglibDescriptorFactoryProviderSelectionStrategy(); + } + + /** + * @param ws + * @param tagDescriptorFactoryProvider + */ + public FaceletTagIndex(final IWorkspace ws, final ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory> tagDescriptorFactoryProvider) + { + this(ws); + _tagDescriptorFactoryProvider = tagDescriptorFactoryProvider; } private static FaceletTagIndex INSTANCE; @@ -63,9 +72,7 @@ public class FaceletTagIndex extends { if (INSTANCE == null) { - INSTANCE = new FaceletTagIndex(ws, - new DefaultProjectTaglibDescriptorFactory()); - + INSTANCE = new FaceletTagIndex(ws); } return INSTANCE; } @@ -74,8 +81,16 @@ public class FaceletTagIndex extends protected IProjectTaglibDescriptor createNewInstance(final IProject project) { final TagRecordFactory factory = new TagRecordFactory(project, true); - - return _factory.create(project, factory); + IProjectTaglibDescriptorFactory descFactory; + try + { + descFactory = _tagDescriptorFactoryProvider + .perform(project); + return descFactory.create(project, factory); + } catch (Exception e) + { + return null; + } } /** @@ -85,11 +100,64 @@ public class FaceletTagIndex extends */ public void flush(final IProject project) { - IProjectTaglibDescriptor flushedDescriptor = unmanageResource(project); + final IProjectTaglibDescriptor flushedDescriptor = unmanageResource(project); flushedDescriptor.destroy(); } /** + * Used to decide what provider gets used to get the descriptor factory. + * This allows us to inject a different descriptor factory than the default + * through either a test setter (test-only) or production (ext point). + * + * @author cbateman + * + */ + private static class ProjectTaglibDescriptorFactoryProviderSelectionStrategy + extends + AbstractTestableExtensibleDefaultProviderSelectionStrategy<IProject, IProjectTaglibDescriptorFactory> + { + private static final IProjectTaglibDescriptorFactory NO_RESULT = null; + + public ProjectTaglibDescriptorFactoryProviderSelectionStrategy() + { + super(); + addDefaultStrategy(new DefaultProjectTaglibDescriptorFactoryProvider( + new DefaultProjectTaglibDescriptorFactory())); + addExtensionStrategy(new ExtensionBasedTagDescriptorFactoryProviderStrategy()); + } + + @Override + public IProjectTaglibDescriptorFactory getNoResult() + { + return NO_RESULT; + } + } + + private static class DefaultProjectTaglibDescriptorFactoryProvider + implements + ISimpleStrategy<IProject, IProjectTaglibDescriptorFactory> + { + private final DefaultProjectTaglibDescriptorFactory _factory; + + public DefaultProjectTaglibDescriptorFactoryProvider( + final DefaultProjectTaglibDescriptorFactory factory) + { + _factory = factory; + } + + public IProjectTaglibDescriptorFactory perform(final IProject input) + throws Exception + { + return _factory; + } + + public IProjectTaglibDescriptorFactory getNoResult() + { + return null; + } + } + + /** * The default factory for creating per-project tag descriptors. * * @author cbateman @@ -108,13 +176,13 @@ public class FaceletTagIndex extends factory, ModelProviderManager.getModelProvider(project), new DefaultVirtualComponentQuery(), new WorkspaceMediator())); final List<IJSFResourceLocator> resourceLocators = new ArrayList<IJSFResourceLocator>(); - resourceLocators.add(new JarBasedJSFResourceLocator( - Collections.EMPTY_LIST, - new CopyOnWriteArrayList<ILocatorChangeListener>(), - new DefaultJarLocator( - Collections.singletonList(new AlwaysMatcher()), - new JavaCoreMediator()), - new ContentTypeResolver())); + resourceLocators + .add(new JarBasedJSFResourceLocator(Collections.EMPTY_LIST, + new CopyOnWriteArrayList<ILocatorChangeListener>(), + new DefaultJarLocator(Collections + .singletonList(new AlwaysMatcher()), + new JavaCoreMediator()), + new ContentTypeResolver())); final IWorkspace workspace = project.getWorkspace(); resourceLocators.add(new WorkspaceJSFResourceLocator( Collections.EMPTY_LIST, 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 ea25099cd..a29d6b792 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 @@ -74,6 +74,7 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator private final TagRecordFactory _factory; private final Map<String, IFaceletTagRecord> _records; private final IJarLocator _locator; + private final List<IMatcher> _jarEntryMatchers; /** * @param factory @@ -92,10 +93,22 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator public JarFileFaceletTaglibLocator(final TagRecordFactory factory, final IJarLocator jarProvider) { + this(factory, jarProvider, MATCHERS); + } + + /** + * @param factory + * @param jarProvider + * @param jarEntryMatchers + */ + public JarFileFaceletTaglibLocator(final TagRecordFactory factory, + final IJarLocator jarProvider, final List<IMatcher> jarEntryMatchers) + { super(ID, DISPLAYNAME); _factory = factory; _records = new HashMap<String, IFaceletTagRecord>(); _locator = jarProvider; + _jarEntryMatchers = jarEntryMatchers; } @Override @@ -110,7 +123,7 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator final JarFile jarFile = cpJarFile.getJarFile(); if (jarFile != null) { - tagLibsFound.addAll(processJar(cpJarFile)); + tagLibsFound.addAll(processJar(cpJarFile, _jarEntryMatchers)); } } for (final LibJarEntry jarEntry : tagLibsFound) @@ -133,7 +146,7 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator case JAR_ADDED: { final ClasspathJarFile jar = event.getJar(); - final List<LibJarEntry> foundLibs = processJar(jar); + final List<LibJarEntry> foundLibs = processJar(jar, _jarEntryMatchers); for (final LibJarEntry lib : foundLibs) { IFaceletTagRecord newRecord = _factory.createRecords( @@ -199,7 +212,8 @@ public class JarFileFaceletTaglibLocator extends AbstractFaceletTaglibLocator * @param defaultDtdStream * @throws Exception */ - private static List<LibJarEntry> processJar(final ClasspathJarFile cpJarFile) + private static List<LibJarEntry> processJar(final ClasspathJarFile cpJarFile, + final List<IMatcher> jarEntryMatchers) { final List<LibJarEntry> tagLibsFound = new ArrayList<LibJarEntry>(); final JarFile jarFile = cpJarFile.getJarFile(); 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 593e4cc86..ef06cecbe 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 @@ -61,6 +61,7 @@ public class TagRecordFactory /** * @param taglibDefn + * @param descriptor * @return the new tag record */ public IFaceletTagRecord createRecords(final FaceletTaglib taglibDefn, final TagRecordDescriptor descriptor) |