/*******************************************************************************
* Copyright © 2011, 2013 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.mof.impl;
import org.eclipse.edt.mof.EClass;
import org.eclipse.edt.mof.EClassifier;
import org.eclipse.edt.mof.EDataType;
import org.eclipse.edt.mof.EField;
import org.eclipse.edt.mof.EType;
import org.eclipse.edt.mof.MofFactory;
import org.eclipse.edt.mof.serialization.Environment;
import org.eclipse.edt.mof.serialization.IEnvironment;
public class Bootstrap {
public static void initialize(IEnvironment env) {
Bootstrap bootstrap = new Bootstrap(env);
bootstrap.doIt();
}
public static void initialize() {
Bootstrap bootstrap = new Bootstrap();
bootstrap.doIt();
}
IEnvironment env;
static boolean loaded;
static EClass EObjectClass;
static EClass MetadataObjectClass;
static EClass ModelElementClass;
static EClass MofSerializableClass;
static EClass NamedElementClass;
static EClass TypeClass;
static EClass ClassifierClass;
static EClass TypeParameterClass;
static EClass GenericTypeClass;
static EClass EClassClass;
static EClass EEnumClass;
static EClass EEnumLiteralClass;
static EClass EDataTypeClass;
static EClass MemberClass;
static EClass MemberContainerClass;
static EClass FieldClass;
static EClass FunctionClass;
static EClass ParameterClass;
static EClass MetadataTypeClass;
static EDataType JavaObject;
static EDataType EString;
static EDataType EBoolean;
static EDataType EInt32;
static EDataType EFloat;
static EDataType EDecimal;
static EDataType EList;
Bootstrap() {
env = Environment.getCurrentEnv();
}
Bootstrap(IEnvironment env) {
this.env = env;
}
public void doIt() {
initializeClasses();
}
synchronized void initializeClasses() {
if (!loaded) {
System.out.println("Bootstrap initialize...");
getEClassClass();
getFieldClass();
getMetadataObjectClass();
getMetadataTypeClass();
getEEnumClass();
getFunctionClass();
getEList();
getJavaObject();
getEDecimal();
getEFloat();
getEString();
loaded = true;
}
env.save(EObjectClass, false);
env.save(ModelElementClass, false);
env.save(NamedElementClass, false);
env.save(TypeClass, false);
env.save(ClassifierClass, false);
env.save(MemberClass, false);
env.save(MemberContainerClass, false);
env.save(MofSerializableClass, false);
env.save(FieldClass, false);
env.save(FunctionClass, false);
env.save(TypeParameterClass, false);
env.save(GenericTypeClass, false);
env.save(MetadataObjectClass, false);
env.save(EEnumLiteralClass, false);
env.save(EDataTypeClass, false);
env.save(EString, false);
env.save(EBoolean, false);
env.save(EInt32, false);
env.save(EFloat, false);
env.save(EDecimal, false);
env.save(EList, false);
env.save(ParameterClass, false);
env.save(EClassClass, false);
env.save(EEnumClass, false);
env.save(MetadataTypeClass, false);
env.save(JavaObject, false);
}
EClass getEClassClass() {
if (EClassClass == null) {
EClassClass = createEClassClass();
}
return EClassClass;
}
EClass getEObjectClass() {
if (EObjectClass == null) {
EObjectClass = newEClass();
createEObjectClass();
}
return EObjectClass;
}
EClass getModelElementClass() {
if (ModelElementClass == null) {
ModelElementClass = newEClass();
createModelElementClass();
}
return ModelElementClass;
}
EClass getMetadataObjectClass() {
if (MetadataObjectClass == null) {
MetadataObjectClass = newEClass();
createMetadataObjectClass();
}
return MetadataObjectClass;
}
EClass getMetadataTypeClass() {
if (MetadataTypeClass == null) {
MetadataTypeClass = newEClass();
createMetadataTypeClass();
}
return MetadataTypeClass;
}
EClass getNamedElementClass() {
if (NamedElementClass == null) {
NamedElementClass = newEClass();
createNamedElementClass();
}
return NamedElementClass;
}
EClass getTypeClass() {
if (TypeClass == null) {
TypeClass = newEClass();
createTypeClass();
}
return TypeClass;
}
EClass getMofSerializableClass() {
if (MofSerializableClass == null) {
MofSerializableClass = newEClass();
createMofSerializableClass();
}
return MofSerializableClass;
}
EClass getClassifierClass() {
if (ClassifierClass == null) {
ClassifierClass = newEClass();
createClassifierClass();
}
return ClassifierClass;
}
EClass getTypeParameterClass() {
if (TypeParameterClass == null) {
TypeParameterClass = newEClass();
createTypeParameterClass();
}
return TypeParameterClass;
}
EClass getGenericTypeClass() {
if (GenericTypeClass == null) {
GenericTypeClass = newEClass();
createGenericTypeClass();
}
return GenericTypeClass;
}
EClass getEDataTypeClass() {
if (EDataTypeClass == null) {
EDataTypeClass = newEClass();
createEDataTypeClass();
}
return EDataTypeClass;
}
EClass getEEnumClass() {
if (EEnumClass == null) {
EEnumClass = newEClass();
createEEnumClass();
}
return EEnumClass;
}
EClass getEEnumerationEntryClass() {
if (EEnumLiteralClass == null) {
EEnumLiteralClass = newEClass();
createEEnumLiteralClass();
}
return EEnumLiteralClass;
}
EClass getMemberClass() {
if (MemberClass == null) {
MemberClass = newEClass();
createMemberClass();
}
return MemberClass;
}
EClass getMemberContainerClass() {
if (MemberContainerClass == null) {
MemberContainerClass = newEClass();
createMemberContainerClass();
}
return MemberContainerClass;
}
EClass getFieldClass() {
if (FieldClass == null) {
FieldClass = newEClass();
createFieldClass();
}
return FieldClass;
}
EClass getFunctionClass() {
if (FunctionClass == null) {
FunctionClass = newEClass();
createFunctionClass();
}
return FunctionClass;
}
EClass getParameterClass() {
if (ParameterClass == null) {
ParameterClass = newEClass();
createParameterClass();
}
return ParameterClass;
}
EDataType getJavaObject() {
if (JavaObject == null) {
JavaObject = newEDataType();
createJavaObject();
}
return JavaObject;
}
EDataType getEString() {
if (EString == null) {
EString = newEDataType();
createEString();
}
return EString;
}
EDataType getEBoolean() {
if (EBoolean == null) {
EBoolean = newEDataType();
createEBoolean();
}
return EBoolean;
}
EDataType getEInt32() {
if (EInt32 == null) {
EInt32 = newEDataType();
createEInt32();
}
return EInt32;
}
EDataType getEFloat() {
if (EFloat == null) {
EFloat = newEDataType();
createEFloat();
}
return EFloat;
}
EDataType getEDecimal() {
if (EDecimal == null) {
EDecimal = newEDataType();
createEDecimal();
}
return EDecimal;
}
EDataType getEList() {
if (EList == null) {
EList = newEDataType();
createEList();
}
return EList;
}
EClass createEClassClass() {
EClassImpl classInstance = new EClassImpl();
classInstance.setSlots(new Slot[EClassImpl.totalSlots()]);
classInstance.setEClass(classInstance);
EClassClass = classInstance;
classInstance.setName("EClass");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getClassifierClass());
classInstance.getSuperTypes().add(getMemberContainerClass());
newField(classInstance, "superTypes", getEList(), getEClassClass());
newField(classInstance, "isAbstract", getEBoolean());
newField(classInstance, "isInterface", getEBoolean());
newField(classInstance, "eFields", getEList(), getFieldClass(), true);
newField(classInstance, "eFunctions", getEList(), getFunctionClass(), true);
return classInstance;
}
EClass createTypeClass() {
EClass classInstance = TypeClass;
classInstance.setName("EType");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.setIsAbstract(true);
classInstance.getSuperTypes().add(getModelElementClass());
classInstance.getSuperTypes().add(getMofSerializableClass());
return classInstance;
}
EClass createClassifierClass() {
EClass classInstance = ClassifierClass;
classInstance.setName("EClassifier");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.setIsAbstract(true);
classInstance.getSuperTypes().add(getNamedElementClass());
classInstance.getSuperTypes().add(getTypeClass());
newField(classInstance, "packageName", getEString());
newField(classInstance, "eTypeParameters", getEList(), getTypeParameterClass(), true);
// env.saveType(classInstance);
return classInstance;
}
EClass createTypeParameterClass() {
EClass classInstance = TypeParameterClass;
classInstance.setName("ETypeParameter");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.setIsAbstract(false);
classInstance.getSuperTypes().add(getNamedElementClass());
newField(classInstance, "bounds", getEList(), getGenericTypeClass());
// env.saveType(classInstance);
return classInstance;
}
EClass createGenericTypeClass() {
EClass classInstance = GenericTypeClass;
classInstance.setName("EGenericType");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getTypeClass());
newField(classInstance, "eClassifier", getClassifierClass());
newField(classInstance, "eTypeArguments", getEList(), getTypeClass());
return classInstance;
}
EClass createMofSerializableClass() {
EClass classInstance = MofSerializableClass;
classInstance.setName("MofSerializable");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.setIsAbstract(true);
classInstance.setIsInterface(true);
classInstance.getSuperTypes().add(getEObjectClass());
return classInstance;
}
EClass createEDataTypeClass() {
EClass classInstance = EDataTypeClass;
classInstance.setName("EDataType");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getClassifierClass());
newField(classInstance, "defaultValueString", getEString());
newField(classInstance, "javaClassName", getEString());
// env.saveType(classInstance);
return classInstance;
}
EClass createEEnumClass() {
EClass classInstance = EEnumClass;
classInstance.setName("EEnum");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getEDataTypeClass());
classInstance.getSuperTypes().add(getMemberContainerClass());
newField(classInstance, "literals", getEList(), getEEnumerationEntryClass(), true);
return classInstance;
}
EClass createEEnumLiteralClass() {
EClass classInstance = EEnumLiteralClass;
classInstance.setName("EEnumLiteral");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getMemberClass());
newField(classInstance, "value", getEInt32());
return classInstance;
}
EClass createNamedElementClass() {
EClass classInstance = NamedElementClass;
classInstance.setName("ENamedElement");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getModelElementClass());
classInstance.setIsAbstract(true);
newField(classInstance, "name", getEString());
// env.saveType(classInstance);
return classInstance;
}
EClass createModelElementClass() {
EClass classInstance = ModelElementClass;
classInstance.setName("EModelElement");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getEObjectClass());
classInstance.setIsAbstract(true);
newField(classInstance, "metadata", getEList(), getMetadataObjectClass(), true);
// env.saveType(classInstance);
return classInstance;
}
EClass createMetadataObjectClass() {
EClass type = MetadataObjectClass;
type.setPackageName(MofFactory.PackageName);
type.setName("EMetadataObject");
type.getSuperTypes().add(getModelElementClass());
// env.saveType(type);
return type;
}
EClass createEObjectClass() {
EClass classInstance = EObjectClass;
classInstance.setName("EObject");
classInstance.setPackageName(MofFactory.PackageName);
newField(classInstance, "eClass", getEClassClass());
// env.saveType(classInstance);
return classInstance;
}
EClass createMemberClass() {
EClass classInstance = MemberClass;
classInstance.setName("EMember");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.setIsAbstract(true);
classInstance.getSuperTypes().add(getNamedElementClass());
newField(classInstance, "declarer", getMemberContainerClass());
newField(classInstance, "eType", getTypeClass());
newField(classInstance, "nullable", getEBoolean());
// env.saveType(classInstance);
return classInstance;
}
EClass createMemberContainerClass() {
EClass classInstance = MemberContainerClass;
classInstance.setName("EMemberContainer");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.setIsAbstract(true);
classInstance.setIsInterface(true);
classInstance.getSuperTypes().add(getEObjectClass());
return classInstance;
}
EClass createFunctionClass() {
EClass classInstance = FunctionClass;
classInstance.setEClass(getEClassClass());
classInstance.setName("EFunction");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getMemberClass());
classInstance.getSuperTypes().add(getMemberContainerClass());
newField(classInstance, "eParameters", getEList(), getParameterClass(), true);
// env.saveType(classInstance);
return classInstance;
}
EClass createFieldClass() {
EClass classInstance = FieldClass;
classInstance.setEClass(getEClassClass());
classInstance.setName("EField");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getMemberClass());
newField(classInstance, "isTransient", getEBoolean());
newField(classInstance, "containment", getEBoolean());
newField(classInstance, "initialValue", getJavaObject(), true);
// env.saveType(classInstance);
return classInstance;
}
EClass createParameterClass() {
EClass classInstance = ParameterClass;
classInstance.setEClass(getEClassClass());
classInstance.setName("EParameter");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getFieldClass());
newField(classInstance, "eFunction", getFunctionClass());
// env.saveType(classInstance);
return classInstance;
}
EClass createMetadataTypeClass() {
EClass classInstance = MetadataTypeClass;
classInstance.setEClass(getEClassClass());
classInstance.setName("EMetadataType");
classInstance.setPackageName(MofFactory.PackageName);
classInstance.getSuperTypes().add(getEClassClass());
newField(classInstance, "targets", getEList(), getEClassClass());
return classInstance;
}
EDataType createJavaObject() {
EDataType type = JavaObject;
type.setName("JavaObject");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_JavaObject);
// env.saveType(type);
return type;
}
EDataType createEString() {
EDataType type = EString;
type.setName("EString");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_String);
// env.saveType(type);
return type;
}
EDataType createEBoolean() {
EDataType type = EBoolean;
type.setName("EBoolean");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_Boolean);
// env.saveType(type);
return type;
}
EDataType createEInt32() {
EDataType type = EInt32;
type.setName("EInt32");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_Int32);
return type;
}
EDataType createEFloat() {
EDataType type = EFloat;
type.setName("EFloat");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_Float);
return type;
}
EDataType createEDecimal() {
EDataType type = EDecimal;
type.setName("EDecimal");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_Decimal);
return type;
}
EDataType createEList() {
EDataType type = EList;
type.setName("EList");
type.setPackageName(MofFactory.PackageName);
type.setJavaClassName(EDataType.EDataType_List);
ETypeParameterImpl parm = new ETypeParameterImpl();
parm.setSlots(new Slot[ETypeParameterImpl.totalSlots()]);
parm.setEClass(getTypeParameterClass());
parm.setName("E");
type.getETypeParameters().add(parm);
// env.saveType(type);
return type;
}
EField newField() {
EFieldImpl field = new EFieldImpl();
field.setSlots(new Slot[EFieldImpl.totalSlots()]);
field.setIsTransient(false);
field.setIsNullable(false);
field.setEClass(getFieldClass());
return field;
}
EField newField(EClass container, String name, EType type, boolean containment) {
EField field = newField();
field.setName(name);
field.setEType(type);
field.setDeclarer(container);
field.setContainment(containment);
container.getEFields().add(field);
return field;
}
EField newField(EClass container, String name, EClassifier type) {
return newField(container, name, type, false);
}
EField newField(EClass container, String name, EClassifier type, EClassifier typeArgument) {
return newField(container, name, type, typeArgument, false);
}
EField newField(EClass container, String name, EClassifier type, EClassifier typeArgument, boolean containment ) {
EGenericTypeImpl generic = new EGenericTypeImpl();
generic.setSlots(new Slot[EGenericTypeImpl.totalSlots()]);
generic.setEClass(getGenericTypeClass());
generic.setEClassifier(type);
generic.getETypeArguments().add(typeArgument);
EField field = newField(container, name, generic, containment);
return field;
}
EClass newEClass() {
EClassImpl eClass = new EClassImpl();
eClass.setSlots(new Slot[EClassImpl.totalSlots()]);
getEClassClass().initialize(eClass);
eClass.setEClass(getEClassClass());
return eClass;
}
EDataType newEDataType() {
EDataTypeImpl type = new EDataTypeImpl();
type.setSlots(new Slot[EDataTypeImpl.totalSlots()]);
type.setEClass(getEDataTypeClass());
return type;
}
}