2008-09-26 18 views
1

J'ai un plug-in générateur Xtext/Xpand (oAW 4.3, Eclipse 3.4), que je cours avec le plug-in éditeur dans un second atelier. Là, je voudrais exécuter des flux de travail Xpand par programme sur le fichier de modèle que je crée. Si je définis le fichier de modèle en utilisant le chemin absolu du IFile que j'ai, par ex. avec:Comment faire pour exécuter par programme un flux de travail Xpand sur un modèle dans un deuxième atelier?

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

Ou si j'utilise un URI fichier récupéré avec:

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

Le fichier est introuvable:

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) 

Pour quelle valeur dois-je définir l'attribut de fichier modèle (dslFile) dans la carte que je remets au WorkflowRunner:

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

J'ai également essayé de laisser les propriétés vides et de référencer le fichier modèle par rapport au fichier de flux de travail (dans le fichier de flux de travail), mais cela génère une exception FileNotFoundException. Exécution de tout cela dans une application normale (pas dans un deuxième atelier) fonctionne bien.

Répondre

0

J'ai trouvé de l'aide au openArchitectureWare forum. Fondamentalement, l'utilisation

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

fonctionne, mais vous devez spécifier le regardant via URI dans le flux de travail que vous appelez:

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

2 choses importantes pour les gens qui cherchent ici ... TE utilisé une IFLE pour "file.get ....", et la syntaxe correcte pour les chemins est "file:/c:/myOSbla".

+0

Désolé, mais je ne complètement votre point. –

0

C'est un exemple d'application Launcher.java (assis dans le package par défaut):

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

} 

... et c'est son 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> 

Malheureusement , ce pom.xml n'est pas destiné à l'empaqueter (pas encore, au moins). Pour obtenir des instructions concernant l'emballage, jetez un oeil à link text

Amusez-vous bien :)

Richard Gomes