/******************************************************************************* * Copyright (c) 2004-2011 Abel Hegedus and Daniel Varro * 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: * Abel Hegedus - initial API and implementation *******************************************************************************/ package org.eclipse.incquery.runtime.base.comprehension; import java.util.ArrayList; import java.util.Collection; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.incquery.runtime.base.IncQueryBasePlugin; /** * @author Abel Hegedus * */ public class WellbehavingDerivedFeatureRegistry { private static Collection<EStructuralFeature> contributedWellbehavingDerivedFeatures = new ArrayList<EStructuralFeature>();; private static Collection<EClass> contributedWellbehavingDerivedClasses = new ArrayList<EClass>();; private static Collection<EPackage> contributedWellbehavingDerivedPackages = new ArrayList<EPackage>();; /** * */ private WellbehavingDerivedFeatureRegistry() { } /** * Called by IncQueryBasePlugin. */ public static void initRegistry() { getContributedWellbehavingDerivedFeatures().clear(); getContributedWellbehavingDerivedClasses().clear(); getContributedWellbehavingDerivedPackages().clear(); IExtensionRegistry reg = Platform.getExtensionRegistry(); IExtensionPoint poi; poi = reg.getExtensionPoint(IncQueryBasePlugin.WELLBEHAVING_DERIVED_FEATURE_EXTENSION_POINT_ID); if (poi != null) { IExtension[] exts = poi.getExtensions(); for (IExtension ext : exts) { IConfigurationElement[] els = ext.getConfigurationElements(); for (IConfigurationElement el : els) { if (el.getName().equals("wellbehaving-derived-feature")) { processWellbehavingExtension(el); } else { throw new UnsupportedOperationException("Unknown configuration element " + el.getName() + " in plugin.xml of " + el.getDeclaringExtension().getUniqueIdentifier()); } } } } } /** * @param el */ private static void processWellbehavingExtension(IConfigurationElement el) { try { String packageUri = el.getAttribute("package-nsUri"); String classifierName = el.getAttribute("classifier-name"); String featureName = el.getAttribute("feature-name"); if (packageUri != null) { EPackage pckg = EPackage.Registry.INSTANCE.getEPackage(packageUri); if (pckg != null) { if (classifierName != null) { EClassifier clsr = pckg.getEClassifier(classifierName); if (clsr instanceof EClass) { if (featureName != null) { EClass cls = (EClass) clsr; EStructuralFeature feature = cls.getEStructuralFeature(featureName); if (feature != null) { contributedWellbehavingDerivedFeatures.add(feature); } } else { contributedWellbehavingDerivedClasses.add((EClass) clsr); } } } else { contributedWellbehavingDerivedPackages.add(pckg); } } } } catch (Exception e) { final Logger logger = Logger.getLogger(WellbehavingDerivedFeatureRegistry.class); logger.error("Well-behaving feature registration failed", e); } } /** * @param feature */ public static void registerWellbehavingDerivedFeature(EStructuralFeature feature) { contributedWellbehavingDerivedFeatures.add(feature); } /** * @param feature */ public static void registerWellbehavingDerivedClass(EClass cls) { contributedWellbehavingDerivedClasses.add(cls); } /** * @param feature */ public static void registerWellbehavingDerivedPackage(EPackage pkg) { contributedWellbehavingDerivedPackages.add(pkg); } /** * @return the contributedWellbehavingDerivedFeatures */ public static Collection<EStructuralFeature> getContributedWellbehavingDerivedFeatures() { return contributedWellbehavingDerivedFeatures; } public static Collection<EClass> getContributedWellbehavingDerivedClasses() { return contributedWellbehavingDerivedClasses; } public static Collection<EPackage> getContributedWellbehavingDerivedPackages() { return contributedWellbehavingDerivedPackages; } public static boolean isWellbehavingFeature(EStructuralFeature feature) { if (contributedWellbehavingDerivedFeatures.contains(feature)) { return true; } else if (contributedWellbehavingDerivedClasses.contains(feature.getEContainingClass())) { return true; } else if (contributedWellbehavingDerivedPackages.contains(feature.getEContainingClass().getEPackage())) { return true; } return false; } }