<!--
	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.
-->
<chapter id="ugr.tools.uimafit.migration">
  <title>Migration Guide</title>
  <para>This section provides helpful information on incompatible changes between versions.</para>
  <section>
    <title>Version 2.x to 3.x</title>
    <formalpara>
      <title>Legacy support module removed</title>
      <para>The legacy support in uimaFIT 2.x was present allow being compatible with the
      pre-Apache uimaFIT versions which were based on UIMA 2.x. Since uimaFIT 3.x is not 
      compatible with UIMA 2.x anyway, the legacy module was removed now.</para>
    </formalpara>
    <formalpara>
      <title>Using List instead of Collection</title>
      <para>The <literal>CasUtil</literal>, <literal>JCasUtil</literal> and 
      <literal>FSCollectionFactory</literal> classes were adjusted to return results
      using <literal>List</literal> instead of the more general <literal>Collection</literal>. 
      Often, lists are already used internally and then again wrapped into new lists in client 
      code. This API change avoids this in the future.</para>
    </formalpara>
    <formalpara>
      <title>Throwing specific exceptions instead of UIMAException</title>
      <para>Several uimaFIT methods were throwing the generic <literal>UIMAException</literal>. 
      These have been adjusted to declare throwing several of the sub-types of 
      <literal>UIMAException</literal> to be better able to handle
      specific causes of errors in client code.</para>
    </formalpara>
    <formalpara>
      <title>CasUtil.selectSingle signature changed</title>
      <para>Signature of <literal>CasUtil.selectSingle</literal> has been changed to return
      <literal>AnnotationFS</literal>. The original signature is available as 
      <literal>selectSingleFS</literal></para>
    </formalpara>
    <formalpara>
      <title>Removal of deprecated methods</title>
      <para>Various methods that were deprecated in uimaFIT 2.4.0 or earlier have been removed in
      this release. For details, please refer to the <literal>api-change-report.html</literal>
      file included in the release.</para>
    </formalpara>
    <formalpara>
      <title>Changes to ExternalResourceFactory</title>
      <para>Most methods in the <literal>ExternalResourceFactory</literal> have seen changes to 
      their names and signature to avoid problematic ambiguities as well as to be shorter. In 
      general, the <literal>External</literal> component of the method names was either
      removed or replaced. So most methods called <literal>createExternalResourceDescription</literal>
      are now called <literal>createResourceDescription</literal>. However, some have also been 
      given a more specific name and/or a slightly different order of parameters. For example, this
      method</para>
      <programlisting>public static ExternalResourceDescription createExternalResourceDescription(
  Class&lt;? extends SharedResourceObject&gt; aInterface, String aUrl, Object... aParams)</programlisting>
      <para>was changed to</para>
      <programlisting>public static ExternalResourceDescription createSharedResourceDescription(
  String aUrl, Class&lt;? extends SharedResourceObject&gt; aInterface, Object... aParams)</programlisting>
    </formalpara>
    <formalpara>
      <title>Changes to logging</title>
      <para>UIMA v3 has is using SLF4J. As a consequence, the <literal>ExtendedLogger</literal>
      which uimaFIT had returned on calls to <literal>getLogger()</literal> has been removed
      and instead the regular UIMA v3 logger class is returned which offers methods quite compatible
      with what <literal>ExtendedLogger</literal> offered before. However, it is recommended
      that you go through all your logging calls and replace calls which use string concatenation
      to construct the logging message with corresponding calls using placeholders. For example,
      replace <literal>getLogger().error("Cannot access " + filename, exception);</literal> with
      <literal>getLogger().error("Cannot access {}", filename, exception);</literal>.</para>
    </formalpara>
    <formalpara>
      <title>Version requirements</title>
      <para>Depends on UIMA 3.0.2, Spring Framework 4.3.22 and Java 8.</para>
    </formalpara>
  </section>
  <section>
    <title>Version 2.3.0 to 2.4.0</title>
    <formalpara>
      <title>Version requirements</title>
      <para>Depends on UIMA 2.10.2, Spring Framework 3.2.16 and Java 7.</para>
    </formalpara>
    <formalpara>
      <para>Mind the updated version requirements. There should be no other potentially problematic
      changes in this upgrade.</para>
    </formalpara>
  </section>
  <section>
    <title>Version 2.2.0 to 2.3.0</title>
    <formalpara>
      <title>CasIOUtil deprecated</title>
      <para>The functionality of the uimaFIT CasIOUtil class has been superseded by the core UIMA
      class CasIOUtils added in UIMA 2.9.0. The method signatures in the new class are not the
      same, but provide more functionality. CasIOUtil has been deprecated and documentation has
      been added which of the CasIOUtils methods should be used instead.</para>
    </formalpara>
    <formalpara>
      <title>Version requirements</title>
      <para>Depends on UIMA 2.9.1, Spring Framework 3.2.16 and Java 7.</para>
    </formalpara>
    <formalpara>
      <para>Mind the updated version requirements. There should be no other potentially problematic
      changes in this upgrade.</para>
    </formalpara>
  </section>
  <section>
    <title>Version 2.1.0 to 2.2.0</title>
    <formalpara>
      <title>Version requirements</title>
      <para>Depends on UIMA 2.8.1, Spring Framework 3.2.16 and Java 7.</para>
    </formalpara>
    <formalpara>
      <para>Mind the updated version requirements. There should be no other potentially problematic
      changes in this upgrade.</para>
    </formalpara>
  </section>
  <section>
    <title>Version 2.0.0 to 2.1.0</title>
    <formalpara>
      <title>Version requirements</title>
      <para>Depends on UIMA 2.6.0 and Java 6.</para>
    </formalpara>
    <formalpara>
      <title>AnnotationFactory.createAnnotation()</title>
      <para>No longer throws <literal>UIMAExcption</literal>. If this exception was cought, some
        IDEs may complain here after upgrading to uimaFIT 2.1.0. </para>
    </formalpara>
  </section>
  <section>
    <title>Version 1.4.0 to 2.0.0</title>
    <formalpara>
      <title>Version requirements</title>
      <para>Depends on UIMA 2.4.2.</para>
    </formalpara>
    <formalpara>
      <title>Backwards compatibility</title>
      <para>Compatibility with legacy annotation is provided by the Legacy support module.</para>
    </formalpara>
    <formalpara>
      <title>Change of Maven groupId and artifactId</title>
      <para>The Maven group ID has changed from <literal>org.uimafit</literal> to
          <literal>org.apache.uima</literal>.</para>
    </formalpara>
    <para>The artifact ID of the main uimaFIT artifact has been changed from
        <literal>uimafit</literal> to <literal>uimafit-core</literal>.</para>
    <formalpara>
      <title>Change of package names</title>
      <para>The base package has been renamed from <literal>org.uimafit</literal> to
          <literal>org.apache.uima.fit</literal>. A global search/replace on Java files with for
        lines starting with <literal>import org.uimafit</literal> and replacing that with
          <literal>import org.apache.uima.fit</literal> should work.</para>
    </formalpara>
    <formalpara>
      <title>@ConfigurationParameter</title>
      <para>The default value for the mandatory attribute now is <literal>true</literal>. The
        default name of configuration parameters is now the name of the annotated field only. The
        classname is no longer prefixed. The method
          <code>ConfigurationParameterFactory.createConfigurationParameterName()</code> that was
        used to generate the prefixed name has been removed.</para>
    </formalpara>
    <formalpara>
      <title>Type detection: META-INF/org.uimafit folder</title>
      <para>The <literal>META-INF/org.uimafit</literal> was renamed to
          <literal>META-INF/org.apache.uima.fit</literal>.</para>
    </formalpara>
    <formalpara>
      <title>JCasUtil</title>
      <para>The deprecated <code>JCasUtil.iterate()</code> methods have been removed.
          <code>JCasUtil.select()</code> should be used instead.</para>
    </formalpara>
    <formalpara>
      <title>AnalysisEngineFactory</title>
      <para>All <literal>createAggregateXXX</literal> and <literal>createPrimitiveXXX</literal>
        methods have been renamed to <literal>createEngineXXX</literal>. The old names are
        deprecated and will be removed in future versions.</para>
    </formalpara>
    <para>All <literal>createAnalysisEngineXXX</literal> methods have been renamed to
        <literal>createEngineXXX</literal>. The old names are deprecated and will be removed in
      future versions.</para>
    <formalpara>
      <title>CollectionReaderFactory</title>
      <para>All <literal>createDescriptionXXX</literal> methods have been renamed to
          <literal>createReaderDescriptionXXX</literal>. The old names are deprecated and will be
        removed in future versions.</para>
    </formalpara>
    <para>All <literal>createCollectionReaderXXX</literal> methods have been renamed to
        <literal>createReaderXXX</literal>. The old names are deprecated and will be removed in
      future versions.</para>
    <formalpara>
      <title>JCasIterable</title>
      <para><code>JCasIterable</code> now only accepts reader and engine descriptions (no instances)
        and no longer implements the <code>Iterator</code> interface. Instead, new
          <code>JCasIterator</code> has been added, which replaces <code>JCasIterable</code> in that
        respect.</para>
    </formalpara>
    <formalpara>
      <title>CasDumpWriter</title>
      <para><literal>org.uimafit.component.xwriter.CASDumpWriter</literal> has been renamed to
          <literal>org.apache.uima.fit.component.CasDumpWriter</literal>.</para>
    </formalpara>
    <formalpara>
      <title>CpePipeline</title>
      <para><literal>CpePipeline</literal> has been moved to a separate module with the artifact ID
          <literal>uimafit-cpe</literal> to reduce the dependencies incurred by the main uimaFIT
        artifact.</para>
    </formalpara>
    <formalpara>
      <title>XWriter removed</title>
      <para>The <literal>XWriter</literal> and associated file namers have been removed as they were
        much more complex then acutally needed. As an alternative, <literal>CasIOUtil</literal> has
        been introduced providing several convenience methods to read/write JCas/CAS data. </para>
    </formalpara>
    <formalpara>
      <title>JCasFactory</title>
      <para>Methods only loading JCas data have been removed from <literal>JCasFactory</literal>.
        The new methods in <literal>CasIOUtil</literal> can be used instead.</para>
    </formalpara>
  </section>
</chapter>
