blob: 5bb7f7ec1e34d57e8ccf6e2ac0d650756d1342e8 [file] [log] [blame]
/**
* Copyright (c) 2002-2010 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;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceDescription;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.emf.codegen.CodeGen;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
/**
* This implements the method {@link #run},
* which is called just like main during headless workbench invocation.
*/
public class Generator extends CodeGen
{
/**
* This supports a non-headless invocation.
* The variable VABASE or ECLIPSE.
* @deprecated It is not possible to generate code without using Eclipse. If
* you are invoking this method, you should instantiate a Generator and call
* {@link #run(Object)}. This method will be removed in a future release.
*/
@Deprecated
public static void main(String args[])
{
new Generator().run(args);
}
protected String basePackage;
public void printGenerateUsage()
{
System.out.println("Usage arguments:");
System.out.println(" [-projects <project-root-directory>]");
System.out.println(" [-dynamicTemplates] [-forceOverwrite | -diff]");
System.out.println(" [-generateSchema] [-nonNLSMarkers]");
System.out.println(" [-codeFormatting { default | <profile-file> } ]");
System.out.println(" [-model] [-edit] [-editor] [-tests]");
System.out.println(" [-autoBuild <true|false>]");
System.out.println(" [-reconcile]");
System.out.println(" <genmodel-file>");
System.out.println(" [ <target-root-directory> ]");
System.out.println("");
System.out.println("For example:");
System.out.println("");
System.out.println(" generate result/model/Extended.genmodel");
}
/**
* This is called with the command line arguments of a headless workbench invocation.
*/
@Override
public Object run(Object object)
{
return PlatformRunnable.run(this, object);
}
public static class PlatformRunnable extends Generator implements IApplication, DeprecatedPlatformRunnable
{
public Object start(IApplicationContext context) throws Exception
{
String [] args = (String[])context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
return run(args == null ? new String[0] : args);
}
public void stop()
{
// Do nothing
}
/**
* This is called with the command line arguments of a headless workbench invocation.
*/
@Override
public Object run(Object object)
{
return run(this, object);
}
/**
* This is called with the command line arguments of a headless workbench invocation.
*/
public static Object run(final Generator generator, Object object)
{
try
{
final String[] arguments = (String[])object;
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRunnable runnable =
new IWorkspaceRunnable()
{
public void run(IProgressMonitor progressMonitor) throws CoreException
{
Monitor monitor = BasicMonitor.toMonitor(progressMonitor);
try
{
if (arguments.length == 0)
{
generator.printGenerateUsage();
}
else if ("-ecore2GenModel".equalsIgnoreCase(arguments[0]))
{
IPath ecorePath = new Path(arguments[1]);
generator.basePackage = arguments[2];
String prefix = arguments[3];
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getURIConverter().getURIMap().putAll(EcorePlugin.computePlatformURIMap(true));
URI ecoreURI = URI.createFileURI(ecorePath.toString());
Resource resource = resourceSet.getResource(ecoreURI, true);
EPackage ePackage = (EPackage)resource.getContents().get(0);
IPath genModelPath = ecorePath.removeFileExtension().addFileExtension("genmodel");
progressMonitor.beginTask("", 2);
progressMonitor.subTask("Creating " + genModelPath);
URI genModelURI = URI.createFileURI(genModelPath.toString());
Resource genModelResource =
Resource.Factory.Registry.INSTANCE.getFactory(genModelURI).createResource(genModelURI);
GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
genModelResource.getContents().add(genModel);
resourceSet.getResources().add(genModelResource);
genModel.setModelDirectory("/TargetProject/src");
genModel.getForeignModel().add(ecorePath.toString());
genModel.initialize(Collections.singleton(ePackage));
GenPackage genPackage = genModel.getGenPackages().get(0);
genModel.setModelName(genModelURI.trimFileExtension().lastSegment());
genPackage.setPrefix(prefix);
genPackage.setBasePackage(generator.basePackage);
progressMonitor.worked(1);
if (arguments.length > 4 && "-sdo".equals(arguments[4]))
{
setSDODefaults(genModel);
}
genModelResource.save(Collections.EMPTY_MAP);
}
else
{
String rootLocation = null;
boolean dynamicTemplates = false;
boolean diff = false;
boolean forceOverwrite = false;
boolean generateSchema = false;
boolean nonNLSMarkers = false;
boolean codeFormatting = false;
String profileFile = null;
boolean model = false;
boolean edit = false;
boolean editor = false;
boolean tests = false;
boolean reconcile = false;
Boolean autoBuild = null;
int index = 0;
for (; index < arguments.length && arguments[index].startsWith("-"); ++index)
{
if (arguments[index].equalsIgnoreCase("-projects"))
{
rootLocation = new File(arguments[++index]).getAbsoluteFile().getCanonicalPath();
}
else if (arguments[index].equalsIgnoreCase("-autoBuild"))
{
autoBuild = Boolean.valueOf(arguments[++index]);
}
else if (arguments[index].equalsIgnoreCase("-dynamicTemplates"))
{
dynamicTemplates = true;
}
else if (arguments[index].equalsIgnoreCase("-diff"))
{
diff = true;
}
else if (arguments[index].equalsIgnoreCase("-forceOverwrite"))
{
forceOverwrite = true;
}
else if (arguments[index].equalsIgnoreCase("-generateSchema"))
{
generateSchema = true;
}
else if (arguments[index].equalsIgnoreCase("-nonNLSMarkers"))
{
nonNLSMarkers = true;
}
else if (arguments[index].equalsIgnoreCase("-codeFormatting"))
{
codeFormatting = true;
profileFile = arguments[++index];
if ("default".equals(profileFile))
{
profileFile = null;
}
}
else if (arguments[index].equalsIgnoreCase("-model"))
{
model = true;
}
else if (arguments[index].equalsIgnoreCase("-edit"))
{
edit = true;
}
else if (arguments[index].equalsIgnoreCase("-editor"))
{
editor = true;
}
else if (arguments[index].equalsIgnoreCase("-tests"))
{
tests = true;
}
else if (arguments[index].equalsIgnoreCase("-reconcile"))
{
reconcile = true;
}
else
{
throw new CoreException(
new Status(
IStatus.ERROR,
CodeGenEcorePlugin.getPlugin().getBundle().getSymbolicName(),
0,
"Unrecognized argument: '" + arguments[index] + "'",
null));
}
}
if (!model && !edit && !editor && !tests)
{
model = true;
}
// This is the name of the model.
//
String genModelName = arguments[index++];
progressMonitor.beginTask("Generating " + genModelName, 2);
if (autoBuild != null)
{
IWorkspaceDescription description = workspace.getDescription();
if (description.isAutoBuilding() != autoBuild)
{
description.setAutoBuilding(autoBuild);
try
{
workspace.setDescription(description);
}
catch (CoreException coreException)
{
generator.printStatus(
"Unable to set autoBuild to " + autoBuild.toString() + ". Code generation will proceed normally.",
coreException.getStatus());
}
}
}
// Create a resource set and load the model file into it.
//
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getURIConverter().getURIMap().putAll(EcorePlugin.computePlatformURIMap(true));
URI genModelURI = URI.createFileURI(new File(genModelName).getAbsoluteFile().getCanonicalPath());
Resource genModelResource = resourceSet.getResource(genModelURI, true);
GenModel genModel = (GenModel)genModelResource.getContents().get(0);
if (reconcile)
{
boolean reconcileSuccessful = genModel.reconcile();
if (!reconcileSuccessful)
{
generator.printStatus("", new Status(IStatus.WARNING, CodeGenEcorePlugin.getPlugin().getBundle().getSymbolicName(), "Can't reconcile the generator model."));
}
}
IStatus status = genModel.validate();
if (!status.isOK())
{
generator.printStatus("", status);
}
else
{
org.eclipse.emf.codegen.ecore.generator.Generator gen = new org.eclipse.emf.codegen.ecore.generator.Generator();
gen.setInput(genModel);
if (dynamicTemplates)
{
genModel.setDynamicTemplates(true);
}
if (forceOverwrite)
{
genModel.setForceOverwrite(true);
}
if (diff)
{
genModel.setRedirection(".{0}.new");
}
if (index < arguments.length)
{
IPath path = new Path(genModel.getModelDirectory());
// This is the path of the target directory.
//
IPath targetRootDirectory = new Path(arguments[index]);
targetRootDirectory = new Path(targetRootDirectory.toFile().getAbsoluteFile().getCanonicalPath());
CodeGenUtil.EclipseUtil.findOrCreateContainer
(new Path(path.segment(0)),
true,
targetRootDirectory,
//DMS Why not this?
//new SubProgressMonitor(progressMonitor, 1));
BasicMonitor.toIProgressMonitor(CodeGenUtil.EclipseUtil.createMonitor(progressMonitor, 1)));
}
// This is to handle a genmodel produced by rose2genmodel.
//
else
{
String modelDirectory = genModel.getModelDirectory();
genModel.setModelDirectory(generator.findOrCreateContainerHelper(rootLocation, modelDirectory, monitor));
String editDirectory = genModel.getEditDirectory();
if (edit && editDirectory != null)
{
genModel.setEditDirectory(generator.findOrCreateContainerHelper(rootLocation, editDirectory, monitor));
}
String editorDirectory = genModel.getEditorDirectory();
if (editor && editorDirectory != null)
{
genModel.setEditorDirectory(generator.findOrCreateContainerHelper(rootLocation, editorDirectory, monitor));
}
String testsDirectory = genModel.getTestsDirectory();
if (tests && testsDirectory != null)
{
genModel.setTestsDirectory(generator.findOrCreateContainerHelper(rootLocation, testsDirectory, monitor));
}
}
genModel.setCanGenerate(true);
genModel.setUpdateClasspath(false);
if (generateSchema)
{
genModel.setGenerateSchema(true);
}
if (nonNLSMarkers)
{
genModel.setNonNLSMarkers(true);
}
if (codeFormatting)
{
genModel.setCodeFormatting(true);
}
if (profileFile != null)
{
Map<String, String> options = CodeFormatterProfileParser.parse(profileFile);
if (options == null)
{
throw new CoreException
(new Status
(IStatus.ERROR,
CodeGenEcorePlugin.getPlugin().getBundle().getSymbolicName(),
0,
"Unable to read profile file: '" + profileFile + "'",
null));
}
gen.getOptions().codeFormatterOptions = options;
}
if (model)
{
gen.generate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, CodeGenUtil.EclipseUtil.createMonitor(progressMonitor, 1));
}
if (edit)
{
gen.generate(genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, CodeGenUtil.EclipseUtil.createMonitor(progressMonitor, 1));
}
if (editor)
{
gen.generate(genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE, CodeGenUtil.EclipseUtil.createMonitor(progressMonitor, 1));
}
if (tests)
{
gen.generate(genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE, CodeGenUtil.EclipseUtil.createMonitor(progressMonitor, 1));
}
}
}
}
catch (CoreException exception)
{
throw exception;
}
catch (Exception exception)
{
throw
new CoreException
(new Status
(IStatus.ERROR, CodeGenEcorePlugin.getPlugin().getBundle().getSymbolicName(), 0, "EMF Error", exception));
}
finally
{
progressMonitor.done();
}
}
};
workspace.run(runnable, new CodeGenUtil.EclipseUtil.StreamProgressMonitor(System.out));
return 0;
}
catch (Exception exception)
{
generator.printGenerateUsage();
exception.printStackTrace();
CodeGenEcorePlugin.INSTANCE.log(exception);
return 1;
}
}
}
protected String findOrCreateContainerHelper
(String rootLocation, String encodedPath, Monitor progressMonitor) throws CoreException
{
return EclipseHelper.findOrCreateContainerHelper(rootLocation, encodedPath, progressMonitor);
}
public static int EMF_MODEL_PROJECT_STYLE = 0x0001;
public static int EMF_EDIT_PROJECT_STYLE = 0x0002;
public static int EMF_EDITOR_PROJECT_STYLE = 0x0004;
public static int EMF_XML_PROJECT_STYLE = 0x0008;
public static int EMF_PLUGIN_PROJECT_STYLE = 0x0010;
public static int EMF_EMPTY_PROJECT_STYLE = 0x0020;
public static int EMF_TESTS_PROJECT_STYLE = 0x0040;
public static int EMF_GWT_PROJECT_STYLE = 0x0080;
public static IProject createEMFProject
(IPath javaSource,
IPath projectLocationPath,
List<IProject> referencedProjects,
IProgressMonitor progressMonitor,
int style)
{
return createEMFProject(javaSource, projectLocationPath, referencedProjects, progressMonitor, style, Collections.emptyList());
}
public static IProject createEMFProject
(IPath javaSource,
IPath projectLocationPath,
List<IProject> referencedProjects,
IProgressMonitor progressMonitor,
int style,
List<?> pluginVariables)
{
return
EclipseHelper.createEMFProject
(javaSource, projectLocationPath, referencedProjects, BasicMonitor.toMonitor(progressMonitor), style, pluginVariables);
}
public static IProject createEMFProject
(IPath javaSource,
IPath projectLocationPath,
List<IProject> referencedProjects,
Monitor progressMonitor,
int style)
{
return createEMFProject(javaSource, projectLocationPath, referencedProjects, progressMonitor, style, Collections.emptyList());
}
public static IProject createEMFProject
(IPath javaSource,
IPath projectLocationPath,
List<IProject> referencedProjects,
Monitor progressMonitor,
int style,
List<?> pluginVariables)
{
return EclipseHelper.createEMFProject(javaSource, projectLocationPath, referencedProjects, progressMonitor, style, pluginVariables);
}
public static IProject createEMFProject
(IPath javaSource,
URI projectLocationURI,
List<IProject> referencedProjects,
Monitor progressMonitor,
int style,
List<?> pluginVariables)
{
return EclipseHelper.createEMFProject(javaSource, projectLocationURI, referencedProjects, progressMonitor, style, pluginVariables);
}
public void printStatus(String prefix, IStatus status)
{
System.err.print(prefix);
System.err.println(status.getMessage());
IStatus [] children = status.getChildren();
String childPrefix = " " + prefix;
for (int i = 0; i < children.length; ++i)
{
printStatus(childPrefix, children[i]);
}
}
public static void setSDODefaults(GenModel genModel)
{
genModel.setRootExtendsInterface("");
genModel.setRootImplementsInterface("org.eclipse.emf.ecore.sdo.InternalEDataObject");
genModel.setRootExtendsClass("org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl");
genModel.setFeatureMapWrapperInterface("commonj.sdo.Sequence");
genModel.setFeatureMapWrapperInternalInterface("org.eclipse.emf.ecore.sdo.util.ESequence");
genModel.setFeatureMapWrapperClass("org.eclipse.emf.ecore.sdo.util.BasicESequence");
genModel.setSuppressEMFTypes(true);
genModel.setSuppressEMFMetaData(true);
genModel.getModelPluginVariables().add("EMF_COMMONJ_SDO=org.eclipse.emf.commonj.sdo");
genModel.getModelPluginVariables().add("EMF_ECORE_SDO=org.eclipse.emf.ecore.sdo");
genModel.getStaticPackages().add("http://www.eclipse.org/emf/2003/SDO");
}
/**
* This parses a code formatter profile file, recording the options it sepecifies in a map.
*/
static class CodeFormatterProfileParser extends DefaultHandler
{
private Map<String, String> options = null;
private String SETTING = "setting";
private String ID = "id";
private String VALUE = "value";
private String EMPTY = "";
@Override
public void startDocument()
{
options = new HashMap<String, String>();
}
@Override
public void startElement(String namespaceURI, String localName, String qualifiedName, Attributes atts)
{
if (EMPTY.equals(namespaceURI) && SETTING.equals(localName))
{
String id = atts.getValue(EMPTY, ID);
String value = atts.getValue(EMPTY, VALUE);
if (id != null && value != null)
{
options.put(id, value);
}
}
}
public Map<String, String> getOptions()
{
return options;
}
public static Map<String, String> parse(String systemID)
{
try
{
XMLReader parser = XMLReaderFactory.createXMLReader();
CodeFormatterProfileParser handler = new CodeFormatterProfileParser();
parser.setContentHandler(handler);
parser.parse(systemID);
return handler.getOptions();
}
catch (Exception e)
{
// Ignore
}
return null;
}
}
private static class EclipseHelper
{
public static IProject createEMFProject
(IPath javaSource,
IPath projectLocationPath,
List<IProject> referencedProjects,
Monitor monitor,
int style,
List<?> pluginVariables)
{
return createEMFProject(javaSource, projectLocationPath == null ? null : URI.createFileURI(projectLocationPath.toOSString()), referencedProjects, monitor, style, pluginVariables);
}
public static IProject createEMFProject
(IPath javaSource,
URI projectLocationURI,
List<IProject> referencedProjects,
Monitor monitor,
int style,
List<?> pluginVariables)
{
IProgressMonitor progressMonitor = BasicMonitor.toIProgressMonitor(monitor);
String projectName = javaSource.segment(0);
IProject project = null;
try
{
List<IClasspathEntry> classpathEntries =
new UniqueEList<IClasspathEntry>()
{
private static final long serialVersionUID = 1L;
@Override
public boolean contains(Object object)
{
if (super.contains(object))
{
return true;
}
else if (object instanceof IClasspathEntry)
{
IClasspathEntry classpathEntry = (IClasspathEntry)object;
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER)
{
IPath path = classpathEntry.getPath();
for (int i = 0; i < size; ++i)
{
IClasspathEntry otherClasspathEntry = get(i);
if (otherClasspathEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER &&
path.equals(otherClasspathEntry.getPath()))
{
return true;
}
}
}
}
return false;
}
};
progressMonitor.beginTask("", 10);
progressMonitor.subTask
(CodeGenEcorePlugin.INSTANCE.getString
("_UI_CreatingEMFProject_message",
new Object [] { projectName, projectLocationURI != null ? projectLocationURI.toString() : projectName }));
IWorkspace workspace = ResourcesPlugin.getWorkspace();
project = workspace.getRoot().getProject(projectName);
// Clean up any old project information.
//
if (!project.exists())
{
URI location = projectLocationURI;
if (location == null)
{
location = URI.createFileURI(workspace.getRoot().getLocation().append(projectName).toOSString());
}
location = location.appendSegment(".project");
File projectFile = new File(location.toString());
if (projectFile.exists())
{
projectFile.renameTo(new File(location.toString() + ".old"));
}
}
IJavaProject javaProject = JavaCore.create(project);
IProjectDescription projectDescription = null;
if (!project.exists())
{
projectDescription = ResourcesPlugin.getWorkspace().newProjectDescription(projectName);
if (projectLocationURI != null)
{
projectDescription.setLocationURI(new java.net.URI(projectLocationURI.toString()));
}
project.create(projectDescription, new SubProgressMonitor(progressMonitor, 1));
project.open(new SubProgressMonitor(progressMonitor, 1));
}
else
{
projectDescription = project.getDescription();
project.open(new SubProgressMonitor(progressMonitor, 1));
if (project.hasNature(JavaCore.NATURE_ID))
{
classpathEntries.addAll(Arrays.asList(javaProject.getRawClasspath()));
}
}
boolean isInitiallyEmpty = classpathEntries.isEmpty();
{
if (referencedProjects.size() != 0 && (style & (EMF_PLUGIN_PROJECT_STYLE | EMF_EMPTY_PROJECT_STYLE)) == 0)
{
projectDescription.setReferencedProjects
(referencedProjects.toArray(new IProject[referencedProjects.size()]));
for (IProject referencedProject : referencedProjects)
{
IClasspathEntry referencedProjectClasspathEntry = JavaCore.newProjectEntry(referencedProject.getFullPath());
classpathEntries.add(referencedProjectClasspathEntry);
}
}
String [] natureIds = projectDescription.getNatureIds();
if (natureIds == null)
{
natureIds =
((style & EMF_GWT_PROJECT_STYLE) == 0 ?
new String [] { JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature" } :
(style & EMF_EDITOR_PROJECT_STYLE) == 0 ?
new String [] { JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature", "com.google.gwt.eclipse.core.gwtNature" } :
new String []
{ JavaCore.NATURE_ID,
"org.eclipse.pde.PluginNature",
"com.google.gwt.eclipse.core.gwtNature",
"com.google.appengine.eclipse.core.gaeNature" });
}
else
{
if (!project.hasNature(JavaCore.NATURE_ID))
{
String [] oldNatureIds = natureIds;
natureIds = new String [oldNatureIds.length + 1];
System.arraycopy(oldNatureIds, 0, natureIds, 0, oldNatureIds.length);
natureIds[oldNatureIds.length] = JavaCore.NATURE_ID;
}
if (!project.hasNature("org.eclipse.pde.PluginNature"))
{
String [] oldNatureIds = natureIds;
natureIds = new String [oldNatureIds.length + 1];
System.arraycopy(oldNatureIds, 0, natureIds, 0, oldNatureIds.length);
natureIds[oldNatureIds.length] = "org.eclipse.pde.PluginNature";
}
if ((style & EMF_GWT_PROJECT_STYLE) != 0 && !project.hasNature("com.google.gwt.eclipse.core.gwtNature"))
{
String [] oldNatureIds = natureIds;
natureIds = new String [oldNatureIds.length + 1];
System.arraycopy(oldNatureIds, 0, natureIds, 0, oldNatureIds.length);
natureIds[oldNatureIds.length] = "com.google.gwt.eclipse.core.gwtNature";
}
if ((style & EMF_GWT_PROJECT_STYLE) != 0 && (style & EMF_EDITOR_PROJECT_STYLE) != 0 && !project.hasNature("com.google.appengine.eclipse.core.gaeNature"))
{
String [] oldNatureIds = natureIds;
natureIds = new String [oldNatureIds.length + 1];
System.arraycopy(oldNatureIds, 0, natureIds, 0, oldNatureIds.length);
natureIds[oldNatureIds.length] = "com.google.appengine.eclipse.core.gaeNature";
}
}
projectDescription.setNatureIds(natureIds);
ICommand [] builders = projectDescription.getBuildSpec();
if (builders == null)
{
builders = new ICommand [0];
}
boolean hasGWTBuilder = false;
int enhancerBuilderIndex = -1;
for (int i = 0; i < builders.length; ++i)
{
if ("org.eclipse.emf.codegen.ecore.GWTBuilder".equals(builders[i].getBuilderName()))
{
hasGWTBuilder = true;
}
if ("com.google.appengine.eclipse.core.enhancerbuilder".equals(builders[i].getBuilderName()))
{
enhancerBuilderIndex = i;
}
}
if ((style & EMF_GWT_PROJECT_STYLE) != 0 && (style & EMF_EDITOR_PROJECT_STYLE) != 0 && !hasGWTBuilder)
{
ICommand [] oldBuilders = builders;
builders = new ICommand [oldBuilders.length + 1];
System.arraycopy(oldBuilders, 0, builders, 0, oldBuilders.length);
builders[oldBuilders.length] = projectDescription.newCommand();
builders[oldBuilders.length].setBuilderName("org.eclipse.emf.codegen.ecore.GWTBuilder");
}
if (enhancerBuilderIndex != -1)
{
ICommand [] oldBuilders = builders;
builders = new ICommand [oldBuilders.length - 1];
System.arraycopy(oldBuilders, 0, builders, 0, enhancerBuilderIndex);
System.arraycopy(oldBuilders, enhancerBuilderIndex + 1, builders, enhancerBuilderIndex, oldBuilders.length - enhancerBuilderIndex - 1);
}
projectDescription.setBuildSpec(builders);
project.setDescription(projectDescription, new SubProgressMonitor(progressMonitor, 1));
IContainer sourceContainer = project;
if (javaSource.segmentCount() > 1)
{
IPath sourceContainerPath = javaSource.removeFirstSegments(1).makeAbsolute();
sourceContainer = project.getFolder(sourceContainerPath);
if (!sourceContainer.exists())
{
for (int i = sourceContainerPath.segmentCount() - 1; i >= 0; i--)
{
sourceContainer = project.getFolder(sourceContainerPath.removeLastSegments(i));
if (!sourceContainer.exists())
{
((IFolder)sourceContainer).create(false, true, new SubProgressMonitor(progressMonitor, 1));
}
}
}
IClasspathEntry sourceClasspathEntry = JavaCore.newSourceEntry(javaSource);
boolean matched = false;
for (Iterator<IClasspathEntry> i = classpathEntries.iterator(); i.hasNext() && !matched; )
{
IClasspathEntry classpathEntry = i.next();
IPath path = classpathEntry.getPath();
if (path.isPrefixOf(javaSource))
{
if (path.equals(javaSource))
{
matched = true;
}
else
{
i.remove();
}
}
}
if (!matched)
{
classpathEntries.add(0, sourceClasspathEntry);
}
}
if (isInitiallyEmpty)
{
IClasspathEntry jreClasspathEntry =
JavaCore.newVariableEntry
(new Path(JavaRuntime.JRELIB_VARIABLE), new Path(JavaRuntime.JRESRC_VARIABLE), new Path(JavaRuntime.JRESRCROOT_VARIABLE));
for (Iterator<IClasspathEntry> i = classpathEntries.iterator(); i.hasNext(); )
{
IClasspathEntry classpathEntry = i.next();
if (classpathEntry.getPath().isPrefixOf(jreClasspathEntry.getPath()))
{
i.remove();
}
}
String jreContainer = JavaRuntime.JRE_CONTAINER;
String complianceLevel = CodeGenUtil.EclipseUtil.getJavaComplianceLevel(project);
if ("1.5".equals(complianceLevel))
{
jreContainer += "/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5";
}
else if (!"1.4".equals(complianceLevel))
{
jreContainer += "/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-" + complianceLevel;
}
classpathEntries.add(JavaCore.newContainerEntry(new Path(jreContainer)));
}
if ((style & EMF_EMPTY_PROJECT_STYLE) == 0)
{
if ((style & EMF_PLUGIN_PROJECT_STYLE) != 0)
{
classpathEntries.add(JavaCore.newContainerEntry(new Path("org.eclipse.pde.core.requiredPlugins")));
if ((style & EMF_GWT_PROJECT_STYLE) != 0)
{
classpathEntries.add(JavaCore.newContainerEntry(new Path("com.google.gwt.eclipse.core.GWT_CONTAINER")));
if ((style & EMF_EDITOR_PROJECT_STYLE) != 0)
{
classpathEntries.add(JavaCore.newContainerEntry(new Path("com.google.appengine.eclipse.core.GAE_CONTAINER")));
}
}
// Remove variables since the plugin.xml should provide the complete path information.
//
for (Iterator<IClasspathEntry> i = classpathEntries.iterator(); i.hasNext(); )
{
IClasspathEntry classpathEntry = i.next();
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_VARIABLE &&
!JavaRuntime.JRELIB_VARIABLE.equals(classpathEntry.getPath().toString()) ||
classpathEntry.getEntryKind() == IClasspathEntry.CPE_PROJECT)
{
i.remove();
}
}
}
else
{
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_CORE_RUNTIME", "org.eclipse.core.runtime");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_CORE_RESOURCES", "org.eclipse.core.resources");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_COMMON", "org.eclipse.emf.common");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_ECORE", "org.eclipse.emf.ecore");
if ((style & EMF_XML_PROJECT_STYLE) != 0)
{
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_ECORE_XMI", "org.eclipse.emf.ecore.xmi");
}
if ((style & EMF_MODEL_PROJECT_STYLE) == 0)
{
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_EDIT", "org.eclipse.emf.edit");
if ((style & EMF_EDIT_PROJECT_STYLE) == 0)
{
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_SWT", "org.eclipse.swt");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_JFACE", "org.eclipse.jface");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_UI_VIEWS", "org.eclipse.ui.views");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_UI_EDITORS", "org.eclipse.ui.editors");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_UI_IDE", "org.eclipse.ui.ide");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "ECLIPSE_UI_WORKBENCH", "org.eclipse.ui.workbench");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_COMMON_UI", "org.eclipse.emf.common.ui");
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_EDIT_UI", "org.eclipse.emf.edit.ui");
if ((style & EMF_XML_PROJECT_STYLE) == 0)
{
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "EMF_ECORE_XMI", "org.eclipse.emf.ecore.xmi");
}
}
}
if ((style & EMF_TESTS_PROJECT_STYLE) != 0)
{
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, "JUNIT", "org.junit");
}
if (pluginVariables != null)
{
for (Iterator<?> i = pluginVariables.iterator(); i.hasNext(); )
{
Object variable = i.next();
if (variable instanceof IClasspathEntry)
{
classpathEntries.add((IClasspathEntry)variable);
}
else if (variable instanceof String)
{
String pluginVariable = (String)variable;
String name;
String id;
int index = pluginVariable.indexOf("=");
if (index == -1)
{
name = pluginVariable.replace('.','_').toUpperCase();
id = pluginVariable;
}
else
{
name = pluginVariable.substring(0, index);
id = pluginVariable.substring(index + 1);
}
CodeGenUtil.EclipseUtil.addClasspathEntries(classpathEntries, name, id);
}
}
}
}
}
javaProject.setRawClasspath
(classpathEntries.toArray(new IClasspathEntry[classpathEntries.size()]),
new SubProgressMonitor(progressMonitor, 1));
}
if (isInitiallyEmpty)
{
javaProject.setOutputLocation
(new Path("/" + javaSource.segment(0) + (((style & EMF_GWT_PROJECT_STYLE) != 0) && ((style & EMF_EDITOR_PROJECT_STYLE) != 0) ? "/war/WEB-INF/classes" : "/bin")),
new SubProgressMonitor(progressMonitor, 1));
}
}
catch (Exception exception)
{
exception.printStackTrace();
CodeGenEcorePlugin.INSTANCE.log(exception);
}
finally
{
progressMonitor.done();
}
return project;
}
public static String findOrCreateContainerHelper
(String rootLocation, String encodedPath, Monitor progressMonitor) throws CoreException
{
int index = encodedPath.indexOf("/./");
if (encodedPath.endsWith("/.") && index != -1)
{
IPath modelProjectLocation = new Path(encodedPath.substring(0, index));
IPath fragmentPath = new Path(encodedPath.substring(index + 3, encodedPath.length() - 2));
IPath projectRelativePath = new Path(modelProjectLocation.lastSegment()).append(fragmentPath);
CodeGenUtil.EclipseUtil.findOrCreateContainer
(projectRelativePath,
true,
modelProjectLocation,
//DMS Why not this?
//new SubProgressMonitor(progressMonitor, 1));
BasicMonitor.toIProgressMonitor(CodeGenUtil.createMonitor(progressMonitor, 1)));
return projectRelativePath.makeAbsolute().toString();
}
else if (rootLocation != null)
{
// Look for a likely plugin name.
//
index = encodedPath.indexOf("/org.");
if (index == -1)
{
index = encodedPath.indexOf("/com.");
}
if (index == -1)
{
index = encodedPath.indexOf("/javax.");
}
if (index != -1)
{
IPath projectRelativePath = new Path(encodedPath.substring(index, encodedPath.length()));
index = encodedPath.indexOf("/", index + 5);
if (index != -1)
{
IPath modelProjectLocation = new Path(rootLocation + "/" + encodedPath.substring(0, index));
CodeGenUtil.EclipseUtil.findOrCreateContainer
(projectRelativePath,
true,
modelProjectLocation,
//DMS Why not this?
//new SubProgressMonitor(progressMonitor, 1));
BasicMonitor.toIProgressMonitor(CodeGenUtil.createMonitor(progressMonitor, 1)));
return projectRelativePath.makeAbsolute().toString();
}
}
}
return encodedPath;
}
}
}
@SuppressWarnings("deprecation")
interface DeprecatedPlatformRunnable extends org.eclipse.core.runtime.IPlatformRunnable
{
// Empty extension to limit the effect of suppressing the deprecation warning.
}