blob: e4bfd278571f2dd1ec7f4ff394f9281285f4179b [file] [log] [blame]
/**
* Copyright (c) 2006-2007 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 java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.GenBase;
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.codegen.ecore.genmodel.GenResourceKind;
import org.eclipse.emf.codegen.ecore.genmodel.GenRuntimePlatform;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.URIHandlerImpl;
/**
* A {@link GeneratorAdapter} for instances of {@link GenPackage}. This contributes the package level artifacts to EMF's
* default code generation.
*
* <p>This implementation should not be extended merely to augment the default code generation for packages. 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 GenPackageGeneratorAdapter extends GenBaseGeneratorAdapter
{
protected static final int PACKAGE_CLASS_ID = 0;
protected static final int FACTORY_CLASS_ID = 1;
protected static final int XML_PROCESSOR_CLASS_ID = 2;
protected static final int VALIDATOR_CLASS_ID = 3;
protected static final int SWITCH_CLASS_ID = 4;
protected static final int ADAPTER_FACTORY_CLASS_ID = 5;
protected static final int RESOURCE_FACTORY_CLASS_ID = 6;
protected static final int RESOURCE_CLASS_ID = 7;
protected static final int ITEM_PROVIDER_ADAPTER_FACTORY_ID = 8;
protected static final int EDITOR_ID = 9;
protected static final int MODEL_WIZARD_ID = 10;
protected static final int ACTION_BAR_CONTRIBUTOR_ID = 11;
protected static final int PACKAGE_TEST_SUITE_ID = 12;
protected static final int PACKAGE_EXAMPLE_ID = 13;
private static final JETEmitterDescriptor[] JET_EMITTER_DESCRIPTORS =
{
new JETEmitterDescriptor("model/PackageClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.PackageClass"),
new JETEmitterDescriptor("model/FactoryClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.FactoryClass"),
new JETEmitterDescriptor("model/XMLProcessorClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.XMLProcessorClass"),
new JETEmitterDescriptor("model/ValidatorClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.ValidatorClass"),
new JETEmitterDescriptor("model/SwitchClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.SwitchClass"),
new JETEmitterDescriptor("model/AdapterFactoryClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.AdapterFactoryClass"),
new JETEmitterDescriptor("model/ResourceFactoryClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.ResourceFactoryClass"),
new JETEmitterDescriptor("model/ResourceClass.javajet", "org.eclipse.emf.codegen.ecore.templates.model.ResourceClass"),
new JETEmitterDescriptor("edit/ItemProviderAdapterFactory.javajet", "org.eclipse.emf.codegen.ecore.templates.edit.ItemProviderAdapterFactory"),
new JETEmitterDescriptor("editor/Editor.javajet", "org.eclipse.emf.codegen.ecore.templates.editor.Editor"),
new JETEmitterDescriptor("editor/ModelWizard.javajet", "org.eclipse.emf.codegen.ecore.templates.editor.ModelWizard"),
new JETEmitterDescriptor("editor/ActionBarContributor.javajet", "org.eclipse.emf.codegen.ecore.templates.editor.ActionBarContributor"),
new JETEmitterDescriptor("model.tests/PackageTestSuite.javajet", "org.eclipse.emf.codegen.ecore.templates.model.tests.PackageTestSuite"),
new JETEmitterDescriptor("model.tests/PackageExample.javajet", "org.eclipse.emf.codegen.ecore.templates.model.tests.PackageExample")
};
/**
* 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 MODEL_ICON_ID = 0;
protected static final int MODEL_WIZARD_ICON_ID = 1;
protected static final int CREATE_CHILD_ICON_ID = 2;
private static final String[] INPUT_PATH_NAMES = { "editor/ModelFile.gif", "editor/NewModel.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 GenPackageGeneratorAdapter(GeneratorAdapterFactory generatorAdapterFactory)
{
super(generatorAdapterFactory);
}
@Override
protected Collection<?> getGenerateModelChildren(Object object)
{
GenPackage genPackage = (GenPackage)object;
List<GenBase> result = new ArrayList<GenBase>(genPackage.getGenClasses());
result.addAll(genPackage.getGenEnums());
result.addAll(genPackage.getNestedGenPackages());
return result;
}
@Override
protected Collection<?> getGenerateEditChildren(Object object)
{
GenPackage genPackage = (GenPackage)object;
List<GenBase> result = new ArrayList<GenBase>(genPackage.getGenClasses());
result.addAll(genPackage.getNestedGenPackages());
return result;
}
@Override
protected Collection<?> getGenerateEditorChildren(Object object)
{
return new ArrayList<GenPackage>(((GenPackage)object).getNestedGenPackages());
}
@Override
protected Collection<?> getGenerateTestsChildren(Object object)
{
GenPackage genPackage = (GenPackage)object;
List<GenBase> result = new ArrayList<GenBase>(genPackage.getGenClasses());
result.addAll(genPackage.getNestedGenPackages());
return result;
}
/**
* Returns the {@link GenModel} or {@link GenPackage} that contains the given {@link GenPackage}.
*/
@Override
public Object getGenerateParent(Object object, Object projectType)
{
return getParent(object);
}
/**
* Prepares the {@link GenPackage} for generation.
*/
@Override
protected Diagnostic doPreGenerate(Object object, Object projectType)
{
if (MODEL_PROJECT_TYPE.equals(projectType))
{
((GenPackage)object).prepareCache();
return Diagnostic.OK_INSTANCE;
}
return super.doPreGenerate(object, projectType);
}
/**
* Cleans up the {@link GenPackage} after generation.
*/
@Override
protected Diagnostic doPostGenerate(Object object, Object projectType)
{
if (MODEL_PROJECT_TYPE.equals(projectType))
{
((GenPackage)object).clearCache();
return Diagnostic.OK_INSTANCE;
}
return super.doPostGenerate(object, projectType);
}
@Override
protected Diagnostic generateModel(Object object, Monitor monitor)
{
monitor.beginTask("", 13);
GenPackage genPackage = (GenPackage)object;
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingPackage_message", new Object[] { genPackage.getBasicPackageName() });
monitor.subTask(message);
GenModel genModel = genPackage.getGenModel();
ensureProjectExists
(genModel.getModelDirectory(), genPackage, MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generateSchema(genPackage, monitor);
generatePackageSerialization(genPackage, monitor);
generatePackageInterface(genPackage, monitor);
generatePackageClass(genPackage, monitor);
generateFactoryInterface(genPackage, monitor);
generateFactoryClass(genPackage, monitor);
generateXMLProcessorClass(genPackage, monitor);
generateValidatorClass(genPackage, monitor);
generateSwitchClass(genPackage, monitor);
generateAdapterFactoryClass(genPackage, monitor);
generateResourceFactoryClass(genPackage, monitor);
generateResourceClass(genPackage, monitor);
return Diagnostic.OK_INSTANCE;
}
@SuppressWarnings("deprecation")
protected void generateSchema(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.getGenModel().isGenerateSchema())
{
// This functionality should eventually go away, as it is replaced by model exporters.
// We'll just delegate to the deprecated GenPackage method. The monitor isn't used, so we won't pass it.
//
genPackage.generateSchema();
}
monitor.worked(1);
}
protected void generatePackageSerialization(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.isLoadingInitialization())
{
monitor = createMonitor(monitor, 1);
try
{
monitor.beginTask("", 2);
final GenModel genModel = genPackage.getGenModel();
String targetPathName = genModel.getModelDirectory() + "/" + genPackage.getClassPackageName().replace('.', '/') + "/" +
genPackage.getSerializedPackageFilename();
message = CodeGenEcorePlugin.INSTANCE.getString("_UI_GeneratingPackageSerialization_message", new Object[] { targetPathName });
monitor.subTask(message);
URI targetFile = toURI(targetPathName);
ensureContainerExists(targetFile.trimSegments(1), createMonitor(monitor, 1));
final ResourceSet originalSet = genModel.eResource().getResourceSet();
EPackage originalPackage = genPackage.getEcorePackage();
ResourceSet outputSet = new ResourceSetImpl();
outputSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new EcoreResourceFactoryImpl());
URI targetURI = toPlatformResourceURI(targetFile);
Resource outputResource = outputSet.createResource(targetURI);
// Copy the package, excluding unwanted annotations.
//
EcoreUtil.Copier copier =
new EcoreUtil.Copier()
{
private static final long serialVersionUID = 1L;
@Override
protected void copyContainment(EReference reference, EObject object, EObject copyEObject)
{
if (reference == EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS)
{
List<EAnnotation> result = ((EModelElement)copyEObject).getEAnnotations();
result.clear();
for (EAnnotation eAnnotation : ((EModelElement)object).getEAnnotations())
{
if (!genModel.isSuppressedAnnotation(eAnnotation.getSource()))
{
result.add((EAnnotation)copy(eAnnotation));
}
}
return;
}
super.copyContainment(reference, object, copyEObject);
}
};
EPackage outputPackage = (EPackage)copier.copy(originalPackage);
copier.copyReferences();
outputResource.getContents().add(outputPackage);
collapseEmptyPackages(outputPackage);
// This URI handler redirects cross-document references to correct namespace-based values.
//
XMLResource.URIHandler uriHandler =
new URIHandlerImpl.PlatformSchemeAware()
{
private EPackage getContainingPackage(EObject object)
{
while (object != null)
{
if (object instanceof EPackage)
{
return (EPackage)object;
}
object = object.eContainer();
}
return null;
}
private String getRelativeFragmentPath(Resource resource, EObject base, String path)
{
String basePath = resource.getURIFragment(base);
if (basePath != null && path.startsWith(basePath))
{
int i = basePath.length();
if (path.length() == i)
{
return "";
}
else if (path.charAt(i) == '/')
{
return path.substring(i);
}
}
return null;
}
private EPackage getNonEmptySuperPackage(EPackage ePackage)
{
EPackage result = ePackage.getESuperPackage();
while (result != null && result.getEClassifiers().isEmpty())
{
result = result.getESuperPackage();
}
return result;
}
private URI redirect(URI uri)
{
if (!uri.isCurrentDocumentReference() && uri.hasFragment())
{
URI base = uri.trimFragment();
String fragment = uri.fragment();
Resource resource = originalSet.getResource(base, false);
if (resource != null)
{
EObject object = resource.getEObject(fragment);
if (object != null)
{
EPackage ePackage = getContainingPackage(object);
if (ePackage != null)
{
String relativePath = getRelativeFragmentPath(resource, ePackage, fragment);
if (relativePath != null)
{
StringBuilder path = new StringBuilder();
EPackage superPackage = getNonEmptySuperPackage(ePackage);
while (superPackage != null)
{
path.insert(0, '/');
path.insert(1, ePackage.getName());
ePackage = superPackage;
superPackage = getNonEmptySuperPackage(ePackage);
}
path.insert(0, '/');
path.append(relativePath);
return URI.createURI(ePackage.getNsURI()).appendFragment(path.toString());
}
}
}
}
}
return uri;
}
@Override
public URI deresolve(URI uri)
{
return super.deresolve(redirect(uri));
}
@Override
public URI resolve(URI uri)
{
return super.resolve(redirect(uri));
}
@Override
public void setBaseURI(URI uri)
{
super.setBaseURI(redirect(uri));
}
};
Map<Object, Object> options = new HashMap<Object, Object>();
options.put(XMLResource.OPTION_URI_HANDLER, uriHandler);
options.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
options.put(Resource.OPTION_LINE_DELIMITER, Resource.OPTION_LINE_DELIMITER_UNSPECIFIED);
try
{
outputResource.save(options);
}
catch (IOException exception)
{
//DMS handle this well.
CodeGenEcorePlugin.INSTANCE.log(exception);
}
}
finally
{
monitor.done();
}
}
else
{
monitor.worked(1);
}
}
// Returns the change in number of immediate child packages.
//
protected int collapseEmptyPackages(EPackage ePackage)
{
EList<EPackage> subpackages = ePackage.getESubpackages();
for (int i = 0; i < subpackages.size(); i++)
{
EPackage subpackage = subpackages.get(i);
i += collapseEmptyPackages(subpackage);
subpackages = ePackage.getESubpackages();
}
EPackage superPackage = ePackage.getESuperPackage();
if (superPackage != null && ePackage.getEClassifiers().isEmpty())
{
int result = subpackages.size() - 1;
EList<EPackage> siblingPackages = superPackage.getESubpackages();
int i = siblingPackages.indexOf(ePackage);
siblingPackages.remove(i);
siblingPackages.addAll(i, subpackages);
return result;
}
return 0;
}
protected void generatePackageInterface(GenPackage genPackage, Monitor monitor)
{
GenModel genModel = genPackage.getGenModel();
if (genPackage.hasClassifiers() && !genModel.isSuppressEMFMetaData() && !genModel.isSuppressInterfaces())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaInterface_message", new Object[] { genPackage.getQualifiedPackageInterfaceName() });
monitor.subTask(message);
generateJava
(genModel.getModelDirectory(),
genPackage.getReflectionPackageName(),
genPackage.getPackageInterfaceName(),
getJETEmitter(getJETEmitterDescriptors(), PACKAGE_CLASS_ID),
new Object[] { new Object[] { genPackage, Boolean.TRUE, Boolean.FALSE }},
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generatePackageClass(GenPackage genPackage, Monitor monitor)
{
GenModel genModel = genPackage.getGenModel();
if (genPackage.hasClassifiers())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedPackageClassName() });
monitor.subTask(message);
generateJava
(genModel.getModelDirectory(),
genPackage.getReflectionClassPackageName(),
genPackage.getPackageClassName(),
getJETEmitter(getJETEmitterDescriptors(), PACKAGE_CLASS_ID),
new Object[]
{
new Object[]
{
genPackage,
genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces() ? Boolean.TRUE: Boolean.FALSE,
Boolean.TRUE
}
},
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateFactoryInterface(GenPackage genPackage, Monitor monitor)
{
GenModel genModel = genPackage.getGenModel();
if (genPackage.hasClassifiers() && !genModel.isSuppressInterfaces())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaInterface_message", new Object[] { genPackage.getQualifiedFactoryInterfaceName() });
monitor.subTask(message);
generateJava
(genModel.getModelDirectory(),
genPackage.getReflectionPackageName(),
genPackage.getFactoryInterfaceName(),
getJETEmitter(getJETEmitterDescriptors(), FACTORY_CLASS_ID),
new Object[] { new Object[] { genPackage, Boolean.TRUE, Boolean.FALSE }},
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateFactoryClass(GenPackage genPackage, Monitor monitor)
{
GenModel genModel = genPackage.getGenModel();
if (genPackage.hasClassifiers())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedFactoryClassName() });
monitor.subTask(message);
generateJava
(genModel.getModelDirectory(),
genPackage.getReflectionClassPackageName(),
genPackage.getFactoryClassName(),
getJETEmitter(getJETEmitterDescriptors(), FACTORY_CLASS_ID),
new Object[] { new Object[] { genPackage, genModel.isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE, Boolean.TRUE }},
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateXMLProcessorClass(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.getResource().getValue() == GenResourceKind.XML)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedXMLProcessorClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getModelDirectory(),
genPackage.getUtilitiesPackageName(),
genPackage.getXMLProcessorClassName(),
getJETEmitter(getJETEmitterDescriptors(), XML_PROCESSOR_CLASS_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateValidatorClass(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.hasConstraints())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedValidatorClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getModelDirectory(),
genPackage.getUtilitiesPackageName(),
genPackage.getValidatorClassName(),
getJETEmitter(getJETEmitterDescriptors(), VALIDATOR_CLASS_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateSwitchClass(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.isAdapterFactory() && !genPackage.getGenClasses().isEmpty())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedSwitchClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getModelDirectory(),
genPackage.getUtilitiesPackageName(),
genPackage.getSwitchClassName(),
getJETEmitter(getJETEmitterDescriptors(), SWITCH_CLASS_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateAdapterFactoryClass(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.isAdapterFactory() && !genPackage.getGenClasses().isEmpty())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedAdapterFactoryClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getModelDirectory(),
genPackage.getUtilitiesPackageName(),
genPackage.getAdapterFactoryClassName(),
getJETEmitter(getJETEmitterDescriptors(), ADAPTER_FACTORY_CLASS_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateResourceFactoryClass(GenPackage genPackage, Monitor monitor)
{
if (genPackage.getResource() != GenResourceKind.NONE_LITERAL)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedResourceFactoryClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getModelDirectory(),
genPackage.getUtilitiesPackageName(),
genPackage.getResourceFactoryClassName(),
getJETEmitter(getJETEmitterDescriptors(), RESOURCE_FACTORY_CLASS_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateResourceClass(GenPackage genPackage, Monitor monitor)
{
if (genPackage.getResource() != GenResourceKind.NONE_LITERAL)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedResourceClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getModelDirectory(),
genPackage.getUtilitiesPackageName(),
genPackage.getResourceClassName(),
getJETEmitter(getJETEmitterDescriptors(), RESOURCE_CLASS_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
@Override
protected Diagnostic generateEdit(Object object, Monitor monitor)
{
GenPackage genPackage = (GenPackage)object;
monitor.beginTask("", 2 + countCreateChildIcons(genPackage));
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingItemProvidersForPackage_message", new Object[] { genPackage.getBasicPackageName() });
monitor.subTask(message);
GenModel genModel = genPackage.getGenModel();
ensureProjectExists
(genModel.getEditDirectory(), genPackage, EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generateItemProviderAdapterFactory(genPackage, monitor);
generateCreateChildIcons(genPackage, monitor);
return Diagnostic.OK_INSTANCE;
}
protected void generateItemProviderAdapterFactory(GenPackage genPackage, Monitor monitor)
{
if (!genPackage.getGenClasses().isEmpty())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedItemProviderAdapterFactoryClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getEditDirectory(),
genPackage.getProviderPackageName(),
genPackage.getItemProviderAdapterFactoryClassName(),
getJETEmitter(getJETEmitterDescriptors(), ITEM_PROVIDER_ADAPTER_FACTORY_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected int countCreateChildIcons(GenPackage genPackage)
{
int result = 0;
GenModel genModel = genPackage.getGenModel();
if (genModel.isCreationCommands() && genModel.isCreationIcons() && genPackage.isChildCreationExtenders())
{
for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage.getExtendedChildCreationData().entrySet())
{
for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue().entrySet())
{
for (GenClass.ChildCreationData childCreationData : classEntry.getValue())
{
if (childCreationData.createClassifier instanceof GenClass &&
(childCreationData.delegatedFeature == null ||
classEntry.getKey().getAllGenFeatures().contains(childCreationData.delegatedFeature)))
{
++result;
}
}
}
}
}
return result;
}
protected void generateCreateChildIcons(GenPackage genPackage, Monitor monitor)
{
GenModel genModel = genPackage.getGenModel();
if (genModel.isCreationCommands() && genModel.isCreationIcons() && genPackage.isChildCreationExtenders())
{
for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage.getExtendedChildCreationData().entrySet())
{
for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue().entrySet())
{
GenClass genClass = classEntry.getKey();
for (GenClass.ChildCreationData childCreationData : classEntry.getValue())
{
if (childCreationData.createClassifier instanceof GenClass &&
(childCreationData.delegatedFeature == null ||
classEntry.getKey().getAllGenFeatures().contains(childCreationData.delegatedFeature)))
{
GenClass childClass = (GenClass)childCreationData.createClassifier;
GenFeature feature = childCreationData.createFeature;
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingCreateChildIcon_message", new Object[] { classEntry.getKey().getCreateChildIconFileName(feature, childClass) });
monitor.subTask(message);
generateGIF
(genClass.getCreateChildIconFileName(genModel, feature, childClass),
getGIFEmitter(getInputPathNames(), CREATE_CHILD_ICON_ID),
genClass.getName(),
childClass.getName(),
false,
createMonitor(monitor, 1));
}
}
}
}
}
}
@Override
protected Diagnostic generateEditor(Object object, Monitor monitor)
{
monitor.beginTask("", 6);
GenPackage genPackage = (GenPackage)object;
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingEditorForPackage_message", new Object[] { genPackage.getBasicPackageName() });
monitor.subTask(message);
GenModel genModel = genPackage.getGenModel();
ensureProjectExists
(genModel.getEditorDirectory(), genPackage, EDITOR_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generateEditor(genPackage, monitor);
generateModelWizard(genPackage, monitor);
generateActionBarContributor(genPackage, monitor);
generateModelIcon(genPackage, monitor);
generateModelWizardIcon(genPackage, monitor);
return Diagnostic.OK_INSTANCE;
}
protected void generateEditor(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasConcreteClasses() && genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedEditorClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getEditorDirectory(),
genPackage.getPresentationPackageName(),
genPackage.getEditorClassName(),
getJETEmitter(getJETEmitterDescriptors(), EDITOR_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateModelWizard(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard() && genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedModelWizardClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getEditorDirectory(),
genPackage.getPresentationPackageName(),
genPackage.getModelWizardClassName(),
getJETEmitter(getJETEmitterDescriptors(), MODEL_WIZARD_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateActionBarContributor(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasConcreteClasses() && genPackage.getGenModel().getRuntimePlatform() != GenRuntimePlatform.GWT)
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedActionBarContributorClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getEditorDirectory(),
genPackage.getPresentationPackageName(),
genPackage.getActionBarContributorClassName(),
getJETEmitter(getJETEmitterDescriptors(), ACTION_BAR_CONTRIBUTOR_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateModelIcon(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasConcreteClasses())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingModelIcon_message", new Object[] { genPackage.getModelIconFileName() });
monitor.subTask(message);
generateGIF
(genPackage.getModelIconFileName(),
getGIFEmitter(getInputPathNames(), MODEL_ICON_ID),
genPackage.getPrefix(),
null,
false,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generateModelWizardIcon(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasConcreteClasses() && genPackage.isGenerateModelWizard())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingModelWizardIcon_message", new Object[] { genPackage.getModelWizardIconFileName() });
monitor.subTask(message);
generateGIF
(genPackage.getModelWizardIconFileName(),
getGIFEmitter(getInputPathNames(), MODEL_WIZARD_ICON_ID),
genPackage.getPrefix(),
null,
false,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
@Override
protected Diagnostic generateTests(Object object, Monitor monitor)
{
monitor.beginTask("", 3);
GenPackage genPackage = (GenPackage)object;
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingTestsForPackage_message", new Object[] { genPackage.getBasicPackageName() });
monitor.subTask(message);
GenModel genModel = genPackage.getGenModel();
ensureProjectExists
(genModel.getTestsDirectory(), genPackage, TESTS_PROJECT_TYPE, genModel.isUpdateClasspath(), createMonitor(monitor, 1));
generatePackageTestSuite(genPackage, monitor);
generatePackageExample(genPackage, monitor);
return Diagnostic.OK_INSTANCE;
}
protected void generatePackageTestSuite(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedTestSuiteClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getTestsDirectory(),
genPackage.getTestsPackageName(),
genPackage.getTestSuiteClassName(),
getJETEmitter(getJETEmitterDescriptors(), PACKAGE_TEST_SUITE_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
protected void generatePackageExample(GenPackage genPackage, Monitor monitor)
{
if (genPackage.hasClassifiers() && genPackage.isGenerateExampleClass())
{
message = CodeGenEcorePlugin.INSTANCE.getString
("_UI_GeneratingJavaClass_message", new Object[] { genPackage.getQualifiedExampleClassName() });
monitor.subTask(message);
generateJava
(genPackage.getGenModel().getTestsDirectory(),
genPackage.getTestsPackageName(),
genPackage.getExampleClassName(),
getJETEmitter(getJETEmitterDescriptors(), PACKAGE_EXAMPLE_ID),
null,
createMonitor(monitor, 1));
}
else
{
monitor.worked(1);
}
}
}