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 2007/02/11 21:26:12 UTC

svn commit: r506120 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/beaneditor/ main/java/org/apache/tapestry/grid/ main/java/org/apache/tapestry/internal/beaneditor/ main/java/org/apache/tapestry/internal/grid/ main/jav...

Author: hlship
Date: Sun Feb 11 12:26:11 2007
New Revision: 506120

URL: http://svn.apache.org/viewvc?view=rev&rev=506120
Log:
Make use of new tapestry-ioc utility classes: Stack and CaseInsensitiveMap.

Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/BeanEditorModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassLocatorImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HeartbeatImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureManagerImpl.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/MessagesSourceImpl.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.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/InfrastructureManager.java
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/coercion.apt
    tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/InjectDemo.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/services/MusicLibraryParser.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/BeanEditorModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/BeanEditorModel.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/BeanEditorModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/beaneditor/BeanEditorModel.java Sun Feb 11 12:26:11 2007
@@ -35,7 +35,7 @@
      * Returns the named model.
      * 
      * @param propertyName
-     *            name of property to retrieve model for
+     *            name of property to retrieve model for (case is ignored)
      * @return the model for the property
      * @throws RuntimeException
      *             if the bean editor model does not have a property model for the provided name

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/grid/GridDataModel.java Sun Feb 11 12:26:11 2007
@@ -37,7 +37,7 @@
      * Returns the named column model.
      * 
      * @param name
-     *            the name of the column to retrieve
+     *            the name of the column to retrieve (case is ignored)
      * @return the named column
      * @throws RuntimeException
      *             if no such column exists

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/beaneditor/BeanEditorModelImpl.java Sun Feb 11 12:26:11 2007
@@ -14,8 +14,8 @@
 
 package org.apache.tapestry.internal.beaneditor;
 
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 
 import java.util.Collections;
 import java.util.Comparator;
@@ -40,7 +40,7 @@
 
     private final Messages _messages;
 
-    private final Map<String, PropertyEditModel> _properties = newMap();
+    private final Map<String, PropertyEditModel> _properties = newCaseInsensitiveMap();
 
     public BeanEditorModelImpl(Class beanType, PropertyConduitSource propertyConduitSource,
             TypeCoercer typeCoercer, Messages messages)
@@ -75,7 +75,7 @@
                 propertyName), _typeCoercer);
     }
 
-    public PropertyEditModel edit(String propertyName)
+    public PropertyEditModel get(String propertyName)
     {
         PropertyEditModel propertyModel = _properties.get(propertyName);
 
@@ -88,15 +88,12 @@
         return propertyModel;
     }
 
-    public PropertyEditModel get(String propertyName)
-    {
-        return edit(propertyName);
-    }
-
     public List<String> getPropertyNames()
     {
         List<PropertyEditModel> propertyModels = newList(_properties.values());
 
+        // Sort the list of models by their order property.
+        
         Collections.sort(propertyModels, this);
 
         List<String> result = newList();

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/grid/GridDataModelImpl.java Sun Feb 11 12:26:11 2007
@@ -14,8 +14,8 @@
 
 package org.apache.tapestry.internal.grid;
 
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
 import static org.apache.tapestry.ioc.internal.util.Defense.notNull;
 
@@ -38,7 +38,7 @@
 
     private final PropertyConduitSource _propertyConduitSource;
 
-    private final Map<String, ColumnModel> _columns = newMap();
+    private final Map<String, ColumnModel> _columns = newCaseInsensitiveMap();
 
     public GridDataModelImpl(final Class rowType, final Messages messages,
             final PropertyConduitSource propertyConduitSource)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/model/MutableComponentModelImpl.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.internal.model;
 
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
@@ -107,21 +108,19 @@
         notBlank(name, "name");
         notBlank(defaultBindingPrefix, "defaultBindingPrefix");
 
-        String caseless = name.toLowerCase();
-
         // TODO: Check for conflict with base model
 
         if (_parameters == null)
-            _parameters = newMap();
+            _parameters = newCaseInsensitiveMap();
         else
         {
-            if (_parameters.containsKey(caseless))
+            if (_parameters.containsKey(name))
                 throw new IllegalArgumentException(ModelMessages.duplicateParameter(
                         name,
                         _componentClassName));
         }
 
-        _parameters.put(caseless, new ParameterModelImpl(name, required, defaultBindingPrefix));
+        _parameters.put(name, new ParameterModelImpl(name, required, defaultBindingPrefix));
     }
 
     public ParameterModel getParameterModel(String parameterName)
@@ -160,7 +159,7 @@
         // TODO: Parent compent model? Or would we simply override the parent?
 
         if (_embeddedComponents == null)
-            _embeddedComponents = newMap();
+            _embeddedComponents = newCaseInsensitiveMap();
         else if (_embeddedComponents.containsKey(id))
             throw new IllegalArgumentException(ModelMessages.duplicateComponentId(
                     id,
@@ -290,7 +289,7 @@
         notBlank(value, "value");
 
         if (_metaData == null)
-            _metaData = newMap();
+            _metaData = newCaseInsensitiveMap();
 
         // TODO: Error if duplicate?
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassLocatorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassLocatorImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassLocatorImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassLocatorImpl.java Sun Feb 11 12:26:11 2007
@@ -14,8 +14,6 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newLinkedList;
-
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -27,11 +25,11 @@
 import java.net.URLConnection;
 import java.util.Collection;
 import java.util.Enumeration;
-import java.util.LinkedList;
 import java.util.jar.JarEntry;
 
 import org.apache.tapestry.internal.TapestryUtils;
 import org.apache.tapestry.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry.ioc.util.Stack;
 
 public class ComponentClassLocatorImpl implements ComponentClassLocator
 {
@@ -92,13 +90,13 @@
         // Otherwise, we're forced to assume that it is a file: URL for files in the user's
         // workspace.
 
-        LinkedList<Queued> queue = newLinkedList();
+        Stack<Queued> queue = CollectionFactory.newStack();
 
-        queue.addFirst(new Queued(url, packagePath));
+        queue.push(new Queued(url, packagePath));
 
         while (!queue.isEmpty())
         {
-            Queued queued = queue.removeFirst();
+            Queued queued = queue.pop();
 
             scan(queued._packagePath, queued._packageURL, componentClassNames, queue);
         }
@@ -106,7 +104,7 @@
     }
 
     private void scan(String packagePath, URL packageURL, Collection<String> componentClassNames,
-            LinkedList<Queued> queue) throws IOException
+            Stack<Queued> queue) throws IOException
     {
         InputStream is = new BufferedInputStream(packageURL.openStream());
         Reader reader = new InputStreamReader(is);
@@ -151,7 +149,7 @@
                 URL newURL = new URL(packageURL.toExternalForm() + line + "/");
                 String newPackagePath = packagePath + line + "/";
 
-                queue.addFirst(new Queued(newURL, newPackagePath));
+                queue.push(new Queued(newURL, newPackagePath));
             }
 
             lineReader.close();

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentClassResolverImpl.java Sun Feb 11 12:26:11 2007
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.internal.services;
 
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 
@@ -42,7 +43,7 @@
     // Map from folder name to a list of root package names.
     // The key does not begin or end with a slash.
 
-    private final Map<String, List<String>> _mappings = newMap();
+    private final Map<String, List<String>> _mappings = newCaseInsensitiveMap();
 
     // Flag indicating that the maps have been cleared following an invalidation
     // and need to be rebuilt. The flag and the four maps below are not synchronized
@@ -53,12 +54,13 @@
 
     private boolean _rebuild = true;
 
-    private final Map<String, String> _pageToClassName = newMap();
+    private final Map<String, String> _pageToClassName = newCaseInsensitiveMap();
 
-    private final Map<String, String> _componentToClassName = newMap();
+    private final Map<String, String> _componentToClassName = newCaseInsensitiveMap();
 
-    private final Map<String, String> _mixinToClassName = newMap();
+    private final Map<String, String> _mixinToClassName = newCaseInsensitiveMap();
 
+    /** This one is case sensitive, since class names do always have a particular case. */
     private final Map<String, String> _pageClassNameToLogicalName = newMap();
 
     public ComponentClassResolverImpl(ComponentInstantiatorSource componentInstantiatorSource,
@@ -136,12 +138,16 @@
 
     private void rebuild(String pathPrefix, String rootPackage)
     {
-        fillCaselessMap(pathPrefix, rootPackage, PAGES_SUBPACKAGE, _pageToClassName);
-        fillCaselessMap(pathPrefix, rootPackage, COMPONENTS_SUBPACKAGE, _componentToClassName);
-        fillCaselessMap(pathPrefix, rootPackage, MIXINS_SUBPACKAGE, _mixinToClassName);
+        fillNameToClassNameMap(pathPrefix, rootPackage, PAGES_SUBPACKAGE, _pageToClassName);
+        fillNameToClassNameMap(
+                pathPrefix,
+                rootPackage,
+                COMPONENTS_SUBPACKAGE,
+                _componentToClassName);
+        fillNameToClassNameMap(pathPrefix, rootPackage, MIXINS_SUBPACKAGE, _mixinToClassName);
     }
 
-    private void fillCaselessMap(String pathPrefix, String rootPackage, String subPackage,
+    private void fillNameToClassNameMap(String pathPrefix, String rootPackage, String subPackage,
             Map<String, String> logicalNameToClassName)
     {
         String searchPackage = rootPackage + "." + subPackage;
@@ -161,7 +167,7 @@
             if (isPage)
                 _pageClassNameToLogicalName.put(name, logicalName);
 
-            logicalNameToClassName.put(logicalName.toLowerCase(), name);
+            logicalNameToClassName.put(logicalName, name);
         }
     }
 
@@ -215,15 +221,13 @@
     {
         rebuild();
 
-        String key = logicalName.toLowerCase();
-
-        String result = logicalNameToClassName.get(key);
+        String result = logicalNameToClassName.get(logicalName);
 
         // If not found, see if it exists under the core package. In this way,
         // anything in core is "inherited" (but overridable) by the application.
 
         if (result == null)
-            result = logicalNameToClassName.get("core/" + key);
+            result = logicalNameToClassName.get("core/" + logicalName);
 
         return result;
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HeartbeatImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HeartbeatImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HeartbeatImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/HeartbeatImpl.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -14,37 +14,37 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newLinkedList;
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newStack;
 
-import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.tapestry.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry.ioc.internal.util.Defense;
+import org.apache.tapestry.ioc.util.Stack;
 import org.apache.tapestry.services.Heartbeat;
 
 public class HeartbeatImpl implements Heartbeat
 {
-    private final LinkedList<List<Runnable>> _stack = newLinkedList();
+    private final Stack<List<Runnable>> _stack = newStack();
 
     public void begin()
     {
         List<Runnable> beat = CollectionFactory.newList();
 
-        _stack.addFirst(beat);
+        _stack.push(beat);
     }
 
     public void defer(Runnable command)
     {
         Defense.notNull(command, "command");
 
-        _stack.getFirst().add(command);
+        _stack.peek().add(command);
 
     }
 
     public void end()
     {
-        List<Runnable> beat = _stack.removeFirst();
+        List<Runnable> beat = _stack.pop();
 
         for (Runnable r : beat)
             r.run();

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureImpl.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -12,81 +12,73 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.internal.services;
-
-import java.util.Map;
-
-import org.apache.tapestry.ioc.ObjectProvider;
-import org.apache.tapestry.ioc.ServiceLocator;
-import org.apache.tapestry.ioc.internal.util.Defense;
-import org.apache.tapestry.services.Infrastructure;
-import org.apache.tapestry.services.InfrastructureManager;
-
-/**
- * TODO: Extra configuration to support application overrides.
- */
-public class InfrastructureImpl implements Infrastructure, ObjectProvider
-{
-    private InfrastructureManager _manager;
-
-    // Derived from the manager when first needed
-
-    private Map<String, Object> _properties;
-
-    private String _mode;
-
-    public InfrastructureImpl(InfrastructureManager manager)
-    {
-        _manager = manager;
-    }
-
-    public ObjectProvider getObjectProvider()
-    {
-        return this;
-    }
-
-    // Probably don't need to make this concurrent, since it executes at startup,
-    // before multithreading takes hold.
-
-    public synchronized void setMode(String mode)
-    {
-        _mode = Defense.notNull(mode, "mode");
-
-        deriveProperties();
-    }
-
-    private void deriveProperties()
-    {
-        _properties = _manager.getContributionsForMode(_mode);
-
-        // Don't need this again.
-
-        _manager = null;
-    }
-
-    public <T> T provide(String expression, Class<T> objectType, ServiceLocator locator)
-    {
-        if (_properties == null)
-            throw new RuntimeException(ServicesMessages.infrastructureModeNotSet());
-
-        Object object = _properties.get(expression);
-
-        if (object == null)
-            throw new RuntimeException(ServicesMessages.infrastructurePropertyNotFound(
-                    expression,
-                    _properties.keySet()));
-
-        try
-        {
-            return objectType.cast(object);
-        }
-        catch (ClassCastException ex)
-        {
-            throw new RuntimeException(ServicesMessages.infrastructurePropertyWrongType(
-                    expression,
-                    object,
-                    objectType), ex);
-        }
-    }
-
-}
+package org.apache.tapestry.internal.services;
+
+import static org.apache.tapestry.ioc.internal.util.Defense.notNull;
+
+import java.util.Map;
+
+import org.apache.tapestry.ioc.ObjectProvider;
+import org.apache.tapestry.ioc.ServiceLocator;
+import org.apache.tapestry.services.Infrastructure;
+import org.apache.tapestry.services.InfrastructureManager;
+
+/**
+ * TODO: Extra configuration to support application overrides.
+ */
+public class InfrastructureImpl implements Infrastructure, ObjectProvider
+{
+    private final InfrastructureManager _manager;
+
+    // Derived from the manager when first needed
+
+    private Map<String, Object> _properties;
+
+    private String _mode;
+
+    public InfrastructureImpl(InfrastructureManager manager)
+    {
+        _manager = manager;
+    }
+
+    public ObjectProvider getObjectProvider()
+    {
+        return this;
+    }
+
+    // Probably don't need to make this concurrent, since it executes at startup,
+    // before multithreading takes hold.
+
+    public synchronized void setMode(String mode)
+    {
+        _mode = notNull(mode, "mode");
+
+        _properties = _manager.getContributionsForMode(_mode);
+    }
+
+    public <T> T provide(String expression, Class<T> objectType, ServiceLocator locator)
+    {
+        if (_properties == null)
+            throw new RuntimeException(ServicesMessages.infrastructureModeNotSet());
+
+        Object object = _properties.get(expression);
+
+        if (object == null)
+            throw new RuntimeException(ServicesMessages.infrastructurePropertyNotFound(
+                    expression,
+                    _properties.keySet()));
+
+        try
+        {
+            return objectType.cast(object);
+        }
+        catch (ClassCastException ex)
+        {
+            throw new RuntimeException(ServicesMessages.infrastructurePropertyWrongType(
+                    expression,
+                    object,
+                    objectType), ex);
+        }
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureManagerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureManagerImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureManagerImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/InfrastructureManagerImpl.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -12,66 +12,64 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.internal.services;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.tapestry.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry.services.InfrastructureContribution;
-import org.apache.tapestry.services.InfrastructureManager;
-
-/**
- * 
- */
-public class InfrastructureManagerImpl implements InfrastructureManager
-{
-    private final Log _log;
-
-    private final Collection<InfrastructureContribution> _contributions;
-
-    public InfrastructureManagerImpl(Log log, Collection<InfrastructureContribution> contributions)
-    {
-        _log = log;
-        _contributions = contributions;
-    }
-
-    public Map<String, Object> getContributionsForMode(String mode)
-    {
-        Map<String, Object> general = buildMapForMode("");
-        Map<String, Object> specific = buildMapForMode(mode);
-
-        // Anything in specific overrides anything in general
-
-        general.putAll(specific);
-
-        return general;
-    }
-
-    private Map<String, Object> buildMapForMode(String mode)
-    {
-        Map<String, Object> result = CollectionFactory.newMap();
-
-        for (InfrastructureContribution ic : _contributions)
-        {
-            if (!ic.getMode().equals(mode))
-                continue;
-
-            String name = ic.getName();
-
-            Object existing = result.get(name);
-
-            if (existing != null)
-            {
-                _log.warn(ServicesMessages.duplicateContribution(ic.getObject(), name, existing));
-                continue;
-            }
-
-            result.put(name, ic.getObject());
-        }
-
-        return result;
-    }
-
-}
+package org.apache.tapestry.internal.services;
+
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.services.InfrastructureContribution;
+import org.apache.tapestry.services.InfrastructureManager;
+
+public class InfrastructureManagerImpl implements InfrastructureManager
+{
+    private final Log _log;
+
+    private final Collection<InfrastructureContribution> _contributions;
+
+    public InfrastructureManagerImpl(Log log, Collection<InfrastructureContribution> contributions)
+    {
+        _log = log;
+        _contributions = contributions;
+    }
+
+    public Map<String, Object> getContributionsForMode(String mode)
+    {
+        Map<String, Object> general = buildMapForMode("");
+        Map<String, Object> specific = buildMapForMode(mode);
+
+        // Anything in specific overrides anything in general
+
+        general.putAll(specific);
+
+        return general;
+    }
+
+    private Map<String, Object> buildMapForMode(String mode)
+    {
+        Map<String, Object> result = newCaseInsensitiveMap();
+
+        for (InfrastructureContribution ic : _contributions)
+        {
+            if (!ic.getMode().equals(mode))
+                continue;
+
+            String name = ic.getName();
+
+            Object existing = result.get(name);
+
+            if (existing != null)
+            {
+                _log.warn(ServicesMessages.duplicateContribution(ic.getObject(), name, existing));
+                continue;
+            }
+
+            result.put(name, ic.getObject());
+        }
+
+        return result;
+    }
+
+}

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=506120&r1=506119&r2=506120
==============================================================================
--- 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 Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -14,7 +14,7 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 
 import java.util.List;
 import java.util.Map;
@@ -377,7 +377,7 @@
     {
         BindingFactory keywordFactory = new BindingFactory()
         {
-            private final Map<String, Object> _keywords = newMap();
+            private final Map<String, Object> _keywords = newCaseInsensitiveMap();
 
             {
                 _keywords.put("true", Boolean.TRUE);
@@ -388,7 +388,7 @@
             public Binding newBinding(String description, ComponentResources container,
                     ComponentResources component, String expression, Location location)
             {
-                String key = expression.trim().toLowerCase();
+                String key = expression.trim();
 
                 if (_keywords.containsKey(key))
                     return new LiteralBinding(description, _keywords.get(key), location);

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/MessagesSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/MessagesSourceImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/MessagesSourceImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/MessagesSourceImpl.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -14,8 +14,8 @@
 
 package org.apache.tapestry.internal.services;
 
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newThreadSafeMap;
 
 import java.io.BufferedInputStream;
@@ -172,7 +172,7 @@
 
         // Make a copy of the base Map
 
-        Map<String, String> result = newMap(base);
+        Map<String, String> result = newCaseInsensitiveMap(base);
 
         // Add or overwrite properties to the copy
 
@@ -207,7 +207,7 @@
 
         _tracker.add(url);
 
-        Map<String, String> result = newMap();
+        Map<String, String> result = newCaseInsensitiveMap();
 
         Properties p = new Properties();
         InputStream is = null;

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/PageLoaderProcessor.java Sun Feb 11 12:26:11 2007
@@ -14,11 +14,10 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newLinkedList;
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newStack;
 import static org.apache.tapestry.ioc.internal.util.InternalUtils.isBlank;
 import static org.apache.tapestry.ioc.internal.util.InternalUtils.isNonBlank;
 
-import java.util.LinkedList;
 import java.util.Locale;
 import java.util.Set;
 
@@ -49,6 +48,7 @@
 import org.apache.tapestry.ioc.internal.util.IdAllocator;
 import org.apache.tapestry.ioc.internal.util.OneShotLock;
 import org.apache.tapestry.ioc.internal.util.TapestryException;
+import org.apache.tapestry.ioc.util.Stack;
 import org.apache.tapestry.model.ComponentModel;
 import org.apache.tapestry.model.EmbeddedComponentModel;
 import org.apache.tapestry.services.BindingSource;
@@ -67,19 +67,20 @@
         }
     };
 
-    private LinkedList<ComponentPageElement> _activeElementStack = newLinkedList();
+    private Stack<ComponentPageElement> _activeElementStack = newStack();
 
     private boolean _addAttributesAsComponentBindings = false;
 
     private final BindingSource _bindingSource;
 
-    private final LinkedList<BodyPageElement> _bodyPageElementStack = newLinkedList();
+    private final Stack<BodyPageElement> _bodyPageElementStack = newStack();
 
-    private final LinkedList<ComponentPageElement> _componentQueue = newLinkedList();
+    // You can use a stack as a queue
+    private final Stack<ComponentPageElement> _componentQueue = newStack();
 
-    private final LinkedList<Boolean> _discardEndTagStack = newLinkedList();
+    private final Stack<Boolean> _discardEndTagStack = newStack();
 
-    private final LinkedList<Runnable> _endElementCommandStack = newLinkedList();
+    private final Stack<Runnable> _endElementCommandStack = newStack();
 
     private final IdAllocator _idAllocator = new IdAllocator();
 
@@ -266,8 +267,8 @@
      */
     private void configureEnd(boolean discard, Runnable command)
     {
-        _discardEndTagStack.addFirst(discard);
-        _endElementCommandStack.addFirst(command);
+        _discardEndTagStack.push(discard);
+        _endElementCommandStack.push(command);
     }
 
     private void endElement(EndElementToken token)
@@ -275,7 +276,7 @@
         // discard will be false if the matching start token was for a static element, and will be
         // true otherwise (component, block, parameter).
 
-        boolean discard = _discardEndTagStack.removeFirst();
+        boolean discard = _discardEndTagStack.pop();
 
         if (!discard)
         {
@@ -284,7 +285,7 @@
             addToBody(element);
         }
 
-        Runnable command = _endElementCommandStack.removeFirst();
+        Runnable command = _endElementCommandStack.pop();
 
         // Used to return environment to prior state.
 
@@ -349,7 +350,7 @@
 
         _page.setRootElement(rootComponent);
 
-        _componentQueue.addFirst(rootComponent);
+        _componentQueue.push(rootComponent);
     }
 
     /**
@@ -410,7 +411,7 @@
             }
         };
 
-        _bodyPageElementStack.addFirst(shunt);
+        _bodyPageElementStack.push(shunt);
 
         for (TemplateToken token : template.getTokens())
         {
@@ -463,7 +464,7 @@
 
         // For neatness / symmetry:
 
-        _bodyPageElementStack.removeFirst(); // the shunt
+        _bodyPageElementStack.pop(); // the shunt
 
         // TODO: Check that all stacks are empty. That should never happen, as long
         // as the ComponentTemplate is valid.
@@ -485,13 +486,13 @@
 
     private void setupBlock(BodyPageElement block)
     {
-        _bodyPageElementStack.addFirst(block);
+        _bodyPageElementStack.push(block);
 
         Runnable cleanup = new Runnable()
         {
             public void run()
             {
-                _bodyPageElementStack.removeFirst();
+                _bodyPageElementStack.pop();
             }
         };
 
@@ -576,7 +577,7 @@
         addToBody(newComponent);
 
         // Remember to load the template for this new component
-        _componentQueue.addFirst(newComponent);
+        _componentQueue.push(newComponent);
 
         // Any attribute tokens that immediately follow should be
         // used to bind parameters.
@@ -585,11 +586,11 @@
 
         // Any attributes (including component parameters) that come up belong on this component.
 
-        _activeElementStack.addFirst(newComponent);
+        _activeElementStack.push(newComponent);
 
         // Set things up so that content inside the component is added to the component's body.
 
-        _bodyPageElementStack.addFirst(newComponent);
+        _bodyPageElementStack.push(newComponent);
 
         // And clean that up when the end element is reached.
 
@@ -597,8 +598,8 @@
         {
             public void run()
             {
-                _activeElementStack.removeFirst();
-                _bodyPageElementStack.removeFirst();
+                _activeElementStack.pop();
+                _bodyPageElementStack.pop();
             }
         };
 
@@ -635,7 +636,7 @@
     {
         while (!_componentQueue.isEmpty())
         {
-            ComponentPageElement componentElement = _componentQueue.removeFirst();
+            ComponentPageElement componentElement = _componentQueue.pop();
 
             loadTemplateForComponent(componentElement);
         }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/RenderQueueImpl.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -14,18 +14,17 @@
 
 package org.apache.tapestry.internal.services;
 
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newLinkedList;
-
-import java.util.LinkedList;
-
 import org.apache.commons.logging.Log;
 import org.apache.tapestry.MarkupWriter;
+import org.apache.tapestry.ioc.util.Stack;
 import org.apache.tapestry.runtime.RenderCommand;
 import org.apache.tapestry.runtime.RenderQueue;
 
 public class RenderQueueImpl implements RenderQueue
 {
-    private final LinkedList<RenderCommand> _queue = newLinkedList();
+    private static final int INITIAL_QUEUE_DEPTH = 100;
+
+    private final Stack<RenderCommand> _queue = new Stack<RenderCommand>(INITIAL_QUEUE_DEPTH);
 
     private final Log _log;
 
@@ -36,7 +35,7 @@
 
     public void push(RenderCommand command)
     {
-        _queue.addFirst(command);
+        _queue.push(command);
     }
 
     public void run(MarkupWriter writer)
@@ -50,7 +49,7 @@
         {
             while (!_queue.isEmpty())
             {
-                command = _queue.removeFirst();
+                command = _queue.pop();
 
                 if (_log.isDebugEnabled())
                     _log.debug(String.format("Executing: %s", command));

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=506120&r1=506119&r2=506120
==============================================================================
--- 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 Sun Feb 11 12:26:11 2007
@@ -14,8 +14,8 @@
 
 package org.apache.tapestry.internal.structure;
 
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
 import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
 
 import java.util.Iterator;
@@ -590,17 +590,15 @@
     public void addEmbeddedElement(ComponentPageElement child)
     {
         if (_children == null)
-            _children = newMap();
+            _children = newCaseInsensitiveMap();
 
-        String childId = child.getId().toLowerCase();
+        String childId = child.getId();
 
         ComponentPageElement existing = _children.get(childId);
         if (existing != null)
             throw new TapestryException(StructureMessages.duplicateChildComponent(this, childId),
                     child, null);
 
-        // TODO: Check for conflicts!
-
         _children.put(childId, child);
     }
 
@@ -608,7 +606,7 @@
     {
         if (_mixinsByShortName == null)
         {
-            _mixinsByShortName = newMap();
+            _mixinsByShortName = newCaseInsensitiveMap();
             _components = newList();
         }
 
@@ -1051,7 +1049,7 @@
     {
         notBlank(id, "id");
 
-        Block result = InternalUtils.get(_blocks, id.toLowerCase());
+        Block result = InternalUtils.get(_blocks, id);
 
         if (result == null)
             throw new BlockNotFoundException(StructureMessages.blockNotFound(_completeId, id),
@@ -1063,15 +1061,13 @@
     public void addBlock(String blockId, Block block)
     {
         if (_blocks == null)
-            _blocks = newMap();
-
-        String caselessId = blockId.toLowerCase();
+            _blocks = newCaseInsensitiveMap();
 
-        if (_blocks.containsKey(caselessId))
+        if (_blocks.containsKey(blockId))
             throw new TapestryException(StructureMessages.duplicateBlock(this, blockId), block,
                     null);
 
-        _blocks.put(caselessId, block);
+        _blocks.put(blockId, block);
     }
 
     public String getDefaultBindingPrefix(String parameterName)

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=506120&r1=506119&r2=506120
==============================================================================
--- 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 Sun Feb 11 12:26:11 2007
@@ -14,7 +14,7 @@
 
 package org.apache.tapestry.internal.structure;
 
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newCaseInsensitiveMap;
 
 import java.util.Locale;
 import java.util.Map;
@@ -55,6 +55,7 @@
 
     private final ComponentResources _containerResources;
 
+    // Case insensitive
     private Map<String, Binding> _bindings;
 
     private final ComponentMessagesSource _messagesSource;
@@ -170,9 +171,9 @@
     public void bindParameter(String parameterName, Binding binding)
     {
         if (_bindings == null)
-            _bindings = newMap();
+            _bindings = newCaseInsensitiveMap();
 
-        _bindings.put(parameterName.toLowerCase(), binding);
+        _bindings.put(parameterName, binding);
     }
 
     @SuppressWarnings("unchecked")
@@ -229,7 +230,7 @@
 
     private Binding getBinding(String parameterName)
     {
-        return _bindings == null ? null : _bindings.get(parameterName.toLowerCase());
+        return _bindings == null ? null : _bindings.get(parameterName);
     }
 
     public AnnotationProvider getAnnotationProvider(String parameterName)
@@ -255,7 +256,7 @@
         for (String name : _bindings.keySet())
         {
             // Skip all formal parameters.
-            
+
             if (_componentModel.getParameterModel(name) != null)
                 continue;
 
@@ -333,10 +334,8 @@
         if (_bindings == null)
             return null;
 
-        String key = parameterName.toLowerCase();
-
-        if (_bindings.containsKey(key))
-            return (Block) _bindings.get(key).get();
+        if (_bindings.containsKey(parameterName))
+            return (Block) _bindings.get(parameterName).get();
 
         return null;
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/InfrastructureManager.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/InfrastructureManager.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/InfrastructureManager.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/services/InfrastructureManager.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -12,25 +12,23 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.services;
-
-import java.util.Map;
-
-/**
- * A thin wrapper around a set of {@link org.apache.tapestry.services.InfrastructureContribution}s.
- * 
- * 
- */
-public interface InfrastructureManager
-{
-    /**
-     * Filters down the contributions based on the mode. Each contribution will identify a name and
-     * object and may identify a mode. Only contributions where the mode is blank or the mode
-     * matches the provided mode are returned. Mode specific contributions quietly override
-     * non-specific contributions (where the mode is blank).
-     * 
-     * @param mode
-     * @return
-     */
-    Map<String, Object> getContributionsForMode(String mode);
-}
+package org.apache.tapestry.services;
+
+import java.util.Map;
+
+/**
+ * A thin wrapper around a set of {@link org.apache.tapestry.services.InfrastructureContribution}s.
+ */
+public interface InfrastructureManager
+{
+    /**
+     * Filters down the contributions based on the mode. Each contribution will identify a name and
+     * object and may identify a mode. Only contributions where the mode is blank or the mode
+     * matches the provided mode are returned. Mode specific contributions quietly override
+     * non-specific contributions (where the mode is blank).
+     * 
+     * @param mode
+     * @return
+     */
+    Map<String, Object> getContributionsForMode(String mode);
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/coercion.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/coercion.apt?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/coercion.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/guide/coercion.apt Sun Feb 11 12:26:11 2007
@@ -42,49 +42,10 @@
   
 TypeCoercer Service
 
-  The {{{../apidoc/org/apache/tapestry/ioc/services/TypeCoercer.html}tapestry.ioc.TypeCoercer}} service
-  is responsible for this type coercion.
+  The tapestry.ioc.TypeCoercer service
+  is responsible for this type coercion. This service is part of the tapestry-ioc module, and 
+  is {{{http://tapestry.apache.org/tapestry5/tapestry-ioc/coerce.html}documented there}}.  The service
+  is quite extensible, allowing for new types and coercions to be added easily.
   
-  The service is quite flexible; it is configured with a 
-  basic set of coercions
-  for common cases, such as String --\> Long or Object --\> String, and can automatically
-  discover more complex coercions (for example, StringBuffer --\> String --\> Long --\> Integer). 
-  
-  The service's configuration is a collection of
-  {{{../apidoc/org/apache/tapestry/ioc/service/CoercionTuple.html}CoercionTuple}}s.  Each of
-  these tuples defines a source type, a target type, and a bit of code to perform the coersion.
-  
-  An example tuple, to convert from a String to a Double:
-  
-+---+
-new CoercionTuple<String,Double>(String.class, Double.class,
-  new Coercer<String,Double>()
-  {
-    public Double coerce(String input)
-    {
-      return new Double(input);
-    }
-  }
-);
-+---+
-  
-  As a special case, the service treats null input values as if they were instances of the special type Void. 
-  This allows tuples for converting nulls:
-  
-+---+
-new CoercionTuple<Void,Boolean>(Void.class, Boolean.class,
-  new Coercer<String,Boolean>()
-  {
-    public Boolean coerce(Void input)
-    {
-      return false;
-    }
-  }
-);
-+---+  
- 
-Contributing New Coercions
-
-  To be documented.
   
                 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/site/apt/index.apt Sun Feb 11 12:26:11 2007
@@ -38,6 +38,10 @@
   Progress on Tapestry 5 is really taking off. This space lists some cool new features that have been added
   recently.
   
+  * Named-based lookups of messages, resources, etc., are all case-insensitive.
+  
+  * Fast, smart, fully customizable Grid component for displaying tabular data.
+  
   * Validating form components will use the same system as BeanEditForm to determine default validation for fields.
   
   * Select component will automatically provide a ValueEncoder and SelectModel when the value parameter is bound to an Enum type.

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/InjectDemo.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/InjectDemo.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/InjectDemo.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/InjectDemo.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -25,8 +25,8 @@
 @ComponentClass
 public class InjectDemo
 {
-    // Named
-    @Inject("infrastructure:Request")
+    // Named --- now demonstrating case insensitivity
+    @Inject("Infrastructure:request")
     private Request _request;
 
     // Via ComponentResourcesInjectionProvider
@@ -41,7 +41,8 @@
     @InjectPage
     private Fred _fred;
 
-    @InjectPage("Barney")
+    // Again, demonstrates case insensitivity
+    @InjectPage("barney")
     private Runnable _barney;
 
     public BindingSource getBindingSource()

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/services/MusicLibraryParser.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/services/MusicLibraryParser.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/services/MusicLibraryParser.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/services/MusicLibraryParser.java Sun Feb 11 12:26:11 2007
@@ -15,17 +15,17 @@
 package org.apache.tapestry.integration.app1.services;
 
 import static java.lang.String.format;
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newLinkedList;
 import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
+import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newStack;
 
 import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.net.URL;
-import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.commons.logging.Log;
 import org.apache.tapestry.integration.app1.data.Track;
+import org.apache.tapestry.ioc.util.Stack;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -95,7 +95,7 @@
     {
         private final List<Track> _tracks = newList();
 
-        private LinkedList<Item> _stack = newLinkedList();
+        private Stack<Item> _stack = newStack();
 
         private int _state = STATE_START;
 
@@ -117,9 +117,7 @@
 
         private void pop()
         {
-            _state = peek()._priorState;
-
-            _stack.removeFirst();
+            _state = _stack.pop()._priorState;
         }
 
         private void push(int newState)
@@ -131,7 +129,7 @@
         {
             Item item = new Item(_state, ignoreCharacterData);
 
-            _stack.addFirst(item);
+            _stack.push(item);
 
             _state = newState;
         }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/model/MutableComponentModelImplTest.java Sun Feb 11 12:26:11 2007
@@ -223,6 +223,12 @@
         assertSame(model.getEmbeddedComponentModel("fred"), fred);
         assertSame(model.getEmbeddedComponentModel("barney"), barney);
 
+        // Access by id is case insensitive
+        
+        assertSame(model.getEmbeddedComponentModel("FRED"), fred);
+        assertSame(model.getEmbeddedComponentModel("BARNEY"), barney);
+        
+        
         assertEquals(
                 fred.toString(),
                 "EmbeddedComponentModel[id=fred type=Fred class=org.example.components.Fred]");
@@ -255,7 +261,33 @@
         }
 
         verify();
+    }
+    
+    @Test
+    public void add_embedded_is_case_insensitive()
+    {
+        Resource r = newResource();
+        Log log = newLog();
+
+        replay();
+
+        MutableComponentModel model = new MutableComponentModelImpl(CLASS_NAME, log, r, null);
 
+        model.addEmbeddedComponent("fred", "Fred1", COMPONENT_CLASS_NAME);
+
+        try
+        {
+            model.addEmbeddedComponent("FRED", "Fred2", COMPONENT_CLASS_NAME);
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            assertEquals(
+                    ex.getMessage(),
+                    "Embedded component 'FRED' has already been defined for component class org.example.components.Foo.");
+        }
+
+        verify();      
     }
 
     @Test
@@ -641,6 +673,12 @@
 
         assertEquals(model.getMeta("fred"), "flintstone");
         assertEquals(model.getMeta("barney"), "rubble");
+
+        // Ensure case insensitive:
+        
+        assertEquals(model.getMeta("FRED"), "flintstone");
+        assertEquals(model.getMeta("BARNEY"), "rubble");
+
 
         verify();
     }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java?view=diff&rev=506120&r1=506119&r2=506120
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentMessagesSourceImplTest.java Sun Feb 11 12:26:11 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -109,6 +109,29 @@
         assertEquals(messages.get("framework"), "Tapestry");
 
         verify();
+    }
+    
+    @Test
+    public void messages_keys_are_case_insensitive()
+    {
+        ComponentModel model = newComponentModel();
+
+        train_getComponentClassName(model, SIMPLE_COMPONENT_CLASS_NAME);
+
+        train_getBaseResource(model, _simpleComponentResource);
+
+        train_getParentModel(model, null);
+
+        replay();
+
+        forceCacheClear();
+
+        Messages messages = _source.getMessages(model, Locale.UK);
+
+        assertEquals(messages.get("COlor"), "colour");
+        assertEquals(messages.get("Framework"), "Tapestry");
+
+        verify();       
     }
 
     @Test

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=506120&r1=506119&r2=506120
==============================================================================
--- 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 Sun Feb 11 12:26:11 2007
@@ -452,7 +452,7 @@
         catch (TapestryException ex)
         {
             assertTrue(ex.getMessage().contains(
-                    "already contains a child component with id 'child'."));
+                    "already contains a child component with id 'CHILD'."));
         }
 
         verify();