كيفية تشغيل سير عمل Xpand برمجياً على نموذج في طاولة عمل ثانية؟
سؤال
لدي مكون إضافي للمولد 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)
إلى أي قيمة يجب أن أقوم بتعيين سمة ملف النموذج (dslFile) في الخريطة التي أسلمها إلى WorkflowRunner:
Map properties = new HashMap();
properties.put("modelFile", dslFile);
لقد حاولت أيضًا ترك الخصائص فارغة والإشارة إلى ملف النموذج المتعلق بملف سير العمل (داخل ملف سير العمل)، ولكن هذا يؤدي إلى FileNotFoundException.تشغيل كل هذا في تطبيق عادي (وليس في طاولة عمل ثانية) يعمل بشكل جيد.
المحلول 2
لقد وجدت المساعدة في منتدى openArchitectureWare.باستخدام أساسا
properties.put("modelFile", file.getLocation().makeAbsolute().toOSString());
يعمل، ولكن عليك تحديد البحث عنه عبر URI في سير العمل الذي تتصل به:
<component class="org.eclipse.mwe.emf.Reader">
<uri value='${modelFile}'/>
<modelSlot value='theModel'/>
</component>
نصائح أخرى
شيئان مهمان للأشخاص الذين يبحثون هنا... استخدم 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 هذا لتجميعه (على الأقل ليس بعد).للحصول على تعليمات بخصوص التغليف، قم بإلقاء نظرة علىنص الرابط
استمتع :)
ريتشارد جوميز