/** * 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; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.EcorePackage; public class CollectionTypesSupportExt { // These are M2 elements, next to EClass and EReferences, extension of ECore // meta model static final EClass BAG_TYPE = EcoreFactory.eINSTANCE.createEClass(); static final EClass ORDEREDSET_TYPE = EcoreFactory.eINSTANCE.createEClass(); static EClass BAG_OF_OBJECT; static EClass ORDEREDSET_OF_OBJECT; private final Map<EClassifier, EClass> bagsM1 = new HashMap<EClassifier, EClass>(); private final Map<EClassifier, EClass> orderedSetsM1 = new HashMap<EClassifier, EClass>(); void init(EPackage xecore) { BAG_TYPE.setName(BuiltinMetaModelExt.BAG); ORDEREDSET_TYPE.setName(BuiltinMetaModelExt.ORDEREDSET); BAG_TYPE.getESuperTypes().add(CollectionTypesSupport.COLLECTION_TYPE); ORDEREDSET_TYPE.getESuperTypes().add(CollectionTypesSupport.COLLECTION_TYPE); xecore.getEClassifiers().add(BAG_TYPE); xecore.getEClassifiers().add(ORDEREDSET_TYPE); BAG_OF_OBJECT = newBagType(EcorePackage.eINSTANCE.getEJavaObject()); ORDEREDSET_OF_OBJECT = newOrderedSetType(EcorePackage.eINSTANCE.getEJavaObject()); bagsM1.put(null, newBagType(BuiltinMetaModel.VOID)); orderedSetsM1.put(null, newOrderedSetType(BuiltinMetaModel.VOID)); } /** * @param name * @return true if name is one of M2 collection meta-types (either * Collection, List, Set) */ // TODO: remove? is it important? public boolean isCollectionMetaType(String name) { return BAG_TYPE.getName().equals(name) || ORDEREDSET_TYPE.getName().equals(name); } public EClass getCollectionType(String metaTypeName, EClassifier innerType) { assert isCollectionMetaType(metaTypeName); if (BAG_TYPE.getName().equals(metaTypeName)) { return getBagType(innerType); } if (ORDEREDSET_TYPE.getName().equals(metaTypeName)) { return getOrderedSetType(innerType); } throw new IllegalStateException(); } EClass getCollectionType(EClass metaType, EClassifier innerType) { if (BAG_TYPE.equals(metaType)) { return getBagType(innerType); } if (ORDEREDSET_TYPE.equals(metaType)) { return getOrderedSetType(innerType); } throw new IllegalStateException(); } public EClass getBagType(EClassifier innerType) { EClass existing = bagsM1.get(innerType); if (existing == null) { existing = newBagType(innerType); bagsM1.put(innerType, existing); } return existing; } public EClass getOrderedSetType(EClassifier innerType) { EClass existing = orderedSetsM1.get(innerType); if (existing == null) { existing = newOrderedSetType(innerType); orderedSetsM1.put(innerType, existing); } return existing; } private static EClass newBagType(EClassifier innerType) { EClass c = BuiltinMetaModel.internalNewParameterizedType(BAG_TYPE, innerType); c.getESuperTypes().add(CollectionTypesSupport.COLLECTION_OF_OBJECT); return c; } private static EClass newOrderedSetType(EClassifier innerType) { EClass c = BuiltinMetaModel.internalNewParameterizedType(ORDEREDSET_TYPE, innerType); c.getESuperTypes().add(CollectionTypesSupport.COLLECTION_OF_OBJECT); return c; } }