Author: hlship
Date: Tue Sep 9 15:21:00 2008
New Revision: 693636
URL: http://svn.apache.org/viewvc?rev=693636&view=rev
Log:
TAPESTRY-2655: Services defined with the bind() method may conflict with
services from service builder methods without error
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceDefAccumulator.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java?rev=693636&r1=693635&r2=693636&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImpl.java
Tue Sep 9 15:21:00 2008
@@ -325,10 +325,7 @@
ServiceDef existing = serviceDefs.get(serviceId);
if (existing != null)
- {
- logger.warn(buildMethodConflict(serviceDef.toString(),
existing.toString()));
- return;
- }
+ throw new RuntimeException(buildMethodConflict(serviceId,
serviceDef.toString(), existing.toString()));
serviceDefs.put(serviceId, serviceDef);
}
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java?rev=693636&r1=693635&r2=693636&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
Tue Sep 9 15:21:00 2008
@@ -35,9 +35,9 @@
{
private static final Messages MESSAGES =
MessagesImpl.forClass(IOCMessages.class);
- static String buildMethodConflict(String conflict, String existing)
+ static String buildMethodConflict(String serviceId, String conflict,
String existing)
{
- return MESSAGES.format("build-method-conflict", conflict, existing);
+ return MESSAGES.format("build-method-conflict", serviceId, conflict,
existing);
}
static String buildMethodWrongReturnType(Method method)
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java?rev=693636&r1=693635&r2=693636&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
Tue Sep 9 15:21:00 2008
@@ -119,7 +119,9 @@
public String getDescription()
{
- return
classFactory.getConstructorLocation(constructor).toString();
+ return String.format("%s via %s",
+
classFactory.getConstructorLocation(constructor),
+
classFactory.getMethodLocation(bindMethod));
}
};
}
@@ -257,5 +259,4 @@
return this;
}
-
}
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceDefAccumulator.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceDefAccumulator.java?rev=693636&r1=693635&r2=693636&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceDefAccumulator.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceDefAccumulator.java
Tue Sep 9 15:21:00 2008
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2008 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,6 +16,11 @@
import org.apache.tapestry5.ioc.def.ServiceDef;
+/**
+ * Simple interface used when invoking a bind() method on a module class.
+ *
+ * @see org.apache.tapestry5.ioc.internal.ServiceBinderImpl
+ */
public interface ServiceDefAccumulator
{
void addServiceDef(ServiceDef serviceDef);
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties?rev=693636&r1=693635&r2=693636&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
Tue Sep 9 15:21:00 2008
@@ -12,8 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-build-method-conflict=Service building method %s conflicts with (has the same
name as, but different parameters than) \
- previously seen method %s and has been ignored.
+build-method-conflict=Service %s (defined by %s) conflicts with previously
defined service defined by %s.
build-method-wrong-return-type=Method %s is named like a service builder
method, \
but the return type (%s) is not acceptable (try an interface). \
The method has been ignored.
@@ -76,9 +75,9 @@
no-such-service=Service id '%s' is not defined by any module. Defined
services: %s.
service-id-conflict=Service id '%s' has already been defined by %s and may not
be redefined by %s. \
You should rename one of the service builder methods.
- no-constructor=Class %s (implementation of service '%s') does not contain any
public constructors.
- bind-method-must-be-static=Method %s appears to be a service binder method,
but is an instance method, not a static method.
- error-in-bind-method=Error invoking service binder method %s: %s
+no-constructor=Class %s (implementation of service '%s') does not contain any
public constructors.
+bind-method-must-be-static=Method %s appears to be a service binder method,
but is an instance method, not a static method.
+error-in-bind-method=Error invoking service binder method %s: %s
no-autobuild-constructor=Class %s does not contain a public constructor needed
to autobuild.
autobuild-constructor-error=Error invoking constructor %s: %s
overlapping-service-proxy-providers=Setting a new service proxy provider when
there's already an existing provider. This may indicate that you have multiple
IoC Registries.
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java?rev=693636&r1=693635&r2=693636&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
Tue Sep 9 15:21:00 2008
@@ -19,7 +19,6 @@
import org.apache.tapestry5.ioc.def.DecoratorDef;
import org.apache.tapestry5.ioc.def.ModuleDef;
import org.apache.tapestry5.ioc.def.ServiceDef;
-import static
org.apache.tapestry5.ioc.internal.IOCMessages.buildMethodConflict;
import org.apache.tapestry5.ioc.internal.services.ClassFactoryImpl;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
@@ -133,30 +132,23 @@
Logger logger = mockLogger();
- logger.warn(buildMethodConflict(conflictMethodString, expectedMethod));
-
replay();
// BigDecimal is arbitrary, any class would do.
- ModuleDef md = new
DefaultModuleDefImpl(ServiceIdConflictMethodModule.class, logger, classFactory);
-
- Set<String> ids = md.getServiceIds();
-
- assertEquals(ids.size(), 1);
- assertTrue(ids.contains("Fred"));
-
- ServiceDef sd = md.getServiceDef("Fred");
-
- assertEquals(sd.getServiceId(), "Fred");
-
- assertEquals(sd.getServiceInterface(), FieService.class);
+ try
+ {
+ new DefaultModuleDefImpl(ServiceIdConflictMethodModule.class,
logger, classFactory);
- // The methods are considered in ascending order, by name, then
descending order, by
- // parameter count. So the grinder will latch onto the method that
takes a parameter,
- // and consider the other method (with no parameters) the conflict.
+ unreachable();
+ }
+ catch (RuntimeException ex)
+ {
+ assertMessageContains(ex,
+ "Service Fred (defined by
org.apache.tapestry5.ioc.internal.ServiceIdConflictMethodModule.buildFred()",
+ "conflicts with previously defined service
defined by
org.apache.tapestry5.ioc.internal.ServiceIdConflictMethodModule.buildFred(Object)");
+ }
- assertEquals(sd.toString(), expectedMethod.toString());
verify();
}