<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>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>