You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2015/03/22 16:07:59 UTC

svn commit: r1668386 - in /uima/ruta/trunk: ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/ ruta-core/src/main/java/org/apache/uima/ruta/descriptor/ ruta-ep-engine/ ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/ ruta-ep-ide/sr...

Author: pkluegl
Date: Sun Mar 22 15:07:59 2015
New Revision: 1668386

URL: http://svn.apache.org/r1668386
Log:
UIMA-3327
- moved and renamed descriptor building

Added:
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaBuildOptions.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorBuilder.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorInformation.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/StringTriple.java
Removed:
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/DescriptorManager.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuildOptions.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaSimpleBuilder.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/StringTriple.java
Modified:
    uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/ruta/trunk/ruta-ep-engine/pom.xml
    uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java
    uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaModuleDeclaration.java

Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1668386&r1=1668385&r2=1668386&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Sun Mar 22 15:07:59 2015
@@ -54,6 +54,7 @@ import org.apache.uima.resource.metadata
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.UimaContext;
 
+import org.apache.uima.ruta.descriptor.*;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.action.ActionFactory;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
@@ -102,6 +103,18 @@ private String namespace;
 private String moduleName;
 private ResourceManager resourceManager;
 private UimaContext context;
+
+private RutaDescriptorInformation descInfo;
+
+
+public void setDescriptorInformation(RutaDescriptorInformation descInfo) {
+  this.descInfo = descInfo;  
+}
+
+public RutaDescriptorInformation getDescriptorInformation() {
+  return descInfo;
+}
+
 public void setResourceManager(ResourceManager resourceManager) {
   this.resourceManager = resourceManager;  
 }
@@ -205,7 +218,8 @@ public void setExternalFactory(RutaExter
 	    if (!type.contains(".")) {
 	        resolvedType = namespace + "." + moduleName + "." + type;
 	    }
-        parent.getEnvironment().declareType(resolvedType);
+            parent.getEnvironment().declareType(resolvedType);
+            
 	}
 	
 	public boolean isType(RutaBlock parent, String type) {

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaBuildOptions.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaBuildOptions.java?rev=1668386&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaBuildOptions.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaBuildOptions.java Sun Mar 22 15:07:59 2015
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.descriptor;
+
+import java.util.List;
+
+public class RutaBuildOptions {
+
+  private final List<String> language;
+
+  private final List<String> engines;
+
+  private boolean importByName = false;
+
+  private boolean resolveImports = false;
+
+  private boolean errorOnDuplicateShortNames;
+
+  public RutaBuildOptions(List<String> language, List<String> engines) {
+    super();
+    this.language = language;
+    this.engines = engines;
+  }
+
+  public List<String> getLanguage() {
+    return language;
+  }
+
+  public List<String> getEngines() {
+    return engines;
+  }
+
+  public void setImportByName(boolean importByName) {
+    this.importByName = importByName;
+  }
+
+  public boolean isImportByName() {
+    return importByName;
+  }
+
+  public void setResolveImports(boolean resolveImports) {
+    this.resolveImports = resolveImports;
+  }
+
+  public boolean isResolveImports() {
+    return resolveImports;
+  }
+
+  public void setErrorOnDuplicateShortNames(boolean error) {
+    this.errorOnDuplicateShortNames = error;
+  }
+
+  public boolean isErrorOnDuplicateShortNames() {
+    return errorOnDuplicateShortNames;
+  }
+
+}

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorBuilder.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorBuilder.java?rev=1668386&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorBuilder.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorBuilder.java Sun Mar 22 15:07:59 2015
@@ -0,0 +1,505 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.descriptor;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.uima.ResourceSpecifierFactory;
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.TypeSystem;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.impl.ResourceManager_impl;
+import org.apache.uima.resource.metadata.Capability;
+import org.apache.uima.resource.metadata.ConfigurationParameterSettings;
+import org.apache.uima.resource.metadata.FsIndexDescription;
+import org.apache.uima.resource.metadata.Import;
+import org.apache.uima.resource.metadata.TypeDescription;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.resource.metadata.impl.Import_impl;
+import org.apache.uima.ruta.UIMAConstants;
+import org.apache.uima.ruta.engine.RutaEngine;
+import org.apache.uima.util.CasCreationUtils;
+import org.apache.uima.util.InvalidXMLException;
+import org.apache.uima.util.XMLInputSource;
+import org.apache.uima.util.XMLSerializer;
+import org.apache.uima.util.XMLizable;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+public class RutaDescriptorBuilder {
+
+  private static ResourceSpecifierFactory uimaFactory = UIMAFramework.getResourceSpecifierFactory();
+
+  private TypeSystemDescription typeSystemDescription;
+
+  private AnalysisEngineDescription analysisEngineDescription;
+
+  private final String defaultTypeSystem;
+
+  private ResourceManager rm;
+
+  public RutaDescriptorBuilder(String defaultTypeSystem, String defaultEngine)
+          throws InvalidXMLException, IOException {
+    super();
+    this.defaultTypeSystem = defaultTypeSystem;
+    initialize(defaultEngine);
+  }
+
+  private void initialize(String defaultEngine) throws InvalidXMLException, IOException {
+    typeSystemDescription = uimaFactory.createTypeSystemDescription();
+    analysisEngineDescription = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(
+            new XMLInputSource(new File(defaultEngine)));
+
+  }
+
+  public void build(RutaDescriptorInformation desc, String typeSystemOutput, String engineOutput,
+          RutaBuildOptions option, String mainScript, String[] scriptPaths, String[] enginePaths,
+          ClassLoader classloader) throws SAXException, InvalidXMLException,
+          IOException, ResourceInitializationException, URISyntaxException {
+
+    rm = new ResourceManager_impl(classloader);
+    String dataPath = "";
+    for (String string : enginePaths) {
+      dataPath += string + File.pathSeparator;
+    }
+    rm.setDataPath(dataPath);
+
+    Map<String, String> typeNameMap = new HashMap<String, String>();
+    Capability capability = uimaFactory.createCapability();
+    // String defaultTypeSystem2 = defaultTypeSystem.replaceAll("/", "\\\\");
+    File defaultTypeSystemFile = new File(defaultTypeSystem);
+    if (!defaultTypeSystemFile.exists()) {
+      System.out.println("Does not exist: " + defaultTypeSystemFile.getName());
+    }
+    TypeSystemDescription initialTypeSystem = UIMAFramework.getXMLParser()
+            .parseTypeSystemDescription(new XMLInputSource(defaultTypeSystemFile));
+    CAS cas = CasCreationUtils.createCas(initialTypeSystem, null, new FsIndexDescription[0]);
+    fillTypeNameMap(typeNameMap, cas.getTypeSystem());
+    cas.release();
+    List<TypeSystemDescription> toInclude = new ArrayList<TypeSystemDescription>();
+    List<Import> importList = new ArrayList<Import>();
+    Import_impl import_impl = new Import_impl();
+    if (option.isImportByName()) {
+      String name = initialTypeSystem.getName();
+      import_impl.setName(name);
+    } else if (option.isResolveImports()) {
+      String absoluteLocation = initialTypeSystem.getSourceUrlString();
+      import_impl.setLocation(absoluteLocation);
+    } else {
+      String relativeLocation = getRelativeLocation(defaultTypeSystemFile.toURI(),
+              typeSystemOutput);
+      import_impl.setLocation(relativeLocation);
+    }
+    importList.add(import_impl);
+    for (String eachName : desc.getImportedTypeSystems()) {
+      String locate = RutaEngine.locate(eachName, enginePaths, ".xml");
+      URL url = null;
+      boolean include = false;
+      if (locate != null) {
+        File file = new File(locate);
+        url = file.toURI().toURL();
+      }
+      if (url == null) {
+        url = checkImportExistence(eachName, "xml", classloader);
+        include = true;
+        if (url == null) {
+          throw new FileNotFoundException("Build process can't find " + eachName + " in "
+                  + mainScript);
+        }
+      }
+      TypeSystemDescription each = getTypeSystemDescriptor(url, option);
+      if (each != null) {
+        fillTypeNameMap(typeNameMap, each);
+        if (include) {
+          // need to include the complete type system because an import is not possible
+          each.resolveImports(rm);
+          toInclude.add(each);
+        } else {
+          import_impl = new Import_impl();
+          if (option.isImportByName()) {
+            import_impl.setName(eachName);
+          } else if (option.isResolveImports()) {
+            String absoluteLocation = each.getSourceUrlString();
+            import_impl.setLocation(absoluteLocation);
+          } else {
+            String relativeLocation = getRelativeLocation(url.toURI(), typeSystemOutput);
+            File parentFile = new File(typeSystemOutput).getParentFile();
+            File targetFile = new File(parentFile, relativeLocation);
+            boolean ableToFindFile = targetFile.exists();
+            if (!ableToFindFile) {
+              // hotfix for different partitions making trouble for the relative path
+              import_impl.setName(eachName);
+            } else {
+              import_impl.setLocation(relativeLocation);
+            }
+          }
+          importList.add(import_impl);
+        }
+      } else {
+        throw new FileNotFoundException("Build process can't find " + eachName + " in "
+                + mainScript);
+      }
+    }
+    for (String eachName : desc.getImportedScripts()) {
+      // TODO
+      String locate = RutaEngine.locate(eachName, enginePaths, "TypeSystem.xml");
+      File file = new File(locate);
+      URL url = file.toURI().toURL();
+      TypeSystemDescription each = getTypeSystemDescriptor(url, option);
+      if (each != null) {
+        fillTypeNameMap(typeNameMap, each);
+        import_impl = new Import_impl();
+        if (option.isImportByName()) {
+          import_impl.setName(eachName + "TypeSystem");
+        } else if (option.isResolveImports()) {
+          String absoluteLocation = each.getSourceUrlString();
+          import_impl.setLocation(absoluteLocation);
+        } else {
+          String relativeLocation = getRelativeLocation(file.toURI(), typeSystemOutput);
+          import_impl.setLocation(relativeLocation);
+        }
+        importList.add(import_impl);
+      } else {
+        throw new FileNotFoundException("Build process can't find " + eachName + " in "
+                + mainScript);
+      }
+    }
+    typeSystemDescription = CasCreationUtils.mergeTypeSystems(toInclude, rm);
+    Import[] newImports = importList.toArray(new Import[0]);
+    typeSystemDescription.setImports(newImports);
+    if (option.isResolveImports()) {
+        typeSystemDescription.resolveImports(rm);
+    }
+
+    // TODO hotfixes: where do I get the final types??
+    Set<String> finalTypes = new HashSet<String>();
+    finalTypes.addAll(Arrays.asList(new String[] { "uima.cas.Boolean", "uima.cas.Byte",
+        "uima.cas.Short", "uima.cas.Integer", "uima.cas.Long", "uima.cas.Float", "uima.cas.Double",
+        "uima.cas.BooleanArray", "uima.cas.ByteArray", "uima.cas.ShortArray",
+        "uima.cas.IntegerArray", "uima.cas.LongArray", "uima.cas.FloatArray",
+        "uima.cas.DoubleArray", "uima.cas.StringArray", "uima.cas.FSArray" }));
+
+    int typeIndex = 0;
+    for (String eachType : desc.getTypeShortNames()) {
+      StringTriple typeTriple = desc.getTypeTriples().get(typeIndex);
+      typeTriple = resolveType(typeTriple, typeNameMap, mainScript);
+      if (typeSystemDescription.getType(typeTriple.getName()) != null) {
+        continue;
+      }
+      if (!finalTypes.contains(typeTriple.getParent())) {
+        TypeDescription newType = typeSystemDescription.addType(typeTriple.getName(),
+                typeTriple.getDescription(), typeTriple.getParent());
+        capability.addInputType(typeTriple.getName(), false);
+        capability.addOutputType(typeTriple.getName(), false);
+        Collection<StringTriple> collection = desc.getFeatures().get(eachType);
+        if (collection != null) {
+          for (StringTriple eachFeature : collection) {
+            eachFeature = resolveFeature(eachFeature, typeNameMap);
+            newType.addFeature(eachFeature.getName(), eachFeature.getDescription(),
+                    eachFeature.getParent());
+            // capability.addInputFeature(eachFeature.getName());
+            // capability.addOutputFeature(eachFeature.getName());
+          }
+        }
+      }
+      typeIndex++;
+    }
+
+    Set<String> names = new HashSet<String>();
+    Collection<TypeDescription> types = new HashSet<TypeDescription>();
+    for (TypeDescription each : typeSystemDescription.getTypes()) {
+      String name = each.getName();
+      if (!names.contains(name)) {
+        names.add(name);
+        types.add(each);
+      }
+    }
+
+    File typeSystemFile = getFile(typeSystemOutput);
+    TypeDescription[] presentTypes = typeSystemDescription.getTypes();
+
+    types.addAll(Arrays.asList(presentTypes));
+    typeSystemDescription.setTypes(types.toArray(new TypeDescription[0]));
+    typeSystemDescription.setName(mainScript + "TypeSystem");
+    typeSystemDescription.setSourceUrl(typeSystemFile.toURI().toURL());
+    TypeSystemDescription aets = uimaFactory.createTypeSystemDescription();
+    import_impl = new Import_impl();
+    if (option.isImportByName()) {
+      import_impl.setName(typeSystemDescription.getName());
+    } else {
+      String relativeLocation = getRelativeLocation(new File(engineOutput).toURI(), typeSystemOutput);
+      import_impl.setLocation(relativeLocation);
+    }
+
+    File engineFile = configureEngine(desc, engineOutput, option, mainScript, scriptPaths,
+            enginePaths, capability, import_impl, aets);
+
+    toFile(typeSystemDescription, typeSystemFile);
+    toFile(analysisEngineDescription, engineFile);
+  }
+
+  private void fillTypeNameMap(Map<String, String> typeNameMap, TypeSystem typeSystem) {
+    Iterator<Type> typeIterator = typeSystem.getTypeIterator();
+    while (typeIterator.hasNext()) {
+      Type type = (Type) typeIterator.next();
+      String shortName = type.getShortName();
+      String name = type.getName();
+      typeNameMap.put(shortName, name);
+    }
+  }
+
+  private boolean fillTypeNameMap(Map<String, String> typeNameMap, TypeSystemDescription desc) {
+    boolean contained = false;
+    for (TypeDescription each : desc.getTypes()) {
+      String name = each.getName();
+      int lastIndexOf = name.lastIndexOf(".");
+      String shortName = name.substring(lastIndexOf + 1, name.length());
+      typeNameMap.put(shortName, name);
+    }
+    return contained;
+  }
+
+  private StringTriple resolveFeature(StringTriple eachFeature, Map<String, String> types) {
+    String parent = eachFeature.getParent();
+    String name = eachFeature.getName();
+    parent = translate(parent);
+    if (parent.indexOf(".") == -1 && types.containsKey(parent)) {
+      parent = types.get(parent);
+    }
+    return new StringTriple(name, eachFeature.getDescription(), parent);
+  }
+
+  private StringTriple resolveType(StringTriple typeTriple, Map<String, String> types,
+          String packageName) {
+    String parent = typeTriple.getParent();
+    String name = typeTriple.getName();
+    if (parent == null) {
+      parent = "uima.tcas.Annotation";
+    }
+    parent = translate(parent);
+    name = translate(name);
+    if (parent.indexOf(".") == -1 && types.containsKey(parent)) {
+      parent = types.get(parent);
+    }
+    if (name.indexOf(".") == -1) {
+      if (types.containsKey(name)) {
+        name = types.get(name);
+      } else {
+        name = packageName + "." + name;
+      }
+    }
+    int lastIndexOf = name.lastIndexOf(".");
+    String shortName = name.substring(lastIndexOf + 1, name.length());
+    types.put(shortName, name);
+    return new StringTriple(name, typeTriple.getDescription(), parent);
+  }
+
+  private String translate(String name) {
+    if (name == null) {
+      return null;
+    }
+    if (name.equals("Annotation")) {
+      return "uima.tcas.Annotation";
+    } else if (name.equals("STRING")) {
+      return UIMAConstants.TYPE_STRING;
+    } else if (name.equals("INT")) {
+      return UIMAConstants.TYPE_INTEGER;
+    } else if (name.equals("DOUBLE")) {
+      return UIMAConstants.TYPE_DOUBLE;
+    } else if (name.equals("FLOAT")) {
+      return UIMAConstants.TYPE_FLOAT;
+    } else if (name.equals("BOOLEAN")) {
+      return UIMAConstants.TYPE_BOOLEAN;
+    } else if (name.equals("TYPE")) {
+      return UIMAConstants.TYPE_STRING;
+    }
+    return name;
+  }
+
+  private File configureEngine(RutaDescriptorInformation desc, String engineOutput,
+          RutaBuildOptions option, String mainScript, String[] scriptPaths,
+          String[] descriptorPaths, Capability capability, Import_impl import_impl,
+          TypeSystemDescription aets) throws MalformedURLException {
+    aets.setImports(new Import[] { import_impl });
+    analysisEngineDescription.getAnalysisEngineMetaData().setTypeSystem(aets);
+    File file = getFile(engineOutput);
+    analysisEngineDescription.setSourceUrl(file.toURI().toURL());
+
+    if (!desc.getTypeShortNames().isEmpty()) {
+      Capability[] capabilities = analysisEngineDescription.getAnalysisEngineMetaData()
+              .getCapabilities();
+      Capability[] newArray = new Capability[capabilities.length + 1];
+      System.arraycopy(capabilities, 0, newArray, 0, capabilities.length);
+      newArray[capabilities.length] = capability;
+      analysisEngineDescription.getAnalysisEngineMetaData().setCapabilities(newArray);
+    }
+
+    analysisEngineDescription.getAnalysisEngineMetaData().getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_MAIN_SCRIPT, mainScript);
+    analysisEngineDescription.getAnalysisEngineMetaData().getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_SCRIPT_PATHS, scriptPaths);
+    analysisEngineDescription.getAnalysisEngineMetaData().getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_DESCRIPTOR_PATHS, descriptorPaths);
+    String[] parameterValue = (String[]) analysisEngineDescription.getAnalysisEngineMetaData()
+            .getConfigurationParameterSettings().getParameterValue(RutaEngine.PARAM_RESOURCE_PATHS);
+    Set<String> resourceLocations = new HashSet<String>();
+
+    if (parameterValue != null && parameterValue.length != 0) {
+      resourceLocations.addAll(Arrays.asList(parameterValue));
+    }
+    for (String string : descriptorPaths) {
+      File descDir = new File(string);
+      File defaultResourceDir = new File(descDir.getParent(),
+              "resources");
+      resourceLocations.add(defaultResourceDir.getAbsolutePath());
+    }
+    analysisEngineDescription
+            .getAnalysisEngineMetaData()
+            .getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_RESOURCE_PATHS,
+                    resourceLocations.toArray(new String[0]));
+
+    String[] additionalScriptsArray = desc.getImportedScripts().toArray(new String[] {});
+    analysisEngineDescription.getAnalysisEngineMetaData().getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_ADDITIONAL_SCRIPTS, additionalScriptsArray);
+
+    String[] additionalEnginesArray = desc.getImportedEngines().toArray(new String[] {});
+    analysisEngineDescription.getAnalysisEngineMetaData().getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_ADDITIONAL_ENGINES, additionalEnginesArray);
+
+    String[] additionalUimafitEnginesArray = desc.getImportedUimafitEngines().toArray(
+            new String[] {});
+    analysisEngineDescription
+            .getAnalysisEngineMetaData()
+            .getConfigurationParameterSettings()
+            .setParameterValue(RutaEngine.PARAM_ADDITIONAL_UIMAFIT_ENGINES,
+                    additionalUimafitEnginesArray);
+
+    analysisEngineDescription.getAnalysisEngineMetaData().setTypeSystem(typeSystemDescription);
+
+    configureExtensions(option);
+    return file;
+  }
+
+  private String getRelativeLocation(URI target, String base) {
+    Path basePath = Paths.get(base);
+    if( !basePath.toFile().isDirectory()) {
+      basePath = basePath.getParent();
+    }
+    Path targetPath;
+      targetPath = Paths.get(target);
+    Path relativePath = basePath.relativize(targetPath);
+    return relativePath.toString();
+  }
+
+  private void configureExtensions(RutaBuildOptions options) {
+    ConfigurationParameterSettings configurationParameterSettings = analysisEngineDescription
+            .getAnalysisEngineMetaData().getConfigurationParameterSettings();
+
+    List<String> languageExtensions = options.getLanguage();
+
+    String[] extensions = (String[]) configurationParameterSettings
+            .getParameterValue(RutaEngine.PARAM_ADDITIONAL_EXTENSIONS);
+    String[] loaders = (String[]) configurationParameterSettings
+            .getParameterValue(RutaEngine.PARAM_ADDITIONAL_ENGINE_LOADERS);
+
+    List<String> es = new ArrayList<String>();
+    List<String> ls = new ArrayList<String>();
+    if(extensions != null) {
+      es.addAll(Arrays.asList(extensions));
+    }
+    es.addAll(languageExtensions);
+    if(loaders != null) {
+      ls.addAll(Arrays.asList(loaders));
+    }
+    ls.addAll(options.getEngines());
+
+    configurationParameterSettings.setParameterValue(RutaEngine.PARAM_ADDITIONAL_EXTENSIONS, es.toArray(new String[0]));
+    configurationParameterSettings
+            .setParameterValue(RutaEngine.PARAM_ADDITIONAL_ENGINE_LOADERS, ls.toArray(new String[0]));
+  }
+
+  private TypeSystemDescription getTypeSystemDescriptor(URL url, RutaBuildOptions option)
+          throws InvalidXMLException, IOException {
+    TypeSystemDescription tsdesc = UIMAFramework.getXMLParser().parseTypeSystemDescription(
+            new XMLInputSource(url));
+    if (option.isResolveImports()) {
+      tsdesc.resolveImports(rm);
+    }
+    return tsdesc;
+  }
+
+  private File getFile(String location) {
+    return new File(location);
+  }
+
+  private void toFile(XMLizable desc, File destination) throws SAXException, FileNotFoundException {
+    destination.getParentFile().mkdirs();
+    OutputStream out = new FileOutputStream(destination);
+    XMLSerializer sax = new XMLSerializer(out);
+    ContentHandler ch = sax.getContentHandler();
+    ch.startDocument();
+    desc.toXML(ch);
+    ch.endDocument();
+  }
+
+  public static URL checkImportExistence(String candidate, String extension, ClassLoader classloader)
+          throws IOException {
+    String p = candidate.replaceAll("[.]", "/");
+    p += "." + extension;
+    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(
+            classloader);
+    String prefix = "classpath*:";
+    String pattern = prefix + p;
+    Resource[] resources = resolver.getResources(pattern);
+    if (resources == null || resources.length == 0) {
+      return null;
+    } else {
+      Resource resource = resources[0];
+      URL url = resource.getURL();
+      return url;
+    }
+  }
+}

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorInformation.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorInformation.java?rev=1668386&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorInformation.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/RutaDescriptorInformation.java Sun Mar 22 15:07:59 2015
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.descriptor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+public class RutaDescriptorInformation {
+
+  private static final boolean CONVERT = false;
+
+  private List<String> typeShortNames;
+
+  private List<StringTriple> typeTriples;
+
+  private Collection<String> importedTypeSystems;
+
+  private Map<String, Collection<StringTriple>> features;
+
+  private Collection<String> importedScripts;
+
+  private Collection<String> importedEngines;
+
+  private Collection<String> importedUimafitEngines;
+
+  public RutaDescriptorInformation() {
+    super();
+    typeShortNames = new ArrayList<String>();
+    typeTriples = new ArrayList<StringTriple>();
+    importedTypeSystems = new HashSet<String>();
+    importedScripts = new HashSet<String>();
+    importedEngines = new HashSet<String>();
+    importedUimafitEngines = new HashSet<String>();
+    features = new HashMap<String, Collection<StringTriple>>();
+  }
+
+  public void addType(String name, String description, String parent) {
+    if (parent == null) {
+      parent = "uima.tcas.Annotation";
+    }
+    typeShortNames.add(name);
+    typeTriples.add(new StringTriple(name, description, parent));
+  }
+
+  public void addFeature(String type, String name, String description, String parent) {
+    Collection<StringTriple> list = features.get(type);
+    if (list == null) {
+      list = new ArrayList<StringTriple>();
+      features.put(type, list);
+    }
+    list.add(new StringTriple(name, description, parent));
+  }
+
+  public void addScript(String name, boolean convert) {
+    if (convert) {
+      name = name.replaceAll("[.]", "/");
+    }
+    importedScripts.add(name);
+  }
+
+  public void addEngine(String name, boolean convert) {
+    if (convert) {
+      name = name.replaceAll("[.]", "/");
+    }
+    importedEngines.add(name);
+  }
+
+  public void addUimafitEngine(String name) {
+    importedUimafitEngines.add(name);
+  }
+
+  public void addTypeSystem(String name, boolean convert) {
+    if (convert) {
+      name = name.replaceAll("[.]", "/");
+    }
+    importedTypeSystems.add(name);
+  }
+
+  public void addScript(String name) {
+    addScript(name, CONVERT);
+  }
+
+  public void addEngine(String name) {
+    addEngine(name, CONVERT);
+  }
+
+  public void addTypeSystem(String name) {
+    addTypeSystem(name, CONVERT);
+  }
+
+  public List<String> getTypeShortNames() {
+    return typeShortNames;
+  }
+
+  public List<StringTriple> getTypeTriples() {
+    return typeTriples;
+  }
+
+  public Map<String, Collection<StringTriple>> getFeatures() {
+    return features;
+  }
+
+  public Collection<String> getImportedTypeSystems() {
+    return importedTypeSystems;
+  }
+
+  public Collection<String> getImportedScripts() {
+    return importedScripts;
+  }
+
+  public Collection<String> getImportedEngines() {
+    return importedEngines;
+  }
+
+  public Collection<String> getImportedUimafitEngines() {
+    return importedUimafitEngines;
+  }
+  
+}

Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/StringTriple.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/StringTriple.java?rev=1668386&view=auto
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/StringTriple.java (added)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/descriptor/StringTriple.java Sun Mar 22 15:07:59 2015
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.descriptor;
+
+public class StringTriple {
+
+  private final String name;
+
+  private final String description;
+
+  private final String parent;
+
+  public StringTriple(String name, String description, String parent) {
+    super();
+    this.name = name;
+    this.description = description;
+    this.parent = parent;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public String getParent() {
+    return parent;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj == this)
+      return true;
+    if (!(obj instanceof StringTriple)) {
+      return false;
+    }
+    StringTriple t = (StringTriple) obj;
+    return name.equals(t.getName()) && parent.equals(t.getParent());
+  }
+
+  @Override
+  public int hashCode() {
+    return name.hashCode() + parent.hashCode() * 37;
+  }
+}

Modified: uima/ruta/trunk/ruta-ep-engine/pom.xml
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-engine/pom.xml?rev=1668386&r1=1668385&r2=1668386&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-engine/pom.xml (original)
+++ uima/ruta/trunk/ruta-ep-engine/pom.xml Sun Mar 22 15:07:59 2015
@@ -214,6 +214,7 @@ licensed under the Common Public License
                   org.apache.uima.ruta.action,
                   org.apache.uima.ruta.condition,
                   org.apache.uima.ruta.constraint,
+                  org.apache.uima.ruta.descriptor,
                   org.apache.uima.ruta.engine,
                   org.apache.uima.ruta.expression,
                   org.apache.uima.ruta.expression.bool,

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1668386&r1=1668385&r2=1668386&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Sun Mar 22 15:07:59 2015
@@ -57,8 +57,9 @@ import org.eclipse.dltk.ast.expressions.
 import org.eclipse.dltk.ast.references.VariableReference;
 import org.eclipse.dltk.ast.statements.Statement;
 
+import org.apache.uima.ruta.descriptor.RutaDescriptorInformation;
+
 import org.apache.uima.ruta.ide.core.extensions.RutaExternalFactory;
-import org.apache.uima.ruta.ide.core.builder.DescriptorManager;
 import org.apache.uima.ruta.ide.parser.ast.ActionFactory;
 import org.apache.uima.ruta.ide.parser.ast.ComponentDeclaration;
 import org.apache.uima.ruta.ide.parser.ast.ComponentReference;
@@ -89,7 +90,7 @@ import org.apache.uima.ruta.ide.parser.a
 	private Collection<String> knownExternalBlocks = new ArrayList();
 	public int length;
 	public DLTKTokenConverter converter;
-	public DescriptorManager descriptor;
+	public RutaDescriptorInformation descriptor;
 	private int level = 0;
 	private RutaExternalFactory external = new RutaExternalFactory();
 	

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java?rev=1668386&r1=1668385&r2=1668386&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/builder/RutaBuilder.java Sun Mar 22 15:07:59 2015
@@ -27,6 +27,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.uima.ruta.descriptor.RutaBuildOptions;
+import org.apache.uima.ruta.descriptor.RutaDescriptorBuilder;
+import org.apache.uima.ruta.descriptor.RutaDescriptorInformation;
 import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.extensions.IEngineLoader;
 import org.apache.uima.ruta.extensions.IRutaActionExtension;
@@ -130,7 +133,7 @@ public class RutaBuilder extends Abstrac
     List<IPath> result = new ArrayList<IPath>();
     if (moduleDeclaration instanceof RutaModuleDeclaration) {
       RutaModuleDeclaration tmmd = (RutaModuleDeclaration) moduleDeclaration;
-      DescriptorManager sm = tmmd.descriptorInfo;
+      RutaDescriptorInformation sm = tmmd.descriptorInfo;
       IPath pathToModule = sourceModule.getResource().getLocation();
       String elementName = RutaProjectUtils.getModuleName(pathToModule);
 
@@ -199,11 +202,11 @@ public class RutaBuilder extends Abstrac
   }
 
   private void build(String basicTypesystem, String basicEngine, String typeSystemDest,
-          String engineDest, DescriptorManager sm, String mainScript, String[] scriptPaths,
+          String engineDest, RutaDescriptorInformation sm, String mainScript, String[] scriptPaths,
           String[] enginePaths, ClassLoader classloader) {
-    RutaSimpleBuilder builder = null;
+    RutaDescriptorBuilder builder = null;
     try {
-      builder = new RutaSimpleBuilder(basicTypesystem, basicEngine);
+      builder = new RutaDescriptorBuilder(basicTypesystem, basicEngine);
     } catch (Exception e) {
       DLTKCore.error(e.getMessage(), e);
       if (DLTKCore.DEBUG_PARSER) {

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java?rev=1668386&r1=1668385&r2=1668386&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/parser/RutaSourceParser.java Sun Mar 22 15:07:59 2015
@@ -30,13 +30,13 @@ import org.antlr.runtime.ANTLRStringStre
 import org.antlr.runtime.CharStream;
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.Token;
+import org.apache.uima.ruta.descriptor.RutaDescriptorInformation;
 import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.extensions.IRutaBlockExtension;
 import org.apache.uima.ruta.ide.core.IRutaKeywords;
 import org.apache.uima.ruta.ide.core.RutaExtensionManager;
 import org.apache.uima.ruta.ide.core.RutaKeywords;
 import org.apache.uima.ruta.ide.core.RutaKeywordsManager;
-import org.apache.uima.ruta.ide.core.builder.DescriptorManager;
 import org.apache.uima.ruta.ide.parser.ast.RutaModuleDeclaration;
 import org.apache.uima.ruta.parser.RutaLexer;
 import org.eclipse.dltk.ast.parser.AbstractSourceParser;
@@ -130,7 +130,7 @@ public class RutaSourceParser extends Ab
     parser.converter = new DLTKTokenConverter(content.toCharArray());
     parser.reporter = new DLTKRutaErrorReporter(parser.converter, problemReporter, parser);
 
-    parser.descriptor = new DescriptorManager();
+    parser.descriptor = new RutaDescriptorInformation();
 
     moduleDeclaration.descriptorInfo = parser.descriptor;
 

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaModuleDeclaration.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaModuleDeclaration.java?rev=1668386&r1=1668385&r2=1668386&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaModuleDeclaration.java (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/RutaModuleDeclaration.java Sun Mar 22 15:07:59 2015
@@ -19,12 +19,12 @@
 
 package org.apache.uima.ruta.ide.parser.ast;
 
-import org.apache.uima.ruta.ide.core.builder.DescriptorManager;
+import org.apache.uima.ruta.descriptor.RutaDescriptorInformation;
 import org.eclipse.dltk.ast.declarations.ModuleDeclaration;
 
 public class RutaModuleDeclaration extends ModuleDeclaration {
 
-  public DescriptorManager descriptorInfo;
+  public RutaDescriptorInformation descriptorInfo;
 
   public RutaModuleDeclaration(int sourceLength) {
     super(sourceLength);