Merge branch 'main' into feature/UIMA-6266-Clean-JSON-Wire-Format-for-CAS

* main:
  [UIMA-6390] NPE when trying to access config names of fresh context
  [UIMA-6390] NPE when trying to access config names of fresh context
  [UIMA-6390] NPE when trying to access config names of fresh context
  [UIMA-6390] NPE when trying to access config names of fresh context
  [UIMA-6389] Logger_common_impl swallows exception
  [UIMA-6389] Logger_common_impl swallows exception
  [UIMA-6389] Logger_common_impl swallows exception
  [UIMA-6389] Logger_common_impl swallows exception
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
index 7d96233..dda4dfd 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
@@ -512,9 +512,9 @@
     final TypeSystemImpl ts = this.sii.tsi;
 
     // **********************************************
-    // for each type in the TypeSystem, 
-    //   create a list of iicp's 
-    //     each one corresponding to a defined index
+    // for each type in the TypeSystem,
+    // create a list of iicp's
+    // each one corresponding to a defined index
     // **********************************************
     final int numTypes = ts.getNumberOfTypes() + 1; // Type counting starts at 1.
     // Can't instantiate arrays of generic types, but this is ok for ArrayList.
@@ -527,7 +527,7 @@
   }
 
   // ***************
-  // Create indexes 
+  // Create indexes
   // ***************
 
   /**
@@ -1250,7 +1250,7 @@
   // }
 
   // *****************************************
-  //    Adding/removing FS to/from the index
+  // Adding/removing FS to/from the index
   // *****************************************
   public void addFS(int fsRef) {
     ll_addFS(fsRef);
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java
index a09af5c..033615e 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java
@@ -285,7 +285,7 @@
   }
 
   // ***********************
-  //    Index Add Remove
+  // Index Add Remove
   // ***********************
 
   /**
@@ -344,7 +344,7 @@
   }
 
   // *******************************
-  //    IDs and Type
+  // IDs and Type
   // *******************************
   /**
    * NOTE: Possible name collision
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
index d6e0956..67e9420 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
@@ -139,7 +139,6 @@
   private AnnotationFS boundingFs = null;
   private boolean noResult = false;
 
-  
 //@formatter:off
   /* **********************************************
    * Constructors
@@ -1369,7 +1368,7 @@
   }
 
   // *******************************************
-  // The methods below are alternatives 
+  // The methods below are alternatives
   // to the methods above, that combine
   // frequently used patterns into more
   // concise forms using positional arguments
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/Serialization.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/Serialization.java
index f3bdcc2..dea297b 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/Serialization.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/Serialization.java
@@ -50,9 +50,9 @@
 public class Serialization {
 
   // *************************************************************
-  // These methods convert a CAS to / from a serializable object * 
-  // and vice-versa.                                             *
-  // Some also handle type system and index definitions          *
+  // These methods convert a CAS to / from a serializable object *
+  // and vice-versa. *
+  // Some also handle type system and index definitions *
   // *************************************************************
 
   /**
@@ -171,7 +171,7 @@
 
   // *****************************************************************************
   // Methods from here on do some form of custom serialization / deserialization *
-  // with data streams, byte arrays, etc.                                        *   
+  // with data streams, byte arrays, etc. *
   // *****************************************************************************
 
   /**
@@ -225,7 +225,7 @@
   }
 
   // *****************************************************************************
-  // Methods from here on use some form of compression                           *
+  // Methods from here on use some form of compression *
   // *****************************************************************************
 
   /**
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java
index 0b610aa..b5b6b53 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/TypeImpl.java
@@ -148,9 +148,9 @@
   private final List<FeatureImpl> staticMergedFeaturesIntroducedByThisType = new ArrayList<>(0);
 
   /**
-   * Map from adjusted offset in int features to feature. 
+   * Map from adjusted offset in int features to feature.
    * 
-   * Corrects for Long/Double values taking 2 int slots. 
+   * Corrects for Long/Double values taking 2 int slots.
    * 
    * Set at commit time
    */
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java
index 9ae5bd6..3ec3e1e 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/XCASDeserializer.java
@@ -188,7 +188,7 @@
 
     // map incoming _indexed values
     /**
-     * Map external SofaNum -> internal sofaNum 
+     * Map external SofaNum -> internal sofaNum
      * 
      * internal sofaNums also used to index indexRepositories -> ref to FsIndexRepositoryImpl
      */
diff --git a/uimaj-core/src/main/java/org/apache/uima/examples/SourceDocumentInformation.java b/uimaj-core/src/main/java/org/apache/uima/examples/SourceDocumentInformation.java
index 576a811..cce1450 100644
--- a/uimaj-core/src/main/java/org/apache/uima/examples/SourceDocumentInformation.java
+++ b/uimaj-core/src/main/java/org/apache/uima/examples/SourceDocumentInformation.java
@@ -204,5 +204,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/main/java/org/apache/uima/flow/impl/FixedFlowController.java b/uimaj-core/src/main/java/org/apache/uima/flow/impl/FixedFlowController.java
index 52996fc..43f191a 100644
--- a/uimaj-core/src/main/java/org/apache/uima/flow/impl/FixedFlowController.java
+++ b/uimaj-core/src/main/java/org/apache/uima/flow/impl/FixedFlowController.java
@@ -75,7 +75,7 @@
   private static final int ACTION_DROP = 2;
 
   private static final int ACTION_DROP_IF_NEW_CAS_PRODUCED = 3;
-  
+
 //@formatter:off
   // make final to work better in multi-thread case  UIMA-2373
   // working assumption: 
@@ -94,7 +94,7 @@
   //      -- this has the added "benefit" (maybe eventually) of having better semantics for letting existing
   //         Flow objects continue to use the "old" settings, and only the new ones picking up the new ones.
 //@formatter:on
-  final private List<String> mSequence = new CopyOnWriteArrayList<>();  //UIMA-4013
+  final private List<String> mSequence = new CopyOnWriteArrayList<>(); // UIMA-4013
 
   private int mActionAfterCasMultiplier;
 
diff --git a/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java b/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java
index 8c9d74c..750c216 100644
--- a/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java
+++ b/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java
@@ -56,6 +56,7 @@
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.metadata.ConfigurationGroup;
 import org.apache.uima.resource.metadata.ConfigurationParameter;
+import org.apache.uima.resource.metadata.ConfigurationParameterDeclarations;
 import org.apache.uima.util.Level;
 import org.apache.uima.util.Logger;
 import org.apache.uima.util.Settings;
@@ -557,19 +558,23 @@
    */
   @Override
   public String[] getConfigurationGroupNames() {
-    ConfigurationGroup[] groups = getConfigurationManager()
-            .getConfigParameterDeclarations(getQualifiedContextName()).getConfigurationGroups();
+    ConfigurationParameterDeclarations paramDecls = getConfigurationManager()
+            .getConfigParameterDeclarations(getQualifiedContextName());
+    if (paramDecls == null) {
+      return Constants.EMPTY_STRING_ARRAY;
+    }
+
+    ConfigurationGroup[] groups = paramDecls.getConfigurationGroups();
     if (groups == null) {
       return Constants.EMPTY_STRING_ARRAY;
-    } else {
-      Set<String> names = new TreeSet<>();
-      for (int i = 0; i < groups.length; i++) {
-        names.addAll(Arrays.asList(groups[i].getNames()));
-      }
-      String[] nameArray = new String[names.size()];
-      names.toArray(nameArray);
-      return nameArray;
     }
+
+    Set<String> names = new TreeSet<>();
+    for (int i = 0; i < groups.length; i++) {
+      names.addAll(Arrays.asList(groups[i].getNames()));
+    }
+
+    return names.toArray(new String[names.size()]);
   }
 
   /*
@@ -579,17 +584,18 @@
    */
   @Override
   public String[] getConfigParameterNames() {
-    ConfigurationParameter[] params = getConfigurationManager()
-            .getConfigParameterDeclarations(getQualifiedContextName()).getConfigurationParameters();
-    if (params == null) {
+    ConfigurationParameterDeclarations paramDecls = getConfigurationManager()
+            .getConfigParameterDeclarations(getQualifiedContextName());
+    if (paramDecls == null) {
       return Constants.EMPTY_STRING_ARRAY;
-    } else {
-      String[] names = new String[params.length];
-      for (int i = 0; i < params.length; i++) {
-        names[i] = params[i].getName();
-      }
-      return names;
     }
+
+    ConfigurationParameter[] params = paramDecls.getConfigurationParameters();
+    if (params == null || params.length == 0) {
+      return Constants.EMPTY_STRING_ARRAY;
+    }
+
+    return Arrays.stream(params).map(ConfigurationParameter::getName).toArray(String[]::new);
   }
 
   /*
@@ -599,30 +605,33 @@
    */
   @Override
   public String[] getConfigParameterNames(String aGroup) {
-    ConfigurationGroup[] groups = getConfigurationManager()
-            .getConfigParameterDeclarations(getQualifiedContextName())
-            .getConfigurationGroupDeclarations(aGroup);
+    ConfigurationParameterDeclarations paramDecls = getConfigurationManager()
+            .getConfigParameterDeclarations(getQualifiedContextName());
+    if (paramDecls == null) {
+      return Constants.EMPTY_STRING_ARRAY;
+    }
+
+    ConfigurationGroup[] groups = paramDecls.getConfigurationGroupDeclarations(aGroup);
     if (groups.length == 0) {
       return Constants.EMPTY_STRING_ARRAY;
-    } else {
-      List<String> names = new ArrayList<>();
-      ConfigurationParameter[] commonParams = getConfigurationManager()
-              .getConfigParameterDeclarations(getQualifiedContextName()).getCommonParameters();
-      if (commonParams != null) {
-        for (int i = 0; i < commonParams.length; i++) {
-          names.add(commonParams[i].getName());
-        }
-      }
-      for (int i = 0; i < groups.length; i++) {
-        ConfigurationParameter[] groupParams = groups[i].getConfigurationParameters();
-        for (int j = 0; j < groupParams.length; j++) {
-          names.add(groupParams[j].getName());
-        }
-      }
-      String[] nameArray = new String[names.size()];
-      names.toArray(nameArray);
-      return nameArray;
     }
+
+    List<String> names = new ArrayList<>();
+    ConfigurationParameter[] commonParams = paramDecls.getCommonParameters();
+    if (commonParams != null) {
+      for (int i = 0; i < commonParams.length; i++) {
+        names.add(commonParams[i].getName());
+      }
+    }
+
+    for (int i = 0; i < groups.length; i++) {
+      ConfigurationParameter[] groupParams = groups[i].getConfigurationParameters();
+      for (int j = 0; j < groupParams.length; j++) {
+        names.add(groupParams[j].getName());
+      }
+    }
+
+    return names.toArray(new String[names.size()]);
   }
 
   /**
@@ -658,15 +667,17 @@
     String absoluteSofaName = null;
     if (index < 0) {
       absoluteSofaName = mSofaMappings.get(nameToMap);
-      if (absoluteSofaName == null)
+      if (absoluteSofaName == null) {
         absoluteSofaName = nameToMap;
+      }
 
     } else {
       nameToMap = aSofaName.substring(0, index);
       String rest = aSofaName.substring(index);
       String absoluteRoot = mSofaMappings.get(nameToMap);
-      if (absoluteRoot == null)
+      if (absoluteRoot == null) {
         absoluteRoot = nameToMap;
+      }
       absoluteSofaName = absoluteRoot + rest;
     }
     SofaID sofaid = new SofaID_impl();
@@ -684,8 +695,9 @@
     String componentSofaName = aSofaID;
     SofaID[] sofaArr = getSofaMappings();
     for (int i = 0; i < sofaArr.length; i++) {
-      if (aSofaID.equals(sofaArr[i].getSofaID()))
+      if (aSofaID.equals(sofaArr[i].getSofaID())) {
         return sofaArr[i].getComponentSofaName();
+      }
     }
     return componentSofaName;
   }
@@ -852,14 +864,16 @@
       String absoluteSofaName = null;
       if (index < 0) {
         absoluteSofaName = mSofaMappings.get(nameToMap);
-        if (absoluteSofaName == null)
+        if (absoluteSofaName == null) {
           absoluteSofaName = nameToMap;
+        }
       } else {
         nameToMap = aSofaName.substring(0, index);
         String rest = aSofaName.substring(index);
         String absoluteRoot = mSofaMappings.get(nameToMap);
-        if (absoluteRoot == null)
+        if (absoluteRoot == null) {
           absoluteRoot = nameToMap;
+        }
         absoluteSofaName = absoluteRoot + rest;
       }
       return absoluteSofaName;
diff --git a/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java b/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
index a02aca7..0671822 100644
--- a/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
+++ b/uimaj-core/src/main/java/org/apache/uima/internal/util/CopyOnWriteObjHashSet.java
@@ -52,7 +52,7 @@
 
   // ***************************************************
   // These methods to make this class easily usable by *
-  // FsIterator_bag                                    *
+  // FsIterator_bag *
   // ***************************************************
 
   /**
diff --git a/uimaj-core/src/main/java/org/apache/uima/internal/util/rb_trees/Int2IntRBT.java b/uimaj-core/src/main/java/org/apache/uima/internal/util/rb_trees/Int2IntRBT.java
index dc721e5..429a7dd 100644
--- a/uimaj-core/src/main/java/org/apache/uima/internal/util/rb_trees/Int2IntRBT.java
+++ b/uimaj-core/src/main/java/org/apache/uima/internal/util/rb_trees/Int2IntRBT.java
@@ -389,7 +389,7 @@
   // }
 
   /**
-   * Fast version of findKey Keeps the last node referenced 
+   * Fast version of findKey Keeps the last node referenced
    * 
    * *** NOT THREAD SAFE ***
    * 
diff --git a/uimaj-core/src/main/java/org/apache/uima/jcas/JCasRegistry.java b/uimaj-core/src/main/java/org/apache/uima/jcas/JCasRegistry.java
index b19e62b..7679f42 100644
--- a/uimaj-core/src/main/java/org/apache/uima/jcas/JCasRegistry.java
+++ b/uimaj-core/src/main/java/org/apache/uima/jcas/JCasRegistry.java
@@ -130,7 +130,7 @@
   }
 
   /**
-   * NOT CURRENTLY USED 
+   * NOT CURRENTLY USED
    * 
    * Gets the number of cover classes that have been registered.
    * 
diff --git a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java
index d65447b..5f6a60d 100644
--- a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java
+++ b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSArrayList.java
@@ -1112,5 +1112,3 @@
   }
       
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSHashSet.java b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSHashSet.java
index 4bcf055..76fbf6f 100644
--- a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSHashSet.java
+++ b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSHashSet.java
@@ -550,5 +550,3 @@
   }
 
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSLinkedHashSet.java b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSLinkedHashSet.java
index 96e9b90..28e3707 100644
--- a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSLinkedHashSet.java
+++ b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/FSLinkedHashSet.java
@@ -107,5 +107,3 @@
   }
    
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArrayList.java b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArrayList.java
index 64c9d52..fd4e606 100644
--- a/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArrayList.java
+++ b/uimaj-core/src/main/java/org/apache/uima/jcas/cas/IntegerArrayList.java
@@ -564,5 +564,3 @@
   }
     
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/main/java/org/apache/uima/jcas/impl/JCasHashMapSubMap.java b/uimaj-core/src/main/java/org/apache/uima/jcas/impl/JCasHashMapSubMap.java
index fc2cfc2..f47a0c3 100644
--- a/uimaj-core/src/main/java/org/apache/uima/jcas/impl/JCasHashMapSubMap.java
+++ b/uimaj-core/src/main/java/org/apache/uima/jcas/impl/JCasHashMapSubMap.java
@@ -28,7 +28,7 @@
 import org.apache.uima.util.IteratorNvc;
 
 /**
- * Part of the JCasHashMap. 
+ * Part of the JCasHashMap.
  * 
  * There are multiple instances of this class, one per concurrancy level
  */
diff --git a/uimaj-core/src/main/java/org/apache/uima/resource/ConfigurationManager.java b/uimaj-core/src/main/java/org/apache/uima/resource/ConfigurationManager.java
index 6e242e2..ad61d8a 100644
--- a/uimaj-core/src/main/java/org/apache/uima/resource/ConfigurationManager.java
+++ b/uimaj-core/src/main/java/org/apache/uima/resource/ConfigurationManager.java
@@ -146,7 +146,7 @@
    * @param aContextName
    *          the name for which to get the parameter declarations
    * 
-   * @return parameter declarations for the context
+   * @return parameter declarations for the context or {@code null} if there are no declarations.
    */
   ConfigurationParameterDeclarations getConfigParameterDeclarations(String aContextName);
 
diff --git a/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java b/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java
index b893404..209d0a3 100644
--- a/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/resource/metadata/impl/MetaDataObject_impl.java
@@ -222,7 +222,7 @@
   }
 
   /**
-   * Information, kept globally (by thread) for one serialization 
+   * Information, kept globally (by thread) for one serialization
    * 
    * Inherited by some custom impls, e.g. TypeOrFeature_impl
    */
diff --git a/uimaj-core/src/main/java/org/apache/uima/util/CasPool.java b/uimaj-core/src/main/java/org/apache/uima/util/CasPool.java
index 01df4fb..f3ce874 100644
--- a/uimaj-core/src/main/java/org/apache/uima/util/CasPool.java
+++ b/uimaj-core/src/main/java/org/apache/uima/util/CasPool.java
@@ -174,7 +174,7 @@
   }
 
   /**
-   * Creates a new CasPool. 
+   * Creates a new CasPool.
    * 
    * TODO: do we need this method AND the one that takes a CasManager?
    * 
diff --git a/uimaj-core/src/main/java/org/apache/uima/util/Settings.java b/uimaj-core/src/main/java/org/apache/uima/util/Settings.java
index 9e3367a..1ca892b 100644
--- a/uimaj-core/src/main/java/org/apache/uima/util/Settings.java
+++ b/uimaj-core/src/main/java/org/apache/uima/util/Settings.java
@@ -69,7 +69,7 @@
    * them with the value for key. Recursively evaluate the value to be substituted. NOTE: infinite
    * loops not detected! If the key variable has not been defined, an exception is thrown. To avoid
    * evaluation and get ${key} in the output escape the $ or { Arrays are returned as a
-   * comma-separated string, e.g. "[elem1,elem2]" 
+   * comma-separated string, e.g. "[elem1,elem2]"
    * 
    * Note: escape characters are not removed as they may affect array separators.
    * 
diff --git a/uimaj-core/src/main/java/org/apache/uima/util/impl/SerializationMeasures.java b/uimaj-core/src/main/java/org/apache/uima/util/impl/SerializationMeasures.java
index 06935f2..2988b20 100644
--- a/uimaj-core/src/main/java/org/apache/uima/util/impl/SerializationMeasures.java
+++ b/uimaj-core/src/main/java/org/apache/uima/util/impl/SerializationMeasures.java
@@ -306,7 +306,7 @@
           Slot_StrOffset, //
           Slot_StrLength, //
           Slot_StrChars, //
-          Slot_Long_High,//
+          Slot_Long_High, //
           Slot_Long_Low, //
           Slot_Float_Mantissa_Sign, //
           Slot_Float_Exponent, //
diff --git a/uimaj-core/src/main/java/org/apache/uima/util/impl/Slf4jLogger_impl.java b/uimaj-core/src/main/java/org/apache/uima/util/impl/Slf4jLogger_impl.java
index e4b83f8..9136e9e 100644
--- a/uimaj-core/src/main/java/org/apache/uima/util/impl/Slf4jLogger_impl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/util/impl/Slf4jLogger_impl.java
@@ -1,434 +1,445 @@
-/*
- * 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.util.impl;
-
-import java.text.MessageFormat;
-
-import org.apache.uima.internal.util.Misc;
-import org.apache.uima.util.Level;
-import org.apache.uima.util.Logger;
-import org.slf4j.Marker;
-import org.slf4j.spi.LocationAwareLogger;
-
-/**
- * UIMA Logging interface implementation for SLF4j
- * 
- * This design gets a logger in static initialization, in order to see what the back end is. If it
- * is JUL or Log4j, it sets flags so that subsequent calls to getInstance gets those UIMA logger
- * impls, not this one, in order to slightly reduce indirection at run time.
- * 
- */
-public class Slf4jLogger_impl extends Logger_common_impl {
-
-  public static final String DEFAULT_JUL = "uima.use_jul_as_default_uima_logger";
-  public static final boolean IS_DEFAULT_JUL = Misc.getNoValueSystemProperty(DEFAULT_JUL);
-
-  static final boolean isJul;
-  static final boolean isLog4j;
-
-  static {
-    Class<?> staticLoggerBinderClass = null;
-    try {
-      staticLoggerBinderClass = Class.forName("org.slf4j.impl.StaticLoggerBinder");
-    } catch (Exception e) {
-      // empty on purpose, if class not present, no back end logger, and staticLoggerBinderClass is
-      // left as null
-    }
-
-    if (null == staticLoggerBinderClass) {
-      if (IS_DEFAULT_JUL) {
-        isJul = true;
-        isLog4j = false;
-      } else {
-        isJul = false;
-        isLog4j = false;
-      }
-    } else {
-      // have some backend binding
-      boolean tb;
-      org.slf4j.Logger tempLogger = org.slf4j.LoggerFactory.getLogger("org.apache.uima");
-      try { // for jdk14 impl
-        Class<?> clazz = Class.forName("org.slf4j.impl.JDK14LoggerAdapter");
-        tb = clazz != null && clazz.isAssignableFrom(tempLogger.getClass());
-      } catch (ClassNotFoundException e1) {
-        tb = false;
-      }
-      isJul = tb;
-
-      tb = false;
-      if (!isJul) {
-        try { // for log4j 2 impl
-          Class<?> clazz = Class.forName("org.apache.logging.slf4j.Log4jLogger");
-          tb = null != clazz && clazz.isAssignableFrom(tempLogger.getClass());
-        } catch (ClassNotFoundException e1) {
-          tb = false;
-        }
-      }
-      isLog4j = tb;
-    }
-  }
-
-  /**
-   * logger object from the underlying Slf4j logging framework
-   */
-  final private org.slf4j.Logger logger;
-  final private boolean isLocationCapable; // the slf4j simple logger is not
-
-  /**
-   * create a new LogWrapper class for the specified source class
-   * 
-   * @param component
-   *          specified source class
-   */
-  private Slf4jLogger_impl(Class<?> component) {
-    super(component);
-    final String loggerName = (component != null) ? component.getName() : "org.apache.uima";
-
-    logger = org.slf4j.LoggerFactory.getLogger(loggerName);
-    isLocationCapable = logger instanceof org.slf4j.spi.LocationAwareLogger;
-  }
-
-  private Slf4jLogger_impl(Slf4jLogger_impl l, int limit) {
-    super(l, limit);
-    this.logger = l.logger;
-    isLocationCapable = logger instanceof org.slf4j.spi.LocationAwareLogger;
-  }
-
-  /**
-   * creates a new Logger instance for the specified source class
-   * 
-   * @param component
-   *          current source class
-   * 
-   * @return Logger - returns the Logger object for the specified class
-   */
-  public static synchronized Logger getInstance(Class<?> component) {
-    if (isJul) {
-      return JSR47Logger_impl.getInstance(component);
-    }
-    if (isLog4j) {
-      return Log4jLogger_impl.getInstance(component);
-    }
-    return new Slf4jLogger_impl(component);
-  }
-
-  /**
-   * creates a new Logger instance using default name "org.apache.uima"
-   * 
-   * @return Logger - returns the Logger object for the specified class
-   */
-  public static synchronized Logger getInstance() {
-    return getInstance(null);
-  }
-
-  @Override
-  public Slf4jLogger_impl getLimitedLogger(int aLimit) {
-    if (aLimit == Integer.MAX_VALUE || aLimit == this.limit_common) {
-      return this;
-    }
-    return new Slf4jLogger_impl(this, aLimit);
-  }
-
-  public static int getSlf4jLevel(Level level) {
-    switch (level.toInteger()) {
-      case Level.SEVERE_INT:
-        return LocationAwareLogger.ERROR_INT;
-      case Level.WARNING_INT:
-        return LocationAwareLogger.WARN_INT;
-      case Level.INFO_INT:
-        return LocationAwareLogger.INFO_INT;
-      case Level.CONFIG_INT:
-        return LocationAwareLogger.INFO_INT;
-      case Level.FINE_INT:
-        return LocationAwareLogger.DEBUG_INT;
-      case Level.FINER_INT:
-        return LocationAwareLogger.TRACE_INT;
-      case Level.FINEST_INT:
-        return LocationAwareLogger.TRACE_INT;
-    }
-    Misc.internalError();
-    return LocationAwareLogger.ERROR_INT; // ignored, just here for compile error avoidance
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.uima.util.Logger#isLoggable(org.apache.uima.util.Level)
-   */
-  @Override
-  public boolean isLoggable(Level level) {
-    switch (level.toInteger()) {
-      case org.apache.uima.util.Level.OFF_INT:
-        return false;
-      case org.apache.uima.util.Level.SEVERE_INT:
-        return logger.isErrorEnabled();
-      case org.apache.uima.util.Level.WARNING_INT:
-        return logger.isWarnEnabled();
-      case org.apache.uima.util.Level.INFO_INT:
-        return logger.isInfoEnabled();
-      case org.apache.uima.util.Level.CONFIG_INT:
-        return logger.isDebugEnabled(UIMA_MARKER_CONFIG);
-      case org.apache.uima.util.Level.FINE_INT:
-        return logger.isDebugEnabled();
-      case org.apache.uima.util.Level.FINER_INT:
-        return logger.isTraceEnabled();
-      case org.apache.uima.util.Level.FINEST_INT:
-        return logger.isTraceEnabled(UIMA_MARKER_FINEST);
-      default: // for Level.ALL return false, that's what jul logger does
-        return false;
-    }
-  }
-
-  @Override
-  public boolean isLoggable(Level level, Marker marker) {
-    switch (level.toInteger()) {
-      case org.apache.uima.util.Level.OFF_INT:
-        return false;
-      case org.apache.uima.util.Level.SEVERE_INT:
-        return logger.isErrorEnabled(marker);
-      case org.apache.uima.util.Level.WARNING_INT:
-        return logger.isWarnEnabled(marker);
-      case org.apache.uima.util.Level.INFO_INT:
-        return logger.isInfoEnabled(marker);
-      case org.apache.uima.util.Level.CONFIG_INT:
-        return logger.isInfoEnabled(marker);
-      case org.apache.uima.util.Level.FINE_INT:
-        return logger.isDebugEnabled(marker);
-      case org.apache.uima.util.Level.FINER_INT:
-        return logger.isTraceEnabled(marker);
-      case org.apache.uima.util.Level.FINEST_INT:
-        return logger.isTraceEnabled(marker);
-      default: // for Level.ALL return false, that's what jul logger does
-        return false;
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.uima.util.Logger#setLevel(org.apache.uima.util.Level)
-   */
-  @Override
-  public void setLevel(Level level) {
-    // allow nop operation
-  }
-
-  // does the uima-logger style of message formatting
-  @Override
-  public void log(Marker m, String aFqcn, Level level, String message, Object[] args,
-          Throwable thrown) {
-    log(m, aFqcn, level, MessageFormat.format(message, args), thrown);
-  }
-
-  @Override
-  public void log(Marker m, String aFqcn, Level level, String msg_with_params, Throwable thrown) {
-    m = (m == null) ? getMarkerForLevel(level) : m;
-
-    if (isLocationCapable) { // slf4j simple logger is not
-      ((org.slf4j.spi.LocationAwareLogger) logger).log(m, aFqcn, getSlf4jLevel(level),
-              msg_with_params, null, thrown);
-    } else {
-      switch (level.toInteger()) {
-        case Level.SEVERE_INT:
-          // all of these calls to MessageFormat are to the java.text.MessageFormat
-          // to do {n} style format substitution
-          logger.error(m, msg_with_params, thrown);
-          break;
-        case Level.WARNING_INT:
-          logger.warn(m, msg_with_params, thrown);
-          break;
-        case Level.INFO_INT:
-          logger.info(m, msg_with_params, thrown);
-          break;
-        case Level.CONFIG_INT:
-          logger.info(m, msg_with_params, thrown);
-          break;
-        case Level.FINE_INT:
-          logger.debug(m, msg_with_params, thrown);
-          break;
-        case Level.FINER_INT:
-          logger.trace(m, msg_with_params, thrown);
-          break;
-        case Level.FINEST_INT:
-          logger.trace(m, msg_with_params, thrown);
-          break;
-        default:
-          Misc.internalError();
-      }
-    }
-
-  }
-
-  // does the slf4j style of message formatting
-  @Override
-  public void log2(Marker m, String aFqcn, Level level, String message, Object[] args,
-          Throwable thrown) {
-    m = (m == null) ? getMarkerForLevel(level) : m;
-
-    if (isLocationCapable) { // slf4j simple logger is not
-      ((org.slf4j.spi.LocationAwareLogger) logger).log(m, aFqcn, getSlf4jLevel(level), message,
-              args, thrown);
-    } else {
-      if (thrown != null) {
-        Object[] args1 = (args == null) ? new Object[1] : new Object[args.length + 1];
-        if (args != null) {
-          System.arraycopy(args, 0, args1, 0, args.length);
-        }
-        args1[args1.length - 1] = thrown;
-        args = args1;
-      }
-      switch (level.toInteger()) {
-        case Level.SEVERE_INT:
-          logger.error(m, message, args);
-          break;
-        case Level.WARNING_INT:
-          logger.warn(m, message, args);
-          break;
-        case Level.INFO_INT:
-          logger.info(m, message, args);
-          break;
-        case Level.CONFIG_INT:
-          logger.info(m, message, args);
-          break;
-        case Level.FINE_INT:
-          logger.debug(m, message, args);
-          break;
-        case Level.FINER_INT:
-          logger.trace(m, message, args);
-          break;
-        case Level.FINEST_INT:
-          logger.trace(m, message, args);
-          break;
-        default:
-          Misc.internalError();
-      }
-    }
-  }
-
-  /**
-   * @return the logger name
-   * @see org.slf4j.Logger#getName()
-   */
-  @Override
-  public String getName() {
-    return logger.getName();
-  }
-
-  /**
-   * @return -
-   * @see org.slf4j.Logger#isTraceEnabled()
-   */
-  @Override
-  public boolean isTraceEnabled() {
-    return logger.isTraceEnabled();
-  }
-
-  /**
-   * @param marker
-   *          -
-   * @return true if trace is enabled for this marker
-   * @see org.slf4j.Logger#isTraceEnabled(org.slf4j.Marker)
-   */
-  @Override
-  public boolean isTraceEnabled(Marker marker) {
-    return logger.isTraceEnabled(marker);
-  }
-
-  /**
-   * @return -
-   * @see org.slf4j.Logger#isDebugEnabled()
-   */
-  @Override
-  public boolean isDebugEnabled() {
-    return logger.isDebugEnabled();
-  }
-
-  /**
-   * @param marker
-   *          -
-   * @return true if is enabled for this marker
-   * @see org.slf4j.Logger#isDebugEnabled(org.slf4j.Marker)
-   */
-  @Override
-  public boolean isDebugEnabled(Marker marker) {
-    return logger.isDebugEnabled(marker);
-  }
-
-  /**
-   * @return -
-   * @see org.slf4j.Logger#isInfoEnabled()
-   */
-  @Override
-  public boolean isInfoEnabled() {
-    return logger.isInfoEnabled();
-  }
-
-  /**
-   * @param marker
-   *          -
-   * @return true if is enabled for this marker
-   * @see org.slf4j.Logger#isInfoEnabled(org.slf4j.Marker)
-   */
-  @Override
-  public boolean isInfoEnabled(Marker marker) {
-    return logger.isInfoEnabled(marker);
-  }
-
-  /**
-   * @return -
-   * @see org.slf4j.Logger#isWarnEnabled()
-   */
-  @Override
-  public boolean isWarnEnabled() {
-    return logger.isWarnEnabled();
-  }
-
-  /**
-   * @param marker
-   *          -
-   * @return true if is enabled for this marker
-   * @see org.slf4j.Logger#isWarnEnabled(org.slf4j.Marker)
-   */
-  @Override
-  public boolean isWarnEnabled(Marker marker) {
-    return logger.isWarnEnabled(marker);
-  }
-
-  /**
-   * @return -
-   * @see org.slf4j.Logger#isErrorEnabled()
-   */
-  @Override
-  public boolean isErrorEnabled() {
-    return logger.isErrorEnabled();
-  }
-
-  /**
-   * @param marker
-   *          -
-   * @return true if is enabled for this marker
-   * @see org.slf4j.Logger#isErrorEnabled(org.slf4j.Marker)
-   */
-  @Override
-  public boolean isErrorEnabled(Marker marker) {
-    return logger.isErrorEnabled(marker);
-  }
-
-}
+/*

+ * 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.util.impl;

+

+import java.text.MessageFormat;

+

+import org.apache.uima.internal.util.Misc;

+import org.apache.uima.util.Level;

+import org.apache.uima.util.Logger;

+import org.slf4j.Marker;

+import org.slf4j.spi.LocationAwareLogger;

+

+/**

+ * UIMA Logging interface implementation for SLF4j

+ * 

+ * This design gets a logger in static initialization, in order to see what the back end is. If it

+ * is JUL or Log4j, it sets flags so that subsequent calls to getInstance gets those UIMA logger

+ * impls, not this one, in order to slightly reduce indirection at run time.

+ * 

+ */

+public class Slf4jLogger_impl extends Logger_common_impl {

+

+  public static final String DEFAULT_JUL = "uima.use_jul_as_default_uima_logger";

+  public static final boolean IS_DEFAULT_JUL = Misc.getNoValueSystemProperty(DEFAULT_JUL);

+

+  static final boolean isJul;

+  static final boolean isLog4j;

+

+  static {

+    Class<?> staticLoggerBinderClass = null;

+    try {

+      staticLoggerBinderClass = Class.forName("org.slf4j.impl.StaticLoggerBinder");

+    } catch (Exception e) {

+      // empty on purpose, if class not present, no back end logger, and staticLoggerBinderClass is

+      // left as null

+    }

+

+    if (null == staticLoggerBinderClass) {

+      if (IS_DEFAULT_JUL) {

+        isJul = true;

+        isLog4j = false;

+      } else {

+        isJul = false;

+        isLog4j = false;

+      }

+    } else {

+      // have some backend binding

+      boolean tb;

+      org.slf4j.Logger tempLogger = org.slf4j.LoggerFactory.getLogger("org.apache.uima");

+      try { // for jdk14 impl

+        Class<?> clazz = Class.forName("org.slf4j.impl.JDK14LoggerAdapter");

+        tb = clazz != null && clazz.isAssignableFrom(tempLogger.getClass());

+      } catch (ClassNotFoundException e1) {

+        tb = false;

+      }

+      isJul = tb;

+

+      tb = false;

+      if (!isJul) {

+        try { // for log4j 2 impl

+          Class<?> clazz = Class.forName("org.apache.logging.slf4j.Log4jLogger");

+          tb = null != clazz && clazz.isAssignableFrom(tempLogger.getClass());

+        } catch (ClassNotFoundException e1) {

+          tb = false;

+        }

+      }

+      isLog4j = tb;

+    }

+  }

+

+  /**

+   * logger object from the underlying Slf4j logging framework

+   */

+  final private org.slf4j.Logger logger;

+  final private boolean isLocationCapable; // the slf4j simple logger is not

+

+  /**

+   * create a new LogWrapper class for the specified source class

+   * 

+   * @param component

+   *          specified source class

+   */

+  Slf4jLogger_impl(Class<?> component) {

+    super(component);

+    final String loggerName = (component != null) ? component.getName() : "org.apache.uima";

+

+    logger = org.slf4j.LoggerFactory.getLogger(loggerName);

+    isLocationCapable = logger instanceof org.slf4j.spi.LocationAwareLogger;

+  }

+

+  private Slf4jLogger_impl(Slf4jLogger_impl l, int limit) {

+    super(l, limit);

+    this.logger = l.logger;

+    isLocationCapable = logger instanceof org.slf4j.spi.LocationAwareLogger;

+  }

+

+  /**

+   * creates a new Logger instance for the specified source class

+   * 

+   * @param component

+   *          current source class

+   * 

+   * @return Logger - returns the Logger object for the specified class

+   */

+  public static synchronized Logger getInstance(Class<?> component) {

+    if (isJul) {

+      return JSR47Logger_impl.getInstance(component);

+    }

+    if (isLog4j) {

+      return Log4jLogger_impl.getInstance(component);

+    }

+    return new Slf4jLogger_impl(component);

+  }

+

+  /**

+   * creates a new Logger instance using default name "org.apache.uima"

+   * 

+   * @return Logger - returns the Logger object for the specified class

+   */

+  public static synchronized Logger getInstance() {

+    return getInstance(null);

+  }

+

+  @Override

+  public Slf4jLogger_impl getLimitedLogger(int aLimit) {

+    if (aLimit == Integer.MAX_VALUE || aLimit == this.limit_common) {

+      return this;

+    }

+    return new Slf4jLogger_impl(this, aLimit);

+  }

+

+  public static int getSlf4jLevel(Level level) {

+    switch (level.toInteger()) {

+      case Level.SEVERE_INT:

+        return LocationAwareLogger.ERROR_INT;

+      case Level.WARNING_INT:

+        return LocationAwareLogger.WARN_INT;

+      case Level.INFO_INT:

+        return LocationAwareLogger.INFO_INT;

+      case Level.CONFIG_INT:

+        return LocationAwareLogger.INFO_INT;

+      case Level.FINE_INT:

+        return LocationAwareLogger.DEBUG_INT;

+      case Level.FINER_INT:

+        return LocationAwareLogger.TRACE_INT;

+      case Level.FINEST_INT:

+        return LocationAwareLogger.TRACE_INT;

+    }

+    Misc.internalError();

+    return LocationAwareLogger.ERROR_INT; // ignored, just here for compile error avoidance

+  }

+

+  /*

+   * (non-Javadoc)

+   * 

+   * @see org.apache.uima.util.Logger#isLoggable(org.apache.uima.util.Level)

+   */

+  @Override

+  public boolean isLoggable(Level level) {

+    switch (level.toInteger()) {

+      case org.apache.uima.util.Level.OFF_INT:

+        return false;

+      case org.apache.uima.util.Level.SEVERE_INT:

+        return logger.isErrorEnabled();

+      case org.apache.uima.util.Level.WARNING_INT:

+        return logger.isWarnEnabled();

+      case org.apache.uima.util.Level.INFO_INT:

+        return logger.isInfoEnabled();

+      case org.apache.uima.util.Level.CONFIG_INT:

+        return logger.isDebugEnabled(UIMA_MARKER_CONFIG);

+      case org.apache.uima.util.Level.FINE_INT:

+        return logger.isDebugEnabled();

+      case org.apache.uima.util.Level.FINER_INT:

+        return logger.isTraceEnabled();

+      case org.apache.uima.util.Level.FINEST_INT:

+        return logger.isTraceEnabled(UIMA_MARKER_FINEST);

+      default: // for Level.ALL return false, that's what jul logger does

+        return false;

+    }

+  }

+

+  @Override

+  public boolean isLoggable(Level level, Marker marker) {

+    switch (level.toInteger()) {

+      case org.apache.uima.util.Level.OFF_INT:

+        return false;

+      case org.apache.uima.util.Level.SEVERE_INT:

+        return logger.isErrorEnabled(marker);

+      case org.apache.uima.util.Level.WARNING_INT:

+        return logger.isWarnEnabled(marker);

+      case org.apache.uima.util.Level.INFO_INT:

+        return logger.isInfoEnabled(marker);

+      case org.apache.uima.util.Level.CONFIG_INT:

+        return logger.isInfoEnabled(marker);

+      case org.apache.uima.util.Level.FINE_INT:

+        return logger.isDebugEnabled(marker);

+      case org.apache.uima.util.Level.FINER_INT:

+        return logger.isTraceEnabled(marker);

+      case org.apache.uima.util.Level.FINEST_INT:

+        return logger.isTraceEnabled(marker);

+      default: // for Level.ALL return false, that's what jul logger does

+        return false;

+    }

+  }

+

+  /*

+   * (non-Javadoc)

+   * 

+   * @see org.apache.uima.util.Logger#setLevel(org.apache.uima.util.Level)

+   */

+  @Override

+  public void setLevel(Level level) {

+    // allow nop operation

+  }

+

+  // does the uima-logger style of message formatting

+  @Override

+  public void log(Marker m, String aFqcn, Level level, String message, Object[] args,

+          Throwable thrown) {

+    log(m, aFqcn, level, MessageFormat.format(message, args), thrown);

+  }

+

+  @Override

+  public void log(Marker m, String aFqcn, Level level, String msg_with_params, Throwable thrown) {

+    m = (m == null) ? getMarkerForLevel(level) : m;

+

+    if (isLocationCapable) { // slf4j simple logger is not

+      ((org.slf4j.spi.LocationAwareLogger) logger).log(m, aFqcn, getSlf4jLevel(level),

+              msg_with_params, null, thrown);

+    } else {

+      switch (level.toInteger()) {

+        case Level.SEVERE_INT:

+          // all of these calls to MessageFormat are to the java.text.MessageFormat

+          // to do {n} style format substitution

+          logger.error(m, msg_with_params, thrown);

+          break;

+        case Level.WARNING_INT:

+          logger.warn(m, msg_with_params, thrown);

+          break;

+        case Level.INFO_INT:

+          logger.info(m, msg_with_params, thrown);

+          break;

+        case Level.CONFIG_INT:

+          logger.info(m, msg_with_params, thrown);

+          break;

+        case Level.FINE_INT:

+          logger.debug(m, msg_with_params, thrown);

+          break;

+        case Level.FINER_INT:

+          logger.trace(m, msg_with_params, thrown);

+          break;

+        case Level.FINEST_INT:

+          logger.trace(m, msg_with_params, thrown);

+          break;

+        default:

+          Misc.internalError();

+      }

+    }

+

+  }

+

+  // does the slf4j style of message formatting

+  @Override

+  public void log2(Marker m, String aFqcn, Level level, String message, Object[] args,

+          Throwable thrown) {

+    m = (m == null) ? getMarkerForLevel(level) : m;

+

+    if (isLocationCapable) { // slf4j simple logger is not

+      // Work around LOG4J2-3177 by pulling a throwable from the args and providing it as thrown

+      // to the logger

+      Throwable actualThrown = thrown;

+      Object[] actualArgs = args;

+      if (actualThrown == null && args != null && args.length > 0

+              && args[args.length - 1] instanceof Throwable) {

+        actualThrown = (Throwable) args[args.length - 1];

+        actualArgs = new Object[args.length - 1];

+        System.arraycopy(args, 0, actualArgs, 0, actualArgs.length);

+      }

+

+      ((org.slf4j.spi.LocationAwareLogger) logger).log(m, aFqcn, getSlf4jLevel(level), message,

+              actualArgs, actualThrown);

+    } else {

+      if (thrown != null) {

+        Object[] args1 = (args == null) ? new Object[1] : new Object[args.length + 1];

+        if (args != null) {

+          System.arraycopy(args, 0, args1, 0, args.length);

+        }

+        args1[args1.length - 1] = thrown;

+        args = args1;

+      }

+      switch (level.toInteger()) {

+        case Level.SEVERE_INT:

+          logger.error(m, message, args);

+          break;

+        case Level.WARNING_INT:

+          logger.warn(m, message, args);

+          break;

+        case Level.INFO_INT:

+          logger.info(m, message, args);

+          break;

+        case Level.CONFIG_INT:

+          logger.info(m, message, args);

+          break;

+        case Level.FINE_INT:

+          logger.debug(m, message, args);

+          break;

+        case Level.FINER_INT:

+          logger.trace(m, message, args);

+          break;

+        case Level.FINEST_INT:

+          logger.trace(m, message, args);

+          break;

+        default:

+          Misc.internalError();

+      }

+    }

+  }

+

+  /**

+   * @return the logger name

+   * @see org.slf4j.Logger#getName()

+   */

+  @Override

+  public String getName() {

+    return logger.getName();

+  }

+

+  /**

+   * @return -

+   * @see org.slf4j.Logger#isTraceEnabled()

+   */

+  @Override

+  public boolean isTraceEnabled() {

+    return logger.isTraceEnabled();

+  }

+

+  /**

+   * @param marker

+   *          -

+   * @return true if trace is enabled for this marker

+   * @see org.slf4j.Logger#isTraceEnabled(org.slf4j.Marker)

+   */

+  @Override

+  public boolean isTraceEnabled(Marker marker) {

+    return logger.isTraceEnabled(marker);

+  }

+

+  /**

+   * @return -

+   * @see org.slf4j.Logger#isDebugEnabled()

+   */

+  @Override

+  public boolean isDebugEnabled() {

+    return logger.isDebugEnabled();

+  }

+

+  /**

+   * @param marker

+   *          -

+   * @return true if is enabled for this marker

+   * @see org.slf4j.Logger#isDebugEnabled(org.slf4j.Marker)

+   */

+  @Override

+  public boolean isDebugEnabled(Marker marker) {

+    return logger.isDebugEnabled(marker);

+  }

+

+  /**

+   * @return -

+   * @see org.slf4j.Logger#isInfoEnabled()

+   */

+  @Override

+  public boolean isInfoEnabled() {

+    return logger.isInfoEnabled();

+  }

+

+  /**

+   * @param marker

+   *          -

+   * @return true if is enabled for this marker

+   * @see org.slf4j.Logger#isInfoEnabled(org.slf4j.Marker)

+   */

+  @Override

+  public boolean isInfoEnabled(Marker marker) {

+    return logger.isInfoEnabled(marker);

+  }

+

+  /**

+   * @return -

+   * @see org.slf4j.Logger#isWarnEnabled()

+   */

+  @Override

+  public boolean isWarnEnabled() {

+    return logger.isWarnEnabled();

+  }

+

+  /**

+   * @param marker

+   *          -

+   * @return true if is enabled for this marker

+   * @see org.slf4j.Logger#isWarnEnabled(org.slf4j.Marker)

+   */

+  @Override

+  public boolean isWarnEnabled(Marker marker) {

+    return logger.isWarnEnabled(marker);

+  }

+

+  /**

+   * @return -

+   * @see org.slf4j.Logger#isErrorEnabled()

+   */

+  @Override

+  public boolean isErrorEnabled() {

+    return logger.isErrorEnabled();

+  }

+

+  /**

+   * @param marker

+   *          -

+   * @return true if is enabled for this marker

+   * @see org.slf4j.Logger#isErrorEnabled(org.slf4j.Marker)

+   */

+  @Override

+  public boolean isErrorEnabled(Marker marker) {

+    return logger.isErrorEnabled(marker);

+  }

+

+}

diff --git a/uimaj-core/src/test/java/aa/AbstractType.java b/uimaj-core/src/test/java/aa/AbstractType.java
index 9de7a7f..b9fa400 100644
--- a/uimaj-core/src/test/java/aa/AbstractType.java
+++ b/uimaj-core/src/test/java/aa/AbstractType.java
@@ -127,5 +127,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/aa/ConcreteType.java b/uimaj-core/src/test/java/aa/ConcreteType.java
index 7f1660c..c06e2ae 100644
--- a/uimaj-core/src/test/java/aa/ConcreteType.java
+++ b/uimaj-core/src/test/java/aa/ConcreteType.java
@@ -126,5 +126,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/aa/MissingFeatureInCas.java b/uimaj-core/src/test/java/aa/MissingFeatureInCas.java
index 45ac3c7..383f253 100644
--- a/uimaj-core/src/test/java/aa/MissingFeatureInCas.java
+++ b/uimaj-core/src/test/java/aa/MissingFeatureInCas.java
@@ -171,5 +171,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/aa/MissingInCas.java b/uimaj-core/src/test/java/aa/MissingInCas.java
index 0cbd8f3..6decfe3 100644
--- a/uimaj-core/src/test/java/aa/MissingInCas.java
+++ b/uimaj-core/src/test/java/aa/MissingInCas.java
@@ -105,5 +105,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/aa/Root.java b/uimaj-core/src/test/java/aa/Root.java
index b61a374..7906300 100644
--- a/uimaj-core/src/test/java/aa/Root.java
+++ b/uimaj-core/src/test/java/aa/Root.java
@@ -477,5 +477,3 @@
     ((DoubleArray)(_getFeatureValueNc(wrapGetIntCatchException(_FH_arrayDouble)))).set(i, v);
   }  
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/aa/T.java b/uimaj-core/src/test/java/aa/T.java
index 74a3eee..115f06a 100644
--- a/uimaj-core/src/test/java/aa/T.java
+++ b/uimaj-core/src/test/java/aa/T.java
@@ -112,5 +112,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/lang/LanguagePair.java b/uimaj-core/src/test/java/org/apache/lang/LanguagePair.java
index 07982f0..6d21211 100644
--- a/uimaj-core/src/test/java/org/apache/lang/LanguagePair.java
+++ b/uimaj-core/src/test/java/org/apache/lang/LanguagePair.java
@@ -153,5 +153,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/AnnotationIteratorTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/AnnotationIteratorTest.java
index d724d10..364e1a8 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/impl/AnnotationIteratorTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/AnnotationIteratorTest.java
@@ -384,22 +384,21 @@
     // a.getBegin(), a.getEnd());
     // }
 
-    assertThat(annotIndex.subiterator(bigBound, true, false)).toIterable()
-        .containsExactly( //
-                ann[58], ann[11], ann[12], //
-                ann[76], ann[13], ann[14], ann[15], //
-                ann[59], ann[16], //
-                ann[69], ann[17], ann[18], ann[19], ann[20], //
-                ann[60], ann[21], ann[22], //
-                ann[70], ann[23], ann[24], //
-                ann[71], ann[25], //
-                ann[61], ann[26], ann[27], ann[28], ann[29], ann[30], //
-                ann[62], ann[31], //
-                ann[72], ann[32], ann[33], ann[34], ann[35], //
-                ann[63], ann[36], ann[37], //
-                ann[73], ann[38], ann[39], //
-                ann[74], ann[40],  //
-                ann[64], ann[41], ann[42]);
+    assertThat(annotIndex.subiterator(bigBound, true, false)).toIterable().containsExactly( //
+            ann[58], ann[11], ann[12], //
+            ann[76], ann[13], ann[14], ann[15], //
+            ann[59], ann[16], //
+            ann[69], ann[17], ann[18], ann[19], ann[20], //
+            ann[60], ann[21], ann[22], //
+            ann[70], ann[23], ann[24], //
+            ann[71], ann[25], //
+            ann[61], ann[26], ann[27], ann[28], ann[29], ann[30], //
+            ann[62], ann[31], //
+            ann[72], ann[32], ann[33], ann[34], ann[35], //
+            ann[63], ann[36], ann[37], //
+            ann[73], ann[38], ann[39], //
+            ann[74], ann[40], //
+            ann[64], ann[41], ann[42]);
     assertThat(annotIndex.subiterator(bigBound, true, false)).toIterable()
             .extracting(a -> asList(ann).indexOf(a), a -> a.getType(), a -> a.getBegin(),
                     a -> a.getEnd())
@@ -437,18 +436,16 @@
     AnnotationFS sent = cas.getAnnotationIndex(this.sentenceType).iterator().get();
     assertThat(annotIndex.subiterator(sent, false, true)).toIterable()
             .as("Subiterator over annot unambiguous strict")
-            .extracting(a -> a.getType(), a -> a.getBegin(), a -> a.getEnd())
-            .containsExactly( //
-                    tuple(tokenType, 0, 5),  //
+            .extracting(a -> a.getType(), a -> a.getBegin(), a -> a.getEnd()).containsExactly( //
+                    tuple(tokenType, 0, 5), //
                     tuple(tokenType, 5, 10));
     assertCount("Subiterator over annot unambiguous strict", 2,
             annotIndex.subiterator(sent, false, true));
 
     assertThat(annotIndex.select().nonOverlapping().coveredBy(sent).asList())
             .as("Subiterator select over annot unambiguous strict")
-            .extracting(a -> a.getType(), a -> a.getBegin(), a -> a.getEnd())
-            .containsExactly( //
-                    tuple(tokenType, 0, 5),  //
+            .extracting(a -> a.getType(), a -> a.getBegin(), a -> a.getEnd()).containsExactly( //
+                    tuple(tokenType, 0, 5), //
                     tuple(tokenType, 5, 10));
     assertCount("Subiterator select over annot unambiguous strict", 2,
             annotIndex.select().nonOverlapping().coveredBy(sent));
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasTypeSystemMapperTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasTypeSystemMapperTest.java
index 1bc5380..d7acd28 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasTypeSystemMapperTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/CasTypeSystemMapperTest.java
@@ -507,7 +507,7 @@
         ftg2.set(i, v == (featsToInclude2 & v));
       }
     }
-    
+
  // @formatter:off
     /** 
      * Type system  called to initialize the type system.
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java
index 0f16cfa..cb342d8 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/XCASDeserializerTest.java
@@ -331,7 +331,7 @@
 
   @Test
   public void testMultipleSofas() throws Exception {
-      //@formatter:off
+    //@formatter:off
     /*************************************************
      * Make CAS with 2 sofas, initial and OtherSofa  *
      *                                               *
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_BINARY_TSI_Test.java b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_BINARY_TSI_Test.java
index 22226ca..7277ae7 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_BINARY_TSI_Test.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_BINARY_TSI_Test.java
@@ -66,7 +66,8 @@
   }
 
   private static List<DesSerTestScenario> roundTripDesSerScenarios() throws Exception {
-    return SerDesCasIOTestUtils.roundTripDesSerScenariosComparingFileContents(desSerCycles, CAS_FILE_NAME);
+    return SerDesCasIOTestUtils.roundTripDesSerScenariosComparingFileContents(desSerCycles,
+            CAS_FILE_NAME);
   }
 
   private static List<SerDesTestScenario> serDesScenarios() {
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_SERIALIZED_TSI_Test.java b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_SERIALIZED_TSI_Test.java
index 1640b24..d4b8863 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_SERIALIZED_TSI_Test.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_SERIALIZED_TSI_Test.java
@@ -65,7 +65,8 @@
   }
 
   private static List<DesSerTestScenario> roundTripDesSerScenarios() throws Exception {
-    return SerDesCasIOTestUtils.roundTripDesSerScenariosComparingFileContents(desSerCycles, CAS_FILE_NAME);
+    return SerDesCasIOTestUtils.roundTripDesSerScenariosComparingFileContents(desSerCycles,
+            CAS_FILE_NAME);
   }
 
   private static List<SerDesTestScenario> serDesScenarios() {
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/CrossAnnotation.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/CrossAnnotation.java
index 56d5431..06f24e6 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/CrossAnnotation.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/CrossAnnotation.java
@@ -139,5 +139,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/EnrichedEntity.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/EnrichedEntity.java
index 85bc61e..26b020e 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/EnrichedEntity.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/EnrichedEntity.java
@@ -142,5 +142,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureRecord.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureRecord.java
index e623f26..cb9c43c 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureRecord.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureRecord.java
@@ -154,5 +154,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_1.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_1.java
index b02d2e2..5123db2 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_1.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_1.java
@@ -131,5 +131,3 @@
 
   
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_2.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_2.java
index 9881c25..ef6d131 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_2.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_2.java
@@ -88,5 +88,3 @@
   private void readObject() {/*default - does nothing empty block */}
   
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_3.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_3.java
index 4133d03..327c594 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_3.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_3.java
@@ -88,5 +88,3 @@
   private void readObject() {/*default - does nothing empty block */}
   
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_4.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_4.java
index b52ae1f..b347ed8 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_4.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_4.java
@@ -88,5 +88,3 @@
   private void readObject() {/*default - does nothing empty block */}
   
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_5.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_5.java
index 277908f..9f3b12b 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_5.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_5.java
@@ -88,5 +88,3 @@
   private void readObject() {/*default - does nothing empty block */}
   
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_6.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_6.java
index 80253d4..33191b9 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_6.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Level_6.java
@@ -88,5 +88,3 @@
   private void readObject() {/*default - does nothing empty block */}
   
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Sentence.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Sentence.java
index 5c213af..4cfce49 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Sentence.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Sentence.java
@@ -99,5 +99,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/StringSubtypeAnnotation.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/StringSubtypeAnnotation.java
index 7fa588c..7553c47 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/StringSubtypeAnnotation.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/StringSubtypeAnnotation.java
@@ -139,5 +139,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/test/Token.java b/uimaj-core/src/test/java/org/apache/uima/cas/test/Token.java
index ab06a59..5478737 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/test/Token.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/test/Token.java
@@ -99,5 +99,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/impl/UimaContext_implTest.java b/uimaj-core/src/test/java/org/apache/uima/impl/UimaContext_implTest.java
index bd77169..57f277a 100644
--- a/uimaj-core/src/test/java/org/apache/uima/impl/UimaContext_implTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/impl/UimaContext_implTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.uima.impl;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -52,6 +53,7 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+
 public class UimaContext_implTest {
   protected final String TEST_DATAPATH = JUnitExtension.getFile("AnnotatorContextTest").getPath()
           + System.getProperty("path.separator") + JUnitExtension.getFile("ResourceTest");
@@ -273,6 +275,14 @@
   }
 
   @Test
+  public void thatGetConfigurationGroupNamesWorksWhenNoParametersHaveBeenDeclared() {
+    UimaContext emptyContext = UIMAFramework.newUimaContext(UIMAFramework.getLogger(),
+            UIMAFramework.newDefaultResourceManager(), UIMAFramework.newConfigurationManager());
+
+    assertThat(emptyContext.getConfigurationGroupNames()).isEmpty();
+  }
+
+  @Test
   public void testGetConfigParameterNames() {
     String[] names = mContext.getConfigParameterNames();
     Assert.assertEquals(6, names.length);
@@ -295,6 +305,15 @@
   }
 
   @Test
+  public void thatGetConfigParameterNamesWorksWhenNoParametersHaveBeenDeclared() {
+    UimaContext emptyContext = UIMAFramework.newUimaContext(UIMAFramework.getLogger(),
+            UIMAFramework.newDefaultResourceManager(), UIMAFramework.newConfigurationManager());
+
+    assertThat(emptyContext.getConfigParameterNames()).isEmpty();
+    assertThat(emptyContext.getConfigParameterNames("blah")).isEmpty();
+  }
+
+  @Test
   public void testGetConfigParameterNamesString() {
     String[] names = mContext2.getConfigParameterNames("en");
     Assert.assertEquals(4, names.length);
diff --git a/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfShorts.java b/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfShorts.java
index e4687da..d959a47 100644
--- a/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfShorts.java
+++ b/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfShorts.java
@@ -157,5 +157,3 @@
     ((ShortArray)(_getFeatureValueNc(wrapGetIntCatchException(_FH_f1Shorts)))).set(i, v);
   }  
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfStrings.java b/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfStrings.java
index 14f0c9e..5cc6ec3 100644
--- a/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfStrings.java
+++ b/uimaj-core/src/test/java/org/apache/uima/testTypeSystem_arrays/OfStrings.java
@@ -157,5 +157,3 @@
     ((StringArray)(_getFeatureValueNc(wrapGetIntCatchException(_FH_f1Strings)))).set(i, v);
   }  
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/org/apache/uima/util/impl/JSR47Logger_implTest.java b/uimaj-core/src/test/java/org/apache/uima/util/impl/JSR47Logger_implTest.java
index 369bab8..9ca1ad3 100644
--- a/uimaj-core/src/test/java/org/apache/uima/util/impl/JSR47Logger_implTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/util/impl/JSR47Logger_implTest.java
@@ -16,7 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.uima.util.impl;
 
 import java.util.HashMap;
@@ -24,6 +23,7 @@
 
 import org.apache.uima.util.Level;
 import org.junit.Assert;
+
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4JLogger_implCapturingTest.java b/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4JLogger_implCapturingTest.java
new file mode 100644
index 0000000..9693487
--- /dev/null
+++ b/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4JLogger_implCapturingTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.util.impl;
+
+import static java.lang.System.arraycopy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.tuple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.Level;
+import org.apache.uima.util.Logger;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class Log4JLogger_implCapturingTest {
+
+  private final Exception ex = new IllegalArgumentException("boom");
+
+  private Logger sut;
+
+  @BeforeEach
+  public void setup() {
+    sut = Log4jLogger_impl.getInstance(null);
+  }
+
+  @Test
+  public void thatSimpleMessageIsLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.trace("test", ex);
+      sut.debug("test", ex);
+      sut.info("test", ex);
+      sut.warn("test", ex);
+      sut.error("test", ex);
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getLevel(), //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple(Level.TRACE, "test", ex), //
+                      tuple(Level.DEBUG, "test", ex), //
+                      tuple(Level.INFO, "test", ex), //
+                      tuple(Level.WARN, "test", ex), //
+                      tuple(Level.ERROR, "test", ex));
+    }
+  }
+
+  @Test
+  public void thatThrowableIsLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.debug("test", ex);
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple("test", ex));
+    }
+  }
+
+  @Test
+  public void thatMultipleParametersAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      for (int paramCount = 1; paramCount < 5; paramCount++) {
+        List<String> placeholders = new ArrayList<>();
+        List<String> values = new ArrayList<>();
+        for (int i = 0; i < paramCount; i++) {
+          placeholders.add("{}");
+          values.add(Integer.toString(i));
+        }
+        sut.debug(String.join(" ", placeholders), values.toArray());
+
+        assertThat(capture.getAndClearLatestEvents()) //
+                .extracting( //
+                        e -> e.getMessage().getFormattedMessage(), //
+                        e -> e.getThrown()) //
+                .containsExactly( //
+                        tuple(String.join(" ", values), null));
+      }
+    }
+  }
+
+  @Test
+  public void thatOneParameterAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.debug("{}", "1", ex);
+
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple("1", ex));
+    }
+  }
+
+  @Test
+  public void thatTwoParametersAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.trace("{} {}", "1", "2", ex);
+      sut.debug("{} {}", "1", "2", ex);
+      sut.info("{} {}", "1", "2", ex);
+      sut.warn("{} {}", "1", "2", ex);
+      sut.error("{} {}", "1", "2", ex);
+
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getLevel(), //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple(Level.TRACE, "1 2", ex), //
+                      tuple(Level.DEBUG, "1 2", ex), //
+                      tuple(Level.INFO, "1 2", ex), //
+                      tuple(Level.WARN, "1 2", ex), //
+                      tuple(Level.ERROR, "1 2", ex));
+    }
+  }
+
+  @Test
+  public void thatThreeParametersAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.trace("{} {} {}", "1", "2", "3", ex);
+      sut.debug("{} {} {}", "1", "2", "3", ex);
+      sut.info("{} {} {}", "1", "2", "3", ex);
+      sut.warn("{} {} {}", "1", "2", "3", ex);
+      sut.error("{} {} {}", "1", "2", "3", ex);
+
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getLevel(), //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple(Level.TRACE, "1 2 3", ex), //
+                      tuple(Level.DEBUG, "1 2 3", ex), //
+                      tuple(Level.INFO, "1 2 3", ex), //
+                      tuple(Level.WARN, "1 2 3", ex), //
+                      tuple(Level.ERROR, "1 2 3", ex));
+    }
+  }
+
+  @Test
+  public void thatMultipleParametersAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      for (int paramCount = 1; paramCount < 5; paramCount++) {
+        List<String> placeholders = new ArrayList<>();
+        List<String> values = new ArrayList<>();
+        for (int i = 0; i < paramCount; i++) {
+          placeholders.add("{}");
+          values.add(Integer.toString(i));
+        }
+
+        Object[] valuesPlusEx = new Object[paramCount + 1];
+        arraycopy(values.toArray(), 0, valuesPlusEx, 0, paramCount);
+        valuesPlusEx[paramCount] = ex;
+        sut.debug(String.join(" ", placeholders), valuesPlusEx);
+
+        assertThat(capture.getAndClearLatestEvents()) //
+                .extracting( //
+                        e -> e.getMessage().getFormattedMessage(), //
+                        e -> e.getThrown()) //
+                .containsExactly( //
+                        tuple(String.join(" ", values), ex));
+      }
+    }
+  }
+}
diff --git a/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4JMessageCapture.java b/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4JMessageCapture.java
new file mode 100644
index 0000000..39bd6c6
--- /dev/null
+++ b/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4JMessageCapture.java
@@ -0,0 +1,79 @@
+/*
+ * 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.util.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.filter.AbstractFilter;
+import org.apache.uima.util.AutoCloseableNoException;
+
+public class Log4JMessageCapture implements AutoCloseableNoException {
+
+  private final List<LogEvent> events = new ArrayList<>();
+  private final List<LogEvent> latestEvents = new ArrayList<>();
+  private final Filter filter;
+  private final ConsoleAppender app;
+
+  public Log4JMessageCapture() {
+    // Tell the logger to log everything
+    org.apache.logging.log4j.core.Logger rootLogger = (org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
+            .getRootLogger();
+    rootLogger.get().setLevel(org.apache.logging.log4j.Level.ALL);
+    rootLogger.getContext().updateLoggers();
+
+    filter = makeCapturingFilter();
+
+    app = (ConsoleAppender) rootLogger.get().getAppenders().values().stream().findFirst().get();
+    app.addFilter(filter);
+  }
+
+  private Filter makeCapturingFilter() {
+    return new AbstractFilter() {
+      @Override
+      public Result filter(LogEvent event) {
+        StackTraceElement ste = event.getSource();
+        System.out.printf("[%s:%s] %s%n", ste.getFileName(), ste.getLineNumber(),
+                event.getMessage().getFormattedMessage());
+        LogEvent immutableEvent = event.toImmutable();
+        events.add(immutableEvent);
+        latestEvents.add(immutableEvent);
+        return Result.DENY;
+      }
+    };
+  }
+
+  public List<LogEvent> getAndClearLatestEvents() {
+    List<LogEvent> result = new ArrayList<>(latestEvents);
+    latestEvents.clear();
+    return result;
+  }
+
+  public List<LogEvent> getAllEvents() {
+    return events;
+  }
+
+  @Override
+  public void close() {
+    app.removeFilter(filter);
+  }
+}
diff --git a/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4jLogger_implTest.java b/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4jLogger_implTest.java
index be5a011..e0cc918 100644
--- a/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4jLogger_implTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/util/impl/Log4jLogger_implTest.java
@@ -184,46 +184,7 @@
 
   @Test
   public void testMessageLogMethods() throws Exception {
-    // final List<LoggingEvent> records = new ArrayList<LoggingEvent>();
-    final int[] nbrcalls = new int[1];
-    nbrcalls[0] = 0;
-
-    // Tell the logger to log everything
-    // long start = System.nanoTime();
-    org.apache.logging.log4j.core.Logger rootLogger = (org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
-            .getRootLogger();
-    // System.out.format("debug time to init logger is %f%n ", ((double)(System.nanoTime() - start))
-    // / 1000000000.0d);
-    rootLogger.get().setLevel(org.apache.logging.log4j.Level.ALL);
-    rootLogger.getContext().updateLoggers();
-    // Configurator.setLevel(null, org.apache.logging.log4j.Level.ALL);
-    // final LoggerContext loggerContext = LoggerContext.getContext(false);
-    // final LoggerConfig loggerConfig = loggerContext.getConfiguration().getRootLogger();
-    //
-    // Appender appender = (Appender) rootLogger.getAllAppenders().nextElement();
-    // Capture the logging output without actually logging it
-    // ConsoleAppender app = (ConsoleAppender)
-    // rootLogger.getAppenders().values().stream().findFirst().get();
-    // add the filter to the shared Logger Context appender
-    ConsoleAppender app = (ConsoleAppender) rootLogger.get().getAppenders().values().stream()
-            .findFirst().get();
-    Filter filter = new AbstractFilter() {
-      @Override
-      public Result filter(LogEvent event) {
-        nbrcalls[0]++;
-        StackTraceElement ste = event.getSource();
-        System.out.printf("[%s:%s] %s%n", ste.getFileName(), ste.getLineNumber(),
-                event.getMessage().getFormattedMessage());
-        assertEquals(Log4jLogger_implTest.this.getClass().getName(), ste.getClassName());
-        return Result.DENY;
-      }
-    };
-
-    app.addFilter(filter);
-
-    try {
-      // create Logger
-      // debug
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
       org.apache.uima.util.Logger tempLogger = null;
       try {
         tempLogger = Log4jLogger_impl.getInstance(getClass());
@@ -233,18 +194,9 @@
         System.err.println("debug finished stacktrace");
         throw e;
       }
+
       final org.apache.uima.util.Logger logger = tempLogger;
-      // reset log level to INFO
       logger.setLevel(Level.INFO);
-      // Configurator.setLevel("Console", org.apache.logging.log4j.Level.INFO);
-
-      // File file = File.createTempFile("LoggingTest","log");
-      // file.deleteOnExit();
-
-      // change output temporary file
-      // logger.setOutputStream(new PrintStream(new FileOutputStream(file)));
-
-      // log test with method log(Level,String)
 
       logger.log(Level.INFO, "My first test message");
       logger.log(Level.INFO, "");
@@ -293,16 +245,13 @@
       logger.logException(ex);
       logger.logException(null);
 
-      assertEquals(16, nbrcalls[0]); // all calls except those with null or "" msgs (including
-                                     // non-null throwable/exception)
+      // all calls except those with null or "" msgs (including non-null throwable/exception)
+      assertEquals(16, capture.getAllEvents().size());
+
       // https://issues.apache.org/jira/browse/UIMA-5719
       logger.logrb(Level.WARNING, "testClass", "testMethod", "org.apache.uima.impl.log_messages",
               "UIMA_external_override_ignored__CONFIG", new Object[] { "n1", "${abc}" });
-
-    } finally {
-      app.removeFilter(filter);
     }
-
   }
 
   @Test
diff --git a/uimaj-core/src/test/java/org/apache/uima/util/impl/Slf4jLogger_implCapturingTest.java b/uimaj-core/src/test/java/org/apache/uima/util/impl/Slf4jLogger_implCapturingTest.java
new file mode 100644
index 0000000..038160b
--- /dev/null
+++ b/uimaj-core/src/test/java/org/apache/uima/util/impl/Slf4jLogger_implCapturingTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.util.impl;
+
+import static java.lang.System.arraycopy;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.tuple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.Level;
+import org.apache.uima.util.Logger;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class Slf4jLogger_implCapturingTest {
+
+  private final Exception ex = new IllegalArgumentException("boom");
+
+  private Logger sut;
+
+  @BeforeEach
+  public void setup() {
+    sut = new Slf4jLogger_impl(null);
+  }
+
+  @Test
+  public void thatSimpleMessageIsLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.trace("test", ex);
+      sut.debug("test", ex);
+      sut.info("test", ex);
+      sut.warn("test", ex);
+      sut.error("test", ex);
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getLevel(), //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple(Level.TRACE, "test", ex), //
+                      tuple(Level.DEBUG, "test", ex), //
+                      tuple(Level.INFO, "test", ex), //
+                      tuple(Level.WARN, "test", ex), //
+                      tuple(Level.ERROR, "test", ex));
+    }
+  }
+
+  @Test
+  public void thatThrowableIsLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.debug("test", ex);
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple("test", ex));
+    }
+  }
+
+  @Test
+  public void thatMultipleParametersAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      for (int paramCount = 1; paramCount < 5; paramCount++) {
+        List<String> placeholders = new ArrayList<>();
+        List<String> values = new ArrayList<>();
+        for (int i = 0; i < paramCount; i++) {
+          placeholders.add("{}");
+          values.add(Integer.toString(i));
+        }
+        sut.debug(String.join(" ", placeholders), values.toArray());
+
+        assertThat(capture.getAndClearLatestEvents()) //
+                .extracting( //
+                        e -> e.getMessage().getFormattedMessage(), //
+                        e -> e.getThrown()) //
+                .containsExactly( //
+                        tuple(String.join(" ", values), null));
+      }
+    }
+  }
+
+  @Test
+  public void thatOneParameterAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.debug("{}", "1", ex);
+
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple("1", ex));
+    }
+  }
+
+  @Test
+  public void thatTwoParametersAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.trace("{} {}", "1", "2", ex);
+      sut.debug("{} {}", "1", "2", ex);
+      sut.info("{} {}", "1", "2", ex);
+      sut.warn("{} {}", "1", "2", ex);
+      sut.error("{} {}", "1", "2", ex);
+
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getLevel(), //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple(Level.TRACE, "1 2", ex), //
+                      tuple(Level.DEBUG, "1 2", ex), //
+                      tuple(Level.INFO, "1 2", ex), //
+                      tuple(Level.WARN, "1 2", ex), //
+                      tuple(Level.ERROR, "1 2", ex));
+    }
+  }
+
+  @Test
+  public void thatThreeParametersAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      sut.trace("{} {} {}", "1", "2", "3", ex);
+      sut.debug("{} {} {}", "1", "2", "3", ex);
+      sut.info("{} {} {}", "1", "2", "3", ex);
+      sut.warn("{} {} {}", "1", "2", "3", ex);
+      sut.error("{} {} {}", "1", "2", "3", ex);
+
+      assertThat(capture.getAndClearLatestEvents()) //
+              .extracting( //
+                      e -> e.getLevel(), //
+                      e -> e.getMessage().getFormattedMessage(), //
+                      e -> e.getThrown()) //
+              .containsExactly( //
+                      tuple(Level.TRACE, "1 2 3", ex), //
+                      tuple(Level.DEBUG, "1 2 3", ex), //
+                      tuple(Level.INFO, "1 2 3", ex), //
+                      tuple(Level.WARN, "1 2 3", ex), //
+                      tuple(Level.ERROR, "1 2 3", ex));
+    }
+  }
+
+  @Test
+  public void thatMultipleParametersAndThrowableAreLogged() throws Exception {
+    try (Log4JMessageCapture capture = new Log4JMessageCapture()) {
+      for (int paramCount = 1; paramCount < 5; paramCount++) {
+        List<String> placeholders = new ArrayList<>();
+        List<String> values = new ArrayList<>();
+        for (int i = 0; i < paramCount; i++) {
+          placeholders.add("{}");
+          values.add(Integer.toString(i));
+        }
+
+        Object[] valuesPlusEx = new Object[paramCount + 1];
+        arraycopy(values.toArray(), 0, valuesPlusEx, 0, paramCount);
+        valuesPlusEx[paramCount] = ex;
+        sut.debug(String.join(" ", placeholders), valuesPlusEx);
+
+        assertThat(capture.getAndClearLatestEvents()) //
+                .extracting( //
+                        e -> e.getMessage().getFormattedMessage(), //
+                        e -> e.getThrown()) //
+                .containsExactly( //
+                        tuple(String.join(" ", values), ex));
+      }
+    }
+  }
+}
diff --git a/uimaj-core/src/test/java/sofa/test/CrossAnnotation.java b/uimaj-core/src/test/java/sofa/test/CrossAnnotation.java
index faa3e40..8780a19 100644
--- a/uimaj-core/src/test/java/sofa/test/CrossAnnotation.java
+++ b/uimaj-core/src/test/java/sofa/test/CrossAnnotation.java
@@ -138,5 +138,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/x/y/z/EndOfSentence.java b/uimaj-core/src/test/java/x/y/z/EndOfSentence.java
index 638f770..6965b00 100644
--- a/uimaj-core/src/test/java/x/y/z/EndOfSentence.java
+++ b/uimaj-core/src/test/java/x/y/z/EndOfSentence.java
@@ -82,5 +82,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/x/y/z/Sentence.java b/uimaj-core/src/test/java/x/y/z/Sentence.java
index 73a5822..0f25a48 100644
--- a/uimaj-core/src/test/java/x/y/z/Sentence.java
+++ b/uimaj-core/src/test/java/x/y/z/Sentence.java
@@ -121,5 +121,3 @@
   }    
     
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/x/y/z/Separator.java b/uimaj-core/src/test/java/x/y/z/Separator.java
index d0d8fe8..c72b4a0 100644
--- a/uimaj-core/src/test/java/x/y/z/Separator.java
+++ b/uimaj-core/src/test/java/x/y/z/Separator.java
@@ -86,5 +86,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/x/y/z/Token.java b/uimaj-core/src/test/java/x/y/z/Token.java
index fcfaf0f..363f9a9 100644
--- a/uimaj-core/src/test/java/x/y/z/Token.java
+++ b/uimaj-core/src/test/java/x/y/z/Token.java
@@ -205,5 +205,3 @@
     ((StringArray)(_getFeatureValueNc(wrapGetIntCatchException(_FH_lemmaList)))).set(i, v);
   }  
   }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/x/y/z/TokenType.java b/uimaj-core/src/test/java/x/y/z/TokenType.java
index 449d518..593658d 100644
--- a/uimaj-core/src/test/java/x/y/z/TokenType.java
+++ b/uimaj-core/src/test/java/x/y/z/TokenType.java
@@ -87,5 +87,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file
diff --git a/uimaj-core/src/test/java/x/y/z/Word.java b/uimaj-core/src/test/java/x/y/z/Word.java
index 655094b..fec1301 100644
--- a/uimaj-core/src/test/java/x/y/z/Word.java
+++ b/uimaj-core/src/test/java/x/y/z/Word.java
@@ -86,5 +86,3 @@
   private void readObject() {/*default - does nothing empty block */}
      
 }
-
-    
\ No newline at end of file