You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/03/07 21:46:30 UTC

[1/3] git commit: ISIS-356: injectXxx for injecting services.

ISIS-356: injectXxx for injecting services.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/1c11f87f
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/1c11f87f
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/1c11f87f

Branch: refs/heads/master
Commit: 1c11f87fb7dd800bdb79500c5ab620156ab1a970
Parents: db62664
Author: Dan Haywood <da...@apache.org>
Authored: Thu Mar 7 17:33:04 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Mar 7 17:33:04 2013 +0000

----------------------------------------------------------------------
 component/viewer/restfulobjects/pom.xml            |    1 -
 .../runtimecontext/RuntimeContextAbstract.java     |    5 ++
 .../metamodel/runtimecontext/ServicesInjector.java |    8 +++
 .../noruntime/RuntimeContextNoRuntime.java         |    5 ++
 .../services/ServicesInjectorDefault.java          |   33 ++++++----
 .../metamodel/services/ServicesInjectorSpi.java    |    7 --
 .../core/metamodel/spec/SpecificationLoader.java   |    1 +
 .../spec/SpecificationLoaderDelegator.java         |   10 +++
 .../javalang/RemoveInjectMethodsFacetFactory.java  |   47 +++++++++++++++
 .../dflt/ProgrammingModelFacetsJava5.java          |    2 +
 .../progmodel/facets/ProgrammableReflector.java    |    5 ++
 .../internal/RuntimeContextFromSession.java        |    5 ++
 .../dom/src/main/java/dom/todo/ToDoItem.java       |    2 +-
 13 files changed, 109 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/component/viewer/restfulobjects/pom.xml
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/pom.xml b/component/viewer/restfulobjects/pom.xml
index 93d7744..ca63a9c 100644
--- a/component/viewer/restfulobjects/pom.xml
+++ b/component/viewer/restfulobjects/pom.xml
@@ -159,7 +159,6 @@
 
     <modules>
 	    <module>applib</module>
-	    <module>jaxrs</module>
 	    <module>rendering</module>
 	    <module>server</module>
 	    <module>tck</module>

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
index a5f31a2..0b9958a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/RuntimeContextAbstract.java
@@ -137,6 +137,11 @@ public abstract class RuntimeContextAbstract implements RuntimeContext, Specific
             public ObjectSpecification introspectIfRequired(ObjectSpecification spec) {
                 return specificationLoader.introspectIfRequired(spec);
             }
+
+            @Override
+            public List<Class<?>> getServiceClasses() {
+                return specificationLoader.getServiceClasses();
+            }
         });
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
index bd17f9e..9af283f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/ServicesInjector.java
@@ -25,6 +25,14 @@ import org.apache.isis.core.commons.components.Injectable;
 public interface ServicesInjector extends Injectable {
 
     /**
+     * All registered services, as an immutable {@link List}.
+     * 
+     * <p>
+     * Does not include the {@link #getContainer() container}.
+     */
+    List<Object> getRegisteredServices();
+
+    /**
      * Provided by the <tt>ServicesInjectorDefault</tt> when used by framework.
      * 
      * <p>

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
index da87335..e979460 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
@@ -98,6 +98,11 @@ public class RuntimeContextNoRuntime extends RuntimeContextAbstract {
             public <T> List<T> lookupServices(Class<T> serviceClass) {
                 return null;
             }
+
+            @Override
+            public List<Object> getRegisteredServices() {
+                return null;
+            }
         };
         authenticationSessionProvider = new AuthenticationSessionProviderAbstract() {
             @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
index eb28818..706c5fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
@@ -27,6 +27,7 @@ import static org.hamcrest.CoreMatchers.nullValue;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -169,23 +170,29 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
 
     private static void injectServices(final Object object, final List<Object> services) {
         final Class<?> cls = object.getClass();
-        for (final Object service : services) {
-            final Class<?> serviceClass = service.getClass();
-            final Method[] methods = cls.getMethods();
-            for (int j = 0; j < methods.length; j++) {
-                if (!methods[j].getName().startsWith("set")) {
-                    continue;
-                }
-                final Class<?>[] parameterTypes = methods[j].getParameterTypes();
-                if (parameterTypes.length != 1 || parameterTypes[0] == Object.class || !parameterTypes[0].isAssignableFrom(serviceClass)) {
-                    continue;
+        final Method[] methods = cls.getMethods();
+
+        for (int j = 0; j < methods.length; j++) {
+            for (final Object service : services) {
+                final Class<?> serviceClass = service.getClass();
+                boolean isInjectorMethod = isInjectorMethodFor(methods[j], serviceClass);
+                if(isInjectorMethod) {
+                    methods[j].setAccessible(true);
+                    invokeSetMethod(methods[j], object, service);
                 }
+            }
+        }
+    }
 
-                methods[j].setAccessible(true);
-
-                invokeSetMethod(methods[j], object, service);
+    public static boolean isInjectorMethodFor(Method method, final Class<?> serviceClass) {
+        final String methodName = method.getName();
+        if (methodName.startsWith("set") || methodName.startsWith("inject")) {
+            final Class<?>[] parameterTypes = method.getParameterTypes();
+            if (parameterTypes.length == 1 && parameterTypes[0] != Object.class && parameterTypes[0].isAssignableFrom(serviceClass)) {
+                return true;
             }
         }
+        return false;
     }
 
     private static void invokeMethod(final Method method, final Object target, final Object[] parameters) {

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
index e598a2d..1dbfde9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
@@ -69,13 +69,6 @@ public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injecta
      */
     void setServices(List<Object> services);
 
-    /**
-     * All registered services, as an immutable {@link List}.
-     * 
-     * <p>
-     * Does not include the {@link #getContainer() container}.
-     */
-    List<Object> getRegisteredServices();
 
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
index 3e164c7..737b1c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoader.java
@@ -66,6 +66,7 @@ public interface SpecificationLoader extends Injectable {
     Collection<ObjectSpecification> allSpecifications();
 
 
+    List<Class<?>> getServiceClasses();
     
     /**
      * Whether this class has been loaded.

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
index 49f336f..89b89c8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderDelegator.java
@@ -81,6 +81,13 @@ public class SpecificationLoaderDelegator extends SpecificationLoaderAbstract {
         return specificationLoaderDelegate.introspectIfRequired(spec);
     }
 
+    
+    @Override
+    public List<Class<?>> getServiceClasses() {
+        return specificationLoaderDelegate.getServiceClasses();
+    }
+
+    
     @Override
     public void injectInto(Object candidate) {
         super.injectInto(candidate);
@@ -92,4 +99,7 @@ public class SpecificationLoaderDelegator extends SpecificationLoaderAbstract {
 
 
 
+
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
new file mode 100644
index 0000000..d91f9f5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/ignore/javalang/RemoveInjectMethodsFacetFactory.java
@@ -0,0 +1,47 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.isis.core.progmodel.facets.object.ignore.javalang;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
+
+public class RemoveInjectMethodsFacetFactory extends FacetFactoryAbstract {
+
+    public RemoveInjectMethodsFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        for (Class<? extends Object> serviceClass : getSpecificationLoader().getServiceClasses()) {
+            Method[] methods = processClassContext.getCls().getMethods();
+            for (Method method : methods) {
+                if(ServicesInjectorDefault.isInjectorMethodFor(method, serviceClass)) {
+                    processClassContext.removeMethod(method);
+                }
+            }
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 71af1c1..cded2ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -87,6 +87,7 @@ import org.apache.isis.core.progmodel.facets.object.ignore.isis.RemoveStaticGett
 import org.apache.isis.core.progmodel.facets.object.ignore.javalang.IteratorFilteringFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.ignore.javalang.RemoveGetClassMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.ignore.javalang.RemoveInitMethodFacetFactory;
+import org.apache.isis.core.progmodel.facets.object.ignore.javalang.RemoveInjectMethodsFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.ignore.javalang.RemoveJavaLangComparableMethodsFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.ignore.javalang.RemoveJavaLangObjectMethodsFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.ignore.javalang.RemoveSuperclassMethodsFacetFactory;
@@ -213,6 +214,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(RemoveJavaLangComparableMethodsFacetFactory.class);
         addFactory(RemoveSetDomainObjectContainerMethodFacetFactory.class);
         addFactory(RemoveInitMethodFacetFactory.class);
+        addFactory(RemoveInjectMethodsFacetFactory.class);
         addFactory(RemoveStaticGettersAndSettersFacetFactory.class);
         addFactory(RemoveGetClassMethodFacetFactory.class);
         addFactory(RemoveProgrammaticOrIgnoreAnnotationMethodsFacetFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
index 549b7f8..db35953 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
@@ -141,4 +141,9 @@ public class ProgrammableReflector implements SpecificationLoaderSpi, Applicatio
         throw new NotYetImplementedException();
     }
 
+    @Override
+    public List<Class<?>> getServiceClasses() {
+        throw new NotYetImplementedException();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
index b05085d..2f58181 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
@@ -292,6 +292,11 @@ public class RuntimeContextFromSession extends RuntimeContextAbstract {
                 }
             }
 
+            @Override
+            public List<Object> getRegisteredServices() {
+                return getPersistenceSession().getServicesInjector().getRegisteredServices();
+            }
+
         };
         this.localizationProvider = new LocalizationProviderAbstract() {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/1c11f87f/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index 069dc1a..6a26ea9 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -476,7 +476,7 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // {{ injected: ToDoItems
     private ToDoItems toDoItems;
 
-    public void setToDoItems(final ToDoItems toDoItems) {
+    public void injectToDoItems(final ToDoItems toDoItems) {
         this.toDoItems = toDoItems;
     }
     // }}