<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 Ruta v2.7.0 Release Notes</title>
</head>
<body>
<h1>Apache UIMA Ruta&#8482; v2.7.0 Release Notes</h1>

<h2>Contents</h2>
<p>
<a href="#what.is.uima-ruta">1. What is UIMA Ruta</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-ruta">1. What is UIMA Ruta?</a></h2>

     <p>
  			Apache UIMA Ruta&#8482; is a rule-based script language supported by Eclipse-based tooling.
      The language is designed to enable rapid development of text processing applications within Apache UIMA&#8482;. 
      A special focus lies on the intuitive and flexible domain specific language for defining 
      patterns of annotations. The Eclipse-based tooling for Ruta, called the Ruta Workbench,
      was created to support the user and to facilitate every step when writing Ruta rules. Both the 
      Ruta rule language and the Ruta Workbench integrate smoothly with Apache UIMA.
			</p>

<h2><a name="major.changes">2. Major Changes in this Release</a></h2>
<p>
  <p>UIMA Ruta Language and Analysis Engine:</p>
  <ul>
  	<li>Requires Java 8</li>
    <li>New language feature: label expressions at actions for directly assigning/reusing newly created annotations. Example: Document{-> a:T1, CREATE(T2, "ref" = a)};</li>
    <li>New language feature: new type of rule element for completely optional match which does not require an existing annotation and therefore also works at the boundary of a window/document. Example: NUM _{-PARTOF(CW)};</li>
    <li>Type lists can be used as matching condition.</li>
    <li>Initial default value of string and annotations variables is now null.</li>
    <li>Comparison of annotation and annotation list are now supported.</li>
    <li>New configuration parameter 'inferenceVisitors'.</li>
    <li>New configuration parameter 'maxRuleMatches'.</li>
    <li>New configuration parameter 'maxRuleElementMatches'.</li>
    <li>New configuration parameter 'rulesScriptName'.</li>
    <li>Inlined rules as condition are only evaluated if the rule element match was successful.</li>
    <li>Multiple inlined rule blocks are allowed at one rule element.</li>
    <li>String features with allowed values are supported.</li>
    <li>PlainTextAnnotator supports vertical tabs.</li>
    <li>Various improvements for WORDTABLE.</li>
    <li>Thrown exceptions include script name.</li>
    <li>Fixed values of label for failed matches.</li>
    <li>Fixed inlined rules as condition at wildcards.</li>
    <li>Fixed resetting of annotation-based variables.</li>
    <li>Fixed various bugs of wildcards.</li>
    <li>Fixed CONTAINS condition for annotations overlapping the window.</li>
    <li>Fixed COUNT condition.</li>
    <li>Fixed setting variables by configuration parameter.</li>
  </ul>
  <p>UIMA Ruta Workbench:</p>
  <ul>
  	<li>Query View support more CAS formats.</li>
    <li>Fixed order of scripts in Applied Rules view.</li>
    <li>Fixed reporting of non-existing problems in editor.</li>
  </ul>
</p>
 
  
<h2><a name="get.involved">3. How to Get Involved</a></h2>
<p>
The Apache UIMA Ruta 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.html</a> for the list of 
issues fixed in this release.

</body>
</html>