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 2018/11/13 17:05:11 UTC

svn commit: r1846527 - in /ctakes/trunk: ctakes-core/src/main/java/org/apache/ctakes/core/cc/ ctakes-core/src/main/java/org/apache/ctakes/core/cc/html/ ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/ ctakes-fhir/src/main/java/org/apache/ctakes/fhi...

Author: seanfinan
Date: Tue Nov 13 17:05:11 2018
New Revision: 1846527

URL: http://svn.apache.org/viewvc?rev=1846527&view=rev
Log:
HtmlTextWriter : null check for section id
CuiListFileWriter : change from simple write to bsv table
Fhir : add basetoken, sentence, paragraph, file writer, refactoring

Added:
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonFileWriter.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirJsonFileReader.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationCreator.java
      - copied, changed from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationParser.java
      - copied, changed from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/CompositionParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationCreator.java
      - copied, changed from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationParser.java
      - copied, changed from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionCreator.java
      - copied, changed from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionParser.java
      - copied, changed from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceParser.java
Removed:
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicParser.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicCreator.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicParser.java
Modified:
    ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/CuiListFileWriter.java
    ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/html/HtmlTextWriter.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirDocComposer.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonWriter.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirXmlFileReader.java
    ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/element/FhirElementFactory.java

Modified: ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/CuiListFileWriter.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/CuiListFileWriter.java?rev=1846527&r1=1846526&r2=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/CuiListFileWriter.java (original)
+++ ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/CuiListFileWriter.java Tue Nov 13 17:05:11 2018
@@ -2,7 +2,12 @@ package org.apache.ctakes.core.cc;
 
 
 import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.core.semantic.SemanticTui;
 import org.apache.ctakes.core.util.OntologyConceptUtil;
+import org.apache.ctakes.core.util.RelationArgumentUtil;
+import org.apache.ctakes.typesystem.type.constants.CONST;
+import org.apache.ctakes.typesystem.type.refsem.UmlsConcept;
+import org.apache.ctakes.typesystem.type.relation.LocationOfTextRelation;
 import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
 import org.apache.log4j.Logger;
 import org.apache.uima.fit.util.JCasUtil;
@@ -10,6 +15,7 @@ import org.apache.uima.jcas.JCas;
 
 import java.io.*;
 import java.util.Collection;
+import java.util.stream.Collectors;
 
 import static org.apache.ctakes.core.pipeline.PipeBitInfo.TypeProduct.*;
 
@@ -32,8 +38,8 @@ public class CuiListFileWriter extends A
    /**
     * {@inheritDoc}
     */
-   @Override
-   public void writeFile( final JCas jCas,
+//   @Override
+   public void writeFile1( final JCas jCas,
                           final String outputDir,
                           final String documentId,
                           final String fileName ) throws IOException {
@@ -55,4 +61,52 @@ public class CuiListFileWriter extends A
       LOGGER.info( "Finished Writing" );
    }
 
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void writeFile( final JCas jCas,
+                          final String outputDir,
+                          final String documentId,
+                          final String fileName ) throws IOException {
+      final File file = new File( outputDir, fileName + "_annotationInfo.bsv" );
+      LOGGER.info( "Writing Annotation Information to " + file.getPath() + " ..." );
+      final Collection<IdentifiedAnnotation> annotations = JCasUtil.select( jCas, IdentifiedAnnotation.class );
+      final Collection<LocationOfTextRelation> locations = JCasUtil.select( jCas, LocationOfTextRelation.class );
+      try ( Writer writer = new BufferedWriter( new FileWriter( file ) ) ) {
+         writer.write( "CUI | Concept | Semantic Group | Negated | Family History | Location | Document Text\n" );
+         for ( IdentifiedAnnotation annotation : annotations ) {
+            writer.write( createBsvLines( annotation, locations ) );
+         }
+      }
+      LOGGER.info( "Finished Writing" );
+   }
+
+   static private String createBsvLines( final IdentifiedAnnotation annotation,
+                                         final Collection<LocationOfTextRelation> locationRelations ) {
+      final String locationCuis
+            = RelationArgumentUtil.getAllRelated( locationRelations, annotation ).stream()
+                                  .map( OntologyConceptUtil::getCuis )
+                                  .flatMap( Collection::stream )
+                                  .collect( Collectors.joining( ";" ) );
+      return OntologyConceptUtil.getUmlsConceptStream( annotation )
+                                .map( c -> createBsvLine( annotation, c, locationCuis ) )
+                                .collect( Collectors.joining( "\n" ) );
+   }
+
+   static private String createBsvLine( final IdentifiedAnnotation annotation,
+                                        final UmlsConcept concept,
+                                        final String locationCuis ) {
+      final StringBuilder sb = new StringBuilder();
+      sb.append( concept.getCode() ).append( '|' )
+        .append( concept.getPreferredText() ).append( '|' )
+        .append( SemanticTui.getTuiFromCode( concept.getTui() ).getGroupName() ).append( '|' )
+        .append( annotation.getPolarity() == CONST.NE_POLARITY_NEGATION_PRESENT ? "true" : "false" ).append( '|' )
+        .append( annotation.getSubject().equals( CONST.ATTR_SUBJECT_FAMILY_MEMBER ) ? "true" : "false" ).append( '|' )
+        .append( locationCuis ).append( '|' )
+        .append( annotation.getCoveredText() );
+      return sb.toString();
+   }
+
 }
+

Modified: ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/html/HtmlTextWriter.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/html/HtmlTextWriter.java?rev=1846527&r1=1846526&r2=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/html/HtmlTextWriter.java (original)
+++ ctakes/trunk/ctakes-core/src/main/java/org/apache/ctakes/core/cc/html/HtmlTextWriter.java Tue Nov 13 17:05:11 2018
@@ -721,7 +721,7 @@ final public class HtmlTextWriter extend
     */
    static private void writeSectionHeader( final Segment section, final BufferedWriter writer ) throws IOException {
       String sectionId = section.getId();
-      if ( sectionId.equals( "SIMPLE_SEGMENT" ) ) {
+      if ( sectionId == null || sectionId.equals( "SIMPLE_SEGMENT" ) ) {
          return;
       }
       final StringBuilder sb = new StringBuilder();

Modified: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirDocComposer.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirDocComposer.java?rev=1846527&r1=1846526&r2=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirDocComposer.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirDocComposer.java Tue Nov 13 17:05:11 2018
@@ -7,8 +7,11 @@ import org.apache.ctakes.fhir.resource.*
 import org.apache.ctakes.fhir.util.FhirNoteSpecs;
 import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
 import org.apache.ctakes.typesystem.type.relation.RelationArgument;
+import org.apache.ctakes.typesystem.type.syntax.BaseToken;
 import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
+import org.apache.ctakes.typesystem.type.textspan.Paragraph;
 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.fit.util.JCasUtil;
 import org.apache.uima.jcas.JCas;
@@ -19,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Creates a complete fhir bundle for a note.
@@ -38,15 +42,17 @@ final public class FhirDocComposer {
    /**
     * @param jCas         ye olde ...
     * @param practitioner fhir practitioner.  Usually the default "ctakes" practitioner.
+    * @param writeNlpFhir write all nlp information (paragraph, sentence, base annotations) to fhir.
     * @return a complete fhir bundle for a note.
     */
-   static public Bundle composeDocFhir( final JCas jCas, final FhirPractitioner practitioner ) {
+   static public Bundle composeDocFhir( final JCas jCas, final FhirPractitioner practitioner,
+                                        final boolean writeNlpFhir ) {
       final FhirNoteSpecs noteSpecs = new FhirNoteSpecs( jCas );
       // creators
       final CompositionCreator compositionCreator = new CompositionCreator();
-      final FhirResourceCreator<Segment, Basic> sectionCreator = new SectionBasicCreator();
-      final FhirResourceCreator<IdentifiedAnnotation, Basic> iaCreator = new IdentifiedAnnotationBasicCreator();
-      final FhirResourceCreator<Annotation, Basic> aCreator = new AnnotationBasicCreator();
+      final FhirResourceCreator<Segment, Basic> sectionCreator = new SectionCreator();
+      final FhirResourceCreator<IdentifiedAnnotation, Basic> iaCreator = new IdentifiedAnnotationCreator();
+      final FhirResourceCreator<Annotation, Basic> aCreator = new AnnotationCreator();
       // essential types
       final Map<Segment, Collection<IdentifiedAnnotation>> sectionAnnotationMap
             = JCasUtil.indexCovered( jCas, Segment.class, IdentifiedAnnotation.class );
@@ -62,7 +68,7 @@ final public class FhirDocComposer {
          final String segmentId = segment.getId();
          final Basic section = sectionCreator.createResource( jCas, sectionAnnotations.getKey(), practitioner,
                noteSpecs );
-         if ( !segmentId.isEmpty() && !segmentId.equals( SIMPLE_SECTION ) ) {
+         if ( writeNlpFhir || (!segmentId.isEmpty() && !segmentId.equals( SIMPLE_SECTION )) ) {
             sections.add( section );
          }
          final Reference sectionRef = new Reference( section );
@@ -85,6 +91,14 @@ final public class FhirDocComposer {
       }
       // Add relations as reference extensions.
       final Map<Annotation, Basic> simpleAnnotationBasics = new HashMap<>();
+
+      if ( writeNlpFhir ) {
+         final BaseTokenCreator baseTokenCreator = new BaseTokenCreator();
+         JCasUtil.select( jCas, BaseToken.class )
+                 .forEach( b -> simpleAnnotationBasics.put( b,
+                       baseTokenCreator.createResource( jCas, b, practitioner, noteSpecs ) ) );
+      }
+
       addRelations( jCas, practitioner, noteSpecs, aCreator, annotationBasics, simpleAnnotationBasics );
       // Create a Bundle
       final Composition composition = compositionCreator.createResource( jCas, null, practitioner, noteSpecs );
@@ -95,6 +109,23 @@ final public class FhirDocComposer {
       addBundleResources( bundle, sections );
       addBundleResources( bundle, annotationBasics.values() );
       addBundleResources( bundle, simpleAnnotationBasics.values() );
+
+      if ( writeNlpFhir ) {
+         final ParagraphCreator paragraphCreator = new ParagraphCreator();
+         final Collection<Basic> paragraphs
+               = JCasUtil.select( jCas, Paragraph.class ).stream()
+                         .map( p -> paragraphCreator.createResource( jCas, p, practitioner, noteSpecs ) )
+                         .collect( Collectors.toList() );
+         addBundleResources( bundle, paragraphs );
+
+         final SentenceCreator sentenceCreator = new SentenceCreator();
+         final Collection<Basic> sentences
+               = JCasUtil.select( jCas, Sentence.class ).stream()
+                         .map( s -> sentenceCreator.createResource( jCas, s, practitioner, noteSpecs ) )
+                         .collect( Collectors.toList() );
+         addBundleResources( bundle, sentences );
+      }
+
       return bundle;
    }
 

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonFileWriter.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonFileWriter.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonFileWriter.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonFileWriter.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,76 @@
+package org.apache.ctakes.fhir.cc;
+
+import ca.uhn.fhir.context.FhirContext;
+import ca.uhn.fhir.parser.IParser;
+import org.apache.ctakes.core.cc.AbstractJCasFileWriter;
+import org.apache.ctakes.core.config.ConfigParameterConstants;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.fhir.resource.PractitionerCtakes;
+import org.apache.log4j.Logger;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.fit.descriptor.ConfigurationParameter;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.hl7.fhir.dstu3.model.Bundle;
+
+import java.io.*;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/9/2018
+ */
+@PipeBitInfo(
+      name = "FHIR JSON File Writer (Dir Tree)",
+      description = "Writes Json files with full representation of input text and all extracted information.",
+      role = PipeBitInfo.Role.WRITER,
+      dependencies = { PipeBitInfo.TypeProduct.DOCUMENT_ID },
+      usables = { PipeBitInfo.TypeProduct.DOCUMENT_ID_PREFIX }
+)
+public class FhirJsonFileWriter extends AbstractJCasFileWriter {
+
+   @ConfigurationParameter(
+         name = "WriteNlpFhir",
+         description = "Write all nlp information (paragraph, sentence, base annotations) to FHIR.",
+         mandatory = false,
+         defaultValue = "false"
+   )
+   private boolean _writeNlpFhir;
+
+   static private final Logger LOGGER = Logger.getLogger( "FhirJsonFileWriter" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void writeFile( final JCas jCas, final String outputDir,
+                          final String documentId, final String fileName ) throws IOException {
+      final Bundle bundle = FhirDocComposer.composeDocFhir( jCas, PractitionerCtakes.getInstance(), _writeNlpFhir );
+
+      final FhirContext fhirContext = FhirContext.forDstu3();
+      final IParser jsonParser = fhirContext.newJsonParser();
+      jsonParser.setPrettyPrint( true );
+      final String json = jsonParser.encodeResourceToString( bundle );
+
+      final File file = new File( outputDir, fileName + ".json" );
+      try ( Writer writer = new BufferedWriter( new FileWriter( file ) ) ) {
+         writer.write( json );
+      }
+   }
+
+   public static AnalysisEngine createEngine( final String outputDirectory ) throws ResourceInitializationException {
+      return AnalysisEngineFactory
+            .createEngine( FhirJsonFileWriter.class, ConfigParameterConstants.PARAM_OUTPUTDIR, outputDirectory );
+   }
+
+   public static AnalysisEngine createEngine( final String outputDirectory,
+                                              final String subDirectory ) throws ResourceInitializationException {
+      return AnalysisEngineFactory
+            .createEngine( FhirJsonFileWriter.class, ConfigParameterConstants.PARAM_OUTPUTDIR, outputDirectory,
+                  ConfigParameterConstants.PARAM_SUBDIR, subDirectory );
+   }
+
+
+}

Modified: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonWriter.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonWriter.java?rev=1846527&r1=1846526&r2=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonWriter.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cc/FhirJsonWriter.java Tue Nov 13 17:05:11 2018
@@ -20,8 +20,9 @@ import org.hl7.fhir.dstu3.model.Bundle;
  * @since 12/20/2017
  */
 @PipeBitInfo(
-      name = "FhirJsonWriter",
-      description = "For ctakes_401.", role = PipeBitInfo.Role.WRITER
+      name = "FHIR JSON Writer",
+      description = "Writes Json to standard output with full representation of input text and all extracted information.",
+      role = PipeBitInfo.Role.WRITER
 )
 final public class FhirJsonWriter extends JCasAnnotator_ImplBase {
 
@@ -46,7 +47,7 @@ final public class FhirJsonWriter extend
    public void process( final JCas jCas ) throws AnalysisEngineProcessException {
       LOGGER.info( "Processing ..." );
 
-      final Bundle bundle = FhirDocComposer.composeDocFhir( jCas, PractitionerCtakes.getInstance() );
+      final Bundle bundle = FhirDocComposer.composeDocFhir( jCas, PractitionerCtakes.getInstance(), false );
 
       final FhirContext fhirContext = FhirContext.forDstu3();
       final IParser jsonParser = fhirContext.newJsonParser();

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirJsonFileReader.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirJsonFileReader.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirJsonFileReader.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirJsonFileReader.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,196 @@
+package org.apache.ctakes.fhir.cr;
+
+import ca.uhn.fhir.context.ConfigurationException;
+import ca.uhn.fhir.context.FhirContext;
+import ca.uhn.fhir.parser.DataFormatException;
+import ca.uhn.fhir.parser.IParser;
+import org.apache.ctakes.core.cr.AbstractFileTreeReader;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.core.util.RelationArgumentUtil;
+import org.apache.ctakes.fhir.element.FhirElementParser;
+import org.apache.ctakes.fhir.resource.*;
+import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
+import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
+import org.apache.log4j.Logger;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.hl7.fhir.dstu3.model.*;
+import org.hl7.fhir.instance.model.api.IBaseResource;
+import org.hl7.fhir.utilities.xhtml.XhtmlNode;
+
+import java.io.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.ctakes.fhir.element.FhirElementFactory.CTAKES_FHIR_URL;
+import static org.apache.ctakes.fhir.element.FhirElementFactory.RELATION_EXT_PREFIX;
+import static org.apache.ctakes.fhir.resource.AnnotationCreator.ID_NAME_ANNOTATION;
+import static org.apache.ctakes.fhir.resource.BaseTokenCreator.ID_NAME_BASE_TOKEN;
+import static org.apache.ctakes.fhir.resource.IdentifiedAnnotationCreator.ID_NAME_IDENTIFIED_ANNOTATION;
+import static org.apache.ctakes.fhir.resource.ParagraphCreator.ID_NAME_PARAGRAPH;
+import static org.apache.ctakes.fhir.resource.SectionCreator.ID_NAME_SECTION;
+import static org.apache.ctakes.fhir.resource.SentenceCreator.ID_NAME_SENTENCE;
+import static org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
+
+
+/**
+ * Unfinished collection reader to create ctakes annotations from fhir files.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 1/22/2018
+ */
+@PipeBitInfo(
+      name = "FhirJsonFileReader",
+      description = "Reads fhir information from json.", role = PipeBitInfo.Role.READER
+)
+public class FhirJsonFileReader extends AbstractFileTreeReader {
+
+   static private final Logger LOGGER = Logger.getLogger( "FhirJsonFileReader" );
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   protected void readFile( final JCas jCas, final File file ) throws IOException {
+      jCas.reset();
+
+      final Bundle bundle = readBundle( file );
+
+      final CompositionParser compositionParser = new CompositionParser();
+      final SectionParser sectionParser = new SectionParser();
+      final ParagraphParser paragraphParser = new ParagraphParser();
+      final SentenceParser sentenceParser = new SentenceParser();
+      final BaseTokenParser baseTokenParser = new BaseTokenParser();
+      final AnnotationParser annotationParser = new AnnotationParser();
+      final IdentifiedAnnotationParser iaParser = new IdentifiedAnnotationParser();
+      // Build map of resources to annotations, sections, etc.
+      final List<BundleEntryComponent> entries = bundle.getEntry();
+      final Map<IBaseResource, Annotation> resourceAnnotations = new HashMap<>( entries.size() );
+      for ( BundleEntryComponent entry : entries ) {
+         final IBaseResource resource = entry.getResource();
+         final Annotation annotation = parseResource( jCas, resource,
+               compositionParser, sectionParser, paragraphParser, sentenceParser, baseTokenParser,
+               annotationParser, iaParser );
+         if ( annotation != null ) {
+            resourceAnnotations.put( resource, annotation );
+         }
+      }
+
+      // Go through the (Basic) entries in the map and build relations
+      for ( Map.Entry<IBaseResource, Annotation> resourceAnnotation : resourceAnnotations.entrySet() ) {
+         if ( !Basic.class.isInstance( resourceAnnotation.getKey() ) ) {
+            continue;
+         }
+         final Basic basic = (Basic)resourceAnnotation.getKey();
+         final List<Extension> extensions = basic.getExtension();
+         for ( Extension extension : extensions ) {
+            final String url = extension.getUrl();
+            if ( url.startsWith( CTAKES_FHIR_URL + RELATION_EXT_PREFIX ) ) {
+               final Type type = extension.getValue();
+               if ( type instanceof Reference ) {
+                  final IBaseResource resource = ((Reference)type).getResource();
+                  final Annotation target = resourceAnnotations.get( resource );
+                  if ( target != null ) {
+                     createRelation( jCas, url, resourceAnnotation.getValue(), target );
+                  }
+               }
+            }
+         }
+      }
+
+      // TODO build Map<Integer,Collection<Annotation>> with coref chain index to annotations that belong from the Basic Extensions
+   }
+
+
+   static private void createRelation( final JCas jCas, final String url,
+                                       final Annotation source, final Annotation target ) {
+      if ( source instanceof IdentifiedAnnotation && target instanceof IdentifiedAnnotation ) {
+         final String category = url.substring( (CTAKES_FHIR_URL + RELATION_EXT_PREFIX).length() );
+         final BinaryTextRelation relation
+               = RelationArgumentUtil.createRelation( jCas, (IdentifiedAnnotation)source, (IdentifiedAnnotation)target,
+               category );
+         relation.addToIndexes();
+      }
+   }
+
+
+   // TODO
+   static private void createCoreference( final JCas jCas, Collection<Annotation> marked ) {
+
+   }
+
+
+   static private Annotation parseResource( final JCas jCas,
+                                            final IBaseResource resource,
+                                            final CompositionParser compositionParser,
+                                            final SectionParser sectionParser,
+                                            final ParagraphParser paragraphParser,
+                                            final SentenceParser sentenceParser,
+                                            final BaseTokenParser baseTokenParser,
+                                            final AnnotationParser annotationParser,
+                                            final IdentifiedAnnotationParser iaParser ) {
+      if ( resource instanceof Composition ) {
+         final Narrative narrative = ((Composition)resource).getText();
+         final XhtmlNode html = narrative.getDiv();
+         final String docText = html.allText();
+         jCas.setDocumentText( docText );
+         return null;
+      }
+      Annotation annotation = null;
+      if ( resource instanceof Basic ) {
+         final Basic basic = (Basic)resource;
+         final String idName = FhirElementParser.getIdName( basic.getId() );
+         switch ( idName ) {
+            case ID_NAME_SECTION:
+               annotation = sectionParser.parseResource( jCas, basic );
+               break;
+            case ID_NAME_PARAGRAPH:
+               annotation = paragraphParser.parseResource( jCas, basic );
+               break;
+            case ID_NAME_SENTENCE:
+               annotation = sentenceParser.parseResource( jCas, basic );
+               break;
+            case ID_NAME_BASE_TOKEN:
+               annotation = baseTokenParser.parseResource( jCas, basic );
+               break;
+            case ID_NAME_ANNOTATION:
+               annotation = annotationParser.parseResource( jCas, basic );
+               break;
+            case ID_NAME_IDENTIFIED_ANNOTATION:
+               annotation = iaParser.parseResource( jCas, basic );
+               break;
+         }
+         if ( annotation != null ) {
+            annotation.addToIndexes();
+            return annotation;
+         }
+      }
+      return null;
+   }
+
+
+   static private Bundle readBundle( final File file ) throws IOException {
+      IBaseResource baseResource;
+      final FhirContext fhirContext = FhirContext.forDstu3();
+      final IParser jsonParser = fhirContext.newJsonParser();
+      try ( Reader reader = new BufferedReader( new FileReader( file ) ) ) {
+         baseResource = jsonParser.parseResource( reader );
+
+      } catch ( IOException | ConfigurationException | DataFormatException multE ) {
+         LOGGER.error( "Could not read fhir from " + file.getAbsolutePath(), multE );
+         throw new IOException( multE );
+      }
+      if ( baseResource == null ) {
+         throw new IOException( "Null Bundle for file " + file.getAbsolutePath() );
+      }
+      if ( !Bundle.class.isInstance( baseResource ) ) {
+         throw new IOException( "Resource is not a Bundle for file " + file.getAbsolutePath() );
+      }
+      return (Bundle)baseResource;
+   }
+
+
+}

Modified: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirXmlFileReader.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirXmlFileReader.java?rev=1846527&r1=1846526&r2=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirXmlFileReader.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/cr/FhirXmlFileReader.java Tue Nov 13 17:05:11 2018
@@ -8,9 +8,9 @@ import org.apache.ctakes.core.cr.Abstrac
 import org.apache.ctakes.core.pipeline.PipeBitInfo;
 import org.apache.ctakes.core.util.RelationArgumentUtil;
 import org.apache.ctakes.fhir.element.FhirElementParser;
-import org.apache.ctakes.fhir.resource.AnnotationBasicParser;
-import org.apache.ctakes.fhir.resource.IdentifiedAnnotationBasicParser;
-import org.apache.ctakes.fhir.resource.SectionBasicParser;
+import org.apache.ctakes.fhir.resource.AnnotationParser;
+import org.apache.ctakes.fhir.resource.IdentifiedAnnotationParser;
+import org.apache.ctakes.fhir.resource.SectionParser;
 import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
 import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
 import org.apache.log4j.Logger;
@@ -28,9 +28,9 @@ import java.util.Map;
 
 import static org.apache.ctakes.fhir.element.FhirElementFactory.CTAKES_FHIR_URL;
 import static org.apache.ctakes.fhir.element.FhirElementFactory.RELATION_EXT_PREFIX;
-import static org.apache.ctakes.fhir.resource.AnnotationBasicCreator.ID_NAME_ANNOTATION;
-import static org.apache.ctakes.fhir.resource.IdentifiedAnnotationBasicCreator.ID_NAME_IDENTIFIED_ANNOTATION;
-import static org.apache.ctakes.fhir.resource.SectionBasicCreator.ID_NAME_SECTION;
+import static org.apache.ctakes.fhir.resource.AnnotationCreator.ID_NAME_ANNOTATION;
+import static org.apache.ctakes.fhir.resource.IdentifiedAnnotationCreator.ID_NAME_IDENTIFIED_ANNOTATION;
+import static org.apache.ctakes.fhir.resource.SectionCreator.ID_NAME_SECTION;
 import static org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
 
 
@@ -58,9 +58,9 @@ public class FhirXmlFileReader extends A
 
       final Bundle bundle = readBundle( file );
 
-      final SectionBasicParser sectionParser = new SectionBasicParser();
-      final AnnotationBasicParser annotationParser = new AnnotationBasicParser();
-      final IdentifiedAnnotationBasicParser iaParser = new IdentifiedAnnotationBasicParser();
+      final SectionParser sectionParser = new SectionParser();
+      final AnnotationParser annotationParser = new AnnotationParser();
+      final IdentifiedAnnotationParser iaParser = new IdentifiedAnnotationParser();
       // Build map of resources to annotations, sections, etc.
       final List<BundleEntryComponent> entries = bundle.getEntry();
       final Map<IBaseResource, Annotation> resourceAnnotations = new HashMap<>( entries.size() );
@@ -118,9 +118,9 @@ public class FhirXmlFileReader extends A
 
    static private Annotation parseResource( final JCas jCas,
                                             final IBaseResource resource,
-                                            final SectionBasicParser sectionParser,
-                                            final AnnotationBasicParser annotationParser,
-                                            final IdentifiedAnnotationBasicParser iaParser ) {
+                                            final SectionParser sectionParser,
+                                            final AnnotationParser annotationParser,
+                                            final IdentifiedAnnotationParser iaParser ) {
       if ( resource instanceof Composition ) {
          final Narrative narrative = ((Composition) resource).getText();
          final XhtmlNode html = narrative.getDiv();

Modified: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/element/FhirElementFactory.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/element/FhirElementFactory.java?rev=1846527&r1=1846526&r2=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/element/FhirElementFactory.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/element/FhirElementFactory.java Tue Nov 13 17:05:11 2018
@@ -9,6 +9,8 @@ import org.apache.ctakes.typesystem.type
 import org.apache.ctakes.typesystem.type.refsem.EventProperties;
 import org.apache.ctakes.typesystem.type.refsem.OntologyConcept;
 import org.apache.ctakes.typesystem.type.refsem.UmlsConcept;
+import org.apache.ctakes.typesystem.type.syntax.BaseToken;
+import org.apache.ctakes.typesystem.type.syntax.WordToken;
 import org.apache.ctakes.typesystem.type.textsem.EventMention;
 import org.apache.ctakes.typesystem.type.textsem.IdentifiedAnnotation;
 import org.apache.log4j.Logger;
@@ -20,7 +22,7 @@ import org.hl7.fhir.utilities.xhtml.Xhtm
 import java.util.Collection;
 import java.util.Date;
 
-import static org.apache.ctakes.fhir.resource.SectionBasicCreator.SECTION_EXT;
+import static org.apache.ctakes.fhir.resource.SectionCreator.SECTION_EXT;
 
 /**
  * @author SPF , chip-nlp
@@ -42,6 +44,7 @@ final public class FhirElementFactory {
    static public final String CODING_CUI = "cui";
    static public final String CODING_TUI = "tui";
    static public final String CODING_SEMANTIC = "semantic-group";
+   static public final String CODING_PART_OF_SPEECH = "part-of-speech";
 
    static public final char DIVIDER_CHAR = '-';
 
@@ -91,12 +94,27 @@ final public class FhirElementFactory {
    }
 
    /**
+    * @param baseToken -
+    * @return annotation type, part of speech and covered text in a fhir codeable concept.
+    */
+   static public CodeableConcept createPosCode( final BaseToken baseToken ) {
+      final CodeableConcept codeableConcept = createSimpleCode( baseToken );
+      if ( baseToken instanceof WordToken ) {
+         // We are only interested in tokens that are -words-
+         final String pos = baseToken.getPartOfSpeech();
+         codeableConcept.addCoding( new Coding( CODING_PART_OF_SPEECH, pos, "" ) );
+      }
+      return codeableConcept;
+   }
+
+   /**
     * @param annotation -
     * @return annotation type and covered text in a fhir codeable concept.
     */
    static public CodeableConcept createSimpleCode( final org.apache.uima.jcas.tcas.Annotation annotation ) {
       final String type = annotation.getType()
-            .getShortName();
+//            .getShortName();
+                                    .getName();
       return createSimpleCode( CODING_TYPE_SYSTEM, type, null, annotation.getCoveredText() );
    }
 

Copied: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationCreator.java (from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicCreator.java)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationCreator.java?p2=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationCreator.java&p1=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicCreator.java&r1=1846526&r2=1846527&rev=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicCreator.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationCreator.java Tue Nov 13 17:05:11 2018
@@ -1,23 +1,18 @@
 package org.apache.ctakes.fhir.resource;
 
 
-import org.apache.ctakes.fhir.element.FhirElementFactory;
 import org.apache.ctakes.fhir.util.FhirNoteSpecs;
-import org.apache.log4j.Logger;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.tcas.Annotation;
 import org.hl7.fhir.dstu3.model.Basic;
 
-import java.util.Date;
 
 /**
  * @author SPF , chip-nlp
  * @version %I%
  * @since 12/25/2017
  */
-final public class AnnotationBasicCreator implements FhirResourceCreator<Annotation, Basic> {
-
-   static private final Logger LOGGER = Logger.getLogger( "AnnotationBasicCreator" );
+final public class AnnotationCreator implements FhirBasicCreator<Annotation> {
 
    static public final String ID_NAME_ANNOTATION = "Annotation";
 
@@ -25,21 +20,17 @@ final public class AnnotationBasicCreato
     * {@inheritDoc}
     */
    @Override
-   public Basic createResource( final JCas jCas, final Annotation annotation, final FhirPractitioner practitioner,
-                                final FhirNoteSpecs noteSpecs ) {
-      final Basic basic = new Basic();
-      // The 'id' is name of the Resource type (class).  e.g. DiseaseDisorderMention
-      basic.setId( FhirElementFactory.createId( jCas, ID_NAME_ANNOTATION, annotation.hashCode() ) );
-      // The 'code' is the full ontology concept array: cuis, snomeds, urls, preferred text, PLUS covered text.
-      basic.setCode( FhirElementFactory.createSimpleCode( annotation ) );
-      // Add Creation Date as now.
-      basic.setCreated( new Date() );
-      // Add Author (ctakes).
-      basic.setAuthor( practitioner.getPractitionerReference() );
-      // Add text span as an extension.
-      basic.addExtension( FhirElementFactory.createSpanBegin( annotation ) );
-      basic.addExtension( FhirElementFactory.createSpanEnd( annotation ) );
-      return basic;
+   public String getIdName() {
+      return ID_NAME_ANNOTATION;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public Basic createResource( final JCas jCas, final Annotation annotation,
+                                final FhirPractitioner practitioner, final FhirNoteSpecs noteSpecs ) {
+      return createAnnotationBasic( jCas, annotation, practitioner );
    }
 
 }

Copied: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationParser.java (from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicParser.java)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationParser.java?p2=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationParser.java&p1=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicParser.java&r1=1846526&r2=1846527&rev=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationBasicParser.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/AnnotationParser.java Tue Nov 13 17:05:11 2018
@@ -1,7 +1,5 @@
 package org.apache.ctakes.fhir.resource;
 
-import org.apache.ctakes.core.util.Pair;
-import org.apache.ctakes.fhir.element.FhirElementParser;
 import org.apache.log4j.Logger;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.tcas.Annotation;
@@ -20,7 +18,7 @@ import static org.apache.ctakes.fhir.ele
  * @version %I%
  * @since 1/22/2018
  */
-final public class AnnotationBasicParser implements FhirResourceParser<Annotation, Basic> {
+final public class AnnotationParser implements FhirBasicParser<Annotation> {
 
    static private final Logger LOGGER = Logger.getLogger( "AnnotationBasicParser" );
 
@@ -34,13 +32,7 @@ final public class AnnotationBasicParser
          }
       }
       final Annotation annotation = createAnnotation( jCas, className );
-      final Pair<Integer> textSpan = FhirElementParser.getTextSpan( resource.getExtension() );
-      if ( textSpan == null ) {
-         LOGGER.error( "Could not parse text span for annotation basic " + resource.getId() );
-         return null;
-      }
-      annotation.setBegin( textSpan.getValue1() );
-      annotation.setEnd( textSpan.getValue2() );
+      addTextSpan( annotation, resource, LOGGER );
       return annotation;
    }
 

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenCreator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenCreator.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenCreator.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenCreator.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,42 @@
+package org.apache.ctakes.fhir.resource;
+
+
+import org.apache.ctakes.fhir.element.FhirElementFactory;
+import org.apache.ctakes.fhir.util.FhirNoteSpecs;
+import org.apache.ctakes.typesystem.type.syntax.BaseToken;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 12/25/2017
+ */
+final public class BaseTokenCreator implements FhirBasicCreator<BaseToken> {
+
+   static public final String ID_NAME_BASE_TOKEN = "BaseToken";
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String getIdName() {
+      return ID_NAME_BASE_TOKEN;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public Basic createResource( final JCas jCas, final BaseToken baseToken,
+                                final FhirPractitioner practitioner, final FhirNoteSpecs noteSpecs ) {
+      final Basic basic = createAnnotationBasic( jCas, baseToken, practitioner );
+
+      // The 'code' is the part of speech.
+      basic.setCode( FhirElementFactory.createPosCode( baseToken ) );
+
+      return basic;
+   }
+
+}

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenParser.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenParser.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/BaseTokenParser.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,63 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.typesystem.type.syntax.BaseToken;
+import org.apache.log4j.Logger;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+import org.hl7.fhir.dstu3.model.CodeableConcept;
+import org.hl7.fhir.dstu3.model.Coding;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import static org.apache.ctakes.fhir.element.FhirElementFactory.CODING_PART_OF_SPEECH;
+import static org.apache.ctakes.fhir.element.FhirElementFactory.CODING_TYPE_SYSTEM;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 1/22/2018
+ */
+final public class BaseTokenParser implements FhirBasicParser<BaseToken> {
+
+   static private final Logger LOGGER = Logger.getLogger( "BaseTokenParser" );
+
+   public BaseToken parseResource( final JCas jCas, final Basic resource ) {
+      String className = "";
+      String pos = "";
+      final CodeableConcept codeableConcept = resource.getCode();
+      for ( Coding coding : codeableConcept.getCoding() ) {
+         final String system = coding.getSystem();
+         if ( system.equals( CODING_TYPE_SYSTEM ) ) {
+            className = coding.getCode();
+         } else if ( system.equals( CODING_PART_OF_SPEECH ) ) {
+            pos = coding.getCode();
+         }
+      }
+      final BaseToken baseToken = createBaseToken( jCas, className );
+      baseToken.setPartOfSpeech( pos );
+      addTextSpan( baseToken, resource, LOGGER );
+      return baseToken;
+   }
+
+
+   static private BaseToken createBaseToken( final JCas jCas, final String className ) {
+      try {
+         final Class<?> clazz = Class.forName( className );
+         if ( BaseToken.class.isAssignableFrom( clazz ) ) {
+            final Constructor<?> constructor = clazz.getConstructor( JCas.class );
+            return (BaseToken)constructor.newInstance( jCas );
+         } else {
+            LOGGER.error( "Cannot create a ctakes base token for class " + className );
+         }
+      } catch ( ClassNotFoundException | NoSuchMethodException
+            | InstantiationException
+            | IllegalAccessException
+            | InvocationTargetException multE ) {
+         LOGGER.error( "Cannot determine ctakes base token type for class " + className );
+      }
+      return new BaseToken( jCas );
+   }
+
+}

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/CompositionParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/CompositionParser.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/CompositionParser.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/CompositionParser.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,41 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.log4j.Logger;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+import org.hl7.fhir.dstu3.model.Narrative;
+import org.hl7.fhir.utilities.xhtml.XhtmlNode;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/9/2018
+ */
+public class CompositionParser {
+
+   static private final Logger LOGGER = Logger.getLogger( "CompositionParser" );
+
+   public void parseResource( final JCas jCas, final Basic resource ) {
+
+//      composition.addAuthor( practitioner.getPractitionerReference() );
+//      composition.setId( FhirElementFactory.createId( jCas, ID_NAME_COMPOSITION, noteSpecs.getNoteTime() ) );
+//      composition.setStatus( Composition.CompositionStatus.FINAL );
+//      composition.setType( getCompositionType() );
+//      composition.setLanguage( "English" );
+//      composition.setSubject( noteSpecs.getSubjectReference( FhirNoteSpecs.SUBJECT_PATIENT ) );
+
+      // The following claim to have a 0 .. 1 cardinality, but the doc also states that they SHALL be listed.
+//      composition.setEncounter( noteSpecs.getEncounterReference() );
+//      composition.setCustodian( practitioner.getOrganizationReference() );
+//      composition.addEvent( noteSpecs.getEvent() );
+//      composition.addAttester( practitioner.createAttester( noteSpecs ) );
+
+//      composition.setText( FhirElementFactory.createNarrative( jCas.getDocumentText() ) );
+      final Narrative narrative = resource.getText();
+      final XhtmlNode htmlNode = narrative.getDiv();
+      final String docText = htmlNode.allText();
+      jCas.setDocumentText( docText );
+   }
+
+}

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicCreator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicCreator.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicCreator.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicCreator.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,37 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.fhir.element.FhirElementFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.hl7.fhir.dstu3.model.Basic;
+
+import java.util.Date;
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/12/2018
+ */
+public interface FhirBasicCreator<T extends Annotation> extends FhirResourceCreator<T, Basic> {
+
+   String getIdName();
+
+   default Basic createAnnotationBasic( final JCas jCas,
+                                        final T annotation,
+                                        final FhirPractitioner practitioner ) {
+      final Basic basic = new Basic();
+      // The 'id' is name of the Resource type (class).  e.g. DiseaseDisorderMention
+      basic.setId( FhirElementFactory.createId( jCas, getIdName(), annotation.hashCode() ) );
+      // The 'code' is the full ontology concept array: cuis, snomeds, urls, preferred text, PLUS covered text.
+      basic.setCode( FhirElementFactory.createSimpleCode( annotation ) );
+      // Add Creation Date as now.
+      basic.setCreated( new Date() );
+      // Add Author (ctakes).
+      basic.setAuthor( practitioner.getPractitionerReference() );
+      // Add text span as an extension.
+      basic.addExtension( FhirElementFactory.createSpanBegin( annotation ) );
+      basic.addExtension( FhirElementFactory.createSpanEnd( annotation ) );
+      return basic;
+   }
+
+}

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicParser.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicParser.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/FhirBasicParser.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,27 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.core.util.Pair;
+import org.apache.ctakes.fhir.element.FhirElementParser;
+import org.apache.log4j.Logger;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.hl7.fhir.dstu3.model.Basic;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 1/22/2018
+ */
+public interface FhirBasicParser<T extends Annotation> extends FhirResourceParser<T, Basic> {
+
+   default void addTextSpan( final T type, final Basic resource, final Logger logger ) {
+      final Pair<Integer> textSpan = FhirElementParser.getTextSpan( resource.getExtension() );
+      if ( textSpan == null ) {
+         logger.error( "Could not parse text span for basic " + resource.getId() );
+         return;
+      }
+      type.setBegin( textSpan.getValue1() );
+      type.setEnd( textSpan.getValue2() );
+   }
+
+}

Copied: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationCreator.java (from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicCreator.java)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationCreator.java?p2=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationCreator.java&p1=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicCreator.java&r1=1846526&r2=1846527&rev=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicCreator.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationCreator.java Tue Nov 13 17:05:11 2018
@@ -10,15 +10,13 @@ import org.apache.uima.jcas.JCas;
 import org.hl7.fhir.dstu3.model.Basic;
 import org.hl7.fhir.dstu3.model.Extension;
 
-import java.util.Date;
-
 
 /**
  * @author SPF , chip-nlp
  * @version %I%
  * @since 12/25/2017
  */
-final public class IdentifiedAnnotationBasicCreator implements FhirResourceCreator<IdentifiedAnnotation, Basic> {
+final public class IdentifiedAnnotationCreator implements FhirBasicCreator<IdentifiedAnnotation> {
 
    static private final Logger LOGGER = Logger.getLogger( "IdentifiedAnnotationBasicCreator" );
 
@@ -33,22 +31,23 @@ final public class IdentifiedAnnotationB
     * {@inheritDoc}
     */
    @Override
+   public String getIdName() {
+      return ID_NAME_IDENTIFIED_ANNOTATION;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
    public Basic createResource( final JCas jCas, final IdentifiedAnnotation annotation,
                                 final FhirPractitioner practitioner, final FhirNoteSpecs noteSpecs ) {
-      final Basic basic = new Basic();
-      // The 'id' is name of the Resource type (class).  e.g. DiseaseDisorderMention
-      basic.setId( FhirElementFactory.createId( jCas, ID_NAME_IDENTIFIED_ANNOTATION, annotation.hashCode() ) );
+      final Basic basic = createAnnotationBasic( jCas, annotation, practitioner );
+
       // The 'code' is the full ontology concept array: cuis, snomeds, urls, preferred text, PLUS covered text.
       basic.setCode( FhirElementFactory.createPrimaryCode( annotation ) );
+
       // Add Subject reference.
       basic.setSubject( noteSpecs.getSubjectReference( annotation.getSubject() ) );
-      // Add Creation Date as now.
-      basic.setCreated( new Date() );
-      // Add Author (ctakes).
-      basic.setAuthor( practitioner.getPractitionerReference() );
-      // Add text span as an extension.
-      basic.addExtension( FhirElementFactory.createSpanBegin( annotation ) );
-      basic.addExtension( FhirElementFactory.createSpanEnd( annotation ) );
       // Add DocTimeRel as an extension.
       if ( annotation instanceof EventMention ) {
          final Extension dtr = FhirElementFactory.createDocTimeRel( (EventMention) annotation );

Copied: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationParser.java (from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicParser.java)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationParser.java?p2=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationParser.java&p1=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicParser.java&r1=1846526&r2=1846527&rev=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationBasicParser.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/IdentifiedAnnotationParser.java Tue Nov 13 17:05:11 2018
@@ -1,7 +1,6 @@
 package org.apache.ctakes.fhir.resource;
 
 import org.apache.ctakes.core.semantic.SemanticGroup;
-import org.apache.ctakes.core.util.Pair;
 import org.apache.ctakes.fhir.element.FhirElementParser;
 import org.apache.ctakes.typesystem.type.constants.CONST;
 import org.apache.ctakes.typesystem.type.refsem.Event;
@@ -21,7 +20,7 @@ import java.util.Collection;
 import java.util.List;
 
 import static org.apache.ctakes.fhir.element.FhirElementFactory.*;
-import static org.apache.ctakes.fhir.resource.IdentifiedAnnotationBasicCreator.*;
+import static org.apache.ctakes.fhir.resource.IdentifiedAnnotationCreator.*;
 
 
 /**
@@ -29,7 +28,7 @@ import static org.apache.ctakes.fhir.res
  * @version %I%
  * @since 1/22/2018
  */
-final public class IdentifiedAnnotationBasicParser implements FhirResourceParser<IdentifiedAnnotation, Basic> {
+final public class IdentifiedAnnotationParser implements FhirBasicParser<IdentifiedAnnotation> {
 
    static private final Logger LOGGER = Logger.getLogger( "IdentifiedAnnotationBasicParser" );
 
@@ -53,16 +52,11 @@ final public class IdentifiedAnnotationB
       }
       annotation.setOntologyConceptArr( conceptArr );
       // text span
-      final List<Extension> extensions = resource.getExtension();
-      final Pair<Integer> textSpan = FhirElementParser.getTextSpan( extensions );
-      if ( textSpan == null ) {
-         LOGGER.error( "Could not parse text span for annotation basic " + resource.getId() );
-         return null;
-      }
-      annotation.setBegin( textSpan.getValue1() );
-      annotation.setEnd( textSpan.getValue2() );
+      addTextSpan( annotation, resource, LOGGER );
 
       // Set properties
+      final List<Extension> extensions = resource.getExtension();
+      extensions.addAll( resource.getModifierExtension() );
       if ( FhirElementParser.hasExtension( GENERIC_EXT, extensions ) ) {
          annotation.setGeneric( true );
       }
@@ -76,6 +70,7 @@ final public class IdentifiedAnnotationB
          annotation.setHistoryOf( CONST.NE_HISTORY_OF_PRESENT );
       }
       // TODO subject
+      annotation.setSubject( FhirElementParser.getSubjectId( resource ) );
       if ( annotation instanceof EventMention ) {
          final Event event = createEvent( jCas, extensions );
          if ( event != null ) {

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphCreator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphCreator.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphCreator.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphCreator.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,35 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.fhir.util.FhirNoteSpecs;
+import org.apache.ctakes.typesystem.type.textspan.Paragraph;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/12/2018
+ */
+final public class ParagraphCreator implements FhirBasicCreator<Paragraph> {
+
+   static public final String ID_NAME_PARAGRAPH = "DocumentParagraph";
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String getIdName() {
+      return ID_NAME_PARAGRAPH;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public Basic createResource( final JCas jCas, final Paragraph paragraph,
+                                final FhirPractitioner practitioner, final FhirNoteSpecs noteSpecs ) {
+      return createAnnotationBasic( jCas, paragraph, practitioner );
+   }
+
+}

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphParser.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphParser.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/ParagraphParser.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,24 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.typesystem.type.textspan.Paragraph;
+import org.apache.log4j.Logger;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 1/22/2018
+ */
+final public class ParagraphParser implements FhirBasicParser<Paragraph> {
+
+   static private final Logger LOGGER = Logger.getLogger( "ParagraphBasicParser" );
+
+   public Paragraph parseResource( final JCas jCas, final Basic resource ) {
+      final Paragraph paragraph = new Paragraph( jCas );
+      addTextSpan( paragraph, resource, LOGGER );
+      return paragraph;
+   }
+
+}

Copied: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionCreator.java (from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicCreator.java)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionCreator.java?p2=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionCreator.java&p1=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicCreator.java&r1=1846526&r2=1846527&rev=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicCreator.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionCreator.java Tue Nov 13 17:05:11 2018
@@ -9,15 +9,13 @@ import org.hl7.fhir.dstu3.model.Basic;
 import org.hl7.fhir.dstu3.model.CodeableConcept;
 import org.hl7.fhir.dstu3.model.Coding;
 
-import java.util.Date;
-
 
 /**
  * @author SPF , chip-nlp
  * @version %I%
  * @since 12/25/2017
  */
-final public class SectionBasicCreator implements FhirResourceCreator<Segment, Basic> {
+final public class SectionCreator implements FhirBasicCreator<Segment> {
 
    static private final Logger LOGGER = Logger.getLogger( "SectionBasicCreator" );
 
@@ -31,11 +29,18 @@ final public class SectionBasicCreator i
     * {@inheritDoc}
     */
    @Override
+   public String getIdName() {
+      return ID_NAME_SECTION;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
    public Basic createResource( final JCas jCas, final Segment section, final FhirPractitioner practitioner,
                                 final FhirNoteSpecs noteSpecs ) {
-      final Basic basic = new Basic();
-      // The 'id' is name of the Resource type (class).  e.g. DiseaseDisorderMention
-      basic.setId( FhirElementFactory.createId( jCas, ID_NAME_SECTION, section.hashCode() ) );
+      final Basic basic = createAnnotationBasic( jCas, section, practitioner );
+
       // The 'code' is the normalized section name PLUS section tag text.
       final CodeableConcept codeableConcept = FhirElementFactory.createSimpleCode( section );
       codeableConcept.addCoding( new Coding( CODING_SECTION_NAME, section.getPreferredText(), null ) );
@@ -45,13 +50,7 @@ final public class SectionBasicCreator i
       }
       codeableConcept.setText( section.getTagText() );
       basic.setCode( codeableConcept );
-      // Add Creation Date as now.
-      basic.setCreated( new Date() );
-      // Add Author (ctakes).
-      basic.setAuthor( practitioner.getPractitionerReference() );
-      // Add text span as an extension.
-      basic.addExtension( FhirElementFactory.createSpanBegin( section ) );
-      basic.addExtension( FhirElementFactory.createSpanEnd( section ) );
+
       return basic;
    }
 

Copied: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionParser.java (from r1846526, ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicParser.java)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionParser.java?p2=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionParser.java&p1=ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicParser.java&r1=1846526&r2=1846527&rev=1846527&view=diff
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionBasicParser.java (original)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SectionParser.java Tue Nov 13 17:05:11 2018
@@ -1,7 +1,5 @@
 package org.apache.ctakes.fhir.resource;
 
-import org.apache.ctakes.core.util.Pair;
-import org.apache.ctakes.fhir.element.FhirElementParser;
 import org.apache.ctakes.typesystem.type.textspan.Segment;
 import org.apache.log4j.Logger;
 import org.apache.uima.jcas.JCas;
@@ -11,8 +9,8 @@ import org.hl7.fhir.dstu3.model.Coding;
 
 import java.util.List;
 
-import static org.apache.ctakes.fhir.resource.SectionBasicCreator.CODING_SECTION_ID;
-import static org.apache.ctakes.fhir.resource.SectionBasicCreator.CODING_SECTION_NAME;
+import static org.apache.ctakes.fhir.resource.SectionCreator.CODING_SECTION_ID;
+import static org.apache.ctakes.fhir.resource.SectionCreator.CODING_SECTION_NAME;
 
 
 /**
@@ -20,7 +18,7 @@ import static org.apache.ctakes.fhir.res
  * @version %I%
  * @since 1/22/2018
  */
-final public class SectionBasicParser implements FhirResourceParser<Segment, Basic> {
+final public class SectionParser implements FhirBasicParser<Segment> {
 
    static private final Logger LOGGER = Logger.getLogger( "SectionBasicParser" );
 
@@ -38,17 +36,13 @@ final public class SectionBasicParser im
          }
       }
       final String tagText = codeableConcept.getText();
-      final Pair<Integer> textSpan = FhirElementParser.getTextSpan( resource.getExtension() );
-      if ( textSpan == null ) {
-         LOGGER.error( "Could not parse text span for section " + preferredText );
-         return null;
-      }
       final Segment segment = new Segment( jCas );
-      segment.setBegin( textSpan.getValue1() );
-      segment.setEnd( textSpan.getValue2() );
+      addTextSpan( segment, resource, LOGGER );
       segment.setPreferredText( preferredText );
       segment.setTagText( tagText );
-      if ( !id.isEmpty() ) {
+      if ( id.isEmpty() ) {
+         segment.setId( "SIMPLE_SEGMENT" );
+      } else {
          segment.setId( id );
       }
       return segment;

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceCreator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceCreator.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceCreator.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceCreator.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,36 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.fhir.util.FhirNoteSpecs;
+import org.apache.ctakes.typesystem.type.textspan.Sentence;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/12/2018
+ */
+final public class SentenceCreator implements FhirBasicCreator<Sentence> {
+
+   static public final String SENTENCE_EXT = "document-sentence";
+   static public final String ID_NAME_SENTENCE = "DocumentSentence";
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String getIdName() {
+      return ID_NAME_SENTENCE;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public Basic createResource( final JCas jCas, final Sentence sentence,
+                                final FhirPractitioner practitioner, final FhirNoteSpecs noteSpecs ) {
+      return createAnnotationBasic( jCas, sentence, practitioner );
+   }
+
+}

Added: ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceParser.java?rev=1846527&view=auto
==============================================================================
--- ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceParser.java (added)
+++ ctakes/trunk/ctakes-fhir/src/main/java/org/apache/ctakes/fhir/resource/SentenceParser.java Tue Nov 13 17:05:11 2018
@@ -0,0 +1,24 @@
+package org.apache.ctakes.fhir.resource;
+
+import org.apache.ctakes.typesystem.type.textspan.Sentence;
+import org.apache.log4j.Logger;
+import org.apache.uima.jcas.JCas;
+import org.hl7.fhir.dstu3.model.Basic;
+
+
+/**
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 1/22/2018
+ */
+final public class SentenceParser implements FhirBasicParser<Sentence> {
+
+   static private final Logger LOGGER = Logger.getLogger( "SentenceBasicParser" );
+
+   public Sentence parseResource( final JCas jCas, final Basic resource ) {
+      final Sentence sentence = new Sentence( jCas );
+      addTextSpan( sentence, resource, LOGGER );
+      return sentence;
+   }
+
+}