/**
* Copyright (c) 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.importer.java.taskdefs;
import java.io.File;
import java.util.List;
import org.apache.tools.ant.BuildException;
import org.eclipse.emf.ant.taskdefs.codegen.ecore.GeneratorTask;
import org.eclipse.emf.common.CommonPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.importer.java.JavaImporter;
import org.eclipse.emf.importer.java.JavaImporterApplication;
/**
* <p>
* Generates source code from models specified using <b>Annotated Java</b>. Exposes some
* functionalities available on the {@link org.eclipse.emf.importer.java.JavaImporterApplication}
* class - check its <tt>printUsage()</tt> method for detailed information on the arguments
* you can use with this task.
* </p>
* <p>
* This task is supposed to be executed by a Eclipse driver with the
* <b>org.eclipse.emf.ant</b> plugin. It is neither necessary to use Ant's task
* <tt>TaskDef</tt> to declare this task in a script nor to change the Ant's runtime
* classpath.
* </p>
* <p>
* The following command line will start a headless Eclipse instance and run the specified
* Ant script.
* </p>
* <p>
* <i>eclipseDir</i>/eclipse
* -noSplash
* -data <i>worspaceDir</i>
* -application org.eclipse.ant.core.antRunner
* -buildfile <i>antScript</i>
* </p>
* <p>In Windows you should execute <i>eclipsec</i> instead of <i>eclipse</i> in order to have
* access to the Ant build script console output.</p>
* <p>You can also use the Eclipse UI to execute an Ant script containing this task by right-clicking the script and selecting
* <i>Run As > Ant Build... > JRE > "Run in the same JRE as the workspace"</i>.</p>
*
* <p>
* Usage example:
* </p>
* <pre>
* <emf.Java2Java genModel="/lib/emf/lib.genmodel">
* </pre>
* <pre>
* <emf.Java2Java genModelPath="/lib/model/lib.genmodel"
* modelProject="c:/lib"
* <arg line="-packages http://www.example.eclipse.org/Library"/>
* </emf.Ecore2Java>
* </pre>
*
* <p>Different than the other EMF Generator tasks, this one requires the model
* specification files, Annotated Java, to be located in a workspace Java project. The
* <tt>genModelPath</tt> attribute should be used to indicated the workspace absolute path
* of the GenModel. Also, if the genModel's project doesn't exist in the workspace (indicated by
* <tt>workspaceDir</tt> in the command line above), the <tt>modelProject</tt> attribute should
* be used to indicate the model's location. This directory should contain all the Eclipse's necessary
* files (such as ".project" and ".classpath") to define this project as a valid Java project.
* </p>
* <p>Also, the following attributes cannot be used within this task:
* <ul>
* <li>model</li>
* <li>genModel</li>
* <li>modelProjectFragmentPath</li>
* </ul>
* </p>
*
* @since 2.3.0
*/
public class JavaGeneratorTask extends GeneratorTask
{
protected String genModelPath;
protected JavaImporter javaImporter;
@Override
public void setModel(File model)
{
throw new BuildException("The 'model' attribute cannot be used in this task.");
}
@Override
public void setGenModel(File genModel)
{
throw new BuildException("The 'genModel' attribute cannot be used in this task.");
}
@Override
public void setModelProjectFragmentPath(String modelProjectFragmentPath)
{
throw new BuildException("The 'modelProjectFragmentPath' attribute cannot be used in this task.");
}
public void setGenModelPath(String genModelPath)
{
this.genModelPath = genModelPath;
}
@Override
protected void createGenModel(String[] arguments) throws Exception
{
JavaImporterApplication application = new JavaImporterApplication();
javaImporter = application.getJavaImporter();
application.run(getProgressMonitor(), arguments);
}
@Override
protected void checkAttributes() throws BuildException
{
assertTrue("The 'genModelPath' attribute must be specified.", genModelPath != null);
assertTrue("The specifed 'templatePath' attribute is not a valid directory.", templatePath == null || templatePath.isDirectory());
}
@Override
protected void addGenModelPathArgument()
{
if (genModelPath != null)
{
getCommandline().createArgument(true).setValue(genModelPath);
if (reconcileGenModel == GENMODEL_RELOAD)
{
getCommandline().createArgument().setValue("-reload");
}
}
}
@Override
protected List<String> getGeneratorArguments()
{
URI genModelURI = CommonPlugin.asLocalURI(javaImporter.getGenModel().eResource().getURI());
genModel = new File(genModelURI.toFileString());
return super.getGeneratorArguments();
}
}