/**
* Copyright (c) 2006 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 - Initial API and implementation
*/
package org.eclipse.emf.codegen.ecore.genmodel.generator;
import org.eclipse.emf.codegen.ecore.CodeGenEcorePlugin;
import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapter;
import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenFeature;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.Monitor;
/**
* A {@link GeneratorAdapter} for instances of {@link GenClass}. This contributes the artifacts for every class to EMF's
* default code generation.
*
* <p>This implementation should not be extended merely to augment the default code generation for classes. The
* recommended approach is to implement a new adapter and register the {@link GeneratorAdapterFactory adapter factory}
* that creates it, so that it is contributed to code generation. Such registration is usually done through the
* <code>org.eclipse.emf.codegen.ecore.generatorAdapters</code> extension point.
*
* <p>This implementation may be extended, however, in order to remove from or change the default code generation.
*
* @since 2.2.0
*/
public class GenClassGeneratorAdapter extends GenBaseGeneratorAdapter
{
protected static final int CLASS_ID = 0;
protected static final int ITEM_PROVIDER_ID = 1;
protected static final int TEST_CASE_ID = 2;
private static final JETEmitterDescriptor[] JET_EMITTER_DESCRIPTORS =
{
new JETEmitterDescriptor("model/Class.javajet", "org.eclipse.emf.codegen.ecore.templates.model.Class"),
new JETEmitterDescriptor("edit/ItemProvider.javajet", "org.eclipse.emf.codegen.ecore.templates.edit.ItemProvider"),
new JETEmitterDescriptor("model.tests/TestCase.javajet", "org.eclipse.emf.codegen.ecore.templates.model.tests.TestCase")
};
/**
* Returns the set of <code>JETEmitterDescriptor</code>s used by the adapter. The contents of the returned array
* should never be changed. Rather, subclasses may override this method to return a different array altogether.
*/
protected JETEmitterDescriptor[] getJETEmitterDescriptors()
{
return JET_EMITTER_DESCRIPTORS;
}
protected static final int ITEM_ICON_ID = 0;
protected static final int CREATE_CHILD_ICON_ID = 1;
private static final String[] INPUT_PATH_NAMES = { "edit/Item.gif", "edit/CreateChild.gif" };
/**
* Returns the set of {@link org.eclipse.emf.codegen.util.GIFEmitter} input paths used by the adapter. The contents
* of the returned array should never be changed. Rather, subclasses may override this method to return a different
* array altogether.
*/
protected String[] getInputPathNames()
{
return INPUT_PATH_NAMES;
}
public GenClassGeneratorAdapter(GeneratorAdapterFactory generatorAdapterFactory)
{
super(generatorAdapterFactory);
}
/**
* Returns the {@link GenPackage} that contains the given {@link GenClass}.
*/
@Override
public Object getGenerateParent(Object object, Object projectType)
{
return getParent(object);
}
@Override
protected Diagnostic generateModel(Object object, Monitor monitor)
{
monitor.beginTask("", 3);
GenClass genClass = (GenClass)object;
message = CodeGenEcorePlugin.INSTANCE.getString("_UI_Generating_message", new Object[] { genClass.getFormattedName() });
monitor.subTask(message);
GenModel genModel = genClass.getGenModel();
ensureProjectExists
(genModel.getModelDirectory(), genClass, MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generateInterface(genClass, monitor);
generateClass(genClass, monitor);
return Diagnostic.OK_INSTANCE;
}
protected void generateInterface(GenClass genClass, Monitor monitor)
{
GenModel genModel = genClass.getGenModel();
GenPackage genPackage = genClass.getGenPackage();
if (!genClass.isExternalInterface() && (!genModel.isSuppressInterfaces() || genClass.isInterface()))
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaInterface_message",
new Object[] { genPackage.getInterfacePackageName() + "." + genClass.getInterfaceName() });
monitor.subTask(message);
generateJava
(genModel.getModelDirectory(),
genPackage.getInterfacePackageName(),
genClass.getInterfaceName(),
getJETEmitter(getJETEmitterDescriptors(), CLASS_ID),
new Object[] { new Object[] { genClass, Boolean.TRUE, Boolean.FALSE }},
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateClass(GenClass genClass, Monitor monitor)
{
GenModel genModel = genClass.getGenModel();
GenPackage genPackage = genClass.getGenPackage();
if (!genClass.isInterface())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genClass.getQualifiedClassName() });
monitor.subTask(message);
generateJava
(genModel.getModelDirectory(),
genPackage.getClassPackageName(),
genClass.getClassName(),
getJETEmitter(getJETEmitterDescriptors(), CLASS_ID),
new Object[] { new Object[] { genClass, genModel.isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE, Boolean.TRUE }},
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
@Override
protected Diagnostic generateEdit(Object object, Monitor monitor)
{
GenClass genClass = (GenClass)object;
monitor.beginTask("", 3 + countCreateChildIcons(genClass));
message = CodeGenEcorePlugin.INSTANCE.getString("_UI_GeneratingProvider_message", new Object[] { genClass.getFormattedName() });
monitor.subTask(message);
GenModel genModel = genClass.getGenModel();
ensureProjectExists
(genModel.getEditDirectory(), genClass, EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generateItemProvider(genClass, monitor);
generateItemIcon(genClass, monitor);
generateCreateChildIcons(genClass, monitor);
return Diagnostic.OK_INSTANCE;
}
protected void generateItemProvider(GenClass genClass, Monitor monitor)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genClass.getQualifiedProviderClassName() });
monitor.subTask(message);
generateJava
(genClass.getGenModel().getEditDirectory(),
genClass.getGenPackage().getProviderPackageName(),
genClass.getProviderClassName(),
getJETEmitter(getJETEmitterDescriptors(), ITEM_PROVIDER_ID),
null,
createMonitor(monitor, 1));
}
protected void generateItemIcon(GenClass genClass, Monitor monitor)
{
if (genClass.isImage())
{
message = CodeGenEcorePlugin.INSTANCE.getString("_UI_GeneratingItemIcon_message", new Object[] { genClass.getItemIconFileName() });
monitor.subTask(message);
generateGIF
(genClass.getItemIconFileName(),
getGIFEmitter(getInputPathNames(), ITEM_ICON_ID),
genClass.getName(),
null,
false,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected int countCreateChildIcons(GenClass genClass)
{
int result = 0;
GenModel genModel = genClass.getGenModel();
if (genModel.isCreationCommands() && genModel.isCreationIcons())
{
for (GenFeature feature : genClass.getCreateChildFeaturesIncludingDelegation())
{
result += genClass.getChildrenClasses(feature).size();
}
}
return result;
}
protected void generateCreateChildIcons(GenClass genClass, Monitor monitor)
{
GenModel genModel = genClass.getGenModel();
if (genModel.isCreationCommands() && genModel.isCreationIcons())
{
for (GenFeature feature : genClass.getCreateChildFeaturesIncludingDelegation())
{
for (GenClass childClass : genClass.getChildrenClasses(feature))
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingCreateChildIcon_message", new Object[] { genClass.getCreateChildIconFileName(feature, childClass) });
monitor.subTask(message);
generateGIF
(genClass.getCreateChildIconFileName(feature, childClass),
getGIFEmitter(getInputPathNames(), CREATE_CHILD_ICON_ID),
genClass.getName(),
childClass.getName(),
false,
createMonitor(monitor, 1));
}
}
}
}
@Override
protected Diagnostic generateTests(Object object, Monitor monitor)
{
monitor.beginTask("", 2);
GenClass genClass = (GenClass)object;
message = CodeGenEcorePlugin.INSTANCE.getString("_UI_GeneratingTestCase_message", new Object[] { genClass.getFormattedName() });
monitor.subTask(message);
GenModel genModel = genClass.getGenModel();
ensureProjectExists
(genModel.getTestsDirectory(), genClass, TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generateTestCase(genClass, monitor);
return Diagnostic.OK_INSTANCE;
}
protected void generateTestCase(GenClass genClass, Monitor monitor)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genClass.getQualifiedTestCaseClassName() });
monitor.subTask(message);
generateJava
(genClass.getGenModel().getTestsDirectory(),
genClass.getGenPackage().getTestsPackageName(),
genClass.getTestCaseClassName(),
getJETEmitter(getJETEmitterDescriptors(), TEST_CASE_ID),
null,
createMonitor(monitor, 1));
}
}