You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by bu...@apache.org on 2017/02/02 19:54:41 UTC

svn commit: r1781464 - in /uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/resource/ main/java/org/apache/uima/resource/impl/ main/java/org/apache/uima/resource/metadata/impl/ main/resources/org/apache/uima/impl/ test/resources/TextAnalysisE...

Author: burn
Date: Thu Feb  2 19:54:41 2017
New Revision: 1781464

URL: http://svn.apache.org/viewvc?rev=1781464&view=rev
Log:
UIMA-5274 Support external settings in the import element's name and attribute values and in the fileResourceSpecifier's fileUrl

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/Resource_ImplBase.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/FileResourceSpecifier_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/Import_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java
    uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/log_messages.properties
    uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithExternalOverrides.xml
    uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/testExternalOverride2.settings

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/Resource_ImplBase.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/Resource_ImplBase.java?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/Resource_ImplBase.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/Resource_ImplBase.java Thu Feb  2 19:54:41 2017
@@ -26,6 +26,7 @@ import org.apache.uima.UIMAFramework;
 import org.apache.uima.UIMA_IllegalStateException;
 import org.apache.uima.UimaContext;
 import org.apache.uima.UimaContextAdmin;
+import org.apache.uima.UimaContextHolder;
 import org.apache.uima.resource.impl.RelativePathResolver_impl;
 import org.apache.uima.resource.metadata.ResourceManagerConfiguration;
 import org.apache.uima.resource.metadata.ResourceMetaData;
@@ -161,7 +162,8 @@ public abstract class Resource_ImplBase
           }
         }
       }
-
+      UimaContextHolder.setContext(mUimaContextAdmin);  // Create a UimaContext holder so that AEs created on this thread can use the Settings
+      
       // initialize configuration
       try {
         // createContext checks and skips repeated calls with same args (on different threads, for example)

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/FileResourceSpecifier_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/FileResourceSpecifier_impl.java?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/FileResourceSpecifier_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/impl/FileResourceSpecifier_impl.java Thu Feb  2 19:54:41 2017
@@ -50,7 +50,11 @@ public class FileResourceSpecifier_impl
    * @see org.apache.uima.resource.FileResourceSpecifier#getFileUrl()
    */
   public String getFileUrl() {
-    return mFileUrl;
+    if (mFileUrl != null && mFileUrl.contains("${")) {
+      return resolveSettings(mFileUrl);
+    } else {
+      return mFileUrl;
+    }
   }
 
   /**

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/Import_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/Import_impl.java?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/Import_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/Import_impl.java Thu Feb  2 19:54:41 2017
@@ -27,7 +27,6 @@ import org.apache.uima.resource.Resource
 import org.apache.uima.resource.metadata.Import;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.Level;
-import org.apache.uima.util.Logger;
 import org.apache.uima.util.XMLParser;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -42,12 +41,24 @@ import org.xml.sax.helpers.AttributesImp
 public class Import_impl extends MetaDataObject_impl implements Import {
   
   private static final long serialVersionUID = 6876757002913848998L;
+  
+  /**
+   * resource bundle for log messages
+   */
+  protected static final String LOG_RESOURCE_BUNDLE = "org.apache.uima.impl.log_messages";
 
   private String mName;
 
   private String mLocation;
   
   private String byNameSuffix = ".xml";
+  
+  /*
+   * UIMA-5274  Expand any references to external overrides when name and location are fetched.
+   * Leave value unmodified if any settings are undefined.
+   * Don't cache the value as both methods are called (for validation?) early before the settings have been loaded,
+   * but the settings are available when the values are used when initializing an AggregateAnalysisEngine.
+   */
 
   /*
    * (non-Javadoc)
@@ -55,7 +66,11 @@ public class Import_impl extends MetaDat
    * @see org.apache.uima.resource.metadata.Import#getName()
    */
   public String getName() {
-    return mName;
+    if (mName != null && mName.contains("${")) {
+      return resolveSettings(mName);
+    } else {
+      return mName;
+    }
   }
 
   /*
@@ -73,7 +88,11 @@ public class Import_impl extends MetaDat
    * @see org.apache.uima.resource.metadata.Import#getLocation()
    */
   public String getLocation() {
-    return mLocation;
+    if (mLocation != null && mLocation.contains("${")) {
+      return resolveSettings(mLocation);
+    } else {
+      return mLocation;
+    }
   }
 
   /*
@@ -98,22 +117,26 @@ public class Import_impl extends MetaDat
    * @see org.apache.uima.resource.metadata.Import#findAbsoluteUrl(org.apache.uima.resource.ResourceManager)
    */
   public URL findAbsoluteUrl(ResourceManager aResourceManager) throws InvalidXMLException {
-    Logger logger = UIMAFramework.getLogger(this.getClass());
-    if (getLocation() != null) {
+    String location, name;
+    if ((location=getLocation()) != null) {
       try {
-        URL url = new URL(this.getRelativePathBase(), getLocation());
-        logger.log(Level.CONFIG, "Import by location: " + url);
+        URL url = new URL(this.getRelativePathBase(), location);
+        UIMAFramework.getLogger(this.getClass()).logrb(Level.CONFIG, this.getClass().getName(),
+                "findAbsoluteUrl", LOG_RESOURCE_BUNDLE, "UIMA_import_by__CONFIG",
+                new Object[] {"location", url});
         return url;
       } catch (MalformedURLException e) {
         throw new InvalidXMLException(InvalidXMLException.MALFORMED_IMPORT_URL, new Object[] {
-            getLocation(), getSourceUrlString() }, e);
+            location, getSourceUrlString() }, e);
       }
-    } else if (getName() != null) {
-      String filename = getName().replace('.', '/') + byNameSuffix;
+    } else if ((name=getName()) != null) {
+      String filename = name.replace('.', '/') + byNameSuffix;
       URL url;
       try {
         url = aResourceManager.resolveRelativePath(filename);
-        logger.log(Level.CONFIG, "Import by name: " + url);
+        UIMAFramework.getLogger(this.getClass()).logrb(Level.CONFIG, this.getClass().getName(),
+                "findAbsoluteUrl", LOG_RESOURCE_BUNDLE, "UIMA_import_by__CONFIG",
+                new Object[] {"name", url});
       } catch (MalformedURLException e) {
         throw new InvalidXMLException(InvalidXMLException.IMPORT_BY_NAME_TARGET_NOT_FOUND,
                 new Object[] { filename, getSourceUrlString() }, e);
@@ -178,11 +201,13 @@ public class Import_impl extends MetaDat
     
     String namespace = getXmlizationInfo().namespace;
     AttributesImpl attrs = new AttributesImpl();
-    if (getName() != null) {
-      attrs.addAttribute("", "name", "name", "", getName());
+    String name = getName();
+    if (name != null) {
+      attrs.addAttribute("", "name", "name", "", name);
     }
-    if (getLocation() != null) {
-      attrs.addAttribute("", "location", "location", "", getLocation());
+    String location = getLocation();
+    if (location != null) {
+      attrs.addAttribute("", "location", "location", "", location);
     }
     Node node = serializer.findMatchingSubElement("import");
     serializer.outputStartElement(node, namespace, "import", "import", attrs);

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java Thu Feb  2 19:54:41 2017
@@ -40,19 +40,24 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.uima.UIMAFramework;
 import org.apache.uima.UIMARuntimeException;
 import org.apache.uima.UIMA_IllegalArgumentException;
 import org.apache.uima.UIMA_UnsupportedOperationException;
+import org.apache.uima.UimaContext;
+import org.apache.uima.UimaContextHolder;
 import org.apache.uima.internal.util.XMLUtils;
 import org.apache.uima.resource.metadata.AllowedValue;
 import org.apache.uima.resource.metadata.MetaDataObject;
 import org.apache.uima.util.ConcurrentHashMapWithProducer;
 import org.apache.uima.util.InvalidXMLException;
+import org.apache.uima.util.Level;
 import org.apache.uima.util.NameClassPair;
 import org.apache.uima.util.XMLParser;
 import org.apache.uima.util.XMLSerializer;
 import org.apache.uima.util.XMLSerializer.CharacterValidatingContentHandler;
 import org.apache.uima.util.XMLizable;
+import org.apache.uima.util.impl.Settings_impl;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -1650,6 +1655,28 @@ public abstract class MetaDataObject_imp
     return (infoset == null) ? null : serialContext.serializer.findMatchingSubElement(name);
   }
   
+
+  /*
+   * UIMA-5274 Resolve any ${variable} entries in the string.
+   * Leaves the whole string unmodified if any variables are undefined
+   * but logs a warning message.
+   */
+  protected String resolveSettings(String text) {
+    try {
+      UimaContext uimaContext = UimaContextHolder.getContext();
+      if (uimaContext != null) {
+        Settings_impl settings = (Settings_impl) uimaContext.getExternalOverrides();
+        if (settings != null) {
+          return settings.resolve(text);
+        } 
+      }
+    } catch (Exception e) {
+      UIMAFramework.getLogger(this.getClass()).log(Level.WARNING, e.toString());
+    }
+    return text;
+  }
+  
+  
 //  /*****************************************
 //   * JSON support *
 //   * 

Modified: uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/log_messages.properties
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/log_messages.properties?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/log_messages.properties (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/resources/org/apache/uima/impl/log_messages.properties Thu Feb  2 19:54:41 2017
@@ -80,6 +80,8 @@ UIMA_external_overrides_load__CONFIG = L
 
 UIMA_external_override_ignored__CONFIG = Key "{0}" already in use ... ignoring value "{1}"
 
+UIMA_import_by__CONFIG = Import by {0}: {1}
+
 UIMA_parameter_set__CONFIG = Parameter "{0}" in context {1} = "{2}" {3}
 
 UIMA_overridden_resource__CONFIG = The definition of external resource "{0}" in component {1} was overridden in component {2}.

Modified: uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithExternalOverrides.xml
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithExternalOverrides.xml?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithExternalOverrides.xml (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/AggregateWithExternalOverrides.xml Thu Feb  2 19:54:41 2017
@@ -23,7 +23,7 @@
   <primitive>false</primitive>
   <delegateAnalysisEngineSpecifiers>
     <delegateAnalysisEngine key="ExternalOverrides">
-      <import location="AnnotatorWithExternalOverrides.xml"/>
+      <import location="Annotator${with}ExternalOverrides.xml"/>
     </delegateAnalysisEngine>
   </delegateAnalysisEngineSpecifiers>
   <analysisEngineMetaData>

Modified: uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/testExternalOverride2.settings
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/testExternalOverride2.settings?rev=1781464&r1=1781463&r2=1781464&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/testExternalOverride2.settings (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/resources/TextAnalysisEngineImplTest/testExternalOverride2.settings Thu Feb  2 19:54:41 2017
@@ -22,3 +22,9 @@ suffix = should be ignored
 # Empty array
 test.externalFloatArray =  []
 context-holder = Context Holder Test
+
+# Part of an import by location
+with = ${W${i}}${TH}
+i = I
+WI = Wi
+TH = th