You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/05/12 00:50:37 UTC

svn commit: r943321 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/services/ test/java/org/apache/tapestry5/internal/services/

Author: hlship
Date: Tue May 11 22:50:36 2010
New Revision: 943321

URL: http://svn.apache.org/viewvc?rev=943321&view=rev
Log:
TAP5-424: Phase out ValidationMessagesSource by having Global application message catalog override any catalogs contributed to ValidationMessagesSource

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DelegatingMessagesImpl.java   (with props)
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ValidationMessagesSource.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DelegatingMessagesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DelegatingMessagesImpl.java?rev=943321&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DelegatingMessagesImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DelegatingMessagesImpl.java Tue May 11 22:50:36 2010
@@ -0,0 +1,61 @@
+// Copyright 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.internal.services;
+
+import org.apache.tapestry5.ioc.MessageFormatter;
+import org.apache.tapestry5.ioc.Messages;
+
+/**
+ * Implementation of {@link Messages} that wraps two other Messages instances: a primary and a delegate.
+ * The primary handles any keys it contains; method invocations that reference keys not contained by
+ * the primary are passed on to the delegate.
+ * 
+ * @since 5.2.0
+ */
+public class DelegatingMessagesImpl implements Messages
+{
+    private final Messages primary, delegate;
+
+    public DelegatingMessagesImpl(Messages primary, Messages delegate)
+    {
+        this.primary = primary;
+        this.delegate = delegate;
+    }
+
+    public boolean contains(String key)
+    {
+        return primary.contains(key) || delegate.contains(key);
+    }
+
+    private Messages select(String key)
+    {
+        return primary.contains(key) ? primary : delegate;
+    }
+
+    public String format(String key, Object... args)
+    {
+        return select(key).format(key, args);
+    }
+
+    public String get(String key)
+    {
+        return select(key).get(key);
+    }
+
+    public MessageFormatter getFormatter(String key)
+    {
+        return select(key).getFormatter(key);
+    }
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/DelegatingMessagesImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java?rev=943321&r1=943320&r2=943321&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImpl.java Tue May 11 22:50:36 2010
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ import org.apache.tapestry5.ioc.internal
 import org.apache.tapestry5.ioc.services.ClasspathURLConverter;
 import org.apache.tapestry5.services.UpdateListener;
 import org.apache.tapestry5.services.ValidationMessagesSource;
+import org.apache.tapestry5.services.messages.ComponentMessagesSource;
 import org.apache.tapestry5.services.messages.PropertiesFileParser;
 
 import java.util.List;
@@ -30,6 +31,8 @@ import java.util.Map;
 
 public class ValidationMessagesSourceImpl implements ValidationMessagesSource, UpdateListener
 {
+    private final ComponentMessagesSource componentMessagesSource;
+
     private final MessagesSource messagesSource;
 
     private final MessagesBundle bundle;
@@ -110,15 +113,16 @@ public class ValidationMessagesSourceImp
     }
 
     public ValidationMessagesSourceImpl(List<String> bundles, Resource classpathRoot, PropertiesFileParser parser,
-            ClasspathURLConverter classpathURLConverter)
+            ComponentMessagesSource componentMessagesSource, ClasspathURLConverter classpathURLConverter)
     {
-        this(bundles, classpathRoot, parser, new URLChangeTracker(classpathURLConverter));
+        this(bundles, classpathRoot, parser, componentMessagesSource, new URLChangeTracker(classpathURLConverter));
     }
 
     ValidationMessagesSourceImpl(List<String> bundles, Resource classpathRoot, PropertiesFileParser parser,
-            URLChangeTracker tracker)
+            ComponentMessagesSource componentMessagesSource, URLChangeTracker tracker)
     {
         messagesSource = new MessagesSourceImpl(tracker, parser);
+        this.componentMessagesSource = componentMessagesSource;
 
         MessagesBundle parent = null;
 
@@ -138,7 +142,10 @@ public class ValidationMessagesSourceImp
 
         if (result == null)
         {
-            result = new ValidationMessages(locale);
+            Messages appCatalog = componentMessagesSource.getApplicationCatalog(locale);
+            Messages validation = new ValidationMessages(locale);
+            result = new DelegatingMessagesImpl(appCatalog, validation);
+
             cache.put(locale, result);
         }
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=943321&r1=943320&r2=943321&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Tue May 11 22:50:36 2010
@@ -1327,10 +1327,12 @@ public final class TapestryModule
 
     PropertiesFileParser parser,
 
+    ComponentMessagesSource componentMessagesSource,
+
     ClasspathURLConverter classpathURLConverter)
     {
         ValidationMessagesSourceImpl service = new ValidationMessagesSourceImpl(configuration, classpathAssetFactory
-                .getRootResource(), parser, classpathURLConverter);
+                .getRootResource(), parser, componentMessagesSource, classpathURLConverter);
         updateListenerHub.addUpdateListener(service);
 
         return service;

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ValidationMessagesSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ValidationMessagesSource.java?rev=943321&r1=943320&r2=943321&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ValidationMessagesSource.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ValidationMessagesSource.java Tue May 11 22:50:36 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2008 The Apache Software Foundation
+// Copyright 2006, 2008, 2010 The Apache Software Foundation
 //
 // Licensed 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
+// 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,
@@ -16,6 +16,7 @@ package org.apache.tapestry5.services;
 
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.annotations.UsesOrderedConfiguration;
+import org.apache.tapestry5.services.messages.ComponentMessagesSource;
 
 import java.util.Locale;
 
@@ -23,6 +24,13 @@ import java.util.Locale;
  * Source for validation messages, within a particular locale.
  * <p/>
  * The service's configuration are paths, within the classpath, to bundles to load as part of the validation messages.
+ * <p>
+ * Starting with Tapestry 5.2, the returned Messages reflects all the contributed paths, with the
+ * {@linkplain ComponentMessagesSource#getApplicationCatalog(java.util.Locale) global application catalog} ordered to
+ * <em>override</em> any of the messages supplied by a contributed resource. This service will be elminated entirely in
+ * Tapestry 5.3.
+ * 
+ * @deprecated Contribute to the {@link ComponentMessagesSource} service instead
  */
 @UsesOrderedConfiguration(String.class)
 public interface ValidationMessagesSource

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java?rev=943321&r1=943320&r2=943321&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ValidationMessagesSourceImplTest.java Tue May 11 22:50:36 2010
@@ -14,20 +14,23 @@
 
 package org.apache.tapestry5.internal.services;
 
+import java.util.Arrays;
+import java.util.Locale;
+
 import org.apache.tapestry5.internal.services.messages.PropertiesFileParserImpl;
 import org.apache.tapestry5.ioc.MessageFormatter;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.services.ClasspathURLConverterImpl;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
+import org.apache.tapestry5.model.ComponentModel;
+import org.apache.tapestry5.services.InvalidationEventHub;
 import org.apache.tapestry5.services.ValidationMessagesSource;
+import org.apache.tapestry5.services.messages.ComponentMessagesSource;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import java.util.Arrays;
-import java.util.Locale;
-
 public class ValidationMessagesSourceImplTest extends Assert
 {
     private ValidationMessagesSource source;
@@ -35,10 +38,54 @@ public class ValidationMessagesSourceImp
     @BeforeClass
     public void setup()
     {
+        final Messages mockMessages = new Messages()
+        {
+
+            public boolean contains(String key)
+            {
+                return key.equalsIgnoreCase("braniac");
+            }
+
+            public String format(String key, Object... args)
+            {
+                return null;
+            }
+
+            public String get(String key)
+            {
+                return "Braniac";
+            }
+
+            public MessageFormatter getFormatter(String key)
+            {
+                return null;
+            }
+
+        };
+
+        ComponentMessagesSource mockMessagesSource = new ComponentMessagesSource()
+        {
+
+            public Messages getMessages(ComponentModel componentModel, Locale locale)
+            {
+                return null;
+            }
+
+            public InvalidationEventHub getInvalidationEventHub()
+            {
+                return null;
+            }
+
+            public Messages getApplicationCatalog(Locale locale)
+            {
+                return mockMessages;
+            }
+        };
+
         Resource rootResource = new ClasspathResource("/");
         source = new ValidationMessagesSourceImpl(Arrays.asList("org/apache/tapestry5/internal/ValidationMessages",
                 "org/apache/tapestry5/internal/ValidationTestMessages"), rootResource, new PropertiesFileParserImpl(),
-                new ClasspathURLConverterImpl());
+                mockMessagesSource, new ClasspathURLConverterImpl());
     }
 
     @Test
@@ -49,6 +96,17 @@ public class ValidationMessagesSourceImp
         assertEquals(messages.format("required", "My Field"), "You must provide a value for My Field.");
     }
 
+    /** TAP5-424 */
+    @Test
+    public void application_catalog_override()
+    {
+        Messages messages = source.getValidationMessages(Locale.ENGLISH);
+
+        assertTrue(messages.contains("braniac"));
+
+        assertEquals(messages.get("braniac"), "Braniac");
+    }
+
     @Test
     public void overriden_message()
     {