Author: hlship
Date: Wed Nov 29 15:44:05 2006
New Revision: 480770

URL: http://svn.apache.org/viewvc?view=rev&rev=480770
Log:
Add support for injecting Messages (obtained from the ComponentMessagesSource) 
into components.

Added:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CommonResourcesInjectionProvider.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
    
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
Modified:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/infrastructure.apt
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/inject.apt
    tapestry/tapestry5/tapestry-core/trunk/src/test/app1/index.html
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageElementFactoryImplTest.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResources.java
 Wed Nov 29 15:44:05 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry;
 
+import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.runtime.Component;
 
@@ -65,4 +66,7 @@
      * @param writer
      */
     void renderInformalParameters(MarkupWriter writer);
+
+    /** Returns the message catalog for this component. */
+    Messages getMessages();
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
 Wed Nov 29 15:44:05 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry;
 
+import java.util.Locale;
+
 import org.apache.commons.logging.Log;
 import org.apache.tapestry.internal.structure.ComponentPageElement;
 import org.apache.tapestry.model.ComponentModel;
@@ -96,4 +98,7 @@
      * @see ComponentModel#getLog()
      */
     Log getLog();
+
+    /** Returns the locale for the page containing this component. */
+    Locale getLocale();
 }

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CommonResourcesInjectionProvider.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CommonResourcesInjectionProvider.java?view=auto&rev=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CommonResourcesInjectionProvider.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/CommonResourcesInjectionProvider.java
 Wed Nov 29 15:44:05 2006
@@ -0,0 +1,73 @@
+// Copyright 2006 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.tapestry.internal.services;
+
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
+
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.ioc.Messages;
+import org.apache.tapestry.ioc.ServiceLocator;
+import org.apache.tapestry.model.MutableComponentModel;
+import org.apache.tapestry.services.ClassTransformation;
+import org.apache.tapestry.services.InjectionProvider;
+import org.apache.tapestry.services.TransformConstants;
+
+/**
+ * Allows for a number of annonymous injections based on the type of field 
that is to be injected.
+ */
+public class CommonResourcesInjectionProvider implements InjectionProvider
+{
+    private static final Map<String, String> _configuration = newMap();
+
+    public CommonResourcesInjectionProvider()
+    {
+        add(Messages.class, "getMessages");
+        add(Locale.class, "getLocale");
+        add(Log.class, "getLog");
+        add(String.class, "getCompleteId");
+    }
+
+    private void add(Class fieldType, String methodName)
+    {
+        _configuration.put(fieldType.getName(), methodName);
+    }
+
+    public boolean provideInjection(String fieldName, String fieldType, 
ServiceLocator locator,
+            ClassTransformation transformation, MutableComponentModel 
componentModel)
+    {
+        String implementationMethodName = _configuration.get(fieldType);
+
+        if (implementationMethodName == null)
+            return false;
+
+        String resourcesField = transformation.getResourcesFieldName();
+
+        String body = String.format(
+                "%s = %s.%s();",
+                fieldName,
+                resourcesField,
+                implementationMethodName);
+
+        transformation.makeReadOnly(fieldName);
+
+        
transformation.extendMethod(TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE,
 body);
+
+        return true;
+    }
+
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
 Wed Nov 29 15:44:05 2006
@@ -53,6 +53,7 @@
 import org.apache.tapestry.services.BindingSource;
 import org.apache.tapestry.services.ComponentClassResolver;
 import org.apache.tapestry.services.ComponentClassTransformWorker;
+import org.apache.tapestry.services.ComponentMessagesSource;
 import org.apache.tapestry.services.MarkupWriterFactory;
 import org.apache.tapestry.services.PageRenderInitializer;
 import org.apache.tapestry.services.PersistentFieldManager;
@@ -148,11 +149,12 @@
     }
 
     public PageElementFactory 
buildPageElementFactory(@Inject("infrastructure:typeCoercer")
-    TypeCoercer typeCoercer, @InjectService("tapestry.BindingSource")
-    BindingSource bindingSource)
+    TypeCoercer typeCoercer, @Inject("infrastructure:bindingSource")
+    BindingSource bindingSource, 
@Inject("infrastructure:componentMessagesSource")
+    ComponentMessagesSource componentMessagesSource)
     {
         return new PageElementFactoryImpl(_componentInstantiatorSource, 
_componentClassResolver,
-                typeCoercer, bindingSource);
+                typeCoercer, bindingSource, componentMessagesSource);
     }
 
     public PageLoader buildPageLoader(@InjectService("PageElementFactory")

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageElementFactoryImpl.java
 Wed Nov 29 15:44:05 2006
@@ -12,200 +12,205 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.internal.services;
-
-import org.apache.tapestry.ComponentResources;
-import org.apache.tapestry.MarkupWriter;
-import org.apache.tapestry.internal.InternalConstants;
-import org.apache.tapestry.internal.parser.AttributeToken;
-import org.apache.tapestry.internal.parser.ExpansionToken;
-import org.apache.tapestry.internal.parser.StartElementToken;
-import org.apache.tapestry.internal.parser.TextToken;
-import org.apache.tapestry.internal.structure.AttributePageElement;
-import org.apache.tapestry.internal.structure.ComponentPageElement;
-import org.apache.tapestry.internal.structure.ComponentPageElementImpl;
-import org.apache.tapestry.internal.structure.ExpansionPageElement;
-import org.apache.tapestry.internal.structure.Page;
-import org.apache.tapestry.internal.structure.PageElement;
-import org.apache.tapestry.internal.structure.StartElementPageElement;
-import org.apache.tapestry.internal.structure.TextPageElement;
+package org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.internal.InternalConstants;
+import org.apache.tapestry.internal.parser.AttributeToken;
+import org.apache.tapestry.internal.parser.ExpansionToken;
+import org.apache.tapestry.internal.parser.StartElementToken;
+import org.apache.tapestry.internal.parser.TextToken;
+import org.apache.tapestry.internal.structure.AttributePageElement;
+import org.apache.tapestry.internal.structure.ComponentPageElement;
+import org.apache.tapestry.internal.structure.ComponentPageElementImpl;
+import org.apache.tapestry.internal.structure.ExpansionPageElement;
+import org.apache.tapestry.internal.structure.Page;
+import org.apache.tapestry.internal.structure.PageElement;
+import org.apache.tapestry.internal.structure.StartElementPageElement;
+import org.apache.tapestry.internal.structure.TextPageElement;
 import org.apache.tapestry.ioc.Location;
 import org.apache.tapestry.ioc.internal.util.InternalUtils;
 import org.apache.tapestry.ioc.internal.util.TapestryException;
-import org.apache.tapestry.ioc.services.TypeCoercer;
-import org.apache.tapestry.model.ComponentModel;
-import org.apache.tapestry.runtime.RenderQueue;
+import org.apache.tapestry.ioc.services.TypeCoercer;
+import org.apache.tapestry.model.ComponentModel;
+import org.apache.tapestry.runtime.RenderQueue;
 import org.apache.tapestry.services.Binding;
-import org.apache.tapestry.services.BindingSource;
-import org.apache.tapestry.services.ComponentClassResolver;
-
-/**
- * Null check suppressed as much as to simplify testing (yea! I can pass a 
null TypeCoercer) as it
- * is for efficiency.
- */
-
-public class PageElementFactoryImpl implements PageElementFactory
-{
-    private final ComponentInstantiatorSource _componentInstantiatorSource;
-
-    private final ComponentClassResolver _componentClassResolver;
-
-    private final TypeCoercer _typeCoercer;
-
-    private final BindingSource _bindingSource;
-
-    public PageElementFactoryImpl(ComponentInstantiatorSource 
componentInstantiatorSource,
-            ComponentClassResolver resolver, TypeCoercer typeCoercer, 
BindingSource bindingSource)
-    {
-        _componentInstantiatorSource = componentInstantiatorSource;
-        _componentClassResolver = resolver;
-        _typeCoercer = typeCoercer;
-        _bindingSource = bindingSource;
-    }
-
-    /** Singleton instance that represents any close tag of any element in any 
template. */
-    private final PageElement _endElement = new PageElement()
-    {
-        public void render(MarkupWriter writer, RenderQueue queue)
-        {
-            writer.end();
-        }
-
-        @Override
-        public String toString()
-        {
-            return "End";
-        }
-    };
-
-    public PageElement newStartElement(StartElementToken token)
-    {
-        return new StartElementPageElement(token.getName());
-    }
-
-    public PageElement newTextElement(TextToken token)
-    {
-        return new TextPageElement(token.getText());
-    }
-
-    public PageElement newEndElement()
-    {
-        return _endElement;
-    }
-
-    public PageElement newAttributeElement(AttributeToken token)
-    {
-        return new AttributePageElement(token.getName(), token.getValue());
-    }
-
-    public PageElement newExpansionElement(ComponentResources 
componentResources,
-            ExpansionToken token)
-    {
-        Binding binding = _bindingSource.newBinding(
-                "expansion",
-                componentResources,
-                InternalConstants.PROP_BINDING_PREFIX,
-                token.getExpression(),
-                token.getLocation());
-
-        return new ExpansionPageElement(binding, _typeCoercer);
-    }
-
-    public ComponentPageElement newComponentElement(Page page, 
ComponentPageElement container,
-            String id, String componentType, String componentClassName, 
Location location)
-    {
-        String finalClassName = componentClassName;
-
-        // This awkwardness is making me think that the page loader should 
resolve the component
-        // type before invoking this method (we would then remove the 
componentType parameter).
-
-        if (InternalUtils.isNonBlank(componentType))
-        {
-            // The type actually overrides the specified class name. The class 
name is defined
-            // by the type of the field. In many scenarios, the field type is 
a common interface,
-            // and the type is used to determine the concrete class to 
instantiate.
-
-            try
-            {
-                finalClassName = _componentClassResolver
-                        .resolveComponentTypeToClassName(componentType);
-            }
-            catch (IllegalArgumentException ex)
-            {
-                throw new TapestryException(ex.getMessage(), location, ex);
-            }
-        }
-
-        Instantiator instantiator = 
_componentInstantiatorSource.findInstantiator(finalClassName);
-
-        // The container for any components is the loading component, 
regardless of
-        // how the component elements are nested within the loading component's
-        // template.
-
-        ComponentPageElementImpl result = new ComponentPageElementImpl(page, 
container, id,
-                instantiator, _typeCoercer, location);
-
-        page.addLifecycleListener(result);
-
-        container.addEmbeddedElement(result);
-
-        addMixins(result, instantiator);
-
-        return result;
-    }
-
-    public ComponentPageElement newRootComponentElement(Page page, String 
componentType)
-    {
-        Instantiator instantiator = 
_componentInstantiatorSource.findInstantiator(componentType);
-
-        ComponentPageElementImpl result = new ComponentPageElementImpl(page, 
instantiator,
-                _typeCoercer);
-
-        addMixins(result, instantiator);
-
-        page.addLifecycleListener(result);
-
-        return result;
-    }
-
-    private void addMixins(ComponentPageElement component, Instantiator 
instantiator)
-    {
-        ComponentModel model = instantiator.getModel();
-        for (String mixinClassName : model.getMixinClassNames())
-            addMixinByClassName(component, mixinClassName);
-    }
-
-    public PageElement newRenderBodyElement(final ComponentPageElement 
component)
-    {
-        return new PageElement()
-        {
-            public void render(MarkupWriter writer, RenderQueue queue)
-            {
-                component.enqueueBeforeRenderBody(queue);
-            }
-
-            @Override
-            public String toString()
-            {
-                // TODO: Change this to be nested id
-                return String.format("RenderBody[%s]", component.getId());
-            }
-        };
-    }
-
-    public void addMixinByTypeName(ComponentPageElement component, String 
mixinType)
-    {
-        String mixinClassName = 
_componentClassResolver.resolveMixinTypeToClassName(mixinType);
-
-        addMixinByClassName(component, mixinClassName);
-    }
-
-    public void addMixinByClassName(ComponentPageElement component, String 
mixinClassName)
-    {
-        Instantiator mixinInstantiator = _componentInstantiatorSource
-                .findInstantiator(mixinClassName);
-
-        component.addMixin(mixinInstantiator);
-    }
-
-}
+import org.apache.tapestry.services.BindingSource;
+import org.apache.tapestry.services.ComponentClassResolver;
+import org.apache.tapestry.services.ComponentMessagesSource;
+
+/**
+ * Null check suppressed as much as to simplify testing (yea! I can pass a 
null TypeCoercer) as it
+ * is for efficiency.
+ */
+
+public class PageElementFactoryImpl implements PageElementFactory
+{
+    private final ComponentInstantiatorSource _componentInstantiatorSource;
+
+    private final ComponentClassResolver _componentClassResolver;
+
+    private final TypeCoercer _typeCoercer;
+
+    private final BindingSource _bindingSource;
+
+    private final ComponentMessagesSource _messagesSource;
+
+    public PageElementFactoryImpl(ComponentInstantiatorSource 
componentInstantiatorSource,
+            ComponentClassResolver resolver, TypeCoercer typeCoercer, 
BindingSource bindingSource,
+            ComponentMessagesSource messagesSource)
+    {
+        _componentInstantiatorSource = componentInstantiatorSource;
+        _componentClassResolver = resolver;
+        _typeCoercer = typeCoercer;
+        _bindingSource = bindingSource;
+        _messagesSource = messagesSource;
+    }
+
+    /** Singleton instance that represents any close tag of any element in any 
template. */
+    private final PageElement _endElement = new PageElement()
+    {
+        public void render(MarkupWriter writer, RenderQueue queue)
+        {
+            writer.end();
+        }
+
+        @Override
+        public String toString()
+        {
+            return "End";
+        }
+    };
+
+    public PageElement newStartElement(StartElementToken token)
+    {
+        return new StartElementPageElement(token.getName());
+    }
+
+    public PageElement newTextElement(TextToken token)
+    {
+        return new TextPageElement(token.getText());
+    }
+
+    public PageElement newEndElement()
+    {
+        return _endElement;
+    }
+
+    public PageElement newAttributeElement(AttributeToken token)
+    {
+        return new AttributePageElement(token.getName(), token.getValue());
+    }
+
+    public PageElement newExpansionElement(ComponentResources 
componentResources,
+            ExpansionToken token)
+    {
+        Binding binding = _bindingSource.newBinding(
+                "expansion",
+                componentResources,
+                InternalConstants.PROP_BINDING_PREFIX,
+                token.getExpression(),
+                token.getLocation());
+
+        return new ExpansionPageElement(binding, _typeCoercer);
+    }
+
+    public ComponentPageElement newComponentElement(Page page, 
ComponentPageElement container,
+            String id, String componentType, String componentClassName, 
Location location)
+    {
+        String finalClassName = componentClassName;
+
+        // This awkwardness is making me think that the page loader should 
resolve the component
+        // type before invoking this method (we would then remove the 
componentType parameter).
+
+        if (InternalUtils.isNonBlank(componentType))
+        {
+            // The type actually overrides the specified class name. The class 
name is defined
+            // by the type of the field. In many scenarios, the field type is 
a common interface,
+            // and the type is used to determine the concrete class to 
instantiate.
+
+            try
+            {
+                finalClassName = _componentClassResolver
+                        .resolveComponentTypeToClassName(componentType);
+            }
+            catch (IllegalArgumentException ex)
+            {
+                throw new TapestryException(ex.getMessage(), location, ex);
+            }
+        }
+
+        Instantiator instantiator = 
_componentInstantiatorSource.findInstantiator(finalClassName);
+
+        // The container for any components is the loading component, 
regardless of
+        // how the component elements are nested within the loading component's
+        // template.
+
+        ComponentPageElementImpl result = new ComponentPageElementImpl(page, 
container, id,
+                instantiator, _typeCoercer, _messagesSource, location);
+
+        page.addLifecycleListener(result);
+
+        container.addEmbeddedElement(result);
+
+        addMixins(result, instantiator);
+
+        return result;
+    }
+
+    public ComponentPageElement newRootComponentElement(Page page, String 
componentType)
+    {
+        Instantiator instantiator = 
_componentInstantiatorSource.findInstantiator(componentType);
+
+        ComponentPageElementImpl result = new ComponentPageElementImpl(page, 
instantiator,
+                _typeCoercer, _messagesSource);
+
+        addMixins(result, instantiator);
+
+        page.addLifecycleListener(result);
+
+        return result;
+    }
+
+    private void addMixins(ComponentPageElement component, Instantiator 
instantiator)
+    {
+        ComponentModel model = instantiator.getModel();
+        for (String mixinClassName : model.getMixinClassNames())
+            addMixinByClassName(component, mixinClassName);
+    }
+
+    public PageElement newRenderBodyElement(final ComponentPageElement 
component)
+    {
+        return new PageElement()
+        {
+            public void render(MarkupWriter writer, RenderQueue queue)
+            {
+                component.enqueueBeforeRenderBody(queue);
+            }
+
+            @Override
+            public String toString()
+            {
+                // TODO: Change this to be nested id
+                return String.format("RenderBody[%s]", component.getId());
+            }
+        };
+    }
+
+    public void addMixinByTypeName(ComponentPageElement component, String 
mixinType)
+    {
+        String mixinClassName = 
_componentClassResolver.resolveMixinTypeToClassName(mixinType);
+
+        addMixinByClassName(component, mixinClassName);
+    }
+
+    public void addMixinByClassName(ComponentPageElement component, String 
mixinClassName)
+    {
+        Instantiator mixinInstantiator = _componentInstantiatorSource
+                .findInstantiator(mixinClassName);
+
+        component.addMixin(mixinInstantiator);
+    }
+
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
 Wed Nov 29 15:44:05 2006
@@ -19,6 +19,7 @@
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -44,6 +45,7 @@
 import org.apache.tapestry.runtime.RenderCommand;
 import org.apache.tapestry.runtime.RenderQueue;
 import org.apache.tapestry.services.Binding;
+import org.apache.tapestry.services.ComponentMessagesSource;
 
 /**
  * Implements [EMAIL PROTECTED] 
org.apache.tapestry.internal.structure.PageElement} and
@@ -325,6 +327,8 @@
     // The user-provided class, with runtime code enhancements.
     private final Component _component;
 
+    private final ComponentMessagesSource _messagesSource;
+
     /**
      * Component lifecycle instances for all mixins; the core component is 
added to this list during
      * page load. This is only used in the case that a component has mixins 
(in which case, the core
@@ -462,12 +466,15 @@
      *            used to create the new component instance and access the 
component's model
      * @param typeCoercer
      *            used when coercing parameter values
+     * @param messagesSource
+     *            TODO
      * @param location
      *            location of the element (within a template), used as part of 
exception reporting
      */
 
     public ComponentPageElementImpl(Page page, ComponentPageElement container, 
String id,
-            Instantiator instantiator, TypeCoercer typeCoercer, Location 
location)
+            Instantiator instantiator, TypeCoercer typeCoercer,
+            ComponentMessagesSource messagesSource, Location location)
     {
         super(location);
 
@@ -477,9 +484,11 @@
         _id = id;
         _page = page;
         _typeCoercer = typeCoercer;
+        _messagesSource = messagesSource;
         _log = model.getLog();
 
-        _coreResources = new InternalComponentResourcesImpl(this, 
instantiator, _typeCoercer);
+        _coreResources = new InternalComponentResourcesImpl(this, 
instantiator, _typeCoercer,
+                _messagesSource);
 
         _component = _coreResources.getComponent();
 
@@ -515,9 +524,10 @@
     /**
      * Constructor for the root component of a page.
      */
-    public ComponentPageElementImpl(Page page, Instantiator instantiator, 
TypeCoercer typeCoercer)
+    public ComponentPageElementImpl(Page page, Instantiator instantiator, 
TypeCoercer typeCoercer,
+            ComponentMessagesSource messagesSource)
     {
-        this(page, null, null, instantiator, typeCoercer, null);
+        this(page, null, null, instantiator, typeCoercer, messagesSource, 
null);
     }
 
     public void addEmbeddedElement(ComponentPageElement child)
@@ -544,7 +554,7 @@
         String mixinName = IOCUtilities.toSimpleId(mixinClassName);
 
         InternalComponentResourcesImpl resources = new 
InternalComponentResourcesImpl(this,
-                instantiator, _typeCoercer);
+                instantiator, _typeCoercer, _messagesSource);
 
         // TODO: Check for name collision?
 
@@ -923,6 +933,11 @@
             return;
 
         throw new 
TapestryException(StructureMessages.missingParameters(unbound, this), this, 
null);
+    }
+
+    public Locale getLocale()
+    {
+        return _page.getLocale();
     }
 
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
 Wed Nov 29 15:44:05 2006
@@ -16,6 +16,7 @@
 
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -24,11 +25,13 @@
 import org.apache.tapestry.MarkupWriter;
 import org.apache.tapestry.internal.InternalComponentResources;
 import org.apache.tapestry.internal.services.Instantiator;
+import org.apache.tapestry.ioc.Messages;
 import org.apache.tapestry.ioc.internal.util.TapestryException;
 import org.apache.tapestry.ioc.services.TypeCoercer;
 import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.runtime.Component;
 import org.apache.tapestry.services.Binding;
+import org.apache.tapestry.services.ComponentMessagesSource;
 
 /**
  * The bridge between a component and its [EMAIL PROTECTED] 
ComponentPageElement}, that supplies all kinds of
@@ -48,12 +51,18 @@
 
     private Map<String, Binding> _bindings;
 
+    private final ComponentMessagesSource _messagesSource;
+
+    private Messages _messages;
+
     public InternalComponentResourcesImpl(ComponentPageElement element,
-            Instantiator componentInstantiator, TypeCoercer typeCoercer)
+            Instantiator componentInstantiator, TypeCoercer typeCoercer,
+            ComponentMessagesSource messagesSource)
     {
         _element = element;
         _componentModel = componentInstantiator.getModel();
         _typeCoercer = typeCoercer;
+        _messagesSource = messagesSource;
 
         _component = componentInstantiator.newInstance(this);
     }
@@ -238,6 +247,19 @@
         ComponentPageElement containerElement = _element.getContainerElement();
 
         return containerElement == null ? null : 
containerElement.getComponent();
+    }
+
+    public Locale getLocale()
+    {
+        return _element.getLocale();
+    }
+
+    public Messages getMessages()
+    {
+        if (_messages == null)
+            _messages = _messagesSource.getMessages(_componentModel, 
getLocale());
+
+        return _messages;
     }
 
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/TapestryModule.java
 Wed Nov 29 15:44:05 2006
@@ -44,12 +44,14 @@
 import org.apache.tapestry.internal.bindings.LiteralBindingFactory;
 import org.apache.tapestry.internal.services.ApplicationGlobalsImpl;
 import org.apache.tapestry.internal.services.BindingSourceImpl;
+import org.apache.tapestry.internal.services.CommonResourcesInjectionProvider;
 import org.apache.tapestry.internal.services.ComponentClassFactoryImpl;
 import org.apache.tapestry.internal.services.ComponentClassResolverImpl;
 import org.apache.tapestry.internal.services.ComponentEventDispatcher;
 import org.apache.tapestry.internal.services.ComponentInstanceEventHandler;
 import org.apache.tapestry.internal.services.ComponentInstantiatorSource;
 import org.apache.tapestry.internal.services.ComponentLifecycleMethodWorker;
+import org.apache.tapestry.internal.services.ComponentMessagesSourceImpl;
 import 
org.apache.tapestry.internal.services.ComponentResourcesInjectionProvider;
 import org.apache.tapestry.internal.services.ComponentSourceImpl;
 import org.apache.tapestry.internal.services.ComponentWorker;
@@ -397,6 +399,8 @@
         add(configuration, locator, PersistentFieldManager.class);
         add(configuration, locator, Environment.class);
         add(configuration, locator, ComponentSource.class);
+        add(configuration, locator, BindingSource.class);
+        add(configuration, locator, ComponentMessagesSource.class);
 
         configuration.add(new InfrastructureContribution("request", request));
         configuration.add(new InfrastructureContribution("response", 
response));
@@ -498,6 +502,9 @@
             OrderedConfiguration<InjectionProvider> configuration)
     {
         configuration.add("ComponentResources", new 
ComponentResourcesInjectionProvider());
+        configuration.add(
+                "CommonResourcesInjectionProvider",
+                new CommonResourcesInjectionProvider());
         configuration.add("Default", new DefaultInjectionProvider(), 
"after:*.*");
     }
 
@@ -720,5 +727,10 @@
     public ComponentEventHandler buildComponentInstanceEventHandler(Log log)
     {
         return new ComponentInstanceEventHandler(_requestPageCache, log);
+    }
+
+    public ComponentMessagesSource buildComponentMessagesSource()
+    {
+        return new ComponentMessagesSourceImpl();
     }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/infrastructure.apt
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/infrastructure.apt?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/infrastructure.apt 
(original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/infrastructure.apt 
Wed Nov 29 15:44:05 2006
@@ -19,7 +19,7 @@
 
 
   The infrastructure 
-  {{{../../tapestry-ioc/provider.html}object provider}} 
+  {{{http://tapestry.apache.org/tapestry5/tapestry-ioc/provider.html}object 
provider}} 
   is a key element in making Tapestry extensible; it adds a layer of
   indirection between service implementations and their collaborators. Using 
the infrastructure
   provider allows applications to identify and override individual services 
within Tapestry's
@@ -46,24 +46,51 @@
   The following table identifies the properties that are available via the 
infrastructure provider
   by default:
   
-*-----------------------+--------------------------------------------------------------------+------------------------------------+
-| <<Property>>          | <<Service Interface>>                                
             | <<Default Service>>               |
-*-----------------------+--------------------------------------------------------------------+-----------------------------------+
-| componentSource | 
{{{../apidocs/org/apache/tapestry/services/ComponentSource.html}ComponentSource}}
 | tapestry.ComponentSource |
-*-----------------------+--------------------------------------------------------------------+-----------------------------------+
-| environment | 
{{{../apidocs/org/apache/tapestry/services/Environment.html}Environment}} | 
tapestry.Environment |
-*-----------------------+--------------------------------------------------------------------+-----------------------------------+
-| markupWriterFactory | 
{{{../apidocs/org/apache/tapestry/services/MarkupWriterFactory.html}MarkupWriterFactory}}
 | tapestry.MarkupWriterFactory |
-*-----------------------+--------------------------------------------------------------------+-----------------------------------+
-| persistentFieldManager | 
{{{../apidocs/org/apache/tapestry/services/PersistentFieldManager.html}PersistentFieldManager}}
 | tapestry.PersistentFieldManager |
-*-----------------------+--------------------------------------------------------------------+-----------------------------------+
-| request               | 
{{{../apidocs/org/apache/tapestry/services/WebRequest.html}WebRequest}}  | 
tapestry.WebRequest         |        
-*-----------------------+--------------------------------------------------------------------------------------------------------+
-| response | 
{{{../apidocs/org/apache/tapestry/services/WebResponse.html}WebResponse}}  | 
tapestry.WebResponse |        
-*-----------------------+--------------------------------------------------------------------------------------------------------+
-| typeCoercer | org.apache.tapestry.ioc.services.TypeCoercer  | 
tapestry.ioc.TypeCoercer |        
-*-----------------------+--------------------------------------------------------------------------------------------------------+
-Default properties available via the infrastructure object provider
+  [bindingSource]
+    
{{{../apidocs/org/apache/tapestry/services/BindingSource.html}BindingSource}} 
(tapestry.BindingSource)
+    
+    Central factory for creating all types of component Binding objects.
+  
+  [componentSource]
+       
{{{../apidocs/org/apache/tapestry/services/ComponentSource.html}ComponentSource}}
 (tapestry.ComponentSource)
+       
+       Used to retrieve component instances via their complete id.
+       
+  [componentMessagesSource]
+       
{{{../apidocs/org/apache/tapestry/services/ComponentMessagesSource.html}ComponentMessagesSource}}
 (tapestry.ComponentMessagesSource)
+       
+       Access to message catalogs for components.
+       
+  [environment]
+    {{{../apidocs/org/apache/tapestry/services/Environment.html}Environment}} 
(tapestry.Environment)
+    
+    Used to access environmental services (typically, to install a new 
environmental service).
+
+  [markupWriterFactory]
+    
{{{../apidocs/org/apache/tapestry/services/MarkupWriterFactory.html}MarkupWriterFactory}}
 (tapestry.MarkupWriterFactory)
+    
+    Used as a source for MarkupWriter instances.
+    
+  [persistentFieldManager]
+    
{{{../apidocs/org/apache/tapestry/services/PersistentFieldManager.html}PersistentFieldManager}}
 (tapestry.PersistentFieldManager)
+    
+    Main access point between components and persistent field storage.  
Delegates out most behavior to
+    particular persistent strategies.
+    
+  [request]
+    {{{../apidocs/org/apache/tapestry/services/WebRequest.html}WebRequest}}  
(tapestry.WebRequest)
+    
+     The current request object (for the current thread).        
+     
+  [response]
+    {{{../apidocs/org/apache/tapestry/services/WebResponse.html}WebResponse}}  
(tapestry.WebResponse)
+    
+    The current response object (for the current thread).
+    
+  [typeCoercer]
+    
{{{http://tapestry.apache.org/tapestry5/tapestry-ioc/org/apache/tapestry/ioc/services/TypeCoercer.html}TypeCoercer}}
 (tapestry.ioc.TypeCoercer)
+    
+    Used to coerce values from one type to another (such as string to integer).
 
 Contributing to Infrastructure
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/inject.apt
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/inject.apt?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/inject.apt 
(original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/inject.apt Wed 
Nov 29 15:44:05 2006
@@ -5,7 +5,7 @@
 Injection with Components
 
   A key concept in Tapestry is the use of <injection>. The
-  {{{../ioc/index.html}Tapestry IoC container}} makes use of one form
+  {{{http://tapestry.apache.org/tapestry5/tapestry-ioc/index.html}Tapestry IoC 
container}} makes use of one form
   of injection, via parameters to service builder methods.
   
   For components, Tapestry takes a completely different tack: injection 
directly into
@@ -32,7 +32,7 @@
 * Named Injection
 
   Here, a specific object is requested. The value of the Inject annotation is 
an
-  {{{../ioc/provider.html}object reference}} used to identify the exact 
service, or other resource,
+  {{{http://tapestry.apache.org/tapestry5/tapestry-ioc/provider.html}object 
reference}} used to identify the exact service, or other resource,
   to be injected.
   
   Commonly, the "infrastructure:" prefix is used with the Inject annotation, 
to indirectly identify services contributed
@@ -65,6 +65,26 @@
 
   <<TODO: Don't like the name "Annonymous" either.>>
 
+  The following types are supported for annonymous injection out of the box:
+  
+  [java.lang.String]
+    The complete id of the component, which incorporates the complete class 
name of the containing page and the nested
+    id of the component within the page.
+    
+  [java.util.Locale]
+    The locale for the component (all components within a page use the same 
locale).
+    
+  [org.apache.commons.logging.Log]
+    A Log instance configured for the component, based on the component's 
class name.
+  
+  [org.apache.tapestry.ComponentResources]
+       The resources for the component, often used to generate links related 
to the component.
+               
+  [org.apache.tapestry.ioc.Messages]
+    The component message catalog for the component, from which
+    {{{localization.html}localized}} messages can be generated.
+   
+
 ** Default Annonymous Injection
   
   There are a finite number of types that Tapestry can check for.  Beyond 
that, the final default behavior
@@ -76,13 +96,13 @@
   Caution should be used when leveraging this default behavior, since minor 
code changes may introduce new services
   that will cause previously working injections to fail. In general, relying 
on default annonymous injection should
   be avoided in anything but a prototype.
-  
+    
 ** Defining New Annonymous Injection Logic
 
   Annonymous injection is controlled by the 
   
{{{../apidocs/org/apache/tapestry/services/InjectionProvider.html}tapestry.InjectionProvider}}
   service. The configuration for this service is a 
-  {{{../ioc/command.html}chain of command}} for handling annonymous injections.
+  {{{http://tapestry.apache.org/tapestry5/tapestry-ioc/command.html}chain of 
command}} for handling annonymous injections.
   
 Other Injections
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/app1/index.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/app1/index.html?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/app1/index.html (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/app1/index.html Wed Nov 29 
15:44:05 2006
@@ -45,6 +45,9 @@
             <li>
                 <a href="NumberSelect.html">NumberSelect</a> -- 
passivate/activate page context demo
             </li>
+            <li>
+                <a href="Localization.html">Localization</a> -- accessing 
localized messages from the component catalog
+            </li>
             </ul>
         </p>
     </body>

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
 Wed Nov 29 15:44:05 2006
@@ -309,6 +309,15 @@
         assertTextPresent("You chose 5.");
     }
 
+    @Test
+    public void app1_localization()
+    {
+        _selenium.open(BASE_URL);
+        clickAndWait("link=Localization");
+
+        assertTextPresent("Via injected Messages property: [Accessed via 
injected Messages]");
+    }
+
     private void assertText(String locator, String expected)
     {
         String actual = _selenium.getText(locator);

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java?view=auto&rev=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/Localization.java
 Wed Nov 29 15:44:05 2006
@@ -0,0 +1,31 @@
+// Copyright 2006 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.tapestry.integration.app1.pages;
+
+import org.apache.tapestry.annotations.ComponentClass;
+import org.apache.tapestry.annotations.Inject;
+import org.apache.tapestry.ioc.Messages;
+
[EMAIL PROTECTED]
+public class Localization
+{
+    @Inject
+    private Messages _messages;
+
+    public String getInjectedMessage()
+    {
+        return _messages.get("via-inject");
+    }
+}

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageElementFactoryImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageElementFactoryImplTest.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageElementFactoryImplTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/PageElementFactoryImplTest.java
 Wed Nov 29 15:44:05 2006
@@ -46,7 +46,7 @@
 
         replay();
 
-        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null);
+        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null, null);
         StartElementToken token = new StartElementToken("fred", l);
 
         PageElement element = factory.newStartElement(token);
@@ -70,7 +70,7 @@
 
         replay();
 
-        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null);
+        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null, null);
         AttributeToken token = new AttributeToken("name", "value", l);
 
         PageElement element = factory.newAttributeElement(token);
@@ -95,7 +95,7 @@
 
         replay();
 
-        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null);
+        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null, null);
 
         PageElement element = factory.newEndElement();
 
@@ -121,7 +121,7 @@
 
         replay();
 
-        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null);
+        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null, null);
 
         PageElement element1 = factory.newEndElement();
         PageElement element2 = factory.newEndElement();
@@ -142,7 +142,7 @@
 
         replay();
 
-        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null);
+        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null, null);
         TextToken token = new TextToken("some text", l);
 
         PageElement element = factory.newTextElement(token);
@@ -169,7 +169,7 @@
 
         replay();
 
-        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null);
+        PageElementFactory factory = new PageElementFactoryImpl(source, 
resolver, null, null, null);
 
         PageElement element = factory.newRenderBodyElement(component);
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
 Wed Nov 29 15:44:05 2006
@@ -50,7 +50,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         ComponentResources resources = cpe.getComponentResources();
         assertFalse(resources.isBound("fred"));
@@ -84,7 +84,7 @@
 
         replay();
 
-        ComponentPageElementImpl cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElementImpl cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addParameter("barney", binding);
 
@@ -114,7 +114,7 @@
 
         replay();
 
-        ComponentPageElementImpl cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElementImpl cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.containingPageDidLoad();
 
@@ -155,7 +155,7 @@
         replay();
 
         ComponentPageElementImpl cpe = new ComponentPageElementImpl(page, 
container, "myid", ins,
-                coercer, l);
+                coercer, null, l);
 
         try
         {
@@ -193,7 +193,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         assertFalse(cpe.getComponentResources().isInvariant("fred"));
 
@@ -230,7 +230,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addParameter("barney", binding);
 
@@ -270,7 +270,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addParameter("barney", binding);
 
@@ -293,7 +293,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         try
         {
@@ -329,7 +329,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addEmbeddedElement(childElement);
 
@@ -359,7 +359,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addMixin(mixinIns);
 
@@ -388,7 +388,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addMixin(mixinIns);
 
@@ -427,7 +427,7 @@
 
         replay();
 
-        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer);
+        ComponentPageElement cpe = new ComponentPageElementImpl(page, ins, 
coercer, null);
 
         cpe.addMixin(mixinInstantiator);
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java?view=diff&rev=480770&r1=480769&r2=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImplTest.java
 Wed Nov 29 15:44:05 2006
@@ -42,7 +42,7 @@
         replay();
 
         InternalComponentResources resources = new 
InternalComponentResourcesImpl(element, ins,
-                coercer);
+                coercer, null);
 
         resources.renderInformalParameters(writer);
 
@@ -68,7 +68,7 @@
         replay();
 
         InternalComponentResources resources = new 
InternalComponentResourcesImpl(element, ins,
-                coercer);
+                coercer, null);
 
         resources.addParameter("fred", binding);
 
@@ -103,7 +103,7 @@
         replay();
 
         InternalComponentResources resources = new 
InternalComponentResourcesImpl(element, ins,
-                coercer);
+                coercer, null);
 
         resources.addParameter("fred", binding);
 

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html?view=auto&rev=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.html
 Wed Nov 29 15:44:05 2006
@@ -0,0 +1,12 @@
+<t:comp type="Border" 
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
+    <h1>Localization</h1>
+    
+
+<p>Demonstrates a few ways that component message catalogs can be accessed in 
code and in the template.</p>
+    
+    
+    <p>
+        Via injected Messages property: [${injectedMessage}]
+    </p>
+    
+</t:comp>

Added: 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties?view=auto&rev=480770
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
 (added)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/resources/org/apache/tapestry/integration/app1/pages/Localization.properties
 Wed Nov 29 15:44:05 2006
@@ -0,0 +1 @@
+via-inject=Accessed via injected Messages
\ No newline at end of file


Reply via email to