/***************************************************************************** * Copyright (c) 2010 CEA LIST. * * * 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: * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.views.modelexplorer; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.edit.EMFEditPlugin; import org.eclipse.emf.facet.infra.browser.Messages; import org.eclipse.emf.facet.infra.browser.custom.MetamodelView; import org.eclipse.emf.facet.infra.browser.custom.TypeView; import org.eclipse.emf.facet.infra.browser.custom.core.CustomizationsCatalog; import org.eclipse.emf.facet.infra.browser.uicore.CustomizationManager; import org.eclipse.emf.facet.infra.facet.Facet; import org.eclipse.emf.facet.infra.facet.FacetSet; import org.eclipse.emf.facet.infra.facet.core.FacetSetCatalog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.osgi.util.NLS; import org.eclipse.papyrus.infra.core.log.LogHelper; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; /** * The activator class controls the plug-in life cycle */ @SuppressWarnings("restriction") public class Activator extends AbstractUIPlugin implements org.eclipse.ui.IStartup { /** The plug-in ID */ public static final String PLUGIN_ID = "org.eclipse.papyrus.views.modelexplorer"; //$NON-NLS-1$ /** The plug-in shared instance */ private static Activator plugin; /** The log service */ public static LogHelper log; /** Default constructor */ public Activator() { } private CustomizationManager fCustomizationManager; /* * (non-Javadoc) * * @see * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext * ) */ @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; log = new LogHelper(plugin); EMFEditPlugin.getComposedAdapterFactoryDescriptorRegistry(); } /** * get the image descriptor from a string path * * @param pathString * path of the image * @return the image descriptor */ public static ImageDescriptor getImageDescriptor(String pathString) { IPath path = new Path(pathString); URL uri = FileLocator.find(Activator.plugin.getBundle(), path, null); if(uri == null) { return null; } return ImageDescriptor.createFromURL(uri); } /* * (non-Javadoc) * * @see * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext * ) */ @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } /** * Returns the shared instance * * @return the shared instance */ public static Activator getDefault() { return plugin; } /** * * @return the customization manager in charge to adapt element in modisco */ public CustomizationManager getCustomizationManager() { return org.eclipse.papyrus.infra.emf.Activator.getDefault().getCustomizationManager(); } private void init(final CustomizationManager customizationManager) { // the appearance can be customized here: customizationManager.setShowDerivedLinks(true); try { // load customizations defined as default through the customization // extension List<MetamodelView> registryDefaultCustomizations = CustomizationsCatalog.getInstance().getRegistryDefaultCustomizations(); for(MetamodelView metamodelView : registryDefaultCustomizations) { customizationManager.registerCustomization(metamodelView); } customizationManager.loadCustomizations(); loadFacetsForCustomizations(registryDefaultCustomizations,customizationManager); } catch (Throwable e) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error initializing customizations", e)); //$NON-NLS-1$ } } /** * load the facets * * @param customizations * list of customization * @param customizationManager * the Customization Manager */ protected void loadFacetsForCustomizations( final List<MetamodelView> customizations, final CustomizationManager customizationManager) { final Set<Facet> referencedFacets = new HashSet<Facet>(); final Collection<FacetSet> facetSets = FacetSetCatalog.getSingleton() .getAllFacetSets(); for (MetamodelView customization : customizations) { String metamodelURI = customization.getMetamodelURI(); // find customized FacetSet FacetSet customizedFacetSet = null; if (metamodelURI != null) { for (FacetSet facetSet : facetSets) { if (metamodelURI.equals(facetSet.getNsURI())) { customizedFacetSet = facetSet; break; } } } if (customizedFacetSet == null) { continue; } // find customized Facets EList<TypeView> types = customization.getTypes(); for (TypeView typeView : types) { String metaclassName = typeView.getMetaclassName(); Facet facet = findFacetWithFullyQualifiedName(metaclassName, customizedFacetSet); if (facet != null) { referencedFacets.add(facet); } else { Activator.log.warn(NLS .bind( Messages.BrowserActionBarContributor_missingRequiredFacet, new Object[] { metaclassName, customizedFacetSet .getName(), customization.getName() })); } } for (Facet referencedFacet : referencedFacets) { customizationManager.loadFacet(referencedFacet); } } // // for modified facets // customizationManager.getInstancesForMetaclasses().buildDerivationTree(); // customizationManager.getAppearanceConfiguration().touch(); // customizationManager.refreshDelayed(true); } /** * fin a facet from * * @param metaclassName * @param customizedFacetSet * @return */ private Facet findFacetWithFullyQualifiedName(final String metaclassName, final FacetSet customizedFacetSet) { EList<Facet> facets = customizedFacetSet.getFacets(); for (Facet facet : facets) { String facetName = getMetaclassQualifiedName(facet); if (metaclassName.equals(facetName)) { return facet; } } return null; } /** @return the qualified name of the given metaclass */ public static String getMetaclassQualifiedName(final EClassifier eClass) { final ArrayList<String> qualifiedNameParts = new ArrayList<String>(); final StringBuilder builder = new StringBuilder(); EPackage ePackage = eClass.getEPackage(); while (ePackage != null) { qualifiedNameParts.add(ePackage.getName()); ePackage = ePackage.getESuperPackage(); } for (int i = qualifiedNameParts.size() - 1; i >= 0; i--) { builder.append(qualifiedNameParts.get(i) + "."); //$NON-NLS-1$ } builder.append(eClass.getName()); return builder.toString(); } /** * * @see org.eclipse.ui.IStartup#earlyStartup() * */ public void earlyStartup() { } }