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;
+ }
}