You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2017/11/22 20:48:52 UTC

svn commit: r1816079 - in /uima/uv3/uimaj-v3/trunk: uima-docbook-v3-users-guide/src/docbook/ uimaj-core/src/main/java/org/apache/uima/analysis_engine/ uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/ uimaj-core/src/main/java/org/apache/ui...

Author: schor
Date: Wed Nov 22 20:48:51 2017
New Revision: 1816079

URL: http://svn.apache.org/viewvc?rev=1816079&view=rev
Log:
[UIMA-5652] implement MDC contexts for initialize and process methods calls, update docs

Modified:
    uima/uv3/uimaj-v3/trunk/uima-docbook-v3-users-guide/src/docbook/uv3.logging.xml
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/AnalysisEngine.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineImplBase.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/UimacppAnalysisEngineImpl.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java

Modified: uima/uv3/uimaj-v3/trunk/uima-docbook-v3-users-guide/src/docbook/uv3.logging.xml
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uima-docbook-v3-users-guide/src/docbook/uv3.logging.xml?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uima-docbook-v3-users-guide/src/docbook/uv3.logging.xml (original)
+++ uima/uv3/uimaj-v3/trunk/uima-docbook-v3-users-guide/src/docbook/uv3.logging.xml Wed Nov 22 20:48:51 2017
@@ -124,13 +124,10 @@ under the License.
   </section>  
   <section id="uv3.logging.new_recorded_context_data">
     <title>Context Data</title>
-      
-    <note><para><emphasis role="bold">Not (yet) implemented; for planning purposes only.</emphasis></para></note>
     
     <para>
-      Context data is kept in SLF4j MDC and/or NDC maps; there is a separate map per thread.  
-      Some of this information is always updated, other is only recorded if the
-      logger for the class has a level set to Tracing.  
+      Context data is kept in SLF4j MDC maps; there is a separate map per thread.  
+      This information is set before calling Annotator's process or initialize methods. 
       The following table lists the keys and the values recorded in the
       contexts; these can be retrieved by the logging layouts and included in log messages.      
     </para>
@@ -153,12 +150,28 @@ under the License.
          <!-- ******************************************************************************* -->
          <row>
            <entry><para>uima_annotator</para></entry>         
-           <entry><para>the name of the annotator.</para></entry>
+           <entry><para>the annotator implementation name.</para></entry>
+         </row>
+
+         <row>
+           <entry><para>uima_annotator_context_name</para></entry>         
+           <entry><para>the fully qualified annotator context name within the pipeline.
+                        A top level (not contained within any aggregate) annotator will have
+                        a context of "/".</para></entry>
+         </row>
+         
+         <row>
+           <entry><para>uima_root_context_id</para></entry>
+           <entry><para>A unique id representing the pipeline being run. 
+                This is unique within a class-loader for the UIMA-framework.
+                </para></entry>
          </row>
          
          <row>
-           <entry><para>uima_root_context</para></entry>
-           <entry><para>The root context corresponds to the pipeline being run.  This could be be nested.</para></entry>
+           <entry><para>uima_cas_id</para></entry>
+           <entry><para>A unique id representing the CAS being currently processed in the pipeline.
+           This is unique within a class-loader for the UIMA-framework.
+           </para></entry>
          </row>
 
          <!-- <row>

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/AnalysisEngine.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/AnalysisEngine.java?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/AnalysisEngine.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/AnalysisEngine.java Wed Nov 22 20:48:51 2017
@@ -182,6 +182,12 @@ public interface AnalysisEngine extends
   public static final String PARAM_THROTTLE_EXCESSIVE_ANNOTATOR_LOGGING = 
       "PARAM_THROTTLE_EXCESSIVE_ANNOTATOR_LOGGING";
   
+  public static final String MDC_ANNOTATOR_IMPL_NAME = "uima_annotator";
+  public static final String MDC_ANNOTATOR_CONTEXT_NAME = "uima_annotator_context_name";
+  public static final String MDC_ROOT_CONTEXT_ID = "uima_root_context_id";
+  public static final String MDC_CAS_ID = "uima_cas_id";
+  
+  
   /**
    * Initializes this <code>Resource</code> from a <code>ResourceSpecifier</code>. Applications
    * do not need to call this method. It is called automatically by the <code>ResourceFactory</code>

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineImplBase.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineImplBase.java?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineImplBase.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/AnalysisEngineImplBase.java Wed Nov 22 20:48:51 2017
@@ -20,12 +20,13 @@
 package org.apache.uima.analysis_engine.impl;
 
 import java.io.IOException;
-import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
 import org.apache.uima.UIMAFramework;
+import org.apache.uima.UimaContext;
 import org.apache.uima.UimaContextAdmin;
+import org.apache.uima.analysis_component.AnalysisComponent;
 import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineManagement;
 import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
@@ -35,18 +36,19 @@ import org.apache.uima.analysis_engine.R
 import org.apache.uima.analysis_engine.ResultSpecification;
 import org.apache.uima.analysis_engine.TextAnalysisEngine;
 import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData;
+import org.apache.uima.cas.AbstractCas;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.CASException;
-import org.apache.uima.cas.Feature;
-import org.apache.uima.cas.Type;
 import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.cas.impl.CASImpl;
-import org.apache.uima.cas.impl.FeatureImpl;
 import org.apache.uima.cas.impl.TypeImpl;
 import org.apache.uima.cas.impl.TypeSystemImpl;
 import org.apache.uima.cas.text.Language;
+import org.apache.uima.impl.UimaContext_ImplBase;
 import org.apache.uima.internal.util.JmxMBeanAgent;
+import org.apache.uima.internal.util.function.Runnable_withException;
 import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.impl.JCasImpl;
 import org.apache.uima.resource.CasDefinition;
 import org.apache.uima.resource.ConfigurableResource_ImplBase;
 import org.apache.uima.resource.ResourceInitializationException;
@@ -62,6 +64,7 @@ import org.apache.uima.util.ProcessTrace
 import org.apache.uima.util.UimaTimer;
 import org.apache.uima.util.impl.ProcessTraceEvent_impl;
 import org.apache.uima.util.impl.ProcessTrace_impl;
+import org.slf4j.MDC;
 
 /**
  * Provides functionality common to Analysis Engine implementations.
@@ -596,4 +599,64 @@ public abstract class AnalysisEngineImpl
   protected String getMBeanNamePrefix() {
     return mMBeanNamePrefix;
   }
+  
+  protected void callInitializeMethod(AnalysisComponent component, UimaContext context) throws ResourceInitializationException {
+//    component.initialize(context);
+    try {
+      withContexts(component, context, null, () -> component.initialize(context));
+    } catch (Exception e) {
+      throw (ResourceInitializationException)e;
+    }
+  }
+  
+  protected void callProcessMethod(AnalysisComponent component, AbstractCas cas) throws Exception {
+//    component.process(cas);
+//    getMBean().incrementCASesProcessed();
+    withContexts(component, 
+                getUimaContext(), 
+                cas,
+                 () -> {component.process(cas); 
+                        getMBean().incrementCASesProcessed();});
+  }
+  
+  private void withContexts(AnalysisComponent component, UimaContext context, AbstractCas cas, Runnable_withException r) throws Exception {
+    UimaContext_ImplBase ucib = (UimaContext_ImplBase)context;
+    String prevCN = pushMDCstring(MDC_ANNOTATOR_CONTEXT_NAME, ucib.getQualifiedContextName());
+    String prevAN = pushMDCstring(MDC_ANNOTATOR_IMPL_NAME, component.getClass().getName());
+    String prevRID = pushMDCstring(MDC_ROOT_CONTEXT_ID, ((UimaContext_ImplBase)ucib.getRootContext())
+                                                     .getMdcId());
+    String prevCAS = null;
+    if (cas != null) {
+      CASImpl casImpl = (cas instanceof JCas) ? ((JCasImpl)cas).getCasImpl() : (CASImpl)cas;
+      prevCAS = pushMDCstring(MDC_CAS_ID, casImpl.getCasId());
+    }
+    try {
+      r.run();
+    } finally {
+      popMDCstring(MDC_ANNOTATOR_CONTEXT_NAME, prevCN);
+      popMDCstring(MDC_ANNOTATOR_IMPL_NAME, prevAN);
+      popMDCstring(MDC_ROOT_CONTEXT_ID, prevRID);
+      if (cas != null) {
+        popMDCstring(MDC_CAS_ID, prevCAS);
+      }
+    }
+  }
+    
+  private String pushMDCstring(String key, String value) {
+    String v = MDC.get(key);
+    if (value.equals(v)) return value;
+    MDC.put(key, (v == null) ? value : v + " : " + value);
+    return v;
+  }
+  
+  private void popMDCstring(String key, String prev) {
+    String v = MDC.get(key);
+    if (v.equals(prev)) return;
+    if (prev != null) {
+      MDC.put(key,  prev);
+    } else {
+      MDC.remove(key);
+    }
+  }
+
 }

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/PrimitiveAnalysisEngine_impl.java Wed Nov 22 20:48:51 2017
@@ -52,6 +52,7 @@ import org.apache.uima.resource.metadata
 import org.apache.uima.resource.metadata.ResourceMetaData;
 import org.apache.uima.util.Level;
 import org.apache.uima.util.Logger;
+import org.slf4j.MDC;
 
 /**
  * Reference implementation of {@link AnalysisEngine}.
@@ -248,7 +249,8 @@ public class PrimitiveAnalysisEngine_imp
     // initialize AnalysisComponent
     UimaContext prevContext = setContextHolder();  // for use by POJOs
     try {
-      mAnalysisComponent.initialize(getUimaContext());
+      callInitializeMethod(mAnalysisComponent, getUimaContext());
+//      mAnalysisComponent.initialize(getUimaContext());
       // set up the CAS pool for this AE (this won't do anything if mAnalysisComponent.getCasInstancesRequired() == 0)
       getUimaContextAdmin().defineCasPool(mAnalysisComponent.getCasInstancesRequired(),
               getPerformanceTuningSettings(), mSofaAware);
@@ -374,10 +376,19 @@ public class PrimitiveAnalysisEngine_imp
        
         // insure view is passed to switch / restore class loader https://issues.apache.org/jira/browse/UIMA-2211
         ((CASImpl)view).switchClassLoaderLockCasCL(this.getResourceManager().getExtensionClassLoader());
-
-        // call the process method
-        mAnalysisComponent.process(casToPass);
-        getMBean().incrementCASesProcessed();
+          
+        
+        callProcessMethod(mAnalysisComponent, casToPass);
+//        // call the process method
+//        MDC.put(MDC_ANNOTATOR_CONTEXT_NAME, ((UimaContext_ImplBase)getUimaContext()).getQualifiedContextName());
+//        MDC.put(MDC_ANNOTATOR_IMPL_NAME, mAnalysisComponent.getClass().getName());
+//        try {
+//        mAnalysisComponent.process(casToPass);
+//        } finally {
+//          MDC.remove(MDC_ANNOTATOR_CONTEXT_NAME);
+//          MDC.remove(MDC_ANNOTATOR_IMPL_NAME);
+//        }
+//        getMBean().incrementCASesProcessed();
         
         //note we do not clear the CAS's currentComponentInfo at this time
         // nor do we unlock the cas and switch it back (class loader-wise).  The AnalysisComponents still

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/UimacppAnalysisEngineImpl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/UimacppAnalysisEngineImpl.java?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/UimacppAnalysisEngineImpl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/UimacppAnalysisEngineImpl.java Wed Nov 22 20:48:51 2017
@@ -55,6 +55,7 @@ import org.apache.uima.uimacpp.UimacppAn
 import org.apache.uima.util.CasCreationUtils;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.Level;
+import org.slf4j.MDC;
 
 /**
  * Reference implementation of {@link AnalysisEngine}.
@@ -279,8 +280,19 @@ public class UimacppAnalysisEngineImpl e
         // process method
         Class<CAS> requiredInterface = mAnnotator.getRequiredCasInterface();
         AbstractCas casToPass = getCasManager().getCasInterface(view, requiredInterface);
-        mAnnotator.process(casToPass);
-        getMBean().incrementCASesProcessed();
+        
+        callProcessMethod(mAnnotator, casToPass);
+//        
+//        MDC.put(MDC_ANNOTATOR_CONTEXT_NAME, ((UimaContext_ImplBase)getUimaContext()).getQualifiedContextName());
+//        MDC.put(MDC_ANNOTATOR_IMPL_NAME, mAnnotator.getClass().getName());
+//        try {       
+//          mAnnotator.process(casToPass);
+//        } finally {
+//          MDC.remove(MDC_ANNOTATOR_CONTEXT_NAME);
+//          MDC.remove(MDC_ANNOTATOR_IMPL_NAME);
+//        }
+
+//        getMBean().incrementCASesProcessed();
       } catch (Exception e) {
         if (e instanceof AnalysisEngineProcessException) {
           throw e;
@@ -325,7 +337,8 @@ public class UimacppAnalysisEngineImpl e
       getUimaContextAdmin().defineCasPool(mAnnotator.getCasInstancesRequired(),
               getPerformanceTuningSettings(), mSofaAware);
 
-      mAnnotator.initialize(uimaContext);
+      callInitializeMethod(mAnnotator, uimaContext);
+//      mAnnotator.initialize(uimaContext);
     }
   }
 

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CASImpl.java Wed Nov 22 20:48:51 2017
@@ -478,7 +478,7 @@ public class CASImpl extends AbstractCas
     private final AtomicInteger casResets = new AtomicInteger(0);
     
     // unique ID for a created CAS view, not updated if CAS is reset and reused
-    private final int casId = casIdProvider.incrementAndGet();
+    private final String casId = String.valueOf(casIdProvider.incrementAndGet());
     
     // shared singltons, created at type system commit
     
@@ -4643,7 +4643,10 @@ public class CASImpl extends AbstractCas
     return svd.casResets.get();
   }
   
-  int getCasId() {
+  /**
+   * @return an identifier for this CAS, globally unique within the classloader
+   */
+  public String getCasId() {
     return svd.casId;
   }
   
@@ -5131,7 +5134,7 @@ public class CASImpl extends AbstractCas
   void traceFSfs(FeatureStructureImplC fs) {
     StringBuilder b = svd.traceFScreationSb;
     svd.traceFSid = fs._id;
-    b.append("c:").append(String.format("%-3d", getCasId()));
+    b.append("c:").append(String.format("%-3s", getCasId()));
     String viewName = fs._casView.getViewName();
     if (null == viewName) {
       viewName = "base";

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java?rev=1816079&r1=1816078&r2=1816079&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/impl/UimaContext_ImplBase.java Wed Nov 22 20:48:51 2017
@@ -37,6 +37,7 @@ import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.UIMARuntimeException;
@@ -71,6 +72,8 @@ public abstract class UimaContext_ImplBa
    */
   private static final String LOG_RESOURCE_BUNDLE = "org.apache.uima.impl.log_messages";
     
+  private static AtomicInteger MDC_NEXT_ID = new AtomicInteger(0);
+  
   /**
    * The ComponentInfoImpl class (an inner non-static class) has no fields and 
    *   just one method that refers to fields in
@@ -168,6 +171,8 @@ public abstract class UimaContext_ImplBa
 
   final private String uniqueIdentifier;
   
+  final private String mdcUniqueId;
+  
   /**
    * A number to throttle logging from Annotators
    * If not the max value, it wraps loggers obtained with getLogger() that are 
@@ -186,6 +191,7 @@ public abstract class UimaContext_ImplBa
   public UimaContext_ImplBase() { 
     mQualifiedContextName = "/";  // This constructor for root call only
     uniqueIdentifier = constructUniqueName();
+    mdcUniqueId = String.valueOf(MDC_NEXT_ID.getAndIncrement());
     mSofaMappings = new TreeMap<String, String>();
 
   }
@@ -198,6 +204,7 @@ public abstract class UimaContext_ImplBa
   public UimaContext_ImplBase(String contextName, Map<String, String> sofaMappings) {
     mQualifiedContextName = contextName;
     uniqueIdentifier = constructUniqueName();
+    mdcUniqueId = "invalid";  // never referenced
     mSofaMappings = sofaMappings;
   }
   
@@ -860,4 +867,7 @@ public abstract class UimaContext_ImplBa
     loggingThrottleLimit = v;
   }
 
+  public String getMdcId() {
+    return mdcUniqueId;
+  }
 }