Como executar programaticamente um fluxo de trabalho Xpand em um modelo em uma segunda bancada?

StackOverflow https://stackoverflow.com/questions/139525

Pergunta

I têm um Xtext / Xpand (OAW 4,3, Eclipse 3,4) plug-in gerador, que corro em conjunto com o editor plug-in, em uma segunda bancada. Lá, eu gostaria de executar Xpand fluxos de trabalho programaticamente no arquivo modelo que eu criar. Se eu definir o arquivo de modelo usando o caminho absoluto do IFile eu tenho, por exemplo, com:

String dslFile = file.getLocation().makeAbsolute().toOSString();

Ou se eu usar um arquivo URI recuperado com:

String dslFile = file.getLocationURI().toString();

O arquivo não for encontrado:

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)

Para que valor devo definir o atributo de arquivo de modelo (dslFile) na mão mapa I do WorkflowRunner:

Map properties = new HashMap();
properties.put("modelFile", dslFile);

Eu também tentei deixando os imóveis vazios e referenciando o arquivo de modelo relativo ao arquivo de fluxo de trabalho (dentro do arquivo de fluxo de trabalho), mas que produz um FileNotFoundException. Correndo tudo isso em um aplicativo normal (não em uma segunda bancada) multa funciona.

Foi útil?

Solução 2

Eu encontrei ajuda no openArchitectureWare fórum . Basicamente usando

properties.put("modelFile", file.getLocation().makeAbsolute().toOSString());

obras, mas você precisa especificar olhando-o via URI no fluxo de trabalho que você está chamando:

<component class="org.eclipse.mwe.emf.Reader">
    <uri value='${modelFile}'/>
    <modelSlot value='theModel'/>
</component>

Outras dicas

2 coisas importantes para as pessoas olhando aqui ... o TE usado um rifle para o "file.get ....", e a sintaxe correta para caminhos é "file: / c: / myOSbla".

Este é um exemplo de aplicativo Launcher.java (sentado no pacote padrão):

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));
    }

}

... e esta é a sua 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>

Infelizmente, este pom.xml não se destina a empacotá-lo (ainda não, pelo menos). Para instruções sobre a embalagem, ter um olhar para texto do link

Divirta-se:)

Richard Gomes

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top