You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by jo...@apache.org on 2009/07/24 10:58:55 UTC

svn commit: r797373 [5/8] - in /incubator/uima/sandbox/trunk/Lucas: ./ docbook/ docbook/LuceneCASConsumerUserGuide/ docbook/LuceneCASConsumerUserGuide/images/ src/main/java/org/apache/uima/lucas/consumer/ src/main/java/org/apache/uima/lucas/indexer/ sr...

Modified: incubator/uima/sandbox/trunk/Lucas/src/test/java/org/apache/uima/lucas/indexer/analysis/AnnotationTokenStreamTest.java
URL: http://svn.apache.org/viewvc/incubator/uima/sandbox/trunk/Lucas/src/test/java/org/apache/uima/lucas/indexer/analysis/AnnotationTokenStreamTest.java?rev=797373&r1=797372&r2=797373&view=diff
==============================================================================
--- incubator/uima/sandbox/trunk/Lucas/src/test/java/org/apache/uima/lucas/indexer/analysis/AnnotationTokenStreamTest.java (original)
+++ incubator/uima/sandbox/trunk/Lucas/src/test/java/org/apache/uima/lucas/indexer/analysis/AnnotationTokenStreamTest.java Fri Jul 24 08:58:52 2009
@@ -19,1420 +19,1345 @@
 
 package org.apache.uima.lucas.indexer.analysis;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.apache.lucene.analysis.Token;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.CASException;
+import org.apache.uima.cas.Type;
 import org.apache.uima.collection.CollectionReader;
 import org.apache.uima.collection.CollectionReaderDescription;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.cas.FSArray;
 import org.apache.uima.jcas.cas.StringArray;
-import org.apache.uima.lucas.indexer.analysis.AnnotationTokenStream;
 import org.apache.uima.lucas.indexer.types.test.Annotation1;
 import org.apache.uima.lucas.indexer.types.test.FeatureStructure1;
 import org.apache.uima.lucas.indexer.types.test.FeatureStructure2;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.util.CasCreationUtils;
 import org.apache.uima.util.XMLInputSource;
+import org.junit.Before;
+import org.junit.Test;
 
-public class AnnotationTokenStreamTest extends TestCase {
-
-  private final static String READER_DESCRIPTOR =
-          "src/test/resources/AnnotationTokenStreamTestDummyCollectionReader.xml";
-
-  private CollectionReader reader;
-
-  @Override
-  protected void setUp() throws Exception {
-    CollectionReaderDescription readerDescription =
-            (CollectionReaderDescription) UIMAFramework.getXMLParser()
-                    .parseCollectionReaderDescription(new XMLInputSource(READER_DESCRIPTOR));
-    reader = UIMAFramework.produceCollectionReader(readerDescription);
-    super.setUp();
-  }
-
-  public JCas createCasWithText(String documentText) throws ResourceInitializationException,
-          CASException {
-    JCas cas = CasCreationUtils.createCas(reader.getProcessingResourceMetaData()).getJCas();
-    cas.setDocumentText(documentText);
-    return cas;
-  }
-
-  public void testCreateDocumentTextTokens() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-    annotation1.addToIndexes();
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-    annotation3.addToIndexes();
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1");
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  public void testCreateFeatureTokens() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-    annotation1.setFeatureString("token1Feature1");
-    annotation1.addToIndexes();
-
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setFeatureString("token2Feature1");
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setFeatureString("token3Feature1");
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-    annotation3.addToIndexes();
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", "featureString", null);
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  public void testCreateMultipleFeatureTokens() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-    annotation1.setFeatureString("token1Feature1");
-    annotation1.setFeatureInteger(1);
-    annotation1.addToIndexes();
-
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setFeatureString("token2Feature1");
-    annotation2.setFeatureInteger(2);
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setFeatureString("token3Feature1");
-    annotation3.setFeatureInteger(3);
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-    annotation3.addToIndexes();
-
-    List<String> featureNames = new ArrayList<String>();
-    featureNames.add("featureString");
-    featureNames.add("featureInteger");
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", featureNames, "_", null);
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1Feature1_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2Feature1_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3Feature1_3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  public void testCreateArrayFeatureTokensWithoutDelimiter() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-    StringArray stringArray1 = new StringArray(cas, 3);
-    stringArray1.set(0, "token1FeatureStringArray1");
-    stringArray1.set(1, "token1FeatureStringArray2");
-    stringArray1.set(2, "token1FeatureStringArray3");
-    annotation1.setFeatureStringArray(stringArray1);
-    annotation1.addToIndexes();
-
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-    StringArray stringArray2 = new StringArray(cas, 3);
-    stringArray2.set(0, "token2FeatureStringArray1");
-    stringArray2.set(1, "token2FeatureStringArray2");
-    stringArray2.set(2, "token2FeatureStringArray3");
-    annotation2.setFeatureStringArray(stringArray2);
-
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-    StringArray stringArray3 = new StringArray(cas, 3);
-    stringArray3.set(0, "token3FeatureStringArray1");
-    stringArray3.set(1, "token3FeatureStringArray2");
-    stringArray3.set(2, "token3FeatureStringArray3");
-    annotation3.setFeatureStringArray(stringArray3);
-    annotation3.addToIndexes();
-
-    List<String> featureNames = new ArrayList<String>();
-    featureNames.add("featureStringArray");
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", featureNames, null);
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStringArray1", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStringArray2", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStringArray1", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStringArray2", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStringArray1", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStringArray2", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  public void testCreateArrayFeatureTokensWithDelimiter() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-    StringArray stringArray1 = new StringArray(cas, 3);
-    stringArray1.set(0, "token1FeatureStringArray1");
-    stringArray1.set(1, "token1FeatureStringArray2");
-    stringArray1.set(2, "token1FeatureStringArray3");
-    annotation1.setFeatureStringArray(stringArray1);
-    annotation1.addToIndexes();
-
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-    StringArray stringArray2 = new StringArray(cas, 3);
-    stringArray2.set(0, "token2FeatureStringArray1");
-    stringArray2.set(1, "token2FeatureStringArray2");
-    stringArray2.set(2, "token2FeatureStringArray3");
-    annotation2.setFeatureStringArray(stringArray2);
-
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-    StringArray stringArray3 = new StringArray(cas, 3);
-    stringArray3.set(0, "token3FeatureStringArray1");
-    stringArray3.set(1, "token3FeatureStringArray2");
-    stringArray3.set(2, "token3FeatureStringArray3");
-    annotation3.setFeatureStringArray(stringArray3);
-    annotation3.addToIndexes();
-
-    List<String> featureNames = new ArrayList<String>();
-    featureNames.add("featureStringArray");
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", featureNames, " ", null);
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStringArray1 token1FeatureStringArray2 token1FeatureStringArray3",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStringArray1 token2FeatureStringArray2 token2FeatureStringArray3",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStringArray1 token3FeatureStringArray2 token3FeatureStringArray3",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  public void testCreateFeatureStructureTokens() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-    FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token1Feature1");
-    FeatureStructure2 featureStructure2 = new FeatureStructure2(cas);
-    featureStructure2.setFeature1("token1Feature3Feature1");
-    featureStructure1.setFeature3(featureStructure2);
-    annotation1.setFeatureStructure1(featureStructure1);
-    annotation1.addToIndexes();
-
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token2Feature1");
-    featureStructure2 = new FeatureStructure2(cas);
-    featureStructure2.setFeature1("token2Feature3Feature1");
-    featureStructure1.setFeature3(featureStructure2);
-    annotation2.setFeatureStructure1(featureStructure1);
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token3Feature1");
-    featureStructure2 = new FeatureStructure2(cas);
-    featureStructure2.setFeature1("token3Feature3Feature1");
-    featureStructure1.setFeature3(featureStructure2);
-    annotation3.setFeatureStructure1(featureStructure1);
-    annotation3.addToIndexes();
-    List<String> featureNames = new ArrayList<String>();
-    featureNames.add("feature1");
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", "featureStructure1", featureNames,
-                    null);
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-
-    annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", "featureStructure1.feature3",
-                    featureNames, null);
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1Feature3Feature1", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2Feature3Feature1", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3Feature3Feature1", new String(nextToken.termBuffer(), 0, nextToken
-            .termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  public void testCreateArrayFeatureStructuresWithDelimterTokens() throws Exception {
-    JCas cas = createCasWithText("token1 token2 token3");
-    Annotation1 annotation1 = new Annotation1(cas);
-    annotation1.setBegin(0);
-    annotation1.setEnd(6);
-
-    FSArray featureStructure1Array = new FSArray(cas, 3);
-    FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token1FeatureStructures1Feature10");
-    featureStructure1.setFeature2("token1FeatureStructures1Feature20");
-
-    featureStructure1Array.set(0, featureStructure1);
-
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token1FeatureStructures1Feature11");
-    featureStructure1.setFeature2("token1FeatureStructures1Feature21");
-
-    featureStructure1Array.set(1, featureStructure1);
-
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token1FeatureStructures1Feature12");
-    featureStructure1.setFeature2("token1FeatureStructures1Feature22");
-
-    featureStructure1Array.set(2, featureStructure1);
-
-    annotation1.setFeatureStructures1(featureStructure1Array);
-    annotation1.addToIndexes();
-
-    Annotation1 annotation2 = new Annotation1(cas);
-    annotation2.setBegin(7);
-    annotation2.setEnd(13);
-
-    featureStructure1Array = new FSArray(cas, 3);
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token2FeatureStructures1Feature10");
-    featureStructure1.setFeature2("token2FeatureStructures1Feature20");
-
-    featureStructure1Array.set(0, featureStructure1);
-
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token2FeatureStructures1Feature11");
-    featureStructure1.setFeature2("token2FeatureStructures1Feature21");
-
-    featureStructure1Array.set(1, featureStructure1);
-
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token2FeatureStructures1Feature12");
-    featureStructure1.setFeature2("token2FeatureStructures1Feature22");
-
-    featureStructure1Array.set(2, featureStructure1);
-
-    annotation2.setFeatureStructures1(featureStructure1Array);
-    annotation2.addToIndexes();
-
-    Annotation1 annotation3 = new Annotation1(cas);
-    annotation3.setBegin(14);
-    annotation3.setEnd(20);
-
-    featureStructure1Array = new FSArray(cas, 3);
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token3FeatureStructures1Feature10");
-    featureStructure1.setFeature2("token3FeatureStructures1Feature20");
-
-    featureStructure1Array.set(0, featureStructure1);
-
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token3FeatureStructures1Feature11");
-    featureStructure1.setFeature2("token3FeatureStructures1Feature21");
-
-    featureStructure1Array.set(1, featureStructure1);
-
-    featureStructure1 = new FeatureStructure1(cas);
-    featureStructure1.setFeature1("token3FeatureStructures1Feature12");
-    featureStructure1.setFeature2("token3FeatureStructures1Feature22");
-
-    featureStructure1Array.set(2, featureStructure1);
-
-    annotation3.setFeatureStructures1(featureStructure1Array);
-    annotation3.addToIndexes();
-
-    List<String> featureNames = new ArrayList<String>();
-    featureNames.add("feature1");
-    featureNames.add("feature2");
-
-    AnnotationTokenStream annotationTokenStream =
-            new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA,
-                    "de.julielab.jules.types.test.Annotation1", "featureStructures1", featureNames,
-                    ", ", null);
-    Token nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStructures1Feature10, token1FeatureStructures1Feature20",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStructures1Feature11, token1FeatureStructures1Feature21",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token1FeatureStructures1Feature12, token1FeatureStructures1Feature22",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(0, nextToken.startOffset());
-    assertEquals(6, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStructures1Feature10, token2FeatureStructures1Feature20",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStructures1Feature11, token2FeatureStructures1Feature21",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token2FeatureStructures1Feature12, token2FeatureStructures1Feature22",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(7, nextToken.startOffset());
-    assertEquals(13, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStructures1Feature10, token3FeatureStructures1Feature20",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStructures1Feature11, token3FeatureStructures1Feature21",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-
-    nextToken = annotationTokenStream.next();
-    assertNotNull(nextToken);
-    assertEquals("token3FeatureStructures1Feature12, token3FeatureStructures1Feature22",
-            new String(nextToken.termBuffer(), 0, nextToken.termLength()));
-    assertEquals(14, nextToken.startOffset());
-    assertEquals(20, nextToken.endOffset());
-  }
-
-  // public void testCreateArrayFeatureStructuresWithoutDelimterTokens() throws Exception{
-  // JCas cas = createCasWithText("token1 token2 token3");
-  // Annotation1 annotation1 = new Annotation1(cas);
-  // annotation1.setBegin(0);
-  // annotation1.setEnd(6);
-  //		
-  // FSArray featureStructure1Array = new FSArray(cas, 3);
-  // FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token1FeatureStructures1Feature10");
-  // featureStructure1.setFeature2("token1FeatureStructures1Feature20");
-  //	
-  // featureStructure1Array.set(0, featureStructure1);
-  //	
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token1FeatureStructures1Feature11");
-  // featureStructure1.setFeature2("token1FeatureStructures1Feature21");
-  //		
-  // featureStructure1Array.set(1, featureStructure1);
-  //	
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token1FeatureStructures1Feature12");
-  // featureStructure1.setFeature2("token1FeatureStructures1Feature22");
-  //		
-  // featureStructure1Array.set(2, featureStructure1);
-  //		
-  // annotation1.setFeatureStructures1(featureStructure1Array);
-  // annotation1.addToIndexes();
-  //		
-  // Annotation1 annotation2 = new Annotation1(cas);
-  // annotation2.setBegin(7);
-  // annotation2.setEnd(13);
-  //	
-  // featureStructure1Array = new FSArray(cas, 3);
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token2FeatureStructures1Feature10");
-  // featureStructure1.setFeature2("token2FeatureStructures1Feature20");
-  //				
-  // featureStructure1Array.set(0, featureStructure1);
-  //	
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token2FeatureStructures1Feature11");
-  // featureStructure1.setFeature2("token2FeatureStructures1Feature21");
-  //		
-  // featureStructure1Array.set(1, featureStructure1);
-  //	
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token2FeatureStructures1Feature12");
-  // featureStructure1.setFeature2("token2FeatureStructures1Feature22");
-  //		
-  // featureStructure1Array.set(2, featureStructure1);
-  //		
-  // annotation2.setFeatureStructures1(featureStructure1Array);
-  // annotation2.addToIndexes();
-  //		
-  // Annotation1 annotation3 = new Annotation1(cas);
-  // annotation3.setBegin(14);
-  // annotation3.setEnd(20);
-  //		
-  // featureStructure1Array = new FSArray(cas, 3);
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token3FeatureStructures1Feature10");
-  // featureStructure1.setFeature2("token3FeatureStructures1Feature20");
-  //		
-  // featureStructure1Array.set(0, featureStructure1);
-  //	
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token3FeatureStructures1Feature11");
-  // featureStructure1.setFeature2("token3FeatureStructures1Feature21");
-  //		
-  // featureStructure1Array.set(1, featureStructure1);
-  //	
-  // featureStructure1 = new FeatureStructure1(cas);
-  // featureStructure1.setFeature1("token3FeatureStructures1Feature12");
-  // featureStructure1.setFeature2("token3FeatureStructures1Feature22");
-  //		
-  // featureStructure1Array.set(2, featureStructure1);
-  //		
-  // annotation3.setFeatureStructures1(featureStructure1Array);
-  // annotation3.addToIndexes();
-  //	
-  // List<String> featureNames = new ArrayList<String>();
-  // featureNames.add("feature1");
-  // featureNames.add("feature2");
-  //	
-  //
-  // AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas,
-  // "de.julielab.jules.types.test.Annotation1", "featureStructures1", featureNames, null);
-  // Token nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token1FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(0, nextToken.startOffset());
-  // assertEquals(6, nextToken.endOffset());
-  //	
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token1FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(0, nextToken.startOffset());
-  // assertEquals(6, nextToken.endOffset());
-  //		
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token1FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(0, nextToken.startOffset());
-  // assertEquals(6, nextToken.endOffset());
-  //		
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token2FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(7, nextToken.startOffset());
-  // assertEquals(13, nextToken.endOffset());
-  //	
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token2FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(7, nextToken.startOffset());
-  // assertEquals(13, nextToken.endOffset());
-  //	
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token2FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(7, nextToken.startOffset());
-  // assertEquals(13, nextToken.endOffset());
-  //		
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token3FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(14, nextToken.startOffset());
-  // assertEquals(20, nextToken.endOffset());
-  //	
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token3FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(14, nextToken.startOffset());
-  // assertEquals(20, nextToken.endOffset());
-  //	
-  // nextToken = annotationTokenStream.next();
-  // assertNotNull(nextToken);
-  // assertEquals("token3FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0,
-  // nextToken.termLength()));
-  // assertEquals(14, nextToken.startOffset());
-  // assertEquals(20, nextToken.endOffset());
-  // }
+import com.google.common.collect.Lists;
 
-  public void testCreateArrayFeatureStructuresWithSinleFeature() throws Exception {
+public class AnnotationTokenStreamTest {
+	
+	private final static String READER_DESCRIPTOR = "src/test/resources/AnnotationTokenStreamTestDummyCollectionReader.xml";
+	private CollectionReader reader;
+	
+	@Before
+	public void setUp() throws Exception {
+		CollectionReaderDescription readerDescription = (CollectionReaderDescription) UIMAFramework.getXMLParser().parseCollectionReaderDescription(new XMLInputSource(READER_DESCRIPTOR));
+		reader = UIMAFramework.produceCollectionReader(readerDescription);		
+	}
+	
+	public JCas createCasWithText(String documentText) throws ResourceInitializationException, CASException{		
+		JCas cas = CasCreationUtils.createCas(reader.getProcessingResourceMetaData()).getJCas();
+		cas.setDocumentText(documentText);
+		return cas;
+	}
+
+	@Test
+	public void testCreateDocumentTextTokens() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		annotation1.addToIndexes();
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		annotation3.addToIndexes();
+		
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1");
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	}
+	
+	@Test
+	public void testCreateFeatureTokens() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		annotation1.setFeatureString("token1Feature1");
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setFeatureString("token2Feature1");
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setFeatureString("token3Feature1");
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		annotation3.addToIndexes();		
+
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureString", null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	}
+	 
+  @Test
+	public void testCreateMultipleFeatureTokens() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		annotation1.setFeatureString("token1Feature1");
+		annotation1.setFeatureInteger(1);
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setFeatureString("token2Feature1");
+		annotation2.setFeatureInteger(2);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setFeatureString("token3Feature1");
+		annotation3.setFeatureInteger(3);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		annotation3.addToIndexes();		
+
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("featureString");
+		featureNames.add("featureInteger");
+		
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", featureNames, "_", null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1Feature1_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2Feature1_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3Feature1_3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	}	
+  
+  @Test
+	public void testCreateArrayFeatureTokensWithoutDelimiter() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		StringArray stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token1FeatureStringArray1");
+		stringArray1.set(1, "token1FeatureStringArray2");
+		stringArray1.set(2, "token1FeatureStringArray3");
+		annotation1.setFeatureStringArray(stringArray1);
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+		StringArray stringArray2 = new StringArray(cas, 3);
+		stringArray2.set(0, "token2FeatureStringArray1");
+		stringArray2.set(1, "token2FeatureStringArray2");
+		stringArray2.set(2, "token2FeatureStringArray3");
+		annotation2.setFeatureStringArray(stringArray2);
+		
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		StringArray stringArray3 = new StringArray(cas, 3);
+		stringArray3.set(0, "token3FeatureStringArray1");
+		stringArray3.set(1, "token3FeatureStringArray2");
+		stringArray3.set(2, "token3FeatureStringArray3");
+		annotation3.setFeatureStringArray(stringArray3);
+		annotation3.addToIndexes();		
+		
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("featureStringArray");
+		
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", featureNames, null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStringArray1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStringArray2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStringArray1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStringArray2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStringArray1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStringArray2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());		
+	}
+  
+  @Test
+	public void testCreateArrayFeatureTokensWithDelimiter() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		StringArray stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token1FeatureStringArray1");
+		stringArray1.set(1, "token1FeatureStringArray2");
+		stringArray1.set(2, "token1FeatureStringArray3");
+		annotation1.setFeatureStringArray(stringArray1);
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+		StringArray stringArray2 = new StringArray(cas, 3);
+		stringArray2.set(0, "token2FeatureStringArray1");
+		stringArray2.set(1, "token2FeatureStringArray2");
+		stringArray2.set(2, "token2FeatureStringArray3");
+		annotation2.setFeatureStringArray(stringArray2);
+		
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		StringArray stringArray3 = new StringArray(cas, 3);
+		stringArray3.set(0, "token3FeatureStringArray1");
+		stringArray3.set(1, "token3FeatureStringArray2");
+		stringArray3.set(2, "token3FeatureStringArray3");
+		annotation3.setFeatureStringArray(stringArray3);
+		annotation3.addToIndexes();		
+		
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("featureStringArray");
+		
+		
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", featureNames, " ", null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStringArray1 token1FeatureStringArray2 token1FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStringArray1 token2FeatureStringArray2 token2FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStringArray1 token3FeatureStringArray2 token3FeatureStringArray3", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	}
+  
+  @Test
+	public void testCreateFeatureStructureTokens() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token1Feature1");
+		FeatureStructure2 featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token1Feature3Feature1");
+		featureStructure1.setFeature3(featureStructure2);
+		annotation1.setFeatureStructure1(featureStructure1);
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token2Feature1");
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token2Feature3Feature1");
+		featureStructure1.setFeature3(featureStructure2);
+		annotation2.setFeatureStructure1(featureStructure1);		
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token3Feature1");
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token3Feature3Feature1");
+		featureStructure1.setFeature3(featureStructure2);		
+		annotation3.setFeatureStructure1(featureStructure1);		
+		annotation3.addToIndexes();
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("feature1");
+		
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureStructure1", featureNames, null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+		
+		annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureStructure1.feature3", featureNames, null);
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1Feature3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2Feature3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3Feature3Feature1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());		
+	}
+  
+  @Test
+	public void testCreateArrayFeatureStructuresWithDelimterTokens() throws Exception{
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		
+		FSArray featureStructure1Array = new FSArray(cas, 3);
+		FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token1FeatureStructures1Feature10");
+		featureStructure1.setFeature2("token1FeatureStructures1Feature20");
+	
+		featureStructure1Array.set(0, featureStructure1);
+	
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token1FeatureStructures1Feature11");
+		featureStructure1.setFeature2("token1FeatureStructures1Feature21");
+		
+		featureStructure1Array.set(1, featureStructure1);
+	
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token1FeatureStructures1Feature12");
+		featureStructure1.setFeature2("token1FeatureStructures1Feature22");
+		
+		featureStructure1Array.set(2, featureStructure1);
+		
+		annotation1.setFeatureStructures1(featureStructure1Array);
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+	
+		featureStructure1Array = new FSArray(cas, 3);
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token2FeatureStructures1Feature10");
+		featureStructure1.setFeature2("token2FeatureStructures1Feature20");
+				
+		featureStructure1Array.set(0, featureStructure1);
+	
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token2FeatureStructures1Feature11");
+		featureStructure1.setFeature2("token2FeatureStructures1Feature21");
+		
+		featureStructure1Array.set(1, featureStructure1);
+	
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token2FeatureStructures1Feature12");
+		featureStructure1.setFeature2("token2FeatureStructures1Feature22");		
+		
+		featureStructure1Array.set(2, featureStructure1);
+		
+		annotation2.setFeatureStructures1(featureStructure1Array);
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		
+		featureStructure1Array = new FSArray(cas, 3);
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token3FeatureStructures1Feature10");
+		featureStructure1.setFeature2("token3FeatureStructures1Feature20");
+		
+		featureStructure1Array.set(0, featureStructure1);
+	
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token3FeatureStructures1Feature11");
+		featureStructure1.setFeature2("token3FeatureStructures1Feature21");
+		
+		featureStructure1Array.set(1, featureStructure1);
+	
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token3FeatureStructures1Feature12");
+		featureStructure1.setFeature2("token3FeatureStructures1Feature22");
+		
+		featureStructure1Array.set(2, featureStructure1);
+		
+		annotation3.setFeatureStructures1(featureStructure1Array);
+		annotation3.addToIndexes();
+	
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("feature1");
+		featureNames.add("feature2");
+	
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureStructures1", featureNames, ", ", null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature10, token1FeatureStructures1Feature20", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature11, token1FeatureStructures1Feature21", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature12, token1FeatureStructures1Feature22", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature10, token2FeatureStructures1Feature20", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature11, token2FeatureStructures1Feature21", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature12, token2FeatureStructures1Feature22", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature10, token3FeatureStructures1Feature20", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature11, token3FeatureStructures1Feature21", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature12, token3FeatureStructures1Feature22", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());		
+	}
+
+//	public void testCreateArrayFeatureStructuresWithoutDelimterTokens() throws Exception{
+//		JCas cas = createCasWithText("token1 token2 token3");
+//		Annotation1 annotation1 = new Annotation1(cas);
+//		annotation1.setBegin(0);
+//		annotation1.setEnd(6);
+//		
+//		FSArray featureStructure1Array = new FSArray(cas, 3);
+//		FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token1FeatureStructures1Feature10");
+//		featureStructure1.setFeature2("token1FeatureStructures1Feature20");
+//	
+//		featureStructure1Array.set(0, featureStructure1);
+//	
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token1FeatureStructures1Feature11");
+//		featureStructure1.setFeature2("token1FeatureStructures1Feature21");
+//		
+//		featureStructure1Array.set(1, featureStructure1);
+//	
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token1FeatureStructures1Feature12");
+//		featureStructure1.setFeature2("token1FeatureStructures1Feature22");
+//		
+//		featureStructure1Array.set(2, featureStructure1);
+//		
+//		annotation1.setFeatureStructures1(featureStructure1Array);
+//		annotation1.addToIndexes();
+//		
+//		Annotation1 annotation2 = new Annotation1(cas);
+//		annotation2.setBegin(7);
+//		annotation2.setEnd(13);
+//	
+//		featureStructure1Array = new FSArray(cas, 3);
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token2FeatureStructures1Feature10");
+//		featureStructure1.setFeature2("token2FeatureStructures1Feature20");
+//				
+//		featureStructure1Array.set(0, featureStructure1);
+//	
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token2FeatureStructures1Feature11");
+//		featureStructure1.setFeature2("token2FeatureStructures1Feature21");
+//		
+//		featureStructure1Array.set(1, featureStructure1);
+//	
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token2FeatureStructures1Feature12");
+//		featureStructure1.setFeature2("token2FeatureStructures1Feature22");		
+//		
+//		featureStructure1Array.set(2, featureStructure1);
+//		
+//		annotation2.setFeatureStructures1(featureStructure1Array);
+//		annotation2.addToIndexes();
+//		
+//		Annotation1 annotation3 = new Annotation1(cas);
+//		annotation3.setBegin(14);
+//		annotation3.setEnd(20);
+//		
+//		featureStructure1Array = new FSArray(cas, 3);
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token3FeatureStructures1Feature10");
+//		featureStructure1.setFeature2("token3FeatureStructures1Feature20");
+//		
+//		featureStructure1Array.set(0, featureStructure1);
+//	
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token3FeatureStructures1Feature11");
+//		featureStructure1.setFeature2("token3FeatureStructures1Feature21");
+//		
+//		featureStructure1Array.set(1, featureStructure1);
+//	
+//		featureStructure1 = new FeatureStructure1(cas);
+//		featureStructure1.setFeature1("token3FeatureStructures1Feature12");
+//		featureStructure1.setFeature2("token3FeatureStructures1Feature22");
+//		
+//		featureStructure1Array.set(2, featureStructure1);
+//		
+//		annotation3.setFeatureStructures1(featureStructure1Array);
+//		annotation3.addToIndexes();
+//	
+//		List<String> featureNames = new ArrayList<String>();
+//		featureNames.add("feature1");
+//		featureNames.add("feature2");
+//	
+//
+//		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, "org.apache.uima.indexer.types.test.Annotation1", "featureStructures1", featureNames, null);
+//		Token nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token1FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(0, nextToken.startOffset());
+//		assertEquals(6, nextToken.endOffset());
+//	
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token1FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(0, nextToken.startOffset());
+//		assertEquals(6, nextToken.endOffset());
+//		
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token1FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(0, nextToken.startOffset());
+//		assertEquals(6, nextToken.endOffset());
+//		
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token2FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(7, nextToken.startOffset());
+//		assertEquals(13, nextToken.endOffset());
+//	
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token2FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(7, nextToken.startOffset());
+//		assertEquals(13, nextToken.endOffset());
+//	
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token2FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(7, nextToken.startOffset());
+//		assertEquals(13, nextToken.endOffset());
+//		
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token3FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(14, nextToken.startOffset());
+//		assertEquals(20, nextToken.endOffset());
+//	
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token3FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(14, nextToken.startOffset());
+//		assertEquals(20, nextToken.endOffset());
+//	
+//		nextToken = annotationTokenStream.next();
+//		assertNotNull(nextToken);
+//		assertEquals("token3FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+//		assertEquals(14, nextToken.startOffset());
+//		assertEquals(20, nextToken.endOffset());
+//	}
+
+  
+  @Test
+	public void testCreateArrayFeatureStructuresWithSinleFeature() throws Exception{
+			JCas cas = createCasWithText("token1 token2 token3");
+			Annotation1 annotation1 = new Annotation1(cas);
+			annotation1.setBegin(0);
+			annotation1.setEnd(6);
+			
+			FSArray featureStructure1Array = new FSArray(cas, 3);
+			
+			FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token1FeatureStructures1Feature10");
+			featureStructure1Array.set(0, featureStructure1);
+			
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token1FeatureStructures1Feature11");			
+			featureStructure1Array.set(1, featureStructure1);
+
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token1FeatureStructures1Feature12");					
+			featureStructure1Array.set(2, featureStructure1);
+			
+			annotation1.setFeatureStructures1(featureStructure1Array);
+			annotation1.addToIndexes();
+			
+			Annotation1 annotation2 = new Annotation1(cas);
+			annotation2.setBegin(7);
+			annotation2.setEnd(13);
+
+			featureStructure1Array = new FSArray(cas, 3);
+
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token2FeatureStructures1Feature10");			
+			featureStructure1Array.set(0, featureStructure1);
+
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token2FeatureStructures1Feature11");			
+			featureStructure1Array.set(1, featureStructure1);
+
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token2FeatureStructures1Feature12");
+			featureStructure1Array.set(2, featureStructure1);
+			
+			annotation2.setFeatureStructures1(featureStructure1Array);
+			annotation2.addToIndexes();
+			
+			Annotation1 annotation3 = new Annotation1(cas);
+			annotation3.setBegin(14);
+			annotation3.setEnd(20);
+			
+			featureStructure1Array = new FSArray(cas, 3);
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token3FeatureStructures1Feature10");
+			featureStructure1Array.set(0, featureStructure1);
+
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token3FeatureStructures1Feature11");
+			featureStructure1Array.set(1, featureStructure1);
+
+			featureStructure1 = new FeatureStructure1(cas);
+			featureStructure1.setFeature1("token3FeatureStructures1Feature12");
+			featureStructure1Array.set(2, featureStructure1);
+			
+			annotation3.setFeatureStructures1(featureStructure1Array);
+			annotation3.addToIndexes();
+
+			List<String> featureNames = new ArrayList<String>();
+			featureNames.add("feature1");
+					
+			AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureStructures1", featureNames, null);
+			Token nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token1FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(0, nextToken.startOffset());
+			assertEquals(6, nextToken.endOffset());
+
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token1FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(0, nextToken.startOffset());
+			assertEquals(6, nextToken.endOffset());
+			
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token1FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(0, nextToken.startOffset());
+			assertEquals(6, nextToken.endOffset());
+			
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token2FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(7, nextToken.startOffset());
+			assertEquals(13, nextToken.endOffset());
+
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token2FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(7, nextToken.startOffset());
+			assertEquals(13, nextToken.endOffset());
+
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token2FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(7, nextToken.startOffset());
+			assertEquals(13, nextToken.endOffset());
+			
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token3FeatureStructures1Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(14, nextToken.startOffset());
+			assertEquals(20, nextToken.endOffset());
+
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token3FeatureStructures1Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(14, nextToken.startOffset());
+			assertEquals(20, nextToken.endOffset());
+
+			nextToken = annotationTokenStream.next();
+			assertNotNull(nextToken);
+			assertEquals("token3FeatureStructures1Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+			assertEquals(14, nextToken.startOffset());
+			assertEquals(20, nextToken.endOffset());		
+	}
+  
+  @Test
+	public void testCreateArrayFeatureWithFeaturePath() throws Exception{		
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+		
+		FSArray featureStructure1Array = new FSArray(cas, 3);
+		FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
+
+		FeatureStructure2 featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token1FeatureStructures1Feature3Feature10");
+	
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(0, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+		
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token1FeatureStructures1Feature3Feature11");
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(1, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+		
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token1FeatureStructures1Feature3Feature12");
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(2, featureStructure1);
+		
+		annotation1.setFeatureStructures1(featureStructure1Array);
+		annotation1.addToIndexes();
+		
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+
+		featureStructure1Array = new FSArray(cas, 3);
+		featureStructure1 = new FeatureStructure1(cas);
+	
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token2FeatureStructures1Feature3Feature10");
+		
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(0, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+		
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token2FeatureStructures1Feature3Feature11");
+		
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(1, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+		
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token2FeatureStructures1Feature3Feature12");
+		
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(2, featureStructure1);
+		
+		annotation2.setFeatureStructures1(featureStructure1Array);
+		annotation2.addToIndexes();
+		
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+		
+		featureStructure1Array = new FSArray(cas, 3);
+		featureStructure1 = new FeatureStructure1(cas);
+		
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token3FeatureStructures1Feature3Feature10");
+		
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(0, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+		
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token3FeatureStructures1Feature3Feature11");
+				
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(1, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token3FeatureStructures1Feature12");
+		featureStructure1.setFeature2("token3FeatureStructures1Feature22");
+			
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token3FeatureStructures1Feature3Feature12");
+		
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(2, featureStructure1);
+		
+		annotation3.setFeatureStructures1(featureStructure1Array);
+		annotation3.addToIndexes();
+
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("feature1");
+				
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureStructures1.feature3", featureNames, null);
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+		
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature10", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature11", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature12", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+	}
+  
+  @Test
+	public void testCreateArrayFeaturesWithFeaturePathAndStringArray() throws Exception{
+
+		JCas cas = createCasWithText("token1 token2 token3");
+		Annotation1 annotation1 = new Annotation1(cas);
+		annotation1.setBegin(0);
+		annotation1.setEnd(6);
+
+		FSArray featureStructure1Array = new FSArray(cas, 3);
+		FeatureStructure1 featureStructure1 = new FeatureStructure1(cas);
+		featureStructure1.setFeature1("token1FeatureStructures1Feature10");
+		featureStructure1.setFeature2("token1FeatureStructures1Feature20");
+		StringArray stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token1FeatureStructures1Feature3Feature3_0_0");
+		stringArray1.set(1, "token1FeatureStructures1Feature3Feature3_0_1");
+		stringArray1.set(2, "token1FeatureStructures1Feature3Feature3_0_2");
+
+		FeatureStructure2 featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature1("token1FeatureStructures1Feature3Feature10");
+		featureStructure2.setFeature3(stringArray1);		
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(0, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token1FeatureStructures1Feature3Feature3_1_0");
+		stringArray1.set(1, "token1FeatureStructures1Feature3Feature3_1_1");
+		stringArray1.set(2, "token1FeatureStructures1Feature3Feature3_1_2");
+
+		featureStructure2 = new FeatureStructure2(cas);
+
+		featureStructure2.setFeature3(stringArray1);
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(1, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token1FeatureStructures1Feature3Feature3_2_0");
+		stringArray1.set(1, "token1FeatureStructures1Feature3Feature3_2_1");
+		stringArray1.set(2, "token1FeatureStructures1Feature3Feature3_2_2");
+		featureStructure2 = new FeatureStructure2(cas);
+
+		featureStructure2.setFeature3(stringArray1);
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(2, featureStructure1);
+
+		annotation1.setFeatureStructures1(featureStructure1Array);
+		annotation1.addToIndexes();
+
+		Annotation1 annotation2 = new Annotation1(cas);
+		annotation2.setBegin(7);
+		annotation2.setEnd(13);
+
+		featureStructure1Array = new FSArray(cas, 3);
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token2FeatureStructures1Feature3Feature3_0_0");
+		stringArray1.set(1, "token2FeatureStructures1Feature3Feature3_0_1");
+		stringArray1.set(2, "token2FeatureStructures1Feature3Feature3_0_2");
+
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature3(stringArray1);
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(0, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token2FeatureStructures1Feature3Feature3_1_0");
+		stringArray1.set(1, "token2FeatureStructures1Feature3Feature3_1_1");
+		stringArray1.set(2, "token2FeatureStructures1Feature3Feature3_1_2");
+
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature3(stringArray1);
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(1, featureStructure1);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token2FeatureStructures1Feature3Feature3_2_0");
+		stringArray1.set(1, "token2FeatureStructures1Feature3Feature3_2_1");
+		stringArray1.set(2, "token2FeatureStructures1Feature3Feature3_2_2");
+
+		featureStructure1 = new FeatureStructure1(cas);
+
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature3(stringArray1);
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(2, featureStructure1);
+
+		annotation2.setFeatureStructures1(featureStructure1Array);
+		annotation2.addToIndexes();
+
+		Annotation1 annotation3 = new Annotation1(cas);
+		annotation3.setBegin(14);
+		annotation3.setEnd(20);
+
+		featureStructure1Array = new FSArray(cas, 3);
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token3FeatureStructures1Feature3Feature3_0_0");
+		stringArray1.set(1, "token3FeatureStructures1Feature3Feature3_0_1");
+		stringArray1.set(2, "token3FeatureStructures1Feature3Feature3_0_2");
+
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature3(stringArray1);
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(0, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token3FeatureStructures1Feature3Feature3_1_0");
+		stringArray1.set(1, "token3FeatureStructures1Feature3Feature3_1_1");
+		stringArray1.set(2, "token3FeatureStructures1Feature3Feature3_1_2");		
+
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature3(stringArray1);
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(1, featureStructure1);
+
+		featureStructure1 = new FeatureStructure1(cas);
+
+		stringArray1 = new StringArray(cas, 3);
+		stringArray1.set(0, "token3FeatureStructures1Feature3Feature3_2_0");
+		stringArray1.set(1, "token3FeatureStructures1Feature3Feature3_2_1");
+		stringArray1.set(2, "token3FeatureStructures1Feature3Feature3_2_2");		
+
+		featureStructure2 = new FeatureStructure2(cas);
+		featureStructure2.setFeature3(stringArray1);
+
+		featureStructure1.setFeature3(featureStructure2);
+		featureStructure1Array.set(2, featureStructure1);
+
+		annotation3.setFeatureStructures1(featureStructure1Array);
+		annotation3.addToIndexes();
+
+		List<String> featureNames = new ArrayList<String>();
+		featureNames.add("feature3");
+
+		AnnotationTokenStream annotationTokenStream = new AnnotationTokenStream(cas, CAS.NAME_DEFAULT_SOFA, "org.apache.uima.indexer.types.test.Annotation1", "featureStructures1.feature3", featureNames, null);
+
+		Token nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_0_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_0_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_0_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_1_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_1_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_1_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_2_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_2_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token1FeatureStructures1Feature3Feature3_2_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(0, nextToken.startOffset());
+		assertEquals(6, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_0_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_0_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_0_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_1_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_1_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_1_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_2_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_2_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token2FeatureStructures1Feature3Feature3_2_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(7, nextToken.startOffset());
+		assertEquals(13, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_0_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_0_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_0_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_1_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_1_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_1_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_2_0", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_2_1", new String(nextToken.termBuffer(), 0, nextToken.termLength()));
+		assertEquals(14, nextToken.startOffset());
+		assertEquals(20, nextToken.endOffset());
+
+		nextToken = annotationTokenStream.next();
+		assertNotNull(nextToken);
+		assertEquals("token3FeatureStructures1Feature3Feature3_2_2", new String(nextToken.termBuffer(), 0, nextToken.termLength()));

[... 752 lines stripped ...]