You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by th...@apache.org on 2014/12/07 03:29:25 UTC

[27/45] tapestry-5 git commit: TAP5-2425: throw a meaningful exception when trying to use an abstract class as a service implementation

TAP5-2425: throw a meaningful exception when trying to use an abstract class as a service implementation


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/b06c013f
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/b06c013f
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/b06c013f

Branch: refs/heads/beanmodel-split
Commit: b06c013f1719c455b46ed4b88b74b66fd963197a
Parents: 23e512b
Author: Jochen Kemnade <jk...@apache.org>
Authored: Thu Dec 4 20:38:32 2014 +0100
Committer: Jochen Kemnade <jk...@apache.org>
Committed: Thu Dec 4 20:38:32 2014 +0100

----------------------------------------------------------------------
 .../tapestry5/ioc/internal/IOCMessages.java     |  5 ++++
 .../ioc/internal/ServiceBinderImpl.java         |  3 ++
 .../ioc/internal/IOCStrings.properties          |  3 +-
 .../ioc/specs/DefaultModuleDefImplSpec.groovy   | 28 +++++++++++++++----
 .../AbstractAutobuildServiceModule.java         | 25 +++++++++++++++++
 .../ioc/internal/AbstractRunnableService.java   | 29 ++++++++++++++++++++
 6 files changed, 87 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b06c013f/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
index 7584702..ac39d15 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
@@ -187,6 +187,11 @@ final class IOCMessages
         return MESSAGES.format("no-constructor", implementationClass.getName(), serviceId);
     }
 
+    static String abstractServiceImplementation(Class implementationClass, String serviceId)
+    {
+        return MESSAGES.format("abstract-service-implementation", implementationClass.getName(), serviceId);
+    }
+
     static String bindMethodMustBeStatic(String methodId)
     {
         return MESSAGES.format("bind-method-must-be-static", methodId);

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b06c013f/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
index e7ec9e1..d93ed2e 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBinderImpl.java
@@ -28,6 +28,7 @@ import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.Arrays;
 import java.util.Set;
 
@@ -140,6 +141,8 @@ public class ServiceBinderImpl implements ServiceBinder, ServiceBindingOptions
 
     private ObjectCreatorSource createStandardConstructorBasedObjectCreatorSource()
     {
+        if (Modifier.isAbstract(serviceImplementation.getModifiers()))
+            throw new RuntimeException(IOCMessages.abstractServiceImplementation(serviceImplementation, serviceId));
         final Constructor constructor = InternalUtils.findAutobuildConstructor(serviceImplementation);
 
         if (constructor == null)

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b06c013f/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties b/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
index 73fe7e7..6710b91 100644
--- a/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
+++ b/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
@@ -65,4 +65,5 @@ overlapping-service-proxy-providers=Setting a new service proxy provider when th
 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.
 contribution-for-nonexistent-service=Contribution %s is for service '%s', which does not exist.
-contribution-for-unqualified-service=Contribution %s is for service '%s' qualified with marker annotations %s, which does not exist.
\ No newline at end of file
+contribution-for-unqualified-service=Contribution %s is for service '%s' qualified with marker annotations %s, which does not exist.
+abstract-service-implementation=Class %s (implementation of service '%s') is abstract.

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b06c013f/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy b/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
index 91f6dc3..e46f469 100644
--- a/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
+++ b/tapestry-ioc/src/test/groovy/ioc/specs/DefaultModuleDefImplSpec.groovy
@@ -7,9 +7,12 @@ import org.apache.tapestry5.ioc.def.ServiceDef3
 import org.apache.tapestry5.ioc.internal.services.PlasticProxyFactoryImpl
 import org.apache.tapestry5.ioc.services.PlasticProxyFactory
 import org.slf4j.Logger
+
+import spock.lang.Issue;
 import spock.lang.Shared
 import spock.lang.Specification
 import spock.lang.Unroll
+
 import org.apache.tapestry5.ioc.*
 import org.apache.tapestry5.ioc.internal.*
 
@@ -415,15 +418,15 @@ class DefaultModuleDefImplSpec extends Specification {
 
   def "Multiple marker annotations can be added to service via ServiceBindingOptions"() {
 	  when:
-  
+
 	  def md = module MarkerModule
 	  def sd = md.getServiceDef "ColorfulGreeter"
-  
+
 	  then:
-  
+
 	  sd.markers == [RedMarker, BlueMarker] as Set
 	}
-  
+
   def "public synthetic methods on module class are ignored"() {
     def moduleClass = createSyntheticModuleClass()
 
@@ -435,7 +438,7 @@ class DefaultModuleDefImplSpec extends Specification {
 
     md.serviceIds.size() == 1
   }
-  
+
   def "Methods overridden from Object are ignored"() {
 
     when:
@@ -447,6 +450,21 @@ class DefaultModuleDefImplSpec extends Specification {
     md.serviceIds.size() == 1
   }
 
+  @Issue('https://issues.apache.org/jira/browse/TAP5-2425')
+  def "a service implementation must not be abstract"() {
+
+    when:
+
+    module AbstractAutobuildServiceModule
+
+    then:
+
+    RuntimeException e = thrown()
+
+    e.message.contains "Class org.apache.tapestry5.ioc.internal.AbstractRunnableService (implementation of service 'Runnable') is abstract."
+
+  }
+
 
   private createSyntheticModuleClass() {
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b06c013f/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractAutobuildServiceModule.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractAutobuildServiceModule.java b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractAutobuildServiceModule.java
new file mode 100644
index 0000000..13bc367
--- /dev/null
+++ b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractAutobuildServiceModule.java
@@ -0,0 +1,25 @@
+// Copyright 2007, 2010 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.ServiceBinder;
+
+public class AbstractAutobuildServiceModule
+{
+    public static void bind(ServiceBinder binder)
+    {
+        binder.bind(Runnable.class, AbstractRunnableService.class).preventReloading();
+    }
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b06c013f/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractRunnableService.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractRunnableService.java b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractRunnableService.java
new file mode 100644
index 0000000..978286a
--- /dev/null
+++ b/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/AbstractRunnableService.java
@@ -0,0 +1,29 @@
+// Copyright 2014 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;
+
+/**
+ * This service implementation is abstract, which triggers an exception.
+ */
+public abstract class AbstractRunnableService implements Runnable
+{
+
+
+    @Override
+    public void run()
+    {
+    }
+
+}