/******************************************************************************* * 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.codegen.java; import java.util.List; import org.eclipse.edt.mof.EClass; import org.eclipse.edt.mof.EClassifier; import org.eclipse.edt.mof.EDataType; import org.eclipse.edt.mof.EEnum; import org.eclipse.edt.mof.codegen.api.TabbedWriter; import org.eclipse.edt.mof.codegen.api.TemplateContext; import org.eclipse.edt.mof.codegen.api.TemplateException; public class EFactoryImplTemplate extends MofImplTemplate { public void genFactory(List<EClassifier> types, TemplateContext ctx, TabbedWriter out) throws TemplateException { String packageName = types.get(0).getPackageName(); String factoryName = (String)ctx.get(CTX_FactoryName); if (factoryName == null) { String[] packageNames = packageName.split("[.]"); factoryName = packageNames[packageNames.length-1].substring(0,1).toUpperCase(); factoryName += packageNames[packageNames.length-1].substring(1); factoryName += "Factory"; } // Package and import declarations out.print("package "); out.print(packageName); out.println(";"); out.println(); out.println("import org.eclipse.edt.mof.EFactory;"); out.println("import org.eclipse.edt.mof.EClass;"); out.println("import org.eclipse.edt.mof.EEnum;"); out.println("import org.eclipse.edt.mof.EDataType;"); out.print("import "); out.print(packageName); out.print(".impl."); out.print(factoryName); out.println("Impl;"); out.println(); // Interface header out.print("public interface "); out.print(factoryName); out.print(" extends EFactory "); out.println(" {"); out.print("public static final "); out.print(factoryName); out.print(" INSTANCE = new "); out.print(factoryName); out.println("Impl();"); out.print("public String packageName = "); out.print("\""); out.print(packageName); out.println("\";"); out.println(); // Generate EClassifier typeSignature Constants for (EClassifier classifier : types) { out.print("String "); out.print(classifier.getName()); out.print(" = packageName+"); out.print("\"."); out.print(classifier.getName()); out.println("\";"); } out.println(); // Classifier get methods for (EClassifier classifier : types) { String type = "EClass"; if (classifier instanceof EEnum) { type = "EEnum"; } else if (classifier instanceof EDataType) { type = "EDataType"; } String name = classifier.getName(); out.print(type); out.print(" get"); out.print(name); out.print(type); out.println("();"); } // Instance creation methods for (EClassifier classifier : types) { if (classifier instanceof EClass && !(((EClass)classifier).isInterface() || ((EClass)classifier).isAbstract())) { EClass eClass = (EClass)classifier; String name = eClass.getName(); out.print("public "); out.print(name); out.print(" create"); out.print(name); out.println("();"); } } out.println("}"); } public void genFactoryImpl(List<EClassifier> types, TemplateContext ctx, TabbedWriter out) throws TemplateException { String packageName = types.get(0).getPackageName(); String factoryName = (String)ctx.get(CTX_FactoryName); if (factoryName == null) { String[] packageNames = packageName.split("[.]"); factoryName = packageNames[packageNames.length-1].substring(0,1).toUpperCase(); factoryName += packageNames[packageNames.length-1].substring(1); factoryName += "Factory"; } out.print("package "); out.print(packageName); out.println(".impl;"); out.println(); out.print("import "); out.print(packageName); out.println(".*;"); out.println("import org.eclipse.edt.mof.EClass;"); out.println("import org.eclipse.edt.mof.EEnum;"); out.println("import org.eclipse.edt.mof.EDataType;"); out.println("import org.eclipse.edt.mof.impl.EFactoryImpl;"); out.println(); out.print("public class "); out.print(factoryName); out.print("BaseImpl"); out.print(" extends EFactoryImpl implements "); out.print(factoryName); out.println(" {"); for (EClassifier classifier : types) { String type = "EClass"; if (classifier instanceof EEnum) { type = "EEnum"; } else if (classifier instanceof EDataType) { type = "EDataType"; } String name = classifier.getName(); out.println("@Override"); out.print("public "); out.print(type); out.print(" get"); out.print(name); out.print(type); out.println("() {"); out.print("return "); out.print('('); out.print(type); out.print(')'); out.print("getTypeNamed("); out.print(name); out.println(");"); out.println('}'); out.println(); } for (EClassifier classifier : types) { if (classifier instanceof EClass && !(((EClass)classifier).isInterface() || ((EClass)classifier).isAbstract())) { EClass eClass = (EClass)classifier; String name = eClass.getName(); out.println("@Override"); out.print("public "); out.print(name); out.print(" create"); out.print(name); out.println("() {"); out.print("return "); out.print('('); out.print(name); out.print(")get"); out.print(name); out.println("EClass().newInstance();"); out.println("}"); out.println(); } } out.println("}"); } }