diff options
Diffstat (limited to 'jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java')
-rw-r--r-- | jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java | 191 |
1 files changed, 191 insertions, 0 deletions
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 new file mode 100644 index 000000000..3f87846f3 --- /dev/null +++ b/jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/registry/taglib/ProjectTaglibDescriptor.java @@ -0,0 +1,191 @@ +/******************************************************************************* + * Copyright (c) 2008 Oracle Corporation. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Cameron Bateman - initial API and implementation + *******************************************************************************/ +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.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.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 +{ + + private ProxyFactoryRegistry _registry; + private final AtomicInteger _isInitialized = new AtomicInteger( + 0); + private final IProject _project; + private final List<AbstractFaceletTaglibLocator> _locators; + private final MyChangeListener _libChangeListener; + private final Map<String, IFaceletTagRecord> _tagRecords; + + public ProjectTaglibDescriptor(final IProject project) + { + _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)); + + _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) + { + SafeRunner.run(new ISafeRunnable() + { + public void handleException(final Throwable exception) + { + FaceletCorePlugin + .log( + "While locating facelet libraries on project: " + _project.getName(), new Exception(exception)); //$NON-NLS-1$ + } + + public void run() throws Exception + { + locator.addListener(_libChangeListener); + locator.start(_project); + _tagRecords.putAll(locator.locate(_project)); + } + }); + } + } + } + } + + public Collection<? extends IFaceletTagRecord> getTagLibraries() + { + initialize(); + return Collections.unmodifiableCollection(_tagRecords.values()); + } + + void maybeLog(final Exception e) + { + if (_isInitialized.get() <= 1) + { + FaceletCorePlugin.log("Failed initializing taglib descriptor", e); //$NON-NLS-1$ + } + } + + public IFaceletTagRecord getTagLibrary(final String uri) + { + initialize(); + return _tagRecords.get(uri); + } + + public void addListener(final Listener listener) + { + for (final AbstractFaceletTaglibLocator locator : _locators) + { + locator.addListener(listener); + } + } + + public void removeListener(final Listener listener) + { + for (final AbstractFaceletTaglibLocator locator : _locators) + { + locator.removeListener(listener); + } + } + + public void checkpoint() + { + // TODO Auto-generated method stub + } + + public void destroy() + { + // TODO Auto-generated method stub + } + + public void dispose() + { + if (_registry != null) + { + _registry.terminateRegistry(false); + + for (final AbstractFaceletTaglibLocator locator : _locators) + { + locator.stop(); + } + } + } + + private class MyChangeListener extends Listener + { + @Override + public void changed(final TaglibChangedEvent event) + { + switch (event.getChangeType()) + { + case ADDED: + _tagRecords.put(event.getNewValue().getURI(), event + .getNewValue()); + break; + case CHANGED: + _tagRecords.put(event.getNewValue().getURI(), event + .getNewValue()); + break; + case REMOVED: + _tagRecords.remove(event.getOldValue()); + break; + } + } + } +} |