blob: e263d39549817d8c5076c92bf07950105d6a30e7 [file] [log] [blame]
/**
* 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;
}
}