package org.eclipse.jst.jsf.core.jsfappconfig.internal; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader; import org.eclipse.jst.jsf.common.internal.strategy.AbstractTestableExtensibleDefaultProviderSelectionStrategy; import org.eclipse.jst.jsf.common.internal.strategy.TestableProjectFactoryStrategy; import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; import org.eclipse.jst.jsf.core.jsfappconfig.IJSFAppConfigLocater; /** * Composite strategy for providing {@link IJSFAppConfigLocatorProvider}s * */ public class CompositeJSFAppConfigLocatorProviderStrategy implements IJSFAppConfigLocatorProvider { /** * Project property session key for testing. * Project value should hold the testable IJSFAppConfigLocatorProvider instance or null * NOT API - for testing purposes */ public static final QualifiedName TESTABLE_FACTORY_SESSION_KEY = new QualifiedName(JSFCorePlugin.PLUGIN_ID, "LocatorProviderStrategyFactory"); //$NON-NLS-1$ private IProject _project; /** * @param project - may be null */ public CompositeJSFAppConfigLocatorProviderStrategy(final IProject project) { _project = project; } public List<IJSFAppConfigLocater> getLocators() { final LocatorProviderSelectionStrategy providerSelector = new LocatorProviderSelectionStrategy(); addLocatorProviderStrategies(providerSelector); final IJSFAppConfigLocatorProvider provider = providerSelector.perform(_project); if (provider != providerSelector.getNoResult()) { return Collections.unmodifiableList(provider.getLocators()); } return Collections.emptyList(); } private void addLocatorProviderStrategies(final LocatorProviderSelectionStrategy providerSelector) { providerSelector.addDefaultStrategy(new DefaultJSFAppConfigLocatorProviderStrategy()); providerSelector.addExtensionStrategy(new ExtensionPointLocatorProviderStrategy()); providerSelector.addTestableStrategy(new TestableLocatorProviderStrategy()); } private static class TestableLocatorProviderStrategy extends TestableProjectFactoryStrategy<IJSFAppConfigLocatorProvider> { public TestableLocatorProviderStrategy() { super(TESTABLE_FACTORY_SESSION_KEY); } }; private static class ExtensionPointLocatorProviderStrategy extends JSFAppConfigLocatorProviderStrategy { public IJSFAppConfigLocatorProvider perform(final IProject input) throws Exception { final JSFAppConfigLocatorProviderExtensionPointReader reader = new JSFAppConfigLocatorProviderExtensionPointReader(); final List<IJSFAppConfigLocatorProvider> res = reader.getExtensions(); if (res != null && res.size() > 0) { return res.get(0); } return getNoResult(); } } private static class LocatorProviderSelectionStrategy extends AbstractTestableExtensibleDefaultProviderSelectionStrategy<IProject, IJSFAppConfigLocatorProvider> { private static final IJSFAppConfigLocatorProvider NO_RESULT = null; @Override public IJSFAppConfigLocatorProvider getNoResult() { return NO_RESULT; } } private static class JSFAppConfigLocatorProviderExtensionPointReader extends AbstractSimpleClassExtensionRegistryReader<IJSFAppConfigLocatorProvider> { private static final String EXT_PT_ID = "jsfAppConfigLocatorProviderFactory"; //$NON-NLS-1$ private static final String EXT_PT_ELEMENT = "locatorProvider"; //$NON-NLS-1$ private static final String EXT_PT_ATTR = "class"; //$NON-NLS-1$ protected JSFAppConfigLocatorProviderExtensionPointReader() { super( org.eclipse.jst.jsf.core.internal.JSFCorePlugin.PLUGIN_ID, EXT_PT_ID, EXT_PT_ELEMENT, EXT_PT_ATTR, new CompareOrgEclipseJstContributorsLastComparator<IJSFAppConfigLocatorProvider>() ); } @Override protected void handleLoadFailure(final CoreException ce) { org.eclipse.jst.jsf.core.internal.JSFCorePlugin.log(ce, "Error loading JSFAppConfigLocatorProvider from extension"); //$NON-NLS-1$ } } }