~~ $Id$
~~
~~ 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.
~~
         -----------
         Tiles extensions migration
         -----------

Introduction

  Tiles extensions is the part of Tiles where a major effort in refactoring is
  needed.

  The internal part of Tiles changed completely, not only in classes names, but
  also in their behaviour.

Writing definitions factories

  Usually, Struts-Tiles extension writing meant writing a
  <<<DefinitionsFactory>>> or a <<<FactorySet>>> implementation. Here you will
  find how to convert your definitions factory to work correctly with Apache Tiles\u0099.

* Requests management

  Apache Tiles\u0099 is now technology-independent, that means that Apache Tiles\u0099 is no longer
  bound to a Servlet environment. That means for you that all references to
  <<<HttpServletRequest>>> and <<<HttpServletResponse>>> have been removed,
  replacing them with <<<TilesRequestContext>>>

* Definitions factory implementation

  The most common way to implement a Definitions Factory is extending the
  <<<UrlDefinitionsFactory>>> class, that contains code to load definitions,
  resolve Locale-specific definitions, etc.

  If you implemented <<<FactorySet>>>, here comes the bad news: it has been
  <<removed>>! Getting a "key" to map different definitions factory was an
  uncommon implementation detail. But it is easily reproducable, since you can
  take the <<<TilesRequestContext>>> and calculate your "key". This key can be
  used to map different <<<Definitions>>> instances, or to be given to an
  instance of a class extending <<<Definitions>>>. Whatever you choose, it's
  only a question of taste.

Class and interfaces new names

  The following is a conversion table between Struts-Tiles and Apache Tiles\u0099 class
  names.

*---------------------------------+---------------------------------+
| <<Struts-Tiles>>                | <<Apache Tiles\u0099>>          |
*---------------------------------+---------------------------------+
| <<<ComponentDefinition>>>       | <<<Definition>>>                |
*---------------------------------+---------------------------------+
| <<<XmlDefinitionsSet>>>         | <<<Definitions>>>               |
*---------------------------------+---------------------------------+
| <<<XmlAttribute>>>              | <<<Attribute>>>                 |
*---------------------------------+---------------------------------+
| <<<ComponentListAttribute>>>    | <<<ListAttribute>>>             |
*---------------------------------+---------------------------------+
| <<<I18nFactorySet>>>            | <<<UrlDefinitionsFactory>>>     |
*---------------------------------+---------------------------------+
| <<<XmlParser>>>                 | <<<DigesterDefinitionsReader>>> |
*---------------------------------+---------------------------------+

   * Previous Migration Pages

     ** {{{./index.html}Introduction }}

     ** {{{./configuration.html}Tiles configuration files}}.

     ** {{{./tags.html}Tiles JSP tags}}

     ** {{{./apis.html}Java APIs considerations}}.
