/* * Copyright (c) 2005, 2007 Borland Software 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: Radek Dvorak (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.bridge.genmodel; import org.eclipse.emf.codegen.ecore.genmodel.GenClass; import org.eclipse.emf.codegen.ecore.genmodel.GenClassifier; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; import org.eclipse.emf.codegen.ecore.genmodel.impl.GenBaseImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcorePackage; /** * Provides access to Ecore genmodel elements. * <p> * The purpose of this matcher is to return referenceable genmodel elements for * ecore generated elements. The standard matcher returns fake singleton elements * without eResource set for EcorePackage.eINSTANCE.XXX input. * <p> * (This mechanism is hardcoded in ecore.genmodel). * * @see GenBaseImpl#findGenPackage(EPackage) */ public class EcoreGenModelMatcher extends GenModelMatcher { public EcoreGenModelMatcher() { super(getEcoreModel()); } /** * @param domainPackage * @return <code>null</code> in case <code>domainPackage</code> is <code>null</code> or no matching package found. */ public GenPackage findGenPackage(EPackage domainPackage) { if(domainPackage == EcorePackage.eINSTANCE) { for (GenPackage genPackage : getGenModel().getGenPackages()) { if(genPackage.getEcorePackage() != null && safeEquals(domainPackage.getNsURI(), genPackage.getEcorePackage().getNsURI())) { return genPackage; } } } return domainPackage == null ? null : getGenModel().findGenPackage(domainPackage); } /** * @param domainMetaClass * @return respective <code>GenClass</code>, or <code>null</code> if <code>domainMetaClass</code> is <code>null</code>. * @throws IllegalStateException if no matching <code>GenClass</code> found. */ public GenClass findGenClass(EClass domainMetaClass) { GenClassifier genClassifier = findGenClassifier(domainMetaClass); if(genClassifier instanceof GenClass) { return (GenClass)genClassifier; } throw new IllegalStateException("Can't find genClass for class '" + domainMetaClass.getName()); } /** * @param domainMetaClassifier * @return respective <code>GenClassifier</code>, or <code>null</code> if <code>domainMetaClassifier</code> is <code>null</code>. * @throws IllegalStateException if no matching <code>GenClass</code> found. */ public GenClassifier findGenClassifier(EClassifier domainMetaClassifier) { if (domainMetaClassifier == null) { return null; } GenPackage gp = findGenPackage(domainMetaClassifier.getEPackage()); if (gp == null) { throw new IllegalStateException("Can't find genPackage for " + domainMetaClassifier.getEPackage()); } for (GenClassifier genClassifier : gp.getGenClassifiers()) { if (genClassifier.getEcoreClassifier() != null && safeEquals(genClassifier.getEcoreClassifier().getName(), domainMetaClassifier.getName())) { return genClassifier; } } throw new IllegalStateException("Can't find genClassifier for classifier '" + domainMetaClassifier.getName() + "' in package " + gp.getPackageName()); } private static GenModel getEcoreModel() { URI genModelUri = URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel"); //$NON-NLS-1$ FileGenModelAccess access = new FileGenModelAccess(genModelUri); access.load(); return access.model(); } private static boolean safeEquals(String s1, String s2) { return (s1 != null) ? s1.equals(s2) : (s2 == s1 || s2.equals(s1)); } }