You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tiles.apache.org by ap...@apache.org on 2008/06/11 22:49:06 UTC

svn commit: r666834 - in /tiles/framework/trunk: tiles-api/src/main/java/org/apache/tiles/ tiles-core/src/main/java/org/apache/tiles/definition/ tiles-core/src/main/java/org/apache/tiles/definition/dao/ tiles-core/src/main/java/org/apache/tiles/factory...

Author: apetrelli
Date: Wed Jun 11 13:49:05 2008
New Revision: 666834

URL: http://svn.apache.org/viewvc?rev=666834&view=rev
Log:
TILES-256
Moved logic that loads URLs to a DAO.

Added:
    tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html   (with props)
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java   (with props)
Modified:
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/ReloadableDefinitionsFactory.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/UrlDefinitionsFactory.java
    tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
    tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/TestUrlDefinitionsFactory.java

Added: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java (added)
+++ tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java Wed Jun 11 13:49:05 2008
@@ -0,0 +1,39 @@
+/*
+ * $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.
+ */
+package org.apache.tiles;
+
+import java.util.Map;
+
+/**
+ * It is an object that can be initialized using a map with parameters.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.1.0
+ */
+public interface Initializable {
+
+    /**
+     * Initializes the object.
+     *
+     * @param params The map of parameters.
+     */
+    void init(Map<String, String> params);
+}

Propchange: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-api/src/main/java/org/apache/tiles/Initializable.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java?rev=666834&r1=666833&r2=666834&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java Wed Jun 11 13:49:05 2008
@@ -61,6 +61,14 @@
     String DEFINITIONS_CONFIG = "org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG";
 
     /**
+     * Constant representing the configuration parameter used to define the
+     * definition DAO to use.
+     */
+    String DEFINITION_DAO_INIT_PARAM =
+        "org.apache.tiles.definition.DefinitionsFactory.DefinitionDAO";
+
+
+    /**
      * Initializes the DefinitionsFactory and its subcomponents. <p/>
      * Implementations may support configuration properties to be passed in via
      * the params Map.

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java Wed Jun 11 13:49:05 2008
@@ -0,0 +1,39 @@
+/*
+ * $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.
+ */
+package org.apache.tiles.definition;
+
+/**
+ * Implementing this interface means that the object monitors the sources it
+ * uses to check when they change.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.1.0
+ */
+public interface RefreshMonitor {
+
+    /**
+     * Indicates whether the sources are out of date and need to be reloaded.
+     *
+     * @return <code>true</code> if the sources need to be refreshed.
+ * @since 2.1.0
+     */
+    boolean refreshRequired();
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/ReloadableDefinitionsFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/ReloadableDefinitionsFactory.java?rev=666834&r1=666833&r2=666834&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/ReloadableDefinitionsFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/ReloadableDefinitionsFactory.java Wed Jun 11 13:49:05 2008
@@ -22,12 +22,13 @@
 
 package org.apache.tiles.definition;
 
+
 /**
  * Indicates support for reloading Tiles configuration when it changes.
  *
  * @version $Rev$ $Date$
  */
-public interface ReloadableDefinitionsFactory {
+public interface ReloadableDefinitionsFactory extends RefreshMonitor {
 
     /**
      * Indicates whether the DefinitionsFactory is out of date and needs to be

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/UrlDefinitionsFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/UrlDefinitionsFactory.java?rev=666834&r1=666833&r2=666834&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/UrlDefinitionsFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/UrlDefinitionsFactory.java Wed Jun 11 13:49:05 2008
@@ -23,19 +23,20 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tiles.Definition;
+import org.apache.tiles.Initializable;
 import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.awareness.TilesApplicationContextAware;
 import org.apache.tiles.context.TilesRequestContext;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
+import org.apache.tiles.definition.dao.DefinitionDAO;
+import org.apache.tiles.definition.dao.LocaleUrlDefinitionDAO;
+import org.apache.tiles.definition.dao.URLReader;
 import org.apache.tiles.impl.BasicTilesContainer;
 import org.apache.tiles.locale.LocaleResolver;
 import org.apache.tiles.locale.impl.DefaultLocaleResolver;
 import org.apache.tiles.util.ClassUtil;
+import org.apache.tiles.util.LocaleUtil;
 
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.net.URL;
-import java.net.URLConnection;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -56,7 +57,8 @@
  * @version $Rev$ $Date$
  */
 public class UrlDefinitionsFactory implements DefinitionsFactory,
-        ReloadableDefinitionsFactory, TilesApplicationContextAware {
+        ReloadableDefinitionsFactory, TilesApplicationContextAware,
+        Initializable {
 
     /**
      * Compatibility constant.
@@ -71,11 +73,11 @@
     private static final Log LOG = LogFactory.getLog(UrlDefinitionsFactory.class);
 
     /**
-     * Contains the URL objects identifying where configuration data is found.
+     * The definition DAO that extracts the definitions from the sources.
      *
      * @since 2.1.0
      */
-    protected List<URL> sourceURLs;
+    protected DefinitionDAO<Locale> definitionDao;
 
     /**
      * Contains the URL objects identifying where configuration data is found.
@@ -86,11 +88,15 @@
 
     /**
      * Reader used to get definitions from the sources.
+     *
+     * @deprecated No more used.
      */
     protected DefinitionsReader reader;
 
     /**
      * Contains the dates that the URL sources were last modified.
+     *
+     * @deprecated No more used.
      */
     protected Map<String, Long> lastModifiedDates;
 
@@ -126,8 +132,7 @@
      * Creates a new instance of UrlDefinitionsFactory.
      */
     public UrlDefinitionsFactory() {
-        sourceURLs = new ArrayList<URL>();
-        lastModifiedDates = new HashMap<String, Long>();
+        definitionDao = new LocaleUrlDefinitionDAO();
         processedLocales = new ArrayList<Locale>();
     }
 
@@ -137,32 +142,22 @@
     }
 
     /**
-     * Sets the source URLs to use.
-     *
-     * @param sourceURLs The source URLs.
-     */
-    public void setSourceURLs(List<URL> sourceURLs) {
-        this.sourceURLs = sourceURLs;
-    }
-
-    /**
-     * Sets the definitions reader that will read the URLs.
+     * Sets the locale resolver to use.
      *
-     * @param reader The definitions reader.
+     * @param localeResolver The locale resolver.
      * @since 2.1.0
      */
-    public void setReader(DefinitionsReader reader) {
-        this.reader = reader;
+    public void setLocaleResolver(LocaleResolver localeResolver) {
+        this.localeResolver = localeResolver;
     }
 
     /**
-     * Sets the locale resolver to use.
+     * Sets the definition DAO to use. It must be locale-based.
      *
-     * @param localeResolver The locale resolver.
-     * @since 2.1.0
+     * @param definitionDao The definition DAO.
      */
-    public void setLocaleResolver(LocaleResolver localeResolver) {
-        this.localeResolver = localeResolver;
+    public void setDefinitionDAO(DefinitionDAO<Locale> definitionDao) {
+        this.definitionDao = definitionDao;
     }
 
     /**
@@ -174,17 +169,23 @@
      * @param params The Map of configuration properties.
      * @throws DefinitionsFactoryException if an initialization error occurs.
      */
+    @SuppressWarnings("unchecked")
     public void init(Map<String, String> params) {
-        identifySources(params);
-        String readerClassName =
-            params.get(DefinitionsFactory.READER_IMPL_PROPERTY);
-
-        if (readerClassName != null) {
-            reader = (DefinitionsReader) ClassUtil.instantiate(readerClassName);
+        String definitionDaoClassName = params
+                .get(DefinitionsFactory.DEFINITION_DAO_INIT_PARAM);
+        if (definitionDaoClassName != null) {
+            definitionDao = (DefinitionDAO<Locale>) ClassUtil
+                    .instantiate(definitionDaoClassName);
         } else {
-            reader = new DigesterDefinitionsReader();
+            definitionDao = new LocaleUrlDefinitionDAO();
+        }
+        if (definitionDao instanceof TilesApplicationContextAware) {
+            ((TilesApplicationContextAware) definitionDao)
+                    .setApplicationContext(applicationContext);
+        }
+        if (definitionDao instanceof Initializable) {
+            ((Initializable) definitionDao).init(params);
         }
-        reader.init(params);
 
         String resolverClassName = params
                 .get(DefinitionsFactory.LOCALE_RESOLVER_IMPL_PROPERTY);
@@ -247,8 +248,7 @@
      * @param source The configuration source for definitions.
      * @throws DefinitionsFactoryException if an invalid source is passed in or
      *                                     an error occurs resolving the source to an actual data store.
-     * @deprecated Do not call it, let the Definitions Factory load the sources
-     * by itself.
+     * @deprecated Use {@link URLReader#addSourceURL(URL)}.
      */
     public void addSource(Object source) {
         if (source == null) {
@@ -261,7 +261,9 @@
                 "Source object must be an URL");
         }
 
-        sourceURLs.add((URL) source);
+        if (definitionDao instanceof URLReader) {
+            ((URLReader) definitionDao).addSourceURL((URL) source);
+        }
     }
 
     /**
@@ -302,43 +304,11 @@
         }
 
         processedLocales.add(locale);
-        List<String> postfixes = calculatePostfixes(locale);
-        Map<String, Definition> localeDefsMap = new HashMap<String, Definition>();
-        for (Object postfix : postfixes) {
-            // For each postfix, all the sources must be loaded.
-            for (URL url : sourceURLs) {
-                String path = url.toExternalForm();
-
-                String newPath = concatPostfix(path, (String) postfix);
-                try {
-                    URL newUrl = new URL(newPath);
-                    URLConnection connection = newUrl.openConnection();
-                    connection.connect();
-                    lastModifiedDates.put(newUrl.toExternalForm(),
-                        connection.getLastModified());
-
-                    // Definition must be collected, starting from the base
-                    // source up to the last localized file.
-                    Map<String, Definition> defsMap = reader
-                            .read(connection.getInputStream());
-                    if (defsMap != null) {
-                        localeDefsMap.putAll(defsMap);
-                    }
-                } catch (FileNotFoundException e) {
-                    // File not found. continue.
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("File " + newPath + " not found, continue");
-                    }
-                } catch (IOException e) {
-                    throw new DefinitionsFactoryException(
-                        "I/O error processing configuration.");
-                }
-            }
-        }
 
         // At the end of definitions loading, they can be assigned to
         // Definitions implementation, to allow inheritance resolution.
-        localeSpecificDefinitions.put(locale, localeDefsMap);
+        localeSpecificDefinitions.put(locale, definitionDao
+                .getDefinitions(locale));
         resolveInheritances(locale);
     }
 
@@ -393,23 +363,10 @@
      * @param name    Filename.
      * @param postfix Postfix to add.
      * @return Concatenated filename.
+     * @deprecated Use {@link LocaleUtil#concatPostfix(String,String)} instead
      */
-    protected String concatPostfix(String name, String postfix) {
-        if (postfix == null) {
-            return name;
-        }
-
-        // Search file name extension.
-        // take care of Unix files starting with .
-        int dotIndex = name.lastIndexOf(".");
-        int lastNameStart = name.lastIndexOf(java.io.File.pathSeparator);
-        if (dotIndex < 1 || dotIndex < lastNameStart) {
-            return name + postfix;
-        }
-
-        String ext = name.substring(dotIndex);
-        name = name.substring(0, dotIndex);
-        return name + postfix + ext;
+    protected static String concatPostfix(String name, String postfix) {
+        return LocaleUtil.concatPostfix(name, postfix);
     }
 
     /**
@@ -423,20 +380,7 @@
     protected synchronized void loadDefinitions() {
         reset();
 
-        try {
-            for (URL source : sourceURLs) {
-                URLConnection connection = source.openConnection();
-                connection.connect();
-                lastModifiedDates.put(source.toExternalForm(),
-                    connection.getLastModified());
-                Map<String, Definition> defsMap = reader
-                        .read(connection.getInputStream());
-                baseDefinitions.putAll(defsMap);
-                resolveInheritances();
-            }
-        } catch (IOException e) {
-            throw new DefinitionsFactoryException("I/O error accessing source.", e);
-        }
+        baseDefinitions.putAll(definitionDao.getDefinitions(null));
     }
 
     /**
@@ -446,51 +390,10 @@
      *
      * @param locale the locale
      * @return a list of
+     * @deprecated Use {@link LocaleUtil#calculatePostfixes(Locale)} instead.
      */
     protected static List<String> calculatePostfixes(Locale locale) {
-        final List<String> result = new ArrayList<String>();
-        final String language = locale.getLanguage();
-        final int languageLength = language.length();
-        final String country = locale.getCountry();
-        final int countryLength = country.length();
-        final String variant = locale.getVariant();
-        final int variantLength = variant.length();
-
-        // The default configuration file must be loaded to allow correct
-        // definition inheritance.
-        result.add("");
-        if (languageLength + countryLength + variantLength == 0) {
-            //The locale is "", "", "".
-            return result;
-        }
-
-        final StringBuffer temp = new StringBuffer();
-        temp.append('_');
-        temp.append(language);
-
-        if (languageLength > 0) {
-            result.add(temp.toString());
-        }
-
-        if (countryLength + variantLength == 0) {
-            return result;
-        }
-
-        temp.append('_');
-        temp.append(country);
-
-        if (countryLength > 0) {
-            result.add(temp.toString());
-        }
-
-        if (variantLength == 0) {
-            return result;
-        } else {
-            temp.append('_');
-            temp.append(variant);
-            result.add(temp.toString());
-            return result;
-        }
+        return LocaleUtil.calculatePostfixes(locale);
     }
 
 
@@ -509,60 +412,8 @@
      * @return If the factory needs refresh.
      */
     public boolean refreshRequired() {
-        boolean status = false;
-
-        Set<String> urls = lastModifiedDates.keySet();
-
-        try {
-            for (String urlPath : urls) {
-                Long lastModifiedDate = lastModifiedDates.get(urlPath);
-                URL url = new URL(urlPath);
-                URLConnection connection = url.openConnection();
-                connection.connect();
-                long newModDate = connection.getLastModified();
-                if (newModDate != lastModifiedDate) {
-                    status = true;
-                    break;
-                }
-            }
-        } catch (Exception e) {
-            LOG.warn("Exception while monitoring update times.", e);
-            return true;
-        }
-        return status;
-    }
-
-    /**
-     * Detects the sources to load.
-     *
-     * @param initParameters The initialization parameters.
-     * @since 2.1.0
-     */
-    protected void identifySources(Map<String, String> initParameters) {
-        if (applicationContext == null) {
-            throw new IllegalStateException(
-                    "The TilesApplicationContext cannot be null");
-        }
-
-        String resourceString = getResourceString(initParameters);
-        List<String> resources = getResourceNames(resourceString);
-
-        try {
-            for (String resource : resources) {
-                URL resourceUrl = applicationContext.getResource(resource);
-                if (resourceUrl != null) {
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("Adding resource '" + resourceUrl + "' to definitions factory.");
-                    }
-                    sourceURLs.add(resourceUrl);
-                } else {
-                    LOG.warn("Unable to find configured definition '" + resource + "'");
-                }
-            }
-        } catch (IOException e) {
-            throw new DefinitionsFactoryException("Unable to parse definitions from "
-                + resourceString, e);
-        }
+        return (definitionDao instanceof RefreshMonitor)
+                && ((RefreshMonitor) definitionDao).refreshRequired();
     }
 
     /**
@@ -574,8 +425,9 @@
      *
      * @param parms The initialization parameters.
      * @return resource string to be parsed.
+     * @deprecated Deprecated without replacement.
      */
-    @SuppressWarnings("deprecation")
+    @Deprecated
     protected String getResourceString(Map<String, String> parms) {
         String resourceStr = parms.get(DefinitionsFactory.DEFINITIONS_CONFIG);
         if (resourceStr == null) {
@@ -596,7 +448,9 @@
      *
      * @param resourceString comma seperated resources
      * @return parsed resources
+     * @deprecated Deprecated without replacement.
      */
+    @Deprecated
     protected List<String> getResourceNames(String resourceString) {
         StringTokenizer tokenizer = new StringTokenizer(resourceString, ",");
         List<String> filenames = new ArrayList<String>(tokenizer.countTokens());

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java Wed Jun 11 13:49:05 2008
@@ -0,0 +1,57 @@
+/*
+ * $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.
+ */
+package org.apache.tiles.definition.dao;
+
+import java.util.Map;
+
+import org.apache.tiles.Definition;
+
+/**
+ * It represents an object that provides definitions, depending on a
+ * customization key.
+ *
+ * @param <K> The customization key class.
+ * @version $Rev$ $Date$
+ * @since 2.1.0
+ */
+public interface DefinitionDAO<K> {
+
+    /**
+     * Returns a definition, given its name and the customization key.
+     *
+     * @param name The name of the definition.
+     * @param customizationKey The customization key.
+     * @return The requested definition, if found, otherwise <code>null</code>.
+     * The inheritance of the definition must not be resolved.
+     * @since 2.1.0
+     */
+    Definition getDefinition(String name, K customizationKey);
+
+    /**
+     * Returns all the definitions used of a customization key.
+     *
+     * @param customizationKey The customization key.
+     * @return All the definitions that are connected to the customization key.
+     * The inheritance of the definitions must not be resolved.
+     * @since 2.1.0
+     */
+    Map<String, Definition> getDefinitions(K customizationKey);
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java Wed Jun 11 13:49:05 2008
@@ -0,0 +1,307 @@
+/*
+ * $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.
+ */
+package org.apache.tiles.definition.dao;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tiles.Definition;
+import org.apache.tiles.Initializable;
+import org.apache.tiles.TilesApplicationContext;
+import org.apache.tiles.awareness.TilesApplicationContextAware;
+import org.apache.tiles.definition.DefinitionsFactory;
+import org.apache.tiles.definition.DefinitionsFactoryException;
+import org.apache.tiles.definition.DefinitionsReader;
+import org.apache.tiles.definition.RefreshMonitor;
+import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
+import org.apache.tiles.impl.BasicTilesContainer;
+import org.apache.tiles.util.ClassUtil;
+import org.apache.tiles.util.LocaleUtil;
+
+/**
+ * A definition DAO that uses {@link Locale} as a customization key and loads
+ * definitions from URLs.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.1.0
+ */
+public class LocaleUrlDefinitionDAO implements DefinitionDAO<Locale>,
+        Initializable, TilesApplicationContextAware, RefreshMonitor, URLReader {
+
+    /**
+     * The logging object.
+     */
+    private static final Log LOG = LogFactory
+            .getLog(LocaleUrlDefinitionDAO.class);
+
+    /**
+     * Compatibility constant.
+     *
+     * @deprecated use {@link DEFINITIONS_CONFIG} to avoid namespace collisions.
+     */
+    private static final String LEGACY_DEFINITIONS_CONFIG = "definitions-config";
+
+    /**
+     * Contains the URL objects identifying where configuration data is found.
+     *
+     * @since 2.1.0
+     */
+    protected List<URL> sourceURLs;
+
+    /**
+     * Contains the dates that the URL sources were last modified.
+     */
+    protected Map<String, Long> lastModifiedDates;
+
+    /**
+     * The application context.
+     *
+     * @since 2.1.0
+     */
+    protected TilesApplicationContext applicationContext;
+
+    /**
+     * Reader used to get definitions from the sources.
+     */
+    protected DefinitionsReader reader;
+
+    /**
+     * Constructor.
+     */
+    public LocaleUrlDefinitionDAO() {
+        sourceURLs = new ArrayList<URL>();
+        lastModifiedDates = new HashMap<String, Long>();
+    }
+
+    /**
+     * <p>
+     * Returns a definition, given its name and the customization key.
+     * </p>
+     * <strong>WARNING!</strong> This method is slow! It loads all the
+     * definitions and then selects the needed one.
+     *
+     * @param name The name of the definition.
+     * @param customizationKey The customization key.
+     * @return The requested definition, if found, otherwise <code>null</code>.
+     * The inheritance of the definition must not be resolved.
+     * @since 2.1.0
+     */
+    public Definition getDefinition(String name, Locale customizationKey) {
+        Map<String, Definition> defsMap = getDefinitions(customizationKey);
+        return defsMap != null ? defsMap.get(name) : null;
+    }
+
+    /** {@inheritDoc} */
+    public Map<String, Definition> getDefinitions(Locale customizationKey) {
+        List<String> postfixes = LocaleUtil.calculatePostfixes(customizationKey);
+        Map<String, Definition> localeDefsMap = new HashMap<String, Definition>();
+        for (Object postfix : postfixes) {
+            // For each postfix, all the sources must be loaded.
+            for (URL url : sourceURLs) {
+                String path = url.toExternalForm();
+
+                String newPath = LocaleUtil.concatPostfix(path,
+                        (String) postfix);
+                try {
+                    URL newUrl = new URL(newPath);
+                    URLConnection connection = newUrl.openConnection();
+                    connection.connect();
+                    lastModifiedDates.put(newUrl.toExternalForm(), connection
+                            .getLastModified());
+
+                    // Definition must be collected, starting from the base
+                    // source up to the last localized file.
+                    Map<String, Definition> defsMap = reader.read(connection
+                            .getInputStream());
+                    if (defsMap != null) {
+                        localeDefsMap.putAll(defsMap);
+                    }
+                } catch (FileNotFoundException e) {
+                    // File not found. continue.
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("File " + newPath + " not found, continue");
+                    }
+                } catch (IOException e) {
+                    throw new DefinitionsFactoryException(
+                            "I/O error processing configuration.", e);
+                }
+            }
+        }
+
+        return localeDefsMap;
+    }
+
+    /**  {@inheritDoc}*/
+    public void setSourceURLs(List<URL> sourceURLs) {
+        this.sourceURLs = sourceURLs;
+    }
+
+    /**  {@inheritDoc}*/
+    public void setReader(DefinitionsReader reader) {
+        this.reader = reader;
+    }
+
+    /**  {@inheritDoc}*/
+    public void addSourceURL(URL sourceURL) {
+        if (sourceURLs == null) {
+            sourceURLs = new ArrayList<URL>();
+        }
+        sourceURLs.add(sourceURL);
+    }
+
+    /** {@inheritDoc} */
+    public void setApplicationContext(TilesApplicationContext applicationContext) {
+        this.applicationContext = applicationContext;
+    }
+
+    /** {@inheritDoc} */
+    public void init(Map<String, String> params) {
+        identifySources(params);
+        String readerClassName = params
+                .get(DefinitionsFactory.READER_IMPL_PROPERTY);
+
+        if (readerClassName != null) {
+            reader = (DefinitionsReader) ClassUtil.instantiate(readerClassName);
+        } else {
+            reader = new DigesterDefinitionsReader();
+        }
+        reader.init(params);
+    }
+
+    /** {@inheritDoc} */
+    public boolean refreshRequired() {
+        boolean status = false;
+
+        Set<String> urls = lastModifiedDates.keySet();
+
+        try {
+            for (String urlPath : urls) {
+                Long lastModifiedDate = lastModifiedDates.get(urlPath);
+                URL url = new URL(urlPath);
+                URLConnection connection = url.openConnection();
+                connection.connect();
+                long newModDate = connection.getLastModified();
+                if (newModDate != lastModifiedDate) {
+                    status = true;
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            LOG.warn("Exception while monitoring update times.", e);
+            return true;
+        }
+        return status;
+    }
+
+    /**
+     * Appends locale-specific {@link Definition} objects to existing
+     * definitions set by reading locale-specific versions of the applied
+     * sources.
+     *
+     * @param locale The requested locale.
+     * @throws DefinitionsFactoryException if an error occurs reading
+     * definitions.
+     * @since 2.1.0
+     */
+    protected synchronized void addDefinitions(Locale locale) {
+    }
+
+    /**
+     * Detects the sources to load.
+     *
+     * @param initParameters The initialization parameters.
+     * @since 2.1.0
+     */
+    protected void identifySources(Map<String, String> initParameters) {
+        if (applicationContext == null) {
+            throw new IllegalStateException(
+                    "The TilesApplicationContext cannot be null");
+        }
+
+        String resourceString = getResourceString(initParameters);
+        String[] resources = getResourceNames(resourceString);
+
+        try {
+            for (int i = 0; i < resources.length; i++) {
+                URL resourceUrl = applicationContext.getResource(resources[i]);
+                if (resourceUrl != null) {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("Adding resource '" + resourceUrl
+                                + "' to definitions factory.");
+                    }
+                    sourceURLs.add(resourceUrl);
+                } else {
+                    LOG.warn("Unable to find configured definition '"
+                            + resources[i] + "'");
+                }
+            }
+        } catch (IOException e) {
+            throw new DefinitionsFactoryException(
+                    "Unable to parse definitions from " + resourceString, e);
+        }
+    }
+
+    /**
+     * Derive the resource string from the initialization parameters. If no
+     * parameter {@link DefinitionsFactory#DEFINITIONS_CONFIG} is available,
+     * attempts to retrieve {@link BasicTilesContainer#DEFINITIONS_CONFIG} and
+     * {@link #LEGACY_DEFINITIONS_CONFIG}. If neither are available, returns
+     * "/WEB-INF/tiles.xml".
+     *
+     * @param parms The initialization parameters.
+     * @return resource string to be parsed.
+     */
+    @SuppressWarnings("deprecation")
+    protected String getResourceString(Map<String, String> parms) {
+        String resourceStr = parms.get(DefinitionsFactory.DEFINITIONS_CONFIG);
+        if (resourceStr == null) {
+            resourceStr = parms.get(BasicTilesContainer.DEFINITIONS_CONFIG);
+        }
+        if (resourceStr == null) {
+            resourceStr = parms.get(LEGACY_DEFINITIONS_CONFIG);
+        }
+        if (resourceStr == null) {
+            resourceStr = "/WEB-INF/tiles.xml";
+        }
+        return resourceStr;
+    }
+
+    /**
+     * Parse the resourceString into a list of resource paths which can be
+     * loaded by the application context.
+     *
+     * @param resourceString comma separated resources
+     * @return parsed resources
+     */
+    protected String[] getResourceNames(String resourceString) {
+        return resourceString.split(",");
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java Wed Jun 11 13:49:05 2008
@@ -0,0 +1,60 @@
+/*
+ * $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.
+ */
+package org.apache.tiles.definition.dao;
+
+import java.net.URL;
+import java.util.List;
+
+import org.apache.tiles.definition.DefinitionsReader;
+
+/**
+ * It represents an object that reads URLs and is able to read them throw the
+ * use of a {@link DefinitionsReader}.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.1.0
+ */
+public interface URLReader {
+
+    /**
+     * Sets the source URLs to use.
+     *
+     * @param sourceURLs The source URLs.
+     * @since 2.1.0
+     */
+    void setSourceURLs(List<URL> sourceURLs);
+
+    /**
+     * Sets the definitions reader that will read the URLs.
+     *
+     * @param reader The definitions reader.
+     * @since 2.1.0
+     */
+    void setReader(DefinitionsReader reader);
+
+    /**
+     * Adds a single URL to use.
+     *
+     * @param sourceURL The source URL to add.
+     * @since 2.1.0
+     */
+    void addSourceURL(URL sourceURL);
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/URLReader.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html Wed Jun 11 13:49:05 2008
@@ -0,0 +1,31 @@
+<!--
+/*
+ * $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.
+ */
+-->
+<html>
+<head>
+    <title>Tiles definition DAO</title>
+</head>
+<body>
+Classes to simply load definitions depending on a customization key.
+The package contains also basic implementations.
+</body>
+</html>
\ No newline at end of file

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/definition/dao/package.html
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java?rev=666834&r1=666833&r2=666834&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java Wed Jun 11 13:49:05 2008
@@ -24,6 +24,7 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -34,6 +35,8 @@
 import org.apache.tiles.definition.DefinitionsFactory;
 import org.apache.tiles.definition.DefinitionsReader;
 import org.apache.tiles.definition.UrlDefinitionsFactory;
+import org.apache.tiles.definition.dao.DefinitionDAO;
+import org.apache.tiles.definition.dao.LocaleUrlDefinitionDAO;
 import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
 import org.apache.tiles.evaluator.AttributeEvaluator;
 import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
@@ -161,6 +164,7 @@
      * @param contextFactory The Tiles context factory.
      * @param resolver The locale resolver.
      * @return The definitions factory.
+     * @since 2.1.0
      */
     protected DefinitionsFactory createDefinitionsFactory(Object context,
             TilesApplicationContext applicationContext,
@@ -168,15 +172,33 @@
         UrlDefinitionsFactory factory = new UrlDefinitionsFactory();
         factory.setApplicationContext(applicationContext);
         factory.setLocaleResolver(resolver);
-        factory.setReader(createDefinitionsReader(context, applicationContext,
-                contextFactory));
-        factory.setSourceURLs(getSourceURLs(context, applicationContext,
-                contextFactory));
+        factory.setDefinitionDAO(createLocaleDefinitionDao(context,
+                applicationContext, contextFactory, resolver));
         factory.refresh();
         return factory;
     }
 
     /**
+     * Creates a Locale-based definition DAO.
+     *
+     * @param context The context.
+     * @param applicationContext The Tiles application context.
+     * @param contextFactory The Tiles context factory.
+     * @param resolver The locale resolver.
+     * @return The definition DAO.
+     * @since 2.1.0
+     */
+    protected DefinitionDAO<Locale> createLocaleDefinitionDao(Object context,
+            TilesApplicationContext applicationContext,
+            TilesContextFactory contextFactory, LocaleResolver resolver) {
+        LocaleUrlDefinitionDAO definitionDao = new LocaleUrlDefinitionDAO();
+        definitionDao.setReader(createDefinitionsReader(context, applicationContext,
+                contextFactory));
+        definitionDao.setSourceURLs(getSourceURLs(context, applicationContext,
+                contextFactory));
+        return definitionDao;
+    }
+    /**
      * Creates the locale resolver. By default it creates a
      * {@link DefaultLocaleResolver}.
      *

Added: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java?rev=666834&view=auto
==============================================================================
--- tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java (added)
+++ tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java Wed Jun 11 13:49:05 2008
@@ -0,0 +1,128 @@
+/*
+ * $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.
+ */
+package org.apache.tiles.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Utilities for locale manipulation.
+ *
+ * @version $Rev$ $Date$
+ * @since 2.1.0
+ */
+public final class LocaleUtil {
+
+    /**
+     * Private constructor to avoid instantiation.
+     */
+    private LocaleUtil() {
+    }
+
+    /**
+     * Calculate the postfixes along the search path from the base bundle to the
+     * bundle specified by baseName and locale. Method copied from
+     * java.util.ResourceBundle
+     *
+     * @param locale The locale.
+     * @return a list of postfixes to add to filenames.
+     * @since 2.1.0
+     */
+    public static List<String> calculatePostfixes(Locale locale) {
+        final List<String> result = new ArrayList<String>();
+        // The default configuration file must be loaded to allow correct
+        // definition inheritance.
+        result.add("");
+
+        if (locale == null) {
+            return result;
+        }
+
+        final String language = locale.getLanguage();
+        final int languageLength = language.length();
+        final String country = locale.getCountry();
+        final int countryLength = country.length();
+        final String variant = locale.getVariant();
+        final int variantLength = variant.length();
+
+        if (languageLength + countryLength + variantLength == 0) {
+            // The locale is "", "", "".
+            return result;
+        }
+
+        final StringBuffer temp = new StringBuffer();
+        temp.append('_');
+        temp.append(language);
+
+        if (languageLength > 0) {
+            result.add(temp.toString());
+        }
+
+        if (countryLength + variantLength == 0) {
+            return result;
+        }
+
+        temp.append('_');
+        temp.append(country);
+
+        if (countryLength > 0) {
+            result.add(temp.toString());
+        }
+
+        if (variantLength == 0) {
+            return result;
+        } else {
+            temp.append('_');
+            temp.append(variant);
+            result.add(temp.toString());
+            return result;
+        }
+    }
+
+    /**
+     * Concat postfix to the name. Take care of existing filename extension.
+     * Transform the given name "name.ext" to have "name" + "postfix" + "ext".
+     * If there is no ext, return "name" + "postfix".
+     *
+     * @param name Filename.
+     * @param postfix Postfix to add.
+     * @return Concatenated filename.
+     * @since 2.1.0
+     */
+    public static String concatPostfix(String name, String postfix) {
+        if (postfix == null) {
+            return name;
+        }
+
+        // Search file name extension.
+        // take care of Unix files starting with .
+        int dotIndex = name.lastIndexOf(".");
+        int lastNameStart = name.lastIndexOf(java.io.File.pathSeparator);
+        if (dotIndex < 1 || dotIndex < lastNameStart) {
+            return name + postfix;
+        }
+
+        String ext = name.substring(dotIndex);
+        name = name.substring(0, dotIndex);
+        return name + postfix + ext;
+    }
+}

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tiles/framework/trunk/tiles-core/src/main/java/org/apache/tiles/util/LocaleUtil.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/TestUrlDefinitionsFactory.java
URL: http://svn.apache.org/viewvc/tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/TestUrlDefinitionsFactory.java?rev=666834&r1=666833&r2=666834&view=diff
==============================================================================
--- tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/TestUrlDefinitionsFactory.java (original)
+++ tiles/framework/trunk/tiles-core/src/test/java/org/apache/tiles/definition/TestUrlDefinitionsFactory.java Wed Jun 11 13:49:05 2008
@@ -33,6 +33,7 @@
 
 import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.context.TilesRequestContext;
+import org.apache.tiles.util.LocaleUtil;
 import org.easymock.EasyMock;
 
 /**
@@ -373,13 +374,13 @@
     public void testCalculatePostfixes() {
         Locale locale = Locale.US;
 
-        List<String> posts = UrlDefinitionsFactory.calculatePostfixes(locale);
+        List<String> posts = LocaleUtil.calculatePostfixes(locale);
         assertEquals(POSTFIX_COUNT, posts.size());
         assertTrue(posts.contains("_en_US"));
         assertTrue(posts.contains("_en"));
 
         locale = Locale.ENGLISH;
-        posts = UrlDefinitionsFactory.calculatePostfixes(locale);
+        posts = LocaleUtil.calculatePostfixes(locale);
         assertEquals(2, posts.size());
         assertTrue(posts.contains("_en"));
     }
@@ -388,11 +389,10 @@
      * Tests the concatPostfix method.
      */
     public void testConcatPostfix() {
-        UrlDefinitionsFactory factory = new UrlDefinitionsFactory();
         String postfix = "_en_US";
-        assertEquals("a_en_US", factory.concatPostfix("a", postfix));
-        assertEquals("a_en_US.jsp", factory.concatPostfix("a.jsp", postfix));
-        assertEquals("file_en_US.jsp", factory.concatPostfix("file.jsp", postfix));
-        assertEquals("./path/file_en_US.jsp", factory.concatPostfix("./path/file.jsp", postfix));
+        assertEquals("a_en_US", LocaleUtil.concatPostfix("a", postfix));
+        assertEquals("a_en_US.jsp", LocaleUtil.concatPostfix("a.jsp", postfix));
+        assertEquals("file_en_US.jsp", LocaleUtil.concatPostfix("file.jsp", postfix));
+        assertEquals("./path/file_en_US.jsp", LocaleUtil.concatPostfix("./path/file.jsp", postfix));
     }
 }