<!--
    ***************************************************************
    * 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.
    ***************************************************************
   -->
<html>
<head>
  <title>Apache UIMA C++ v3.0.0 Release Notes</title>
</head>
<body>
<h1>Apache UIMA C++ (Unstructured Information Management Architecture C++) v3.0.0 Release Notes</h1>

<h2>Contents</h2>
<p>
<a href="#what.is.uima">What is UIMA?</a><br/>
<a href="#major.changes">Major Changes in this Release</a><br/>
<a href="#get.involved">How to Get Involved</a><br/>
<a href="#report.issues">How to Report Issues</a><br/>
<a href="#list.issues">List of JIRA Issues Fixed in this Release</a><br/>
</p>  
        
<h2><a id="what.is.uima">What is UIMA?</a></h2>

     <p>
  			Unstructured Information Management applications are
				software systems that analyze large volumes of
				unstructured information in order to discover knowledge
				that is relevant to an end user. UIMA is a framework and
				SDK for developing such applications. An example UIM
				application might ingest plain text and identify
				entities, such as persons, places, organizations; or
				relations, such as works-for or located-at. UIMA enables
				such an application to be decomposed into components,
				for example "language identification" -&gt; "language
				specific segmentation" -&gt; "sentence boundary
				detection" -&gt; "entity detection (person/place names
				etc.)". Each component must implement interfaces defined
				by the framework and must provide self-describing
				metadata via XML descriptor files. The framework manages
				these components and the data flow between them.
				Components are written in Java or C++; the data that
				flows between components is designed for efficient
				mapping between these languages. UIMA additionally
				provides capabilities to wrap components as network
				services, and can scale to very large volumes by
				replicating processing pipelines over a cluster of
				networked nodes.
			</p>
      <p>
				Apache UIMA is an Apache-licensed open source
				implementation of the UIMA specification (that
				specification is, in turn, being developed concurrently
				by a technical committee within
				<a href="http://www.oasis-open.org">OASIS</a>,
				a standards organization). We invite and encourage you
				to participate in both the implementation and
				specification efforts.
			</p>
      <p>
				UIMA is a component framework for analysing unstructured
				content such as text, audio and video. It comprises an
				SDK and tooling for composing and running analytic
				components written in Java and C++, with some support
				for Perl, Python and TCL.
			</p>

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

<p>Version 3.0.0 is a major update to 2.4.0.
</p>

<p>Specific changes in release 3.0.0 versus 2.4.0 include</p>
<ul>
  <li>Migrated to Git from SVN</li>
  <li>Extensive code changes to make uimacpp source compatible with modern compilers</li>
  <li>Updated all 3rd party dependencies to latest or near latest versions</li>
  <li>Temporarily dropped Windows binary distribution to get new code out as soon as possible</li>
  <li>Did not get Pythonnator working with Python V3</li>
  <li>Did not get Perltator working at all</li>
</ul>
 
<h3>API changes</h3>

 <p>None this release.
 </p>
 

<h2><a id="list.issues">Full list of JIRA Issues affecting this Release</a></h2>

<!-- Jira report copied from Jira web page, e.g. https://issues.apache.org/jira/projects/UIMA/versions/12346908 -->
            
<h3>        Bug
</h3>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-4899'>UIMA-4899</a>] -         UIMACPP access violation in destroyJNI()
</li>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-5236'>UIMA-5236</a>] -         Can not compile UIMA C++ examples in Mac OS X
</li>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-6140'>UIMA-6140</a>] -         Update of UIMA C++ to run with modern compilers
</li>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-6172'>UIMA-6172</a>] -         Eliminate errors/warnings resulting from UIMA-6140: &quot;Update of UIMA C++ to run with modern compilers&quot;
</li>
</ul>
                
<h3>        Improvement
</h3>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-2311'>UIMA-2311</a>] -         wrong or no svn:eol-style set on many files in uimacpp
</li>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-5235'>UIMA-5235</a>] -         Update UIMAC++ build Mac OSX instructions
</li>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-6173'>UIMA-6173</a>] -         Make it easier to test UIMA C++ interoperability with UIMA-AS
</li>
</ul>
            
<h3>        Task
</h3>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/UIMA-6175'>UIMA-6175</a>] -         Changes needed for UIMA C++ release 3.0.0
</li>
</ul>
                                                                                                           
<!-- end of Jira report -->

<p>Please use the mailing lists 
( http://uima.apache.org/mail-lists.html ) 
for feedback.</p> 
 
<h2><a id="get.involved">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 id="report.issues">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>
  
    
</body>
</html>
