~~ $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.
~~
         -----------
         Migrating Tiles configuration files
         -----------

{Reusing old Tiles configuration files}

  With Tiles 2.1 and 2.2 it is possible to use old Struts-Tiles definition files, since
  1.1 version.

  To use this feature it is needed to:

  * include the <<<tiles-compat-xxx.jar>>> package in the classpath;

  * configure the compatibility definitions reader instance, that is able to
  read old definition files.

* Configuration

  Override the
  {{{../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#createDefinitionsReader(java.lang.Object,%20org.apache.tiles.TilesApplicationContext,%20org.apache.tiles.context.TilesRequestContextFactory)}createDefinitionsReader}}
  method this way:

---------------------------------------
@Override
protected DefinitionsReader createDefinitionsReader(Object context,
        TilesApplicationContext applicationContext,
        TilesRequestContextFactory contextFactory) {
    return new CompatibilityDigesterDefinitionsReader();
}
---------------------------------------

  You need to add a renderer for the "page" attribute type, that is in fact the "template" type.
  So override the
  {{{../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#registerAttributeRenderers(org.apache.tiles.renderer.impl.BasicRendererFactory,%20java.lang.Object,%20org.apache.tiles.TilesApplicationContext,%20org.apache.tiles.context.TilesRequestContextFactory,%20org.apache.tiles.TilesContainer,%20org.apache.tiles.evaluator.AttributeEvaluator)}registerAttributeRenderers}}
  method.

---------------------------------------
@Override
protected void registerAttributeRenderers(
        BasicRendererFactory rendererFactory, Object context,
        TilesApplicationContext applicationContext,
        TilesRequestContextFactory contextFactory, TilesContainer container,
        AttributeEvaluator evaluator) {
    super.registerAttributeRenderers(rendererFactory, context,
            applicationContext, contextFactory, container, evaluator);
    TemplateAttributeRenderer templateRenderer = new TemplateAttributeRenderer();
    templateRenderer.setApplicationContext(applicationContext);
    templateRenderer.setRequestContextFactory(contextFactory);
    templateRenderer.setEvaluator(evaluator);
    rendererFactory.registerRenderer("page", templateRenderer);
}
---------------------------------------

  <<WARNING!!!>> Configuration with initialization parameter has been deprecated! If you
  still want to use it, please refer to the
  {{{../../2.1/framework/migration/configuration.html}2.1 version of this page}}.


Tiles configuration files translation

  A better, and more powerful, choice is to rewrite the definition files, to use
  the new features of Tiles 2.1.

  Most of XML elements and attributes can be translated one-to-one or
  many-to-one without losing functionality from the 1.1-1.3 to the 2.1 DTD
  version.

* Header

  The new header to be put in your Tiles definitions files is:

------------------------------------------------------------
 <!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
------------------------------------------------------------

* Definitions attributes

*---------------------------------+--------------------------------+
| <<Struts-Tiles>>                | <<Apache Tiles\u0099>>         |
*---------------------------------+--------------------------------+
| <<<\<component-definitions\>>>> | <<<\<tiles-definitions\>>>>    |
| <<<\<tiles-definitions\>>>>     |                                |
*---------------------------------+--------------------------------+
| <<<page>>>                      | <<<template>>>                 |
| <<<path>>>                      |                                |
| <<<template>>>                  |                                |
*---------------------------------+--------------------------------+
| <<<controllerClass>>>           | <<<preparer>>> [1]             |
| <<<controllerUrl>>>             |                                |
*---------------------------------+--------------------------------+

  * \[1\] The default behaviour of <<<preparer>>> is to create and use a
  single instance of the specified class. Anyway it is still possible to use a
  URL as a preparer under a Struts 1 environment by using the
  {{{http://svn.apache.org/repos/asf/struts/struts1/trunk/tiles2/}Struts 1 - Apache Tiles\u0099}}
  integration module, still under development.


* Putting and adding attributes values

  The <<<page>>> attribute type has been removed, use <<<template>>> instead.

  The rest of the conversion is in the table below.

*-----------------------+-----------------------------------------------+
| <<Struts-Tiles>>      | <<Apache Tiles\u0099>>                        |
*-----------------------+-----------------------------------------------+
| <<<\<put\>>>>         | <<<\<put-attribute\>>>>                       |
*-----------------------+-----------------------------------------------+
| <<<\<putList\>>>>     | <<<\<put-list-attribute\>>>>                  |
*-----------------------+-----------------------------------------------+
| <<<\<add\>>>>         | <<<\<add-attribute\>>>>  [2]                  |
|                       | <<<\<add-list-attribute\>>>>  [3]             |
*-----------------------+-----------------------------------------------+
| <<<content>>>         | <<<value>>>                                   |
| <<<value>>>           |                                               |
*-----------------------+-----------------------------------------------+
| <<<direct="true">>>   | <<<type="string">>>                           |
*-----------------------+-----------------------------------------------+

  * \[2\] <<<\<add-attribute\>>>> is used when it is needed to add a single
  attribute to a list attribute.

  * \[3\] <<<\<add-list-attribute\>>>> is used when it is needed to a list
  attribute as an element of another list attribute.

  []

   * Previous Migration Pages

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

   * Next Migration Pages

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

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

     ** {{{./extension.html}Tiles extensions}}.
