<html>
<!--
***************************************************************
* 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.
***************************************************************
-->
<head>
    <title>Apache UIMA Addons v2.3.1 Release Notes</title>
</head>
<body>
<h1>Apache UIMA Addons v2.3.1 Release Notes</h1>

<h2>Contents</h2>

<p>
    <a href="#what.is.uima-addons">1. What is the UIMA-Addons package?</a><br/>
    <a href="#major.changes">2. Major Changes in this Release</a><br/>
    <a href="#get.involved">3. How to Get Involved</a><br/>
    <a href="#report.issues">4. How to Report Issues</a><br/>
    <a href="#list.issues">5. List of JIRA Issues Fixed in this Release</a>
</p>

<h2><a name="what.is.uima-addons">1. What is the UIMA-Addons package?</a></h2>

<p>
    The Apache UIMA addons package is a collection of additional components for the base UIMA release.
    The add-on package contains annotator components developed for Apache UIMA. The
    add-on package fits the Apache UIMA directory structure and adds a directory
    called "addons lib" that contains the following annotator components:
<ul>
    <li>DictionaryAnnotator</li>
    <li>RegularExpressionAnnotator</li>
    <li>Tagger</li>
    <li>WhitespaceTokenizer</li>
    <li>Bean Scripting Framework (BSF) BSFAnnotator</li>
    <li>ConceptMapper</li>
    <li>ConfigurableFeatureExtractor</li>
    <li>Lucas</li>
    <li>OpenCalaisAnnotator</li>
    <li>SnowballAnnotator</li>
    <li>TikaAnnotator</li>
    <li>AlchemyAPIAnnotator</li>
    <li>Solrcas</li>
</ul>

Additionally the package contains some components to package annotators
and for accessing annotators as simple REST service. These are:
<ul>
    <li>PearPackagingAntTask</li>
    <li>SimpleServer</li>
</ul>

There is an addon to the base UIMA:
<ul>
    <li>FsVariables</li>
</ul>

<p>Each component has a separate LICENSE and NOTICE files; some also
have Readme and other documentation (in docs/). Documentation
is also available on the UIMA website, in the Sandbox area.
</p>

<h2><a name="major.changes">2. Major Changes in this Release</a></h2>

<p>
    The following components were added in this release:
<ul>
    <li>AlchemyAPI Annotator - is an annotator wrapping alchemyapi.com services providing named entity extraction,
        keyword/concept tagging, etc.
    </li>
    <li>Solrcas - is a CAS Consumer component that can store CAS objects into an Apache Solr instance</li>
</ul>

The following are the main changes to existing components:
<ul>
    <li>TikaAnnotator - now using Apache Tika 0.7 instead of 0.4, language extracted by Tika goes inside CAS
        documentLanguage
    </li>
    <li>Lucas - now using Apache Lucene 2.9.3</li>
    <li>Tagger - added an AnalysisEngine to train HMM Tagger models</li>
    <li>OpenCalaisAnnotator - fixed negative begin/end values bug</li>
    <li>Generally fixed URI/space handling</li>
</ul>

</p>

<h2><a name="get.involved">3. How to Get Involved</a></h2>

<p>
    The Apache UIMA project really needs and appreciates any contributions,
    including documentation help, source code and feedback. If you are interested
    in contributing, please visit
    <a href="http://uima.apache.org/get-involved.html">
        http://uima.apache.org/get-involved.html</a>.
</p>

<h2><a name="report.issues">4. How to Report Issues</a></h2>

<p>
    The Apache UIMA project uses JIRA for issue tracking. Please report any
    issues you find at
    <a href="http://issues.apache.org/jira/browse/uima">http://issues.apache.org/jira/browse/uima</a>
</p>

<h2><a name="list.issues">5. List of JIRA Issues Fixed in this Release</a></h2>

Click <a href="issuesFixed/jira-report.html">issuesFixed/jira-report.hmtl</a> or <a
        href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&jqlQuery=project+%3D+UIMA+AND+resolution+%3D+Fixed+AND+fixVersion+%3D+12316093+AND+status+in+%28Closed%2C+Resolved%29+ORDER+BY+issuetype+ASC%2C+key+ASC%2C+status+ASC">
    Jira</a> for the list of issues fixed in this release.

</body>
</html>
