/******************************************************************************* * Copyright (c) 2010 Spring IDE Developers * 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: * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.beans.core.metadata.internal.model; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jdt.core.IType; import org.springframework.ide.eclipse.beans.core.BeansCorePlugin; import org.springframework.ide.eclipse.beans.core.metadata.model.AbstractAnnotationReadingMetadataProvider; import org.springframework.ide.eclipse.beans.core.metadata.model.IAnnotationBeanMetadataProvider; import org.springframework.ide.eclipse.beans.core.metadata.model.IBeanMetadata; import org.springframework.ide.eclipse.beans.core.metadata.model.IBeanMetadataProvider; import org.springframework.ide.eclipse.beans.core.model.IBean; import org.springframework.ide.eclipse.core.java.annotation.IAnnotationMetadata; /** * {@link IBeanMetadataProvider} that simply delegates the processing to the contributed * {@link IAnnotationBeanMetadataProvider}s. * @author Christian Dupuis * @since 2.0.5 */ public class DelegatingAnnotationReadingMetadataProvider extends AbstractAnnotationReadingMetadataProvider { /** The class attribute in the extension point contribution */ private static final String CLASS_ATTRIBUTE = "class"; /** The metadataProvider element in the extension point contribution */ private static final String ANNOTATION_METADATA_PROVIDER_ELEMENT = "annotationMetadataProvider"; private IAnnotationBeanMetadataProvider[] metadataProviders; /** * {@inheritDoc} */ @Override protected void processFoundAnnotations(final IBean bean, final Set<IBeanMetadata> beanMetaDataSet, final IType type, final IAnnotationMetadata metadata, IProgressMonitor progressMonitor) { for (final IAnnotationBeanMetadataProvider provider : getMetadataProviders()) { if (progressMonitor.isCanceled()) { return; } // make sure that third-party extension don't crash us SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // nothing to do here } public void run() throws Exception { beanMetaDataSet.addAll(provider.provideBeanMetadata(bean, type, metadata)); } }); } } /** * Returns the contributed {@link IAnnotationBeanMetadataProvider} from the Eclipse extension registry. */ protected IAnnotationBeanMetadataProvider[] getMetadataProviders() { // We can safely cache the providers at least for the lifetime of this instance if (metadataProviders != null) { return metadataProviders; } List<IAnnotationBeanMetadataProvider> providers = new ArrayList<IAnnotationBeanMetadataProvider>(); IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint( BeanMetadataBuilderJob.META_DATA_PROVIDERS_EXTENSION_POINT); if (point != null) { for (IExtension extension : point.getExtensions()) { for (IConfigurationElement config : extension.getConfigurationElements()) { if (ANNOTATION_METADATA_PROVIDER_ELEMENT.equals(config.getName()) && config.getAttribute(CLASS_ATTRIBUTE) != null) { try { Object handler = config.createExecutableExtension(CLASS_ATTRIBUTE); if (handler instanceof IAnnotationBeanMetadataProvider) { IAnnotationBeanMetadataProvider entityResolver = (IAnnotationBeanMetadataProvider) handler; providers.add(entityResolver); } } catch (CoreException e) { BeansCorePlugin.log(e); } } } } } metadataProviders = providers.toArray(new IAnnotationBeanMetadataProvider[providers.size()]); return metadataProviders; } }