/** * Copyright (c) 2008 Borland Software Corp. * * 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: * Alexander Shatalin (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.xpand.migration; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.gmf.internal.xpand.BuiltinMetaModel; import org.eclipse.gmf.internal.xpand.BuiltinMetaModelExt; import org.eclipse.ocl.ecore.internal.OCLStandardLibraryImpl; import org.eclipse.ocl.types.AnyType; import org.eclipse.ocl.types.CollectionType; import org.eclipse.ocl.types.OrderedSetType; import org.eclipse.ocl.types.PrimitiveType; import org.eclipse.ocl.types.SequenceType; import org.eclipse.ocl.types.SetType; import org.eclipse.ocl.types.VoidType; public class TypeManager { private final ModeltypeImports modeltypeImportsManger; private boolean useFQNameForPrimitiveTypes = false; private OclKeywordManager oclKeywordManager; public TypeManager(OclKeywordManager keywordManager) { this(null, keywordManager); } public TypeManager(ModeltypeImports modelImports, OclKeywordManager keywordManager) { modeltypeImportsManger = modelImports; oclKeywordManager = keywordManager; } public void setUseFQNameForPrimitiveTypes(boolean value) { useFQNameForPrimitiveTypes = value; } public String getQvtFQName(EEnumLiteral literal) { return getPackageName(literal.getEEnum().getEPackage()) + OclCs.PATH_SEPARATOR + oclKeywordManager.getValidIdentifierValue(literal.getEEnum().getName()) + OclCs.PATH_SEPARATOR + oclKeywordManager.getValidIdentifierValue(literal.getName()); } public String getQvtFQName(EClassifier classifier) throws MigrationException { if (classifier == BuiltinMetaModel.VOID) { return VoidType.SINGLETON_NAME; } if (classifier instanceof EDataType) { /** * Handling QVT primitive types here. */ if (EcorePackage.eINSTANCE.getEString() == classifier) { return getPrimitiveTypeName(PrimitiveType.STRING_NAME, useFQNameForPrimitiveTypes); } else if (EcorePackage.eINSTANCE.getEBoolean() == classifier) { return getPrimitiveTypeName(PrimitiveType.BOOLEAN_NAME, useFQNameForPrimitiveTypes); } else if (EcorePackage.eINSTANCE.getEInt() == classifier) { return getPrimitiveTypeName(PrimitiveType.INTEGER_NAME, useFQNameForPrimitiveTypes); } else if (EcorePackage.eINSTANCE.getEDouble() == classifier) { return getPrimitiveTypeName(PrimitiveType.REAL_NAME, useFQNameForPrimitiveTypes); } else if (EcorePackage.eINSTANCE.getEJavaObject() == classifier) { return getPrimitiveTypeName(AnyType.SINGLETON_NAME, useFQNameForPrimitiveTypes); } } if (BuiltinMetaModel.isCollectionType(classifier)) { StringBuilder sb = new StringBuilder(); if (BuiltinMetaModelExt.isSetType(classifier)) { sb.append(SetType.SINGLETON_NAME); } else if (BuiltinMetaModelExt.isListType(classifier)) { sb.append(SequenceType.SINGLETON_NAME); } else if (BuiltinMetaModelExt.isOrderedSetType(classifier)) { sb.append(OrderedSetType.SINGLETON_NAME); } else { sb.append(CollectionType.SINGLETON_NAME); } sb.append(OclCs.OPEN_PAREN); sb.append(getQvtFQName(BuiltinMetaModel.getInnerType(classifier))); return sb.append(OclCs.CLOSE_PAREN).toString(); } EPackage ePackage = classifier.getEPackage(); assert ePackage != null; return getPackageName(ePackage) + OclCs.PATH_SEPARATOR + oclKeywordManager.getValidIdentifierValue(classifier.getName()); } private String getPrimitiveTypeName(String primitiveTypeName, boolean useFQNameForPrimitiveTypes) { return useFQNameForPrimitiveTypes ? OCLStandardLibraryImpl.stdlibPackage.getName() + OclCs.PATH_SEPARATOR + primitiveTypeName : primitiveTypeName; } private String getPackageName(EPackage ePackage) { return modeltypeImportsManger != null ? modeltypeImportsManger.getModeltypeAlias(ePackage) : oclKeywordManager.getValidIdentifierValue(ePackage.getName()); } }