如何以编程方式在第二个工作台中的模型上运行Xpand工作流?
时间:2020-03-06 14:47:02 来源:igfitidea点击:
我有一个Xtext / Xpand(oAW 4.3,Eclipse 3.4)生成器插件,它与编辑器插件一起在另一个工作台中运行。在那里,我想在我创建的模型文件上以编程方式运行Xpand工作流程。如果我使用IFile的绝对路径设置模型文件,例如和:
String dslFile = file.getLocation().makeAbsolute().toOSString();
或者,如果我使用通过以下方式检索的文件URI:
String dslFile = file.getLocationURI().toString();
找不到文件:
org.eclipse.emf.ecore.resource.Resource$IOWrappedException: Resource '/absolute/path/to/my/existing/dsl.file' does not exist. at org.openarchitectureware.xtext.parser.impl.AbstractParserComponent.invokeInternal(AbstractParserComponent.java:55)
我应该在传递给WorkflowRunner的映射中将模型文件属性(dslFile)设置为什么值:
Map properties = new HashMap(); properties.put("modelFile", dslFile);
我还尝试将属性保留为空,并相对于工作流文件(在工作流文件内部)引用模型文件,但这会产生FileNotFoundException。在普通应用程序(而不是第二个工作台)中运行所有这些程序都可以正常工作。
解决方案
我在openArchitectureWare论坛上找到了帮助。基本上使用
properties.put("modelFile", file.getLocation().makeAbsolute().toOSString());
可以,但是我们需要在要调用的工作流中指定通过URI查找:
<component class="org.eclipse.mwe.emf.Reader"> <uri value='${modelFile}'/> <modelSlot value='theModel'/> </component>
对于在这里看东西的人来说,有2件重要的事情... TE将IFLE用作" file.get ....",并且路径的正确语法是" file:/ c:/ myOSbla"。
这是一个示例应用程序Launcher.java(位于默认包中):
import gnu.getopt.Getopt; import gnu.getopt.LongOpt; import java.io.File; import java.io.IOException; import org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher; public class Launcher implements Runnable { // // main program // public static void main(final String[] args) { new Launcher(args).run(); } // // private final fields // private static final String defaultModelDir = "src/main/resources/model"; private static final String defaultTargetDir = "target/generated/pageflow-maven-plugin/java"; private static final String defaultFileEncoding = "UTF-8"; private static final LongOpt[] longopts = new LongOpt[] { new LongOpt("baseDir", LongOpt.REQUIRED_ARGUMENT, new StringBuffer(), 'b'), new LongOpt("modelDir", LongOpt.REQUIRED_ARGUMENT, new StringBuffer(), 'm'), new LongOpt("targetDir", LongOpt.REQUIRED_ARGUMENT, new StringBuffer(), 't'), new LongOpt("encoding", LongOpt.REQUIRED_ARGUMENT, new StringBuffer(), 'e'), new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h'), new LongOpt("verbose", LongOpt.NO_ARGUMENT, null, 'v'), }; private final String[] args; // // public constructors // public Launcher(final String[] args) { this.args = args; } public void run() { final String cwd = System.getProperty("user.dir"); String baseDir = cwd; String modelDir = defaultModelDir; String targetDir = defaultTargetDir; String encoding = defaultFileEncoding; boolean verbose = false; final StringBuffer sb = new StringBuffer(); final Getopt g = new Getopt("pageflow-dsl-generator", this.args, "b:m:t:e:hv;", longopts); g.setOpterr(false); // We'll do our own error handling int c; while ((c = g.getopt()) != -1) switch (c) { case 'b': baseDir = g.getOptarg(); break; case 'm': modelDir = g.getOptarg(); break; case 't': targetDir = g.getOptarg(); break; case 'e': encoding = g.getOptarg(); break; case 'h': printUsage(); System.exit(0); break; case 'v': verbose = true; break; case '?': default: System.out.println("The option '" + (char) g.getOptopt() + "' is not valid"); printUsage(); System.exit(1); break; } String absoluteModelDir; String absoluteTargetDir; try { absoluteModelDir = checkDir(baseDir, modelDir, false, true); absoluteTargetDir = checkDir(baseDir, targetDir, true, true); } catch (final IOException e) { throw new RuntimeException(e.getMessage(), e.getCause()); } if (verbose) { System.err.println(String.format("modeldir = %s", absoluteModelDir)); System.err.println(String.format("targetdir = %s", absoluteTargetDir)); System.err.println(String.format("encoding = %s", encoding)); } Mwe2Launcher.main( new String[] { "workflow.PageflowGenerator", "-p", "modelDir=".concat(absoluteModelDir), "-p", "targetDir=".concat(absoluteTargetDir), "-p", "fileEncoding=".concat(encoding) }); } private void printUsage() { System.err.println("Syntax: [-b <baseDir>] [-m <modelDir>] [-t <targetDir>] [-e <encoding>] [-h] [-v]"); System.err.println("Options:"); System.err.println(" -b, --baseDir project home directory, e.g: /home/workspace/myapp"); System.err.println(" -m, --modelDir default is: ".concat(defaultModelDir)); System.err.println(" -t, --targetDir default is: ".concat(defaultTargetDir)); System.err.println(" -e, --encoding default is: ".concat(defaultFileEncoding)); System.err.println(" -h, --help this help text"); System.err.println(" -v, --verbose verbose mode"); } private String checkDir(final String basedir, final String dir, final boolean create, final boolean fail) throws IOException { final StringBuilder sb = new StringBuilder(); sb.append(basedir).append('/').append(dir); final File f = new File(sb.toString()).getCanonicalFile(); final String absolutePath = f.getAbsolutePath(); if (create) { if (f.isDirectory()) return absolutePath; if (f.mkdirs()) return absolutePath; } else { if (f.isDirectory()) return absolutePath; } if (!fail) return null; throw new IOException(String.format("Failed to locate or create directory %s", absolutePath)); } private String checkFile(final String basedir, final String file, final boolean fail) throws IOException { final StringBuilder sb = new StringBuilder(); sb.append(basedir).append('/').append(file); final File f = new File(sb.toString()).getCanonicalFile(); final String absolutePath = f.getAbsolutePath(); if (f.isFile()) return absolutePath; if (!fail) return null; throw new IOException(String.format("Failed to find or locate directory %s", absolutePath)); } }
...这是它的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.vaadin</groupId> <artifactId>pageflow-dsl-generator</artifactId> <version>0.1.0-SNAPSHOT</version> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <index>true</index> <manifest> <mainClass>Launcher</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>urbanophile</groupId> <artifactId>java-getopt</artifactId> <version>1.0.9</version> </dependency> </dependencies> </project>
不幸的是,这个pom.xml并不打算打包(至少现在还没有)。
有关包装的说明,请参阅
连结文字
玩得开心 :)
理查德·戈麦斯