/** * 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.ant.taskdefs.codegen; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; import java.io.Writer; import org.apache.tools.ant.BuildException; import org.eclipse.emf.codegen.jet.JETCompiler; import org.eclipse.emf.codegen.jet.JETException; import org.eclipse.emf.codegen.jet.JETSkeleton; /** * <p> * Exposes some functionalities available on the * {@link org.eclipse.emf.codegen.jet.JETCompiler JETCompiler} class. * </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> * <p> * Usage examples: * </p> * <pre> * <emf.JETCompiler templateURI="http://www.example.com/jetTemplate.javajet"/> * </pre> * <pre> * <emf.JETCompiler templateFile="jetTemplate.javajet"/> * </pre> * <pre> * <emf.JETCompiler templateURI="d:\templates\jetTemplate.txtjet" * newFile="c:\output.txt"/> * </pre> * * @since 2.3.0 */ public class JETCompilerTask extends JETTask { protected static final String DEFAULT_EXTENSION = ".java"; protected String encoding; protected File sourceDirectory; public void setSourceDirectory(File sourceDirectory) { this.sourceDirectory = sourceDirectory; } public void setEncoding(String encoding) { this.encoding = encoding; } @Override protected void checkAttributes() throws BuildException { assertTrue("Either the 'newFile' or 'sourceDirectory' attributes must be specified.", newFile != null || sourceDirectory != null); if (sourceDirectory != null) { assertTrue("The sourceDirectory must be an existing directory", sourceDirectory.isDirectory()); } } @Override protected void doExecute() throws Exception { invokeCompiler(createJETCompiler()); } protected JETCompiler createJETCompiler() throws JETException { JETCompiler compiler = new JETCompiler(getTemplateURIAsString(), encoding); return compiler; } protected void invokeCompiler(JETCompiler compiler) throws JETException, IOException, InstantiationException, IllegalAccessException { compiler.parse(); Writer writer = newFile != null ? new FileWriter(newFile) : new StringWriter(); compiler.generate(writer); if (newFile == null) { JETSkeleton skeleton = compiler.getSkeleton(); if (skeleton != null) { String fileName = skeleton.getClassName(); if (fileName != null) { if (!fileName.endsWith(DEFAULT_EXTENSION) && fileName.indexOf('.') < 0) { fileName = fileName + DEFAULT_EXTENSION; } String packageDirectory = skeleton.getPackageName(); newFile = packageDirectory != null ? new File(sourceDirectory, packageDirectory.replace('.', '/') + "/" + fileName) : new File(sourceDirectory, fileName); newFile.getParentFile().mkdirs(); String contents = ((StringWriter)writer).getBuffer().toString(); OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(newFile)); try { outputStream.write(encoding == null ? contents.getBytes() : contents.getBytes(encoding)); return; } finally { outputStream.close(); } } } throw new BuildException("Unable to save the file. Try the scrip again specifying the 'newFile' attribute."); } } }