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);
- }
}