You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by dr...@apache.org on 2008/07/03 00:57:30 UTC

svn commit: r673536 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/ main/resources/org/apache/tapestry5/ioc/internal/ site/apt/ test/java/org/apache/tapestry5/ioc/

Author: drobiazko
Date: Wed Jul  2 15:57:29 2008
New Revision: 673536

URL: http://svn.apache.org/viewvc?rev=673536&view=rev
Log:
TAPESTRY-1810: ServiceBinder.bind() with an interface should check to see if there's an Impl class and bind to that.

Added:
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionFailureModule.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModule.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModuleImplementationNotFound.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/PingableImpl.java
Modified:
    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/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
    tapestry/tapestry5/trunk/tapestry-ioc/src/site/apt/service.apt
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java

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=673536&r1=673535&r2=673536&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 Wed Jul  2 15:57:29 2008
@@ -306,4 +306,9 @@
     {
         return MESSAGES.format("no-proxy-provider", serviceId);
     }
+
+    static String noConventionServiceImplementationFound(Class clazz)
+    {
+        return MESSAGES.format("no-convention-service-implementation-found", clazz.getName(), clazz.getName());
+    }
 }

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=673536&r1=673535&r2=673536&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 Wed Jul  2 15:57:29 2008
@@ -112,9 +112,26 @@
         return result;
     }
 
-    public <T> ServiceBindingOptions bind(Class<T> implementationClass)
+    public <T> ServiceBindingOptions bind(Class<T> serviceClass)
     {
-        return bind(implementationClass, implementationClass);
+        if(serviceClass.isInterface())
+        {
+            try
+            {
+                Class<T> implementationClass = (Class<T>) Class.forName(serviceClass.getName()+"Impl");
+                
+                if(!implementationClass.isInterface() && serviceClass.isAssignableFrom(implementationClass))
+                {
+                    return bind(serviceClass, implementationClass);
+                }
+                throw new RuntimeException(IOCMessages.noServiceMatchesType(serviceClass));
+            }
+            catch (ClassNotFoundException ex)
+            {
+                throw new RuntimeException(IOCMessages.noConventionServiceImplementationFound(serviceClass));
+            }
+        }
+        return bind(serviceClass, serviceClass);
     }
 
     public <T> ServiceBindingOptions bind(Class<T> serviceInterface, Class<? extends T> serviceImplementation)

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=673536&r1=673535&r2=673536&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 Wed Jul  2 15:57:29 2008
@@ -87,3 +87,4 @@
 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.
 unexpected-service-proxy-provider=Unexpected service proxy provider when clearing the provider. This may indicate that you have multiple IoC Registries.
 no-proxy-provider=Service token for service '%s' can not be converted back into a proxy because no proxy provider has been registered. This may indicate that an IoC Registry has not been started yet.
+no-convention-service-implementation-found=No service implements the interface %s. Please provide the implementation %sImpl or bind the service interface to a service implementation.

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/site/apt/service.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/site/apt/service.apt?rev=673536&r1=673535&r2=673536&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/site/apt/service.apt (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/site/apt/service.apt Wed Jul  2 15:57:29 2008
@@ -107,6 +107,25 @@
 
   In terms of the evolution of the framework, service builder methods came first, and autobuilding was a later
   addition, inspired by the terseness of the {{{http://code.google.com/p/google-guice/}Guice}} IoC container.
+
+
+  Following the convention over configuration principle the autobuilding of services can be done even less verbose.
+  If a service interface is passed as a single argument to the bind() method Tapestry will try to find an implementation in the
+  same package whose name matches the name of the service interface followed by the suffix <Impl>.
+  
++------+
+package org.example.myapp.services;
+
+import org.apache.tapestry5.ioc.ServiceBinder;
+
+public class MyAppModule
+{
+  public static void bind(ServiceBinder binder)
+  {
+    binder.bind(Indexer.class);
+  }
+}
++----+
     
 Service Ids
 

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionFailureModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionFailureModule.java?rev=673536&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionFailureModule.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionFailureModule.java Wed Jul  2 15:57:29 2008
@@ -0,0 +1,9 @@
+package org.apache.tapestry5.ioc;
+
+public class ConventionFailureModule
+{
+    public static void bind(ServiceBinder binder)
+    {
+        binder.bind(Pingable.class);
+    }
+}

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModule.java?rev=673536&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModule.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModule.java Wed Jul  2 15:57:29 2008
@@ -0,0 +1,9 @@
+package org.apache.tapestry5.ioc;
+
+public class ConventionModule
+{
+    public static void bind(ServiceBinder binder)
+    {
+        binder.bind(StringHolder.class);
+    }
+}

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModuleImplementationNotFound.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModuleImplementationNotFound.java?rev=673536&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModuleImplementationNotFound.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ConventionModuleImplementationNotFound.java Wed Jul  2 15:57:29 2008
@@ -0,0 +1,9 @@
+package org.apache.tapestry5.ioc;
+
+public class ConventionModuleImplementationNotFound
+{
+    public static void bind(ServiceBinder binder)
+    {
+        binder.bind(StringTransformer.class);
+    }
+}

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=673536&r1=673535&r2=673536&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 Wed Jul  2 15:57:29 2008
@@ -401,6 +401,47 @@
 
         r.shutdown();
     }
+    
+    @Test
+    public void convention_over_configuration_service()
+    {
+        Registry r = buildRegistry(ConventionModule.class);
+
+
+        StringHolder holder = r.getService(StringHolder.class);
+        
+        holder.setValue("Bar");
+
+        assertEquals(holder.getValue(), "Bar");
+
+        r.shutdown();
+    }
+    
+    @Test
+    public void convention_over_configuration_service_impl_not_found()
+    {
+        try
+        {
+            buildRegistry(ConventionModuleImplementationNotFound.class);
+            unreachable();
+        }catch (RuntimeException ex) {
+            assertMessageContains(ex,
+            "No service implements the interface "+StringTransformer.class.getName()+". Please provide");
+        }
+    }
+    
+    @Test
+    public void convention_over_configuration_service_wrong_impl_found()
+    {
+        try
+        {
+            buildRegistry(ConventionFailureModule.class);
+            unreachable();
+        }catch (RuntimeException ex) {
+            assertMessageContains(ex,
+            "No service implements the interface "+Pingable.class.getName());
+        }
+    }
 
     @Test
     public void service_builder_method_uses_autobuild()

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/PingableImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/PingableImpl.java?rev=673536&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/PingableImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/PingableImpl.java Wed Jul  2 15:57:29 2008
@@ -0,0 +1,6 @@
+package org.apache.tapestry5.ioc;
+
+public class PingableImpl
+{
+
+}