You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by se...@apache.org on 2017/11/26 15:56:24 UTC

svn commit: r1816385 [2/2] - in /ctakes/trunk: ctakes-assertion-res/src/main/resources/org/apache/ctakes/assertion/pipeline/ ctakes-chunker-res/src/main/resources/org/apache/ctakes/chunker/pipeline/ ctakes-chunker/src/main/java/org/apache/ctakes/chunke...

Added: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java (added)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,117 @@
+package org.apache.ctakes.coreference.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.coreference.ae.MarkableSalienceAnnotator;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+import java.util.logging.Logger;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Markable Salience Annotator",
+      description = "Annotates Markable Salience.",
+      role = PipeBitInfo.Role.ANNOTATOR,
+      dependencies = { PipeBitInfo.TypeProduct.PARAGRAPH, PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.MARKABLE, PipeBitInfo.TypeProduct.DEPENDENCY_NODE },
+      usables = { PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION }
+)
+public class ThreadSafeMarkableSalienceAnnotator extends MarkableSalienceAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeMarkableSalienceAnnotator" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      MsSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      MsSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<? extends DataWriter<Boolean>> dataWriterClass,
+         File outputDirectory ) throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeMarkableSalienceAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            true,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+            dataWriterClass,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+            outputDirectory );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeMarkableSalienceAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+
+   private enum MsSingleton implements ThreadSafeWrapper<MarkableSalienceAnnotator> {
+      INSTANCE;
+
+      static public MsSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final MarkableSalienceAnnotator _delegate;
+      private boolean _initialized;
+
+      MsSingleton() {
+         _delegate = new MarkableSalienceAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public MarkableSalienceAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+
+}

Added: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java (added)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,131 @@
+package org.apache.ctakes.coreference.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.coreference.ae.MentionClusterCoreferenceAnnotator;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+import java.util.logging.Logger;
+
+import static org.apache.ctakes.core.pipeline.PipeBitInfo.TypeProduct.*;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Coreference (Clusters)",
+      description = "Coreference annotator using mention-synchronous paradigm.",
+      dependencies = { BASE_TOKEN, SENTENCE, SECTION, IDENTIFIED_ANNOTATION, MARKABLE },
+      products = { COREFERENCE_RELATION }
+)
+public class ThreadSafeMentionClusterCoreferencer extends MentionClusterCoreferenceAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeMentionClusterCoreferencer" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      MccSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      MccSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<? extends DataWriter<String>> dataWriterClass,
+         File outputDirectory,
+         float downsamplingRate ) throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeMentionClusterCoreferencer.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            true,
+            MentionClusterCoreferenceAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+            downsamplingRate,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+            dataWriterClass,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+            outputDirectory,
+            MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT,
+            false );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeMentionClusterCoreferencer.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+   public static AnalysisEngineDescription createMultidocAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeMentionClusterCoreferencer.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath,
+            MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT, false );
+   }
+
+
+   private enum MccSingleton implements ThreadSafeWrapper<MentionClusterCoreferenceAnnotator> {
+      INSTANCE;
+
+      static public MccSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final MentionClusterCoreferenceAnnotator _delegate;
+      private boolean _initialized;
+
+      MccSingleton() {
+         _delegate = new MentionClusterCoreferenceAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public MentionClusterCoreferenceAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+
+}

Modified: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java (original)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java Sun Nov 26 15:56:23 2017
@@ -90,10 +90,10 @@ public class ClearNLPDependencyParserAE
    static private final Logger LOGGER = Logger.getLogger( ClearNLPDependencyParserAE.class.getSimpleName() );
 
    // single class-based model:
-   private static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
+   protected static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
          DependencySharedModel.class,
          DependencySharedModel.DEFAULT_MODEL_FILE_NAME );
-   private static ExternalResourceDescription defaultLemmatizerResource = ExternalResourceFactory.createExternalResourceDescription(
+   protected static ExternalResourceDescription defaultLemmatizerResource = ExternalResourceFactory.createExternalResourceDescription(
          LemmatizerSharedModel.class,
          LemmatizerSharedModel.ENG_LEMMATIZER_DATA_FILE );
 

Modified: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java (original)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java Sun Nov 26 15:56:23 2017
@@ -18,11 +18,9 @@
  */
 package org.apache.ctakes.dependency.parser.ae;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.googlecode.clearnlp.component.AbstractComponent;
+import com.googlecode.clearnlp.dependency.*;
+import com.googlecode.clearnlp.reader.AbstractReader;
 import org.apache.ctakes.core.pipeline.PipeBitInfo;
 import org.apache.ctakes.core.util.ListFactory;
 import org.apache.ctakes.dependency.parser.ae.shared.SRLSharedParserModel;
@@ -52,13 +50,10 @@ import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.resource.ExternalResourceDescription;
 import org.apache.uima.resource.ResourceInitializationException;
 
-import com.googlecode.clearnlp.component.AbstractComponent;
-import com.googlecode.clearnlp.dependency.DEPArc;
-import com.googlecode.clearnlp.dependency.DEPFeat;
-import com.googlecode.clearnlp.dependency.DEPLib;
-import com.googlecode.clearnlp.dependency.DEPNode;
-import com.googlecode.clearnlp.dependency.DEPTree;
-import com.googlecode.clearnlp.reader.AbstractReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  *This class provides a UIMA wrapper for the ClearNLP Semantic Role Labeler, which is
@@ -105,14 +100,14 @@ public class ClearNLPSemanticRoleLabeler
    public static final String SRL_ROLE_MODEL_KEY = "SrlRoleModel";
    @ExternalResource(key = SRL_ROLE_MODEL_KEY, mandatory=false)
    private SRLSharedRoleModel roleModel=null;
-   
-   private static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
+
+   protected static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
        SRLSharedParserModel.class, 
        SRLSharedParserModel.DEFAULT_SRL_MODEL_FILE_NAME);
-   private static ExternalResourceDescription defaultPredictionResource = ExternalResourceFactory.createExternalResourceDescription(
+   protected static ExternalResourceDescription defaultPredictionResource = ExternalResourceFactory.createExternalResourceDescription(
        SRLSharedPredictionModel.class, 
        SRLSharedPredictionModel.DEFAULT_PRED_MODEL_FILE_NAME);
-   private static ExternalResourceDescription defaultRoleResource = ExternalResourceFactory.createExternalResourceDescription(
+   protected static ExternalResourceDescription defaultRoleResource = ExternalResourceFactory.createExternalResourceDescription(
        SRLSharedRoleModel.class, 
        SRLSharedRoleModel.DEFAULT_ROLE_MODEL_FILE_NAME);
    

Added: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java (added)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,110 @@
+package org.apache.ctakes.dependency.parser.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.dependency.parser.ae.ClearNLPDependencyParserAE;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.descriptor.TypeCapability;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ExternalResourceDescription;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ * ClearNLPDependencyParserAE is almost thread safe ... the shared models are not immutable.
+ * {@inheritDoc}
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@TypeCapability(
+      inputs = {
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:partOfSpeech",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:normalizedForm",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:tokenNumber",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:end",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:begin"
+      } )
+@PipeBitInfo(
+      name = "ClearNLP Dependency Parser",
+      description = "Analyses Sentence Structure, storing information in nodes.",
+      role = PipeBitInfo.Role.SPECIAL,
+      dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN },
+      products = { PipeBitInfo.TypeProduct.DEPENDENCY_NODE }
+)
+final public class ThreadSafeClearNlpDepParser extends ClearNLPDependencyParserAE {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeClearNlpSemRoleLabeler" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      DepSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      DepSingleton.getInstance().process( jCas );
+   }
+
+   // If someone calls this, they want the default model, lazy initialization of the external resources:
+   public static synchronized AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return createAnnotatorDescription( defaultParserResource, defaultLemmatizerResource );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final ExternalResourceDescription parserDesc,
+                                                                       final ExternalResourceDescription lemmaDesc )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeClearNlpDepParser.class, DEP_MODEL_KEY, parserDesc, LEM_MODEL_KEY, lemmaDesc );
+   }
+
+   private enum DepSingleton implements ThreadSafeWrapper<ClearNLPDependencyParserAE> {
+      INSTANCE;
+
+      static public DepSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final ClearNLPDependencyParserAE _delegate;
+      private boolean _initialized;
+
+      DepSingleton() {
+         _delegate = new ClearNLPDependencyParserAE();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public ClearNLPDependencyParserAE getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}

Added: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java (added)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,110 @@
+package org.apache.ctakes.dependency.parser.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.dependency.parser.ae.ClearNLPSemanticRoleLabelerAE;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.descriptor.TypeCapability;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ * ClearNLPSemanticRoleLabelerAE is almost thread safe ... the shared models are not immutable.
+ * <p>
+ * {@inheritDoc}
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@TypeCapability(
+      inputs = {
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:partOfSpeech",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:tokenNumber",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:end",
+            "org.apache.ctakes.typesystem.type.syntax.BaseToken:begin",
+            "org.apache.ctakes.typesystem.type.syntax.ConllDependencyNode"
+      } )
+@PipeBitInfo(
+      name = "Thread safe ClearNLP Semantic Role Labeler",
+      description = "Adds Semantic Roles Relations.",
+      role = PipeBitInfo.Role.ANNOTATOR,
+      dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN,
+            PipeBitInfo.TypeProduct.DEPENDENCY_NODE },
+      products = { PipeBitInfo.TypeProduct.SEMANTIC_RELATION }
+)
+final public class ThreadSafeClearNlpSemRoleLabeler extends ClearNLPSemanticRoleLabelerAE {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeClearNlpSemRoleLabeler" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      SemSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      SemSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeClearNlpSemRoleLabeler.class,
+            SRL_PARSER_MODEL_KEY,
+            defaultParserResource,
+            SRL_PRED_MODEL_KEY,
+            defaultPredictionResource,
+            SRL_ROLE_MODEL_KEY,
+            defaultRoleResource );
+   }
+
+   private enum SemSingleton implements ThreadSafeWrapper<ClearNLPSemanticRoleLabelerAE> {
+      INSTANCE;
+
+      static public SemSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final ClearNLPSemanticRoleLabelerAE _delegate;
+      private boolean _initialized;
+
+      SemSingleton() {
+         _delegate = new ClearNLPSemanticRoleLabelerAE();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public ClearNLPSemanticRoleLabelerAE getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}

Copied: ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper (from r1815683, ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/DictionarySubPipe.piper)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper?p2=ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper&p1=ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/DictionarySubPipe.piper&r1=1815683&r2=1816385&rev=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/DictionarySubPipe.piper (original)
+++ ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper Sun Nov 26 15:56:23 2017
@@ -7,4 +7,4 @@ cli umlsUser=user
 cli umlsPass=pass
 
 // Default fast dictionary lookup
-add DefaultJCasTermAnnotator
+add concurrent.ThreadSafeFastLookup

Modified: ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java (original)
+++ ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java Sun Nov 26 15:56:23 2017
@@ -45,7 +45,7 @@ import java.util.List;
       dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN },
       products = PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION
 )
-final public class DefaultJCasTermAnnotator extends AbstractJCasTermAnnotator {
+public class DefaultJCasTermAnnotator extends AbstractJCasTermAnnotator {
 
    /**
     * {@inheritDoc}

Added: ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java (added)
+++ ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,105 @@
+package org.apache.ctakes.dictionary.lookup2.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.config.ConfigParameterConstants;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.dictionary.lookup2.ae.DefaultJCasTermAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for dictionary memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Dictionary Lookup (Default)",
+      description = "Annotates clinically-relevant terms.  Terms must match dictionary entries exactly.",
+      dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN },
+      products = PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION
+)
+final public class ThreadSafeFastLookup extends DefaultJCasTermAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeFastLookup" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      DlSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      DlSingleton.getInstance().process( jCas );
+   }
+
+   /**
+    * @return dictionary lookup with defaults
+    * @throws ResourceInitializationException -
+    */
+   static public AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription( ThreadSafeFastLookup.class );
+   }
+
+   /**
+    * @param descriptorPath path to lookup configuration xml file
+    * @return dictionary lookup using the given configuration
+    * @throws ResourceInitializationException -
+    */
+   static public AnalysisEngineDescription createAnnotatorDescription( final String descriptorPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription( ThreadSafeFastLookup.class,
+            ConfigParameterConstants.PARAM_LOOKUP_XML, descriptorPath );
+   }
+
+   private enum DlSingleton implements ThreadSafeWrapper<DefaultJCasTermAnnotator> {
+      INSTANCE;
+
+      static public DlSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final DefaultJCasTermAnnotator _delegate;
+      private boolean _initialized;
+
+      DlSingleton() {
+         _delegate = new DefaultJCasTermAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public DefaultJCasTermAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}

Added: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper (added)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper Sun Nov 26 15:56:23 2017
@@ -0,0 +1,34 @@
+
+// Advanced Tokenization: Regex sectionization, BIO Sentence Detector (lumper), Paragraphs, Lists
+load AdvancedTokenizerPipeline
+// OR use the standard tokenizer pipeline:
+//load DefaultTokenizerPipeline
+
+// Always need these ...
+add ContextDependentTokenizerAnnotator
+add POSTagger
+
+// Chunkers
+load ChunkerSubPipe
+
+// Default fast dictionary lookup
+set minimumSpan=2
+load DictionarySubPipe
+
+// Cleartk Entity Attributes (negation, uncertainty, etc.)
+load AttributeCleartkSubPipe
+
+// Entity Relations (degree/severity, anatomical location)
+load RelationSubPipe
+
+// Temporal (event, time, dtr, tlink)
+load TemporalSubPipe
+
+// Coreferences (e.g. patient = he)
+load CorefSubPipe
+
+// Html output
+add pretty.html.HtmlTextWriter
+
+// XMI output
+//writeXmis

Modified: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper (original)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper Sun Nov 26 15:56:23 2017
@@ -13,7 +13,7 @@ addDescription POSTagger
 set ctakes.umlsuser=CHANGE_ME ctakes.umlspw=CHANGE_ME
 
 // Default fast dictionary lookup
-add DefaultJCasTermAnnotator
+load DictionarySubPipe.piper
 
 // Collect discovered UMLS Concept Unique Identifiers (CUI) for post-run information
 collectCuis

Modified: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper (original)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper Sun Nov 26 15:56:23 2017
@@ -14,7 +14,8 @@ addDescription POSTagger
 //addDescription LvgAnnotator
 addDescription ThreadSafeLvg
 
-add DefaultJCasTermAnnotator
+// Default fast dictionary lookup
+load DictionarySubPipe.piper
 
 // Add Named Entity Context Entity Attribute annotators
 load NeContextsSubPipe.piper

Added: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper (added)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper Sun Nov 26 15:56:23 2017
@@ -0,0 +1,34 @@
+// Pipeline for: sections, paragraphs, sentences, lists, entities and attributes, relations, temporal info, coreferences
+
+// set the thread count
+threads 3
+
+// Advanced Tokenization: Regex sectionization, BIO Sentence Detector (lumper), Paragraphs, Lists
+load TsFullTokenizerPipeline
+
+// Always need these ...
+add ContextDependentTokenizerAnnotator
+add concurrent.ThreadSafePosTagger
+
+// Chunkers
+load TsChunkerSubPipe
+
+// Default fast dictionary lookup
+set minimumSpan=2
+load TsDictionarySubPipe
+
+// Cleartk Entity Attributes (negation, uncertainty, etc.)
+load TsAttributeCleartkSubPipe
+
+// Entity Relations (degree/severity, anatomical location)
+load TsRelationSubPipe
+
+// Temporal (event, time, dtr, tlink)
+load TsTemporalSubPipe
+
+// Coreferences (e.g. patient = he)
+load TsCorefSubPipe
+
+// Html output
+add pretty.html.HtmlTextWriter
+

Added: ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java (added)
+++ ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,117 @@
+package org.apache.ctakes.postagger.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.postagger.POSTagger;
+import org.apache.ctakes.typesystem.type.syntax.BaseToken;
+import org.apache.ctakes.typesystem.type.textspan.Segment;
+import org.apache.ctakes.typesystem.type.textspan.Sentence;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.fit.factory.TypePrioritiesFactory;
+import org.apache.uima.fit.factory.TypeSystemDescriptionFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Part of Speech Tagger",
+      description = "Annotate Parts of Speech.",
+      dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.BASE_TOKEN, }
+)
+final public class ThreadSafePosTagger extends POSTagger {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafePosTagger" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      PosSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      PosSingleton.getInstance().process( jCas );
+   }
+
+   /**
+    * @return a part of speech tagger using a default model
+    * @throws ResourceInitializationException -
+    */
+   public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafePosTagger.class,
+            TypeSystemDescriptionFactory.createTypeSystemDescription(),
+            TypePrioritiesFactory.createTypePriorities( Segment.class, Sentence.class, BaseToken.class ) );
+   }
+
+   /**
+    * @param model a part of speech model
+    * @return a part of speech tagger using the given model
+    * @throws ResourceInitializationException -
+    */
+   public static AnalysisEngineDescription createAnnotatorDescription( final String model )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafePosTagger.class,
+            TypeSystemDescriptionFactory.createTypeSystemDescription(),
+            TypePrioritiesFactory.createTypePriorities( Segment.class, Sentence.class, BaseToken.class ),
+            POSTagger.PARAM_POS_MODEL_FILE, model );
+   }
+
+
+   private enum PosSingleton implements ThreadSafeWrapper<POSTagger> {
+      INSTANCE;
+
+      static public PosSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final POSTagger _delegate;
+      private boolean _initialized;
+
+      PosSingleton() {
+         _delegate = new POSTagger();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public POSTagger getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+
+}

Copied: ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper (from r1815683, ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/RelationSubPipe.piper)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper?p2=ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper&p1=ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/RelationSubPipe.piper&r1=1815683&r2=1816385&rev=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/RelationSubPipe.piper (original)
+++ ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper Sun Nov 26 15:56:23 2017
@@ -1,10 +1,10 @@
 // Commands and parameters to create a default relation extraction sub-pipeline.  This is not a full pipeline.
 
 // Modifiers. Use addLogged to log start and finish of processing.  There aren't default models, so set specifically
-addLogged ModifierExtractorAnnotator classifierJarPath=/org/apache/ctakes/relationextractor/models/modifier_extractor/model.jar
+add concurrent.ThreadSafeModifierExtractor classifierJarPath=/org/apache/ctakes/relationextractor/models/modifier_extractor/model.jar
 
 // Degree of severity, etc.
-addLogged DegreeOfRelationExtractorAnnotator classifierJarPath=/org/apache/ctakes/relationextractor/models/degree_of/model.jar
+add concurrent.ThreadSafeDegreeExtractor classifierJarPath=/org/apache/ctakes/relationextractor/models/degree_of/model.jar
 
 // Location.
-addLogged LocationOfRelationExtractorAnnotator classifierJarPath=/org/apache/ctakes/relationextractor/models/location_of/model.jar
+add concurrent.ThreadSafeLocationExtractor classifierJarPath=/org/apache/ctakes/relationextractor/models/location_of/model.jar

Added: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java (added)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,121 @@
+package org.apache.ctakes.relationextractor.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.DegreeOfRelationExtractorAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Degree of Annotator",
+      description = "Annotates Degree Of relations.",
+      role = PipeBitInfo.Role.ANNOTATOR,
+      dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION },
+      products = { PipeBitInfo.TypeProduct.DEGREE_RELATION }
+)
+final public class ThreadSafeDegreeExtractor extends DegreeOfRelationExtractorAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeDegreeExtractor" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      DoSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      DoSingleton.getInstance().process( jCas );
+   }
+
+   /**
+    * @return a degree of relation extractor
+    * @throws ResourceInitializationException -
+    */
+   public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription( ThreadSafeDegreeExtractor.class );
+   }
+
+   private enum DoSingleton implements ThreadSafeWrapper<DegreeOfRelationExtractorAnnotator> {
+      INSTANCE;
+
+      static public DoSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final DegreeOfRelationExtractorAnnotator _delegate;
+      private boolean _initialized;
+
+      DoSingleton() {
+         _delegate = new DegreeOfRelationExtractorAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public DegreeOfRelationExtractorAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+
+      /**
+       * Calls initialize on the single instance if and only if it has not already been initialized
+       */
+      @Override
+      public void initialize( final UimaContext context ) throws ResourceInitializationException {
+         synchronized (LOCK) {
+            if ( !isInitialized() ) {
+               LOGGER.info( "Initializing ..." );
+               getDelegate().initialize( context );
+               setInitialized( true );
+            }
+         }
+      }
+
+      /**
+       * Calls process on the single instance if it is not already processing
+       */
+      @Override
+      public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+         synchronized (LOCK) {
+            LOGGER.info( "Extracting Degree relations ..." );
+            getDelegate().process( jCas );
+            LOGGER.info( "Finished." );
+         }
+      }
+
+   }
+
+}

Added: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java (added)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,120 @@
+package org.apache.ctakes.relationextractor.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.LocationOfRelationExtractorAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Location of Annotator",
+      description = "Annotates Location Of relations.",
+      role = PipeBitInfo.Role.ANNOTATOR,
+      dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION },
+      products = { PipeBitInfo.TypeProduct.LOCATION_RELATION }
+)
+final public class ThreadSafeLocationExtractor extends LocationOfRelationExtractorAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeLocationExtractor" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      LocSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      LocSingleton.getInstance().process( jCas );
+   }
+
+   /**
+    * @return a location of relation extractor
+    * @throws ResourceInitializationException -
+    */
+   public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription( ThreadSafeLocationExtractor.class );
+   }
+
+   private enum LocSingleton implements ThreadSafeWrapper<LocationOfRelationExtractorAnnotator> {
+      INSTANCE;
+
+      static public LocSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final LocationOfRelationExtractorAnnotator _delegate;
+      private boolean _initialized;
+
+      LocSingleton() {
+         _delegate = new LocationOfRelationExtractorAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public LocationOfRelationExtractorAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+
+      /**
+       * Calls initialize on the single instance if and only if it has not already been initialized
+       */
+      @Override
+      public void initialize( final UimaContext context ) throws ResourceInitializationException {
+         synchronized (LOCK) {
+            if ( !isInitialized() ) {
+               LOGGER.info( "Initializing ..." );
+               getDelegate().initialize( context );
+               setInitialized( true );
+            }
+         }
+      }
+
+      /**
+       * Calls process on the single instance if it is not already processing
+       */
+      @Override
+      public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+         synchronized (LOCK) {
+            LOGGER.info( "Extracting location relations ..." );
+            getDelegate().process( jCas );
+            LOGGER.info( "Finished." );
+         }
+      }
+   }
+
+}

Added: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java (added)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,120 @@
+package org.apache.ctakes.relationextractor.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.ModifierExtractorAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Modifier Extractor",
+      description = "Annotates Modifiers and Chunks.",
+      dependencies = { PipeBitInfo.TypeProduct.BASE_TOKEN, PipeBitInfo.TypeProduct.SENTENCE },
+      products = { PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION, PipeBitInfo.TypeProduct.CHUNK }
+)
+final public class ThreadSafeModifierExtractor extends ModifierExtractorAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeModifierExtractor" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      MeSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      MeSingleton.getInstance().process( jCas );
+   }
+
+   /**
+    * @return a modifier extractor
+    * @throws ResourceInitializationException -
+    */
+   public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription( ThreadSafeModifierExtractor.class );
+   }
+
+   private enum MeSingleton implements ThreadSafeWrapper<ModifierExtractorAnnotator> {
+      INSTANCE;
+
+      static public MeSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final ModifierExtractorAnnotator _delegate;
+      private boolean _initialized;
+
+      MeSingleton() {
+         _delegate = new ModifierExtractorAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public ModifierExtractorAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+
+      /**
+       * Calls initialize on the single instance if and only if it has not already been initialized
+       */
+      @Override
+      public void initialize( final UimaContext context ) throws ResourceInitializationException {
+         synchronized (LOCK) {
+            if ( !isInitialized() ) {
+               LOGGER.info( "Initializing ..." );
+               getDelegate().initialize( context );
+               setInitialized( true );
+            }
+         }
+      }
+
+      /**
+       * Calls process on the single instance if it is not already processing
+       */
+      @Override
+      public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+         synchronized (LOCK) {
+            LOGGER.info( "Extracting Modifiers ..." );
+            getDelegate().process( jCas );
+            LOGGER.info( "Finished." );
+         }
+      }
+   }
+
+
+}

Copied: ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper (from r1815683, ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TemporalSubPipe.piper)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper?p2=ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper&p1=ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TemporalSubPipe.piper&r1=1815683&r2=1816385&rev=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TemporalSubPipe.piper (original)
+++ ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper Sun Nov 26 15:56:23 2017
@@ -1,19 +1,19 @@
 // Commands and parameters to create a default temporal processing sub-pipeline.  This is not a full pipeline.
 
 // 'Generic' Events.  Use addDescription and let the EventAnnotator set itself up with defaults.
-addDescription EventAnnotator
+addDescription concurrent.ThreadSafeEventAnnotator
 
 // Times.  Use addLogged to log start and finish of processing.  There aren't default models, so set specifically
-add BackwardsTimeAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/timeannotator/model.jar
+add concurrent.ThreadSafeBackTimeAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/timeannotator/model.jar
 
 // DocTimeRel: the relation bin for Events to the Document Creation Time.
-add DocTimeRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/doctimerel/model.jar
+add concurrent.ThreadSafeDocTimeRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/doctimerel/model.jar
 
 // Event - Time binary relations.
-add EventTimeRelationAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventtime/model.jar
+add concurrent.ThreadSafeEventTimeRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventtime/model.jar
 
 // Event - Event binary relations.
-add EventEventRelationAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventevent/model.jar
+add concurrent.ThreadSafeEventEventRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventevent/model.jar
 
 //  Need to improve.  Generic Events (head words) should be replaced by overlapping subclasses with relations adjusted.
 //add FullTemporalExtractionPipeline.CopyPropertiesToTemporalEventAnnotator

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,128 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.temporal.ae.BackwardsTimeAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Backward Timex Annotator",
+      description = "Annotates absolute time / date Temporal expressions.",
+      role = PipeBitInfo.Role.ANNOTATOR,
+      dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.BASE_TOKEN },
+      products = { PipeBitInfo.TypeProduct.TIMEX }
+)
+final public class ThreadSafeBackTimeAnnotator extends BackwardsTimeAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeBackTimeAnnotator" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      BtSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      BtSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<? extends DataWriter<String>> dataWriterClass, File outputDirectory )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeBackTimeAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            true,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+            dataWriterClass,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+            outputDirectory );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeBackTimeAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+   public static AnalysisEngineDescription createEnsembleDescription( final String modelPath,
+                                                                      final String viewName )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeBackTimeAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            BackwardsTimeAnnotator.PARAM_TIMEX_VIEW, viewName,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+
+   private enum BtSingleton implements ThreadSafeWrapper<BackwardsTimeAnnotator> {
+      INSTANCE;
+
+      static public BtSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final BackwardsTimeAnnotator _delegate;
+      private boolean _initialized;
+
+      BtSingleton() {
+         _delegate = new BackwardsTimeAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public BackwardsTimeAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+
+
+   }
+
+}

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,113 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.temporal.ae.DocTimeRelAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe DocTimeRel Annotator",
+      description = "Annotates event relativity to document creation time.",
+      dependencies = { PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION, PipeBitInfo.TypeProduct.EVENT }
+)
+final public class ThreadSafeDocTimeRelAnnotator extends DocTimeRelAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeDocTimeRelAnnotator" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      DtrSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      DtrSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<? extends DataWriter<String>> dataWriterClass,
+         File outputDirectory ) throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeDocTimeRelAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            true,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+            dataWriterClass,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+            outputDirectory );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeDocTimeRelAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+   private enum DtrSingleton implements ThreadSafeWrapper<DocTimeRelAnnotator> {
+      INSTANCE;
+
+      static public DtrSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final DocTimeRelAnnotator _delegate;
+      private boolean _initialized;
+
+      DtrSingleton() {
+         _delegate = new DocTimeRelAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public DocTimeRelAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,122 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.temporal.ae.EventAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe Event Annotator",
+      description = "Annotates Temporal Events.",
+      dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.CHUNK, PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION },
+      products = { PipeBitInfo.TypeProduct.EVENT }
+)
+final public class ThreadSafeEventAnnotator extends EventAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeEventAnnotator" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      EvSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      EvSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<?> dataWriter,
+         File outputDirectory,
+         float downratio,
+         float featureSelect, float smoteNeighborNumber ) throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeEventAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, true,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME, dataWriter,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY, outputDirectory,
+            EventAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE, downratio,
+            EventAnnotator.PARAM_FEATURE_SELECTION_THRESHOLD, featureSelect,
+            EventAnnotator.PARAM_SMOTE_NUM_NEIGHBORS, smoteNeighborNumber );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeEventAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription()
+         throws ResourceInitializationException {
+      return createAnnotatorDescription(
+            String.format( "/%s/model.jar",
+                  EventAnnotator.class.getName().toLowerCase().replace( '.', '/' ) ) );
+   }
+
+   private enum EvSingleton implements ThreadSafeWrapper<EventAnnotator> {
+      INSTANCE;
+
+      static public EvSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final EventAnnotator _delegate;
+      private boolean _initialized;
+
+      EvSingleton() {
+         _delegate = new EventAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public EventAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,120 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator;
+import org.apache.ctakes.temporal.ae.EventEventRelationAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe E-E TLinker",
+      description = "Creates Event - Event TLinks.",
+      dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.EVENT },
+      products = { PipeBitInfo.TypeProduct.TEMPORAL_RELATION }
+)
+final public class ThreadSafeEventEventRelAnnotator extends EventEventRelationAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeEventEventRelAnnotator" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      EvErSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      EvErSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<? extends DataWriter<String>> dataWriterClass,
+         File outputDirectory,
+         double probabilityOfKeepingANegativeExample ) throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeEventEventRelAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            true,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+            dataWriterClass,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+            outputDirectory,
+            RelationExtractorAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+            // not sure why this has to be cast; something funny going on in uimaFIT maybe?
+            (float) probabilityOfKeepingANegativeExample );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeEventEventRelAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+
+   private enum EvErSingleton implements ThreadSafeWrapper<EventEventRelationAnnotator> {
+      INSTANCE;
+
+      static public EvErSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final EventEventRelationAnnotator _delegate;
+      private boolean _initialized;
+
+      EvErSingleton() {
+         _delegate = new EventEventRelationAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public EventEventRelationAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,119 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator;
+import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+      name = "Thread safe E-T TLinker",
+      description = "Creates Event - Time TLinks.",
+      dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+            PipeBitInfo.TypeProduct.EVENT, PipeBitInfo.TypeProduct.TIMEX },
+      products = { PipeBitInfo.TypeProduct.TEMPORAL_RELATION }
+)
+final public class ThreadSafeEventTimeRelAnnotator extends EventTimeRelationAnnotator {
+
+   static private final Logger LOGGER = Logger.getLogger( "ThreadSafeEventTimeRelAnnotator" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void initialize( final UimaContext context ) throws ResourceInitializationException {
+      EvtrSingleton.getInstance().initialize( context );
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+      EvtrSingleton.getInstance().process( jCas );
+   }
+
+   public static AnalysisEngineDescription createDataWriterDescription(
+         Class<? extends DataWriter<String>> dataWriterClass,
+         File outputDirectory,
+         double probabilityOfKeepingANegativeExample ) throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeEventTimeRelAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING,
+            true,
+            DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+            dataWriterClass,
+            DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+            outputDirectory,
+            RelationExtractorAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+            // not sure why this has to be cast; something funny going on in uimaFIT maybe?
+            (float) probabilityOfKeepingANegativeExample );
+   }
+
+   public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+         throws ResourceInitializationException {
+      return AnalysisEngineFactory.createEngineDescription(
+            ThreadSafeEventTimeRelAnnotator.class,
+            CleartkAnnotator.PARAM_IS_TRAINING, false,
+            GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+   }
+
+   private enum EvtrSingleton implements ThreadSafeWrapper<EventTimeRelationAnnotator> {
+      INSTANCE;
+
+      static public EvtrSingleton getInstance() {
+         return INSTANCE;
+      }
+
+      private final EventTimeRelationAnnotator _delegate;
+      private boolean _initialized;
+
+      EvtrSingleton() {
+         _delegate = new EventTimeRelationAnnotator();
+      }
+
+      final private Object LOCK = new Object();
+
+      @Override
+      public Object getLock() {
+         return LOCK;
+      }
+
+      @Override
+      public EventTimeRelationAnnotator getDelegate() {
+         return _delegate;
+      }
+
+      @Override
+      public boolean isInitialized() {
+         return _initialized;
+      }
+
+      @Override
+      public void setInitialized( final boolean initialized ) {
+         _initialized = initialized;
+      }
+   }
+
+}