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 2006/07/27 16:47:27 UTC

svn commit: r426092 - in /tapestry/tapestry5/tapestry-core/trunk/src: main/java/org/apache/tapestry/internal/ioc/ main/java/org/apache/tapestry/test/ main/resources/org/apache/tapestry/internal/ioc/ test/java/org/apache/tapestry/internal/ioc/

Author: hlship
Date: Thu Jul 27 07:47:26 2006
New Revision: 426092

URL: http://svn.apache.org/viewvc?rev=426092&view=rev
Log:
Start work on adding support for mapped configurations (and contributions).

Added:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapper.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapperTest.java
Modified:
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java
    tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingConfigurationWrapperTest.java
    tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java?rev=426092&r1=426091&r2=426092&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/IOCMessages.java Thu Jul 27 07:47:26 2006
@@ -197,6 +197,11 @@
         return MESSAGES.format("contribution-was-null", serviceId, def);
     }
 
+    static String contributionKeyWasNull(String serviceId, ContributionDef def)
+    {
+        return MESSAGES.format("contribution-key-was-null", serviceId, def);
+    }
+
     static String contributionWrongValueType(String serviceId, ContributionDef def,
             Class actualClass, Class expectedClass)
     {
@@ -204,6 +209,13 @@
         { serviceId, def, actualClass.getName(), expectedClass.getName() });
     }
 
+    static String contributionWrongKeyType(String serviceId, ContributionDef def,
+            Class actualClass, Class expectedClass)
+    {
+        return MESSAGES.format("contribution-wrong-key-type", new Object[]
+        { serviceId, def, actualClass.getName(), expectedClass.getName() });
+    }
+
     static String tooManyConfigurationParameters(Method method)
     {
         return MESSAGES.format("too-many-configuration-parameters", asString(method));
@@ -212,5 +224,15 @@
     static String genericTypeNotSupported(Type type)
     {
         return MESSAGES.format("generic-type-not-supported", type);
+    }
+
+    static String contributionDuplicateKey(String serviceId, ContributionDef contributionDef,
+            ContributionDef existingDef)
+    {
+        return MESSAGES.format(
+                "contribution-duplicate-key",
+                serviceId,
+                contributionDef,
+                existingDef);
     }
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapper.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapper.java?rev=426092&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapper.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapper.java Thu Jul 27 07:47:26 2006
@@ -0,0 +1,98 @@
+package org.apache.tapestry.internal.ioc;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.internal.annotations.SuppressNullCheck;
+import org.apache.tapestry.ioc.MappedConfiguration;
+import org.apache.tapestry.ioc.def.ContributionDef;
+
+/**
+ * Provides two forms of validation for mapped configurations:
+ * <ul>
+ * <li>If either key or value is null, then a warning is logged </li>
+ * <li>If the key has previously been stored (by some other
+ * {@link org.apache.tapestry.ioc.def.ContributionDef}, then a warning is logged</li>
+ * </ul>
+ * <p>
+ * When a warning is logged, the key/value pair is not added to the delegate.
+ * 
+ * @author Howard M. Lewis Ship
+ * @param <K>
+ * @param <V>
+ */
+@SuppressNullCheck
+public class ValidatingMappedConfigurationWrapper<K, V> implements MappedConfiguration<K, V>
+{
+    private final String _serviceId;
+
+    private final ContributionDef _contributionDef;
+
+    private final Log _log;
+
+    private final Class<K> _expectedKeyType;
+
+    private final Class<V> _expectedValueType;
+
+    private final Map<K, ContributionDef> _keyToContributor;
+
+    private final MappedConfiguration<K, V> _delegate;
+
+    public ValidatingMappedConfigurationWrapper(String serviceId, ContributionDef contributionDef,
+            Log log, Class<K> expectedKeyType, Class<V> expectedValueType,
+            Map<K, ContributionDef> keyToContributor, MappedConfiguration<K, V> delegate)
+    {
+        _serviceId = serviceId;
+        _contributionDef = contributionDef;
+        _log = log;
+        _expectedKeyType = expectedKeyType;
+        _expectedValueType = expectedValueType;
+        _keyToContributor = keyToContributor;
+        _delegate = delegate;
+    }
+
+    public void add(K key, V value)
+    {
+        if (key == null)
+        {
+            _log.warn(IOCMessages.contributionKeyWasNull(_serviceId, _contributionDef));
+            return;
+        }
+
+        if (value == null)
+        {
+            _log.warn(IOCMessages.contributionWasNull(_serviceId, _contributionDef));
+            return;
+        }
+
+        if (!_expectedKeyType.isInstance(key))
+        {
+            _log.warn(IOCMessages.contributionWrongKeyType(_serviceId, _contributionDef, key
+                    .getClass(), _expectedKeyType));
+            return;
+        }
+
+        if (!_expectedValueType.isInstance(value))
+        {
+            _log.warn(IOCMessages.contributionWrongValueType(_serviceId, _contributionDef, value
+                    .getClass(), _expectedValueType));
+            return;
+        }
+
+        ContributionDef existing = _keyToContributor.get(key);
+
+        if (existing != null)
+        {
+            _log.warn(IOCMessages.contributionDuplicateKey(_serviceId, _contributionDef, existing));
+            return;
+        }
+
+        _delegate.add(key, value);
+
+        // Remember that this key is provided by this contribution, when looking
+        // for future conflicts.
+
+        _keyToContributor.put(key, _contributionDef);
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java?rev=426092&r1=426091&r2=426092&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/BaseTestCase.java Thu Jul 27 07:47:26 2006
@@ -320,4 +320,10 @@
         return newMock(DecoratorDef.class);
     }
 
+    /** Frequently used as a placeholder for an arbitrary service (but its nice and simple). */
+    protected final Runnable newRunnable()
+    {
+        return newMock(Runnable.class);
+    }
+
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties?rev=426092&r1=426091&r2=426092&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/ioc/IOCStrings.properties Thu Jul 27 07:47:26 2006
@@ -58,7 +58,12 @@
   make contributions into the service's configuration. The method has been ignored.
 contribution-method-error=Error invoking service contribution method {0}: {1}
 contribution-was-null=Service contribution (to service ''{0}'', by {1}) was null and has been ignored.
+contribution-key-was-null=Key for service contribution (to service ''{0}'', by {1}) was null and has been ignored.
 contribution-wrong-value-type=Service contribution (to service ''{0}'', by {1}) was an instance of {2}, \
   but {3} was expected. The contribution has been ignored.
+contribution-wrong-key-type=Key for service contribution (to service ''{0}'', by {1}) was an instance of {2}, \
+  but {3} was expected. The contribution has been ignored.
+contribution-duplicate-key=Service contribution (to service ''{0}'', by {1}) conflicts with \
+  existing contribution (by {2}) and has been ignored.
 generic-type-not-supported=Generic type ''{0}'' is not supported. Only simple parameterized lists are \
   supported.

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingConfigurationWrapperTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingConfigurationWrapperTest.java?rev=426092&r1=426091&r2=426092&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingConfigurationWrapperTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingConfigurationWrapperTest.java Thu Jul 27 07:47:26 2006
@@ -101,8 +101,4 @@
 
     }
 
-    private Runnable newRunnable()
-    {
-        return newMock(Runnable.class);
-    }
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapperTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapperTest.java?rev=426092&view=auto
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapperTest.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingMappedConfigurationWrapperTest.java Thu Jul 27 07:47:26 2006
@@ -0,0 +1,103 @@
+package org.apache.tapestry.internal.ioc;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.tapestry.internal.test.InternalBaseTestCase;
+import org.apache.tapestry.ioc.MappedConfiguration;
+import org.apache.tapestry.ioc.def.ContributionDef;
+import org.testng.annotations.Test;
+
+import static org.apache.tapestry.util.CollectionFactory.newMap;
+
+/**
+ * @author Howard M. Lewis Ship
+ */
+public class ValidatingMappedConfigurationWrapperTest extends InternalBaseTestCase
+{
+    private static final String SERVICE_ID = "foo.bar.Baz";
+
+    private static final String CLASS_NAME = ValidatingMappedConfigurationWrapperTest.class
+            .getName();
+
+    @Test
+    public void proper_key_and_value()
+    {
+        ContributionDef def = newContributionDef();
+        Log log = newLog();
+        Map<Class, ContributionDef> keyToContribution = newMap();
+        MappedConfiguration<Class, Runnable> delegate = newMappedConfiguration();
+
+        Class key = Integer.class;
+        Runnable value = newRunnable();
+
+        delegate.add(key, value);
+
+        replay();
+
+        MappedConfiguration<Class, Runnable> wrapper = new ValidatingMappedConfigurationWrapper<Class, Runnable>(
+                SERVICE_ID, def, log, Class.class, Runnable.class, keyToContribution, delegate);
+
+        wrapper.add(key, value);
+
+        verify();
+    }
+
+    @Test
+    public void null_key()
+    {
+        ContributionDef def = newContributionDef("contributionPlaceholder1");
+        Log log = newLog();
+        Map<Class, ContributionDef> keyToContribution = newMap();
+        MappedConfiguration<Class, Runnable> delegate = newMappedConfiguration();
+        Runnable value = newRunnable();
+
+        log.warn(IOCMessages.contributionKeyWasNull(SERVICE_ID, def));
+
+        replay();
+
+        MappedConfiguration<Class, Runnable> wrapper = new ValidatingMappedConfigurationWrapper<Class, Runnable>(
+                SERVICE_ID, def, log, Class.class, Runnable.class, keyToContribution, delegate);
+
+        wrapper.add(null, value);
+
+        verify();
+    }
+
+    @Test
+    public void null_value()
+    {
+        ContributionDef def = newContributionDef("contributionPlaceholder1");
+        Log log = newLog();
+        Map<Class, ContributionDef> keyToContribution = newMap();
+        MappedConfiguration<Class, Runnable> delegate = newMappedConfiguration();
+
+        log.warn(IOCMessages.contributionWasNull(SERVICE_ID, def));
+
+        replay();
+
+        MappedConfiguration<Class, Runnable> wrapper = new ValidatingMappedConfigurationWrapper<Class, Runnable>(
+                SERVICE_ID, def, log, Class.class, Runnable.class, keyToContribution, delegate);
+
+        wrapper.add(Integer.class, null);
+
+        verify();
+
+    }
+
+    private ContributionDef newContributionDef(String methodName)
+    {
+        return new ContributionDefImpl(SERVICE_ID, findMethod(methodName));
+    }
+
+    public void contributionPlaceholder1()
+    {
+
+    }
+
+    public void contributionPlaceholder2()
+    {
+
+    }
+
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java?rev=426092&r1=426091&r2=426092&view=diff
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/ioc/ValidatingOrderedConfigurationWrapperTest.java Thu Jul 27 07:47:26 2006
@@ -117,9 +117,4 @@
     {
 
     }
-
-    private Runnable newRunnable()
-    {
-        return newMock(Runnable.class);
-    }
 }