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 2009/01/03 01:34:28 UTC

svn commit: r730877 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/ main/java/org/apache/tapestry5/ioc/internal/ main/java/org/apache/tapestry5/ioc/internal/util/ test/java/org/apache/tapestry5/ioc/ test/java/org/ap...

Author: hlship
Date: Fri Jan  2 16:34:28 2009
New Revision: 730877

URL: http://svn.apache.org/viewvc?rev=730877&view=rev
Log:
TAP5-437: The OrderedConfiguration and MappedConfiguration interfaces should allow for override() methods (similar to add()

Added:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OrderedConfigurationOverride.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConfigurationOverrideModule.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/DuplicateConfigurationOverrideModule.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/FailedConfigurationOverrideModule.java
Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/OrderedConfiguration.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapper.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/Orderer.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapperTest.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/OrdererTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/OrderedConfiguration.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/OrderedConfiguration.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/OrderedConfiguration.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/OrderedConfiguration.java Fri Jan  2 16:34:28 2009
@@ -1,4 +1,4 @@
-// Copyright 2006, 2008 The Apache Software Foundation
+// Copyright 2006, 2008, 2009 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.
@@ -39,6 +39,17 @@
     void add(String id, T object, String... constraints);
 
     /**
+     * Overrides a normally contributed object.  Each override must match a single normally contributed object.
+     *
+     * @param id          identifies object to override
+     * @param object      overriding object (may be null)
+     * @param constraints contrains for the overridden object, replacing constraints for the original object (even if
+     *                    omitted, in which case the override object will have no orderring contraints)
+     * @since 5.1.0.0
+     */
+    void override(String id, T object, String... constraints);
+
+    /**
      * Adds an ordered object by instantiating (with dependencies) the indicated class.
      *
      * @param id          of contribution (used for ordering)
@@ -47,4 +58,14 @@
      * @since 5.1.0.0
      */
     void addInstance(String id, Class<? extends T> clazz, String... constraints);
+
+    /**
+     * Instantiates an object and adds it as an override.
+     *
+     * @param id          of object to override
+     * @param clazz       to instantiate
+     * @param constraints override contraints
+     * @since 5.1.0.0
+     */
+    void overrideInstance(String id, Class<? extends T> clazz, String... constraints);
 }

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OrderedConfigurationOverride.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OrderedConfigurationOverride.java?rev=730877&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OrderedConfigurationOverride.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OrderedConfigurationOverride.java Fri Jan  2 16:34:28 2009
@@ -0,0 +1,63 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.internal;
+
+import org.apache.tapestry5.ioc.def.ContributionDef;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.internal.util.Orderer;
+
+class OrderedConfigurationOverride<T>
+{
+    private final Orderer<T> orderer;
+
+    private final String id;
+
+    private final T replacementObject;
+
+    private final String[] constraints;
+
+    private final ContributionDef contribDef;
+
+    OrderedConfigurationOverride(Orderer<T> orderer, String id, T replacementObject, String[] constraints,
+                                 ContributionDef contribDef)
+    {
+        this.orderer = orderer;
+        this.id = id;
+        this.replacementObject = replacementObject;
+        this.constraints = constraints;
+        this.contribDef = contribDef;
+    }
+
+    void apply()
+    {
+        try
+        {
+            orderer.override(id, replacementObject, constraints);
+        }
+        catch (Exception ex)
+        {
+            String message = String.format("Failure processing override from %s: %s",
+                                           contribDef,
+                                           InternalUtils.toMessage(ex));
+
+            throw new RuntimeException(message, ex);
+        }
+    }
+
+    public ContributionDef getContribDef()
+    {
+        return contribDef;
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java Fri Jan  2 16:34:28 2009
@@ -375,9 +375,10 @@
         Logger logger = getServiceLogger(serviceId);
 
         Orderer<T> orderer = new Orderer<T>(logger);
+        Map<String, OrderedConfigurationOverride<T>> overrides = CollectionFactory.newCaseInsensitiveMap();
 
         for (Module m : moduleToServiceDefs.keySet())
-            addToOrderedConfiguration(orderer, objectType, serviceDef, m);
+            addToOrderedConfiguration(orderer, overrides, objectType, serviceDef, m);
 
         // An ugly hack ... perhaps we should introduce a new builtin service so that this can be
         // accomplished in the normal way?
@@ -395,6 +396,9 @@
             orderer.add("ServiceByMarker", (T) contribution);
         }
 
+        for (OrderedConfigurationOverride<T> override : overrides.values())
+            override.apply();
+
         return orderer.getOrdered();
     }
 
@@ -501,11 +505,12 @@
         }
     }
 
-    private <T> void addToOrderedConfiguration(Orderer<T> orderer,
-                                               Class<T> valueType,
+    private <T> void addToOrderedConfiguration(final Orderer<T> orderer,
+                                               final Map<String, OrderedConfigurationOverride<T>> overrides,
+                                               final Class<T> valueType,
                                                ServiceDef serviceDef, final Module module)
     {
-        String serviceId = serviceDef.getServiceId();
+        final String serviceId = serviceDef.getServiceId();
         Set<ContributionDef> contributions = module.getContributorDefsForService(serviceId);
 
         if (contributions.isEmpty()) return;
@@ -515,10 +520,6 @@
 
         final ServiceResources resources = new ServiceResourcesImpl(this, module, serviceDef, classFactory, logger);
 
-        final OrderedConfiguration<T> validating = new ValidatingOrderedConfigurationWrapper<T>(orderer, serviceId,
-                                                                                                valueType,
-                                                                                                resources);
-
         for (final ContributionDef def : contributions)
         {
             String description = IOCMessages.invokingMethod(def);
@@ -530,6 +531,10 @@
             {
                 public void run()
                 {
+                    OrderedConfiguration<T> validating =
+                            new ValidatingOrderedConfigurationWrapper<T>(orderer, overrides, def, serviceId, valueType,
+                                                                         resources);
+
                     def.contribute(module, resources, validating);
                 }
             });

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapper.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapper.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapper.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapper.java Fri Jan  2 16:34:28 2009
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009 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.
@@ -16,8 +16,12 @@
 
 import org.apache.tapestry5.ioc.ObjectLocator;
 import org.apache.tapestry5.ioc.OrderedConfiguration;
+import org.apache.tapestry5.ioc.def.ContributionDef;
+import org.apache.tapestry5.ioc.internal.util.Defense;
 import org.apache.tapestry5.ioc.internal.util.Orderer;
 
+import java.util.Map;
+
 /**
  * Wraps a {@link java.util.List} as a {@link org.apache.tapestry5.ioc.OrderedConfiguration}, implementing validation of
  * values provided to an {@link org.apache.tapestry5.ioc.OrderedConfiguration}.
@@ -34,11 +38,19 @@
 
     private final ObjectLocator locator;
 
+    private final Map<String, OrderedConfigurationOverride<T>> overrides;
+
+    private final ContributionDef contribDef;
 
-    public ValidatingOrderedConfigurationWrapper(Orderer<T> orderer, String serviceId, Class expectedType,
+    public ValidatingOrderedConfigurationWrapper(Orderer<T> orderer,
+                                                 Map<String, OrderedConfigurationOverride<T>> overrides,
+                                                 ContributionDef contribDef, String serviceId,
+                                                 Class expectedType,
                                                  ObjectLocator locator)
     {
         this.orderer = orderer;
+        this.overrides = overrides;
+        this.contribDef = contribDef;
         this.serviceId = serviceId;
         this.expectedType = expectedType;
         this.locator = locator;
@@ -51,11 +63,30 @@
         orderer.add(id, object, constraints);
     }
 
+    public void override(String id, T object, String... constraints)
+    {
+        Defense.notBlank(id, "id");
+
+        checkValid(object);
+
+        OrderedConfigurationOverride existing = overrides.get(id);
+        if (existing != null)
+            throw new IllegalArgumentException(String.format("Contribution '%s' has already been overridden (by %s).",
+                                                             id, existing.getContribDef()));
+
+        overrides.put(id, new OrderedConfigurationOverride(orderer, id, object, constraints, contribDef));
+    }
+
     public void addInstance(String id, Class<? extends T> clazz, String... constraints)
     {
         add(id, locator.autobuild(clazz), constraints);
     }
 
+    public void overrideInstance(String id, Class<? extends T> clazz, String... constraints)
+    {
+        override(id, locator.autobuild(clazz), constraints);
+    }
+
     private void checkValid(T object)
     {
         if (object == null || expectedType.isInstance(object)) return;

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/Orderer.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/Orderer.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/Orderer.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/Orderer.java Fri Jan  2 16:34:28 2009
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2009 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.
@@ -100,6 +100,24 @@
         idToOrderable.put(id, orderable);
     }
 
+    public void override(Orderable<T> orderable)
+    {
+        lock.check();
+
+        String id = orderable.getId();
+
+        Orderable<T> existing = idToOrderable.get(id);
+
+        if (existing == null)
+            throw new IllegalArgumentException(
+                    String.format("Override for object '%s' is invalid as it does not match an existing object.", id));
+
+        orderables.remove(existing);
+        orderables.add(orderable);
+
+        idToOrderable.put(id, orderable);
+    }
+
     /**
      * Adds an object to be ordered.
      *
@@ -116,6 +134,13 @@
         add(new Orderable<T>(id, target, constraints));
     }
 
+    public void override(String id, T target, String... constraints)
+    {
+        lock.check();
+
+        override(new Orderable<T>(id, target, constraints));
+    }
+
     public List<T> getOrdered()
     {
         lock.lock();

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConfigurationOverrideModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConfigurationOverrideModule.java?rev=730877&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConfigurationOverrideModule.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConfigurationOverrideModule.java Fri Jan  2 16:34:28 2009
@@ -0,0 +1,24 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc;
+
+public class ConfigurationOverrideModule
+{
+    public static void contributeOrderedNames(OrderedConfiguration<String> configuration)
+    {
+        configuration.add("wilma", "WILMA", "after:barney");
+        configuration.override("fred", "Mr. Flintstone", "after:*");
+    }
+}

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/DuplicateConfigurationOverrideModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/DuplicateConfigurationOverrideModule.java?rev=730877&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/DuplicateConfigurationOverrideModule.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/DuplicateConfigurationOverrideModule.java Fri Jan  2 16:34:28 2009
@@ -0,0 +1,24 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc;
+
+public class DuplicateConfigurationOverrideModule
+{
+    public static void contributeOrderedNames(OrderedConfiguration<String> configuration)
+    {
+        configuration.override("fred", "Fred Flintstone");
+    }
+}
+

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/FailedConfigurationOverrideModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/FailedConfigurationOverrideModule.java?rev=730877&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/FailedConfigurationOverrideModule.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/FailedConfigurationOverrideModule.java Fri Jan  2 16:34:28 2009
@@ -0,0 +1,24 @@
+// Copyright 2009 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc;
+
+public class FailedConfigurationOverrideModule
+{
+    public static void contributeOrderedNames(OrderedConfiguration<String> configuration)
+    {
+        // Failure: wilma doesn't exist
+        configuration.override("wilma", "WILMA", "after:barney");
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java Fri Jan  2 16:34:28 2009
@@ -1143,4 +1143,58 @@
 
         r.shutdown();
     }
+
+    @Test
+    public void successful_ordered_configuration_override()
+    {
+        Registry r = buildRegistry(FredModule.class, BarneyModule.class, ConfigurationOverrideModule.class);
+
+        NameListHolder service = r.getService("OrderedNames", NameListHolder.class);
+
+        List<String> names = service.getNames();
+
+        assertEquals(names, Arrays.asList("BARNEY", "WILMA", "Mr. Flintstone"));
+    }
+
+    @Test
+    public void failed_ordered_configuration_override()
+    {
+        Registry r = buildRegistry(FredModule.class, BarneyModule.class, FailedConfigurationOverrideModule.class);
+
+        NameListHolder service = r.getService("OrderedNames", NameListHolder.class);
+
+        try
+        {
+            service.getNames();
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertMessageContains(ex,
+                                  "Failure processing override from org.apache.tapestry5.ioc.FailedConfigurationOverrideModule.contributeOrderedNames(OrderedConfiguration)",
+                                  "Override for object 'wilma' is invalid as it does not match an existing object.");
+        }
+    }
+
+    @Test
+    public void duplicate_ordered_configuration_override()
+    {
+        Registry r = buildRegistry(FredModule.class, BarneyModule.class, ConfigurationOverrideModule.class,
+                                   DuplicateConfigurationOverrideModule.class);
+
+        NameListHolder service = r.getService("OrderedNames", NameListHolder.class);
+
+        try
+        {
+            service.getNames();
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            // Can't get too specific since we don't know which module will get processed first
+            assertMessageContains(ex,
+                                  "Error invoking service contribution method ",
+                                  "Contribution 'fred' has already been overridden");
+        }
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapperTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapperTest.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapperTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/ValidatingOrderedConfigurationWrapperTest.java Fri Jan  2 16:34:28 2009
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009 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.
@@ -41,7 +41,7 @@
         replay();
 
         OrderedConfiguration<Runnable> wrapper = new ValidatingOrderedConfigurationWrapper<Runnable>(
-                orderer, "Service", Runnable.class, null);
+                orderer, null, null, "Service", Runnable.class, null);
 
         wrapper.add("id", contribution, "after:pre", "before:post");
 
@@ -68,7 +68,7 @@
         replay();
 
         OrderedConfiguration<Map> wrapper = new ValidatingOrderedConfigurationWrapper<Map>(
-                orderer, "Service", Map.class, locator);
+                orderer, null, null, "Service", Map.class, locator);
 
         wrapper.addInstance("id", HashMap.class, "after:pre", "before:post");
 
@@ -86,7 +86,7 @@
         replay();
 
         OrderedConfiguration<Runnable> wrapper = new ValidatingOrderedConfigurationWrapper<Runnable>(
-                orderer, "Service", Runnable.class, null);
+                orderer, null, null, "Service", Runnable.class, null);
 
         wrapper.add("id", null);
 
@@ -104,7 +104,7 @@
 
         replay();
 
-        OrderedConfiguration wrapper = new ValidatingOrderedConfigurationWrapper(orderer, "Service",
+        OrderedConfiguration wrapper = new ValidatingOrderedConfigurationWrapper(orderer, null, null, "Service",
                                                                                  Runnable.class, null);
 
         try

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/OrdererTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/OrdererTest.java?rev=730877&r1=730876&r2=730877&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/OrdererTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/util/OrdererTest.java Fri Jan  2 16:34:28 2009
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2009 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.
@@ -46,6 +46,57 @@
     }
 
     @Test
+    public void override()
+    {
+        Logger logger = mockLogger();
+
+        replay();
+
+        Orderer<String> o = new Orderer<String>(logger);
+
+        o.add("fred", "FRED");
+        o.add("barney", "BARNEY");
+        o.add("wilma", "WILMA");
+        o.add("betty", "BETTY");
+
+        o.override("barney", "Mr. Rubble", "before:*");
+
+        List<String> ordered = o.getOrdered();
+
+        assertEquals(ordered, Arrays.asList("Mr. Rubble", "FRED", "WILMA", "BETTY"));
+
+        verify();
+    }
+
+    @Test
+    public void failed_override()
+    {
+        Logger logger = mockLogger();
+
+        replay();
+
+        Orderer<String> o = new Orderer<String>(logger);
+
+        o.add("fred", "FRED");
+        o.add("barney", "BARNEY");
+        o.add("wilma", "WILMA");
+        o.add("betty", "BETTY");
+
+        try
+        {
+            o.override("bambam", "Mr. Rubble JR.", "before:*");
+            unreachable();
+        }
+        catch (IllegalArgumentException ex)
+        {
+            assertEquals(ex.getMessage(),
+                         "Override for object 'bambam' is invalid as it does not match an existing object.");
+        }
+
+        verify();
+    }
+
+    @Test
     public void missing_constraint_type()
     {
         Logger logger = mockLogger();