svn merge -c1539385 ^/tiles/framework/branches/TILES_3_0_X .
> TILES-573 – Tiles.xml definitions not reloaded when using expressions
> Contribution from Eric B.


git-svn-id: https://svn.apache.org/repos/asf/tiles/framework/trunk@1539386 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java b/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java
index 542d8d7..cee95a3 100644
--- a/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java
+++ b/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java
@@ -166,10 +166,10 @@
      * @return The loaded definitions.
      * @since 2.1.0
      */
-    protected synchronized Map<String, Definition> checkAndloadDefinitions(
-            Locale customizationKey) {
+    protected synchronized Map<String, Definition> checkAndloadDefinitions(Locale customizationKey) {
         if (checkRefresh && refreshRequired()) {
             locale2definitionMap.clear();
+            definitionResolver.clearPatternPaths(customizationKey);
         }
         loadDefinitions(customizationKey);
         return locale2definitionMap.get(customizationKey);
diff --git a/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java b/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java
index 65ff73d..50bc8f7 100644
--- a/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java
+++ b/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java
@@ -106,4 +106,17 @@
 
         return d;
     }
+    
+    
+    /**
+     * Used to clear all entries in the localePatternPaths for a specific locale. Necessary when reloading definition
+     * files to ensure that the list is cleared first
+     * 
+     * @param customizationKey
+     */
+    @Override
+    public void clearPatternPaths(T customizationKey) {
+        if (localePatternPaths.get(customizationKey) != null)
+            localePatternPaths.get(customizationKey).clear();
+    }
 }
diff --git a/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java b/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java
index 539f8dd..2cf3d4b 100644
--- a/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java
+++ b/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java
@@ -57,4 +57,12 @@
      * @since 2.2.0
      */
     Definition resolveDefinition(String name, T customizationKey);
+
+    /**
+     * Used to clear all entries in the localePatternPaths for a specific locale. Necessary when reloading definition
+     * files to ensure that the list is cleared first
+     * 
+     * @param customizationKey
+     */
+    public void clearPatternPaths(T customizationKey);
 }
diff --git a/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java b/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java
index 10a39a8..a564e37 100644
--- a/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java
+++ b/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java
@@ -40,60 +40,70 @@
  */
 public class AbstractPatternDefinitionResolverTest {
 
+    private DefinitionPatternMatcher firstMatcher;
+    private DefinitionPatternMatcher thirdMatcher;
+
+    private final PatternDefinitionResolver<Integer> resolver = new AbstractPatternDefinitionResolver<Integer>() {
+        @Override
+        protected Map<String, Definition> addDefinitionsAsPatternMatchers(
+                List<DefinitionPatternMatcher> matchers,
+                Map<String, Definition> defsMap) {
+
+            if (defsMap.containsKey("first")) {
+                matchers.add(firstMatcher);
+            }
+            if (defsMap.containsKey("third")) {
+                matchers.add(thirdMatcher);
+            }
+            Map<String, Definition> retValue = new HashMap<String, Definition>(defsMap);
+            retValue.remove("first");
+            retValue.remove("third");
+            return retValue;
+        }
+    };
+
     /**
      * Test method for
      * {@link BasicPatternDefinitionResolver#resolveDefinition(String, Object)}.
      */
     @Test
     public void testResolveDefinition() {
-        final DefinitionPatternMatcher firstMatcher = createMock(DefinitionPatternMatcher.class);
-        final DefinitionPatternMatcher thirdMatcher = createMock(DefinitionPatternMatcher.class);
+        testResolveDefinitionImpl();
+    }
 
-        Definition firstDefinition = new Definition("first", (Attribute) null,
-                null);
-        Definition secondDefinition = new Definition("second",
-                (Attribute) null, null);
-        Definition thirdDefinition = new Definition("third", (Attribute) null,
-                null);
+    /**
+     * Test method for
+     * {@link BasicPatternDefinitionResolver#clearPatternPaths(Object)}.
+     */
+    @Test
+    public void testClearPatternPaths() {
+        testResolveDefinitionImpl();
+        resolver.clearPatternPaths(1);
+        resolver.clearPatternPaths(2);
+        testResolveDefinitionImpl();
+    }
 
-        Definition firstTransformedDefinition = new Definition(
-                "firstTransformed", (Attribute) null, null);
-        Definition thirdTransformedDefinition = new Definition(
-                "thirdTransformed", (Attribute) null, null);
+    private void testResolveDefinitionImpl() {
 
-        expect(firstMatcher.createDefinition("firstTransformed")).andReturn(
-                firstTransformedDefinition);
-        expect(firstMatcher.createDefinition("secondTransformed")).andReturn(
-                null);
-        expect(firstMatcher.createDefinition("thirdTransformed")).andReturn(
-                null);
-        expect(thirdMatcher.createDefinition("thirdTransformed")).andReturn(
-                thirdTransformedDefinition).times(2);
-        expect(thirdMatcher.createDefinition("firstTransformed")).andReturn(
-                null);
-        expect(thirdMatcher.createDefinition("secondTransformed")).andReturn(
-                null).times(2);
+        firstMatcher = createMock(DefinitionPatternMatcher.class);
+        thirdMatcher = createMock(DefinitionPatternMatcher.class);
+
+        Definition firstDefinition = new Definition("first", (Attribute) null, null);
+        Definition secondDefinition = new Definition("second", (Attribute) null, null);
+        Definition thirdDefinition = new Definition("third", (Attribute) null, null);
+
+        Definition firstTransformedDefinition = new Definition("firstTransformed", (Attribute) null, null);
+        Definition thirdTransformedDefinition = new Definition("thirdTransformed", (Attribute) null, null);
+
+        expect(firstMatcher.createDefinition("firstTransformed")).andReturn(firstTransformedDefinition);
+        expect(firstMatcher.createDefinition("secondTransformed")).andReturn(null);
+        expect(firstMatcher.createDefinition("thirdTransformed")).andReturn(null);
+        expect(thirdMatcher.createDefinition("thirdTransformed")).andReturn(thirdTransformedDefinition).times(2);
+        expect(thirdMatcher.createDefinition("firstTransformed")).andReturn(null);
+        expect(thirdMatcher.createDefinition("secondTransformed")).andReturn(null).times(2);
 
         replay(firstMatcher, thirdMatcher);
-        PatternDefinitionResolver<Integer> resolver = new AbstractPatternDefinitionResolver<Integer>() {
 
-            @Override
-            protected Map<String, Definition> addDefinitionsAsPatternMatchers(
-                    List<DefinitionPatternMatcher> matchers,
-                    Map<String, Definition> defsMap) {
-                if (defsMap.containsKey("first")) {
-                    matchers.add(firstMatcher);
-                }
-                if (defsMap.containsKey("third")) {
-                    matchers.add(thirdMatcher);
-                }
-                Map<String, Definition> retValue = new HashMap<String, Definition>(defsMap);
-                retValue.remove("first");
-                retValue.remove("third");
-                return retValue;
-            }
-
-        };
         Map<String, Definition> localeDefsMap = new LinkedHashMap<String, Definition>();
         localeDefsMap.put("first", firstDefinition);
         localeDefsMap.put("second", secondDefinition);