/******************************************************************************* * Copyright (c) 2008 - 2012 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.ui.model.metadata; import java.util.Collection; import java.util.HashMap; import java.util.Map; 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.Platform; import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils; import org.springframework.ide.eclipse.beans.core.metadata.BeansMetadataPlugin; import org.springframework.ide.eclipse.beans.core.metadata.model.IBeanMetadata; import org.springframework.ide.eclipse.beans.core.model.IBean; import org.springframework.ide.eclipse.beans.core.model.IBeansComponent; import org.springframework.ide.eclipse.beans.core.model.IBeansConfig; import org.springframework.ide.eclipse.beans.core.model.IBeansProject; import org.springframework.ide.eclipse.beans.ui.BeansUIPlugin; /** * Helper methods to load external contributed {@link IBeanMetadataContentProvider} and * {@link IBeanMetadataLabelProvider} for linking in third-party contributed bean meta data. * @author Christian Dupuis * @since 2.0.5 */ public class BeanMetadataUtils { private static final String LABEL_PROVIDER_ATTRIBUTE = "labelProvider"; private static final String CONTENT_PROVIDER_ATTRIBUTE = "contentProvider"; private static final String METADATA_PROVIDERS_ELEMENT = "metadataProviders"; private static final String PRIORITY_ATTRIBUTE = "priority"; public static final String META_DATA_PROVIDERS_EXTENSION_POINT = BeansUIPlugin.PLUGIN_ID + ".metadataproviders"; public static IBeanMetadataContentProvider getContenProvider(IBeanMetadata metaDataReference) { IBeanMetadataContentProvider contentProvider = null; int priority = -1; IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(META_DATA_PROVIDERS_EXTENSION_POINT); if (point != null) { for (IExtension extension : point.getExtensions()) { for (IConfigurationElement config : extension.getConfigurationElements()) { if (METADATA_PROVIDERS_ELEMENT.equals(config.getName()) && config.getAttribute(CONTENT_PROVIDER_ATTRIBUTE) != null) { try { int handlerPriority = getPriority(config); if (handlerPriority > priority) { Object handler = config.createExecutableExtension(CONTENT_PROVIDER_ATTRIBUTE); if (handler instanceof IBeanMetadataContentProvider) { IBeanMetadataContentProvider provider = (IBeanMetadataContentProvider) handler; if (provider.supports(metaDataReference)) { contentProvider = provider; priority = handlerPriority; } } } } catch (CoreException e) { BeansUIPlugin.log(e); } } } } } return contentProvider; } public static IBeanMetadataLabelProvider getLabelProvider(BeanMetadataReference metaDataReference) { IBeanMetadataLabelProvider labelProvider = null; int priority = -1; IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(META_DATA_PROVIDERS_EXTENSION_POINT); if (point != null) { for (IExtension extension : point.getExtensions()) { for (IConfigurationElement config : extension.getConfigurationElements()) { if (METADATA_PROVIDERS_ELEMENT.equals(config.getName()) && config.getAttribute(LABEL_PROVIDER_ATTRIBUTE) != null) { try { int handlerPriority = getPriority(config); if (handlerPriority > priority) { Object handler = config.createExecutableExtension(LABEL_PROVIDER_ATTRIBUTE); if (handler instanceof IBeanMetadataLabelProvider) { IBeanMetadataLabelProvider provider = (IBeanMetadataLabelProvider) handler; if (provider.supports(metaDataReference)) { labelProvider = provider; priority = handlerPriority; } } } } catch (CoreException e) { BeansUIPlugin.log(e); } } } } } return labelProvider; } public static IBeanMetadataLabelProvider getLabelProvider(IBeanMetadata metaData) { IBeanMetadataLabelProvider labelProvider = null; int priority = -1; IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(META_DATA_PROVIDERS_EXTENSION_POINT); if (point != null) { for (IExtension extension : point.getExtensions()) { for (IConfigurationElement config : extension.getConfigurationElements()) { if (METADATA_PROVIDERS_ELEMENT.equals(config.getName()) && config.getAttribute(LABEL_PROVIDER_ATTRIBUTE) != null) { try { int handlerPriority = getPriority(config); if (handlerPriority > priority) { Object handler = config.createExecutableExtension(LABEL_PROVIDER_ATTRIBUTE); if (handler instanceof IBeanMetadataLabelProvider) { IBeanMetadataLabelProvider provider = (IBeanMetadataLabelProvider) handler; if (provider.supports(metaData)) { labelProvider = provider; priority = handlerPriority; } } } } catch (CoreException e) { BeansUIPlugin.log(e); } } } } } return labelProvider; } public static Collection<? extends Object> getProjectChildren(IBeansProject project) { Map<String, BeanMetadataReference> metaDataMapping = new HashMap<String, BeanMetadataReference>(); // add meta data grouping for (IBeansConfig beansConfig : project.getConfigs()) { // add beans from config for (IBean bean : BeansModelUtils.getBeans(beansConfig)) { addMetaDataForBean(project, metaDataMapping, bean); } // add nested component beans; required for component scan for (IBeansComponent beansComponent : beansConfig.getComponents()) { for (IBean bean : BeansModelUtils.getBeans(beansComponent)) { addMetaDataForBean(project, metaDataMapping, bean); } } } return metaDataMapping.values(); } private static void addMetaDataForBean(IBeansProject project, Map<String, BeanMetadataReference> metaDataMapping, IBean bean) { for (IBeanMetadata metaData : BeansMetadataPlugin.getMetadataModel().getBeanMetadata(bean)) { if (!metaDataMapping.containsKey(metaData.getKey())) { metaDataMapping.put(metaData.getKey(), getContenProvider(metaData).getBeanMetadataReference(metaData, project)); } metaDataMapping.get(metaData.getKey()).addChild(metaData); } } private static int getPriority(IConfigurationElement config) { int handlerPriority = 10; // DEFAULT_PRIORITY = 10 if (config.getAttribute(PRIORITY_ATTRIBUTE) != null) { handlerPriority = Integer.valueOf(config.getAttribute(PRIORITY_ATTRIBUTE)); } return handlerPriority; } }