Merge branch 'maintenance/3.1.x' into UIMA-6408-Ruta-No-type-check-of-features-in-TRANSFER
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/action/TransferAction.java b/ruta-core/src/main/java/org/apache/uima/ruta/action/TransferAction.java
index bf38e7b..cb4694b 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/action/TransferAction.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/action/TransferAction.java
@@ -21,6 +21,7 @@
 

 import java.util.List;

 

+import org.apache.uima.UimaContextHolder;

 import org.apache.uima.cas.CAS;

 import org.apache.uima.cas.Feature;

 import org.apache.uima.cas.FeatureStructure;

@@ -79,10 +80,20 @@
       if (newFeature != null) {

         if (feature.getRange().isPrimitive()) {

           String value = oldFS.getFeatureValueAsString(feature);

-          newFS.setFeatureValueFromString(newFeature, value);

+          try {

+            newFS.setFeatureValueFromString(newFeature, value);

+          } catch (Exception e) {

+            UimaContextHolder.getContext().getLogger().debug("Unable to transfer feature {}: {}",

+                    shortName, e.getMessage());

+          }

         } else {

           FeatureStructure value = oldFS.getFeatureValue(feature);

-          newFS.setFeatureValue(newFeature, value);

+          try {

+            newFS.setFeatureValue(newFeature, value);

+          } catch (Exception e) {

+            UimaContextHolder.getContext().getLogger().debug("Unable to transfer feature {}: {}",

+                    shortName, e.getMessage());

+          }

         }

       }

     }

diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/action/TransferTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/action/TransferTest.java
index 31f4a89..bac9613 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/action/TransferTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/action/TransferTest.java
@@ -21,6 +21,9 @@
 

 import static org.junit.Assert.assertEquals;

 

+import java.util.Arrays;

+import java.util.LinkedHashMap;

+import java.util.List;

 import java.util.Map;

 import java.util.TreeMap;

 

@@ -30,8 +33,10 @@
 import org.apache.uima.cas.Type;

 import org.apache.uima.cas.text.AnnotationFS;

 import org.apache.uima.cas.text.AnnotationIndex;

+import org.apache.uima.ruta.engine.Ruta;

 import org.apache.uima.ruta.engine.RutaEngine;

 import org.apache.uima.ruta.engine.RutaTestUtils;

+import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;

 import org.junit.Test;

 

 public class TransferTest {

@@ -45,8 +50,8 @@
     complexTypes.put(type, CAS.TYPE_NAME_DOCUMENT_ANNOTATION);

     CAS cas = null;

     try {

-      cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION, namespace + "/" + name

-              + ".txt", 50, false, false, complexTypes, null);

+      cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION,

+              namespace + "/" + name + ".txt", 50, false, false, complexTypes, null);

     } catch (Exception e) {

       e.printStackTrace();

       assert (false);

@@ -63,7 +68,40 @@
     Feature featureByBaseName = t.getFeatureByBaseName("language");

     String stringValue = afs.getStringValue(featureByBaseName);

     assertEquals("x-unspecified", stringValue);

-   

+

     cas.release();

   }

+

+  @Test

+  public void testIncompatibleFeatureRanges() throws Exception {

+

+    Map<String, String> typeMap = new LinkedHashMap<String, String>();

+    typeMap.put("Struct11", "uima.tcas.Annotation");

+    typeMap.put("Struct12", "uima.tcas.Annotation");

+    typeMap.put("Struct21", "uima.tcas.Annotation");

+    typeMap.put("Struct22", "uima.tcas.Annotation");

+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();

+    featureMap.put("Struct11", Arrays.asList(new TestFeature("f", "", CAS.TYPE_NAME_ANNOTATION)));

+    featureMap.put("Struct12", Arrays.asList(new TestFeature("f", "", CAS.TYPE_NAME_STRING)));

+    featureMap.put("Struct21",

+            Arrays.asList(new TestFeature("array", "", CAS.TYPE_NAME_STRING_ARRAY)));

+    featureMap.put("Struct22",

+            Arrays.asList(new TestFeature("array", "", CAS.TYPE_NAME_BOOLEAN_ARRAY)));

+

+    CAS cas = RutaTestUtils.getCAS("This is a test.", typeMap, featureMap);

+    String script = "CW{->s:Struct11,s.f=CW};";

+    script += "CW{->s:Struct21,s.array={true, false, true}};";

+    script += "Struct11{-> TRANSFER(Struct12)};";

+    script += "Struct21{-> TRANSFER(Struct22)};";

+

+    Ruta.apply(cas, script, RutaTestUtils.getDebugParams());

+

+    if (RutaTestUtils.DEBUG_MODE) {

+      RutaTestUtils.storeTypeSystem(typeMap, featureMap);

+      RutaTestUtils.storeCas(cas, "testIncompatibleFeatureRanges");

+    }

+

+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);

+

+  }

 }