/*
* Created on Apr 30, 2005
*
*/
package tefkat.antTask;
import java.io.File;
import java.io.IOException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import tefkat.config.TefkatConfig.ExecutionMode;
import tefkat.config.TefkatConfig.Model;
import tefkat.config.TefkatConfig.TefkatConfigFactory;
import tefkat.config.TefkatConfig.TransformationTask;
import tefkat.engine.Tefkat;
import tefkat.model.TefkatException;
import tefkat.model.parser.TefkatResourceFactory;
/**
* This class implements an Ant task for running Tefkat.
*
* When complete it will support specification of all parameters currently
* supported by the config file tefkat.xmi :
* <ul>
* <li>transformation URI</li>
* <li>source model URIs</li>
* <li>target model URIs</li>
* <li>trace model URI</li>
* <li>mode: REPLACE/UPDATE</li>
* <li>URI maps</li>
* </ul>
*
* @author lawley
*/
public class TefkatTask extends Task {
private static URI currentDir = URI.createFileURI(System.getProperty("user.dir") + File.separator);
static {
System.err.println("CWD: " + currentDir);
URI uri = URI.createFileURI("file.qvt");
System.err.println(uri);
System.err.println(uri.resolve(currentDir));
// System.err.println(currentDir.resolve(uri));
}
private TransformationTask task;
private boolean save;
private boolean force;
/**
*
*/
public TefkatTask() {
super();
URIConverter.URI_MAP.put(URI.createURI("platform:/resource/"), currentDir);
}
public void execute() throws BuildException {
// super.execute();
Tefkat engine = new Tefkat();
try {
engine.registerFactory("qvt", new TefkatResourceFactory());
engine.transform(task, save, force);
} catch (IOException e) {
e.printStackTrace();
throw new BuildException(e);
} catch (TefkatException e) {
e.printStackTrace();
throw new BuildException(e);
} catch (RuntimeException e) {
e.printStackTrace();
throw new BuildException(e);
}
}
public void init() {
task = TefkatConfigFactory.eINSTANCE.createTransformationTask();
task.setEnabled(true);
}
public void setSave(boolean doSave) {
save = doSave;
}
public void setForce(boolean doForce) {
force = doForce;
}
public void setTransformation(String str) {
System.out.println("setTransformation: " + str);
Model model = TefkatConfigFactory.eINSTANCE.createModel();
model.setLocationUri(resolveUriStr(str));
task.setTransformation(model);
}
public void setTraceURI(String str) {
System.out.println("setTraceURI: " + str);
Model model = TefkatConfigFactory.eINSTANCE.createModel();
model.setLocationUri(resolveUriStr(str));
task.setTrace(model);
}
public void setMode(Mode mode) {
System.out.println("setMode: " + mode.getValue() + "\t" + ExecutionMode.get(mode.getValue()));
task.setMode(ExecutionMode.get(mode.getValue()));
}
public void addSrc(Location location) {
System.out.println("addSrc: " + location + "\t" + location.getClass().getSimpleName());
task.getSourceModels().add(location.getModel());
}
public void addTgt(Location location) {
System.out.println("addTgt: " + location);
task.getTargetModels().add(location.getModel());
}
private static String resolveUriStr(String input) {
System.err.println("input: " + input);
final URI uri = URI.createURI(input);
System.err.println("uri: " + uri);
final String result;
System.err.println("1 " + currentDir+"\t: " + uri);
System.err.println(uri.resolve(currentDir));
if (uri.hasRelativePath() || true) {
result = uri.resolve(currentDir).toString();
} else {
result = input;
}
System.err.println("2 " + input+"\t: " + result);
return result;
}
public static class Mode extends EnumeratedAttribute {
public String[] getValues() {
return new String[] {"REPLACE", "UPDATE"};
}
}
public static class Location {
private Model model = TefkatConfigFactory.eINSTANCE.createModel();
public Location() {
}
public void setURI(String str) {
System.out.println("setUri: " + str);
model.setLocationUri(resolveUriStr(str));
}
public void setVarGroup(String str) {
model.setVarGroup(str);
}
Model getModel() {
return model;
}
}
}