<?xml version="1.0" encoding="UTF-8"?>
  <!--
   ***************************************************************
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
         *
   *   http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   ***************************************************************
   -->
<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
  <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
  <primitive>true</primitive>
  <annotatorImplementationName>org.apache.uima.ae.multiplier.SimpleCasGenerator</annotatorImplementationName>
  <analysisEngineMetaData>
    <name>Simple Text Segmenter</name>
    <description>Generates specified number of CASes.</description>
    <version>1.0</version>
    <vendor>The Apache Software Foundation</vendor>
    <configurationParameters>
      <configurationParameter>
        <name>NumberToGenerate</name>
        <description>Approximate number of CASes to create.</description>
        <type>Integer</type>
        <multiValued>false</multiValued>
        <mandatory>true</mandatory>
      </configurationParameter>
      
      
      <configurationParameter>
        <name>StringOne</name>
        <description>document text</description>
        <type>String</type>
        <multiValued>false</multiValued>
        <mandatory>true</mandatory>
      </configurationParameter>
      <configurationParameter>
        <name>StringTwo</name>
        <description>document text</description>
        <type>String</type>
        <multiValued>false</multiValued>
        <mandatory>true</mandatory>
      </configurationParameter>
    
    
      <configurationParameter>
        <name>InputFile</name>
        <description>document text</description>
        <type>String</type>
        <multiValued>false</multiValued>
        <mandatory>true</mandatory>
      </configurationParameter>
    
    
    
    
    </configurationParameters>
    <configurationParameterSettings>
      <nameValuePair>
        <name>NumberToGenerate</name>
        <value>
          <integer>10</integer>
        </value>
      </nameValuePair>
      <nameValuePair>
        <name>StringOne</name>
        <value>
          <string>Upcoming UIMA Seminars      April 7, 2004 Distillery Lunch Seminar   UIMA and its Metadata   12:00PM-1:00PM in HAW GN-K35.       Dave Ferrucci will give a UIMA overview and discuss the types of component metadata that UIMA components provide.  Jon Lenchner will give a demo of the Text Analysis Engine configurator tool.         April 16, 2004 KM &amp; I Department Tea    Title: An Eclipse-based TAE Configurator Tool   3:00PM-4:30PM in HAW GN-K35 .      Jon Lenchner will demo an Eclipse plugin for configuring TAE descriptors, which will be available soon for you to use.  No more editing XML descriptors by hand!         May 11, 2004 UIMA Tutorial    9:00AM-5:00PM in HAW GN-K35.      This is a full-day, hands-on tutorial on UIMA, covering the development of Text Analysis Engines and Collection Processing Engines, as well as how to include these components in your own applications.   </string>
        </value>
      </nameValuePair>
      <nameValuePair>
        <name>StringTwo</name>
        <value>
          <string>UIMA Summer School      August 26, 2003   UIMA 101 - The New UIMA Introduction    (Hands-on Tutorial)   9:00AM-5:00PM in HAW GN-K35      August 28, 2003   FROST Tutorial   9:00AM-5:00PM in HAW GN-K35      September 15, 2003   UIMA 201: UIMA Advanced Topics    (Hands-on Tutorial)   9:00AM-5:00PM in HAW 1S-F53      September 17, 2003   The UIMA System Integration Test and Hardening Service   The "SITH"   3:00PM-4:30PM in HAW GN-K35            UIMA Summer School Tutorial and Presentation Details   UIMA 101: The new UIMA tutorial     Tuesday August 26 9:00AM - 4:30PM in GN-K35      UIMA 101 is a hands-on programming tutorial.      UIMA 101 is intended for people who want a first introductory course to UIMA or for people who would like a refresher.      The tutorial covers the same concepts in the first UIMA tutorial given in 3Q 2002 except for some key updates:      1) It uses a new interface to the CAS that makes it more natural to access and update CAS feature structures using ordinary Java objects (i.e., the JCAS) and   2) It uses updated TAE interfaces that give the application developer more control over managing multiple CASs.       Please NOTE expert users of UIMA can skip this one and should consider attending the Advanced Topics tutorial.      Prerequisites for the UIMA 101 Tutorial   1) Java Programming   2) Some experience with Eclipse IDE helpful      FROST Tutorial   August 28  9:00AM - 5:00PM  in GN-K35      Visitors from the FROST team will be here to talk to us about FROST.      UIMA 201: The UIMA Advanced Topics Tutorial   September 15:   9:00AM - 5:30PM in Hawthorne 1S-F53      UIMA 201 will introduce some new UIMA concepts and walk the student through hands-on examples.      The advanced topics tutorial is designed for people who have some experience with UIMA and want    to use new capabilities of UIMA 1.0 to address one or more of the following    Advanced Topics:      1) Collection Processing and Collection Processing Engines (CPEs)   2) Multi-Threading and CAS Pooling   3) Using the UIMA adapter framework to integrate network TAEs with Java TAEs   4) A Semantic Search Application that brings it all together	      Prerequisites for UIMA 201   1) UIMA 101 Tutorial OR Extensive UIMA Experience      The UIMA Integration Test bed Service (The "SITH")   September 17 3:00PM - 4:30PM in HAW GN-K35      We have developed the first version of the UIMA Integration Test bed service.      This service is being developed to help test, evaluate, certify and publish UIMA compliant components.      In this talk we will explain the service and what it is intended to provide the UIMA community. We will address the following topics:      1. SITH Services   2. How to submit components and what to expect in return   3. Overview of the test bed implementation using Collection Processing UIMA and Juru.    4. Next Steps for the SITH         </string>
        </value>
      </nameValuePair>
    
      <nameValuePair>
        <name>InputFile</name>
        <value>
        <string>data/IBM_LifeSciences.xml</string>
          <!-- <string>c:/new-nt.xml</string>  -->
        </value>
      </nameValuePair>
    
    </configurationParameterSettings>
    <typeSystemDescription>
      <imports>
        <import name="org.apache.uima.examples.SourceDocumentInformation"/>
      </imports>
    </typeSystemDescription>
    <capabilities>
      <capability>
        <inputs/>
        <outputs/>
        <languagesSupported/>
      </capability>
    </capabilities>
    <operationalProperties>
      <modifiesCas>false</modifiesCas>
      <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
      <outputsNewCASes>true</outputsNewCASes>
    </operationalProperties>
  </analysisEngineMetaData>
</analysisEngineDescription>

