This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2033-IoC
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/2033-IoC by this push:
     new b33d1b9  ISIS-2033: simple-app: let CDI bootstrap Spring
b33d1b9 is described below

commit b33d1b99318db504ca0498c71809acdb5bf140ff
Author: Andi Huber <[email protected]>
AuthorDate: Tue Jan 29 21:26:13 2019 +0100

    ISIS-2033: simple-app: let CDI bootstrap Spring
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../isis/config/builder/ModulePackageHelper.java   |  5 ++++
 .../isis/core/metamodel/services/ServiceUtil.java  | 16 +++++++------
 .../modules/spring/SpringContextBridge.java        | 27 ++++++++++++++++++++++
 .../modules/spring/SpringContextListener.java      | 26 ---------------------
 .../domainapp/modules/spring/SpringModule.java     |  9 ++++++++
 .../modules/spring/SpringModuleBridge.java         | 20 ++++++++++++++++
 .../modules/spring/SpringModuleCDIBridge.java      | 17 --------------
 .../modules/spring/dom/customer/CustomerMenu.java  | 27 ++++++++++++++++++----
 8 files changed, 92 insertions(+), 55 deletions(-)

diff --git 
a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
 
b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
index 75294dd..f938e64 100644
--- 
a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
+++ 
b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
@@ -187,6 +187,11 @@ class ModulePackageHelper {
         
registry.setViewModelTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, 
viewModelTypes));
         
registry.setXmlElementTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, 
xmlElementTypes));
         
+        typesForScanning.addAll(domainServiceTypes);
+        typesForScanning.addAll(viewModelTypes);
+        typesForScanning.addAll(domainObjectTypes);
+        typesForScanning.addAll(persistenceCapableTypes);
+        
         return typesForScanning;
     }
     
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
index 61bdaa8..e3d8e06 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
@@ -38,6 +38,7 @@ public final class ServiceUtil {
     private ServiceUtil() {
     }
 
+    //FIXME [2033] I found no standardized way yet to do this, maybe create a 
list during bean-scan?
     public static String idOfBean(final Bean<?> serviceBean) {
        
        // serviceBean might also be a producer method
@@ -84,14 +85,15 @@ public final class ServiceUtil {
                return normalize(requiredTypes.iterator().next());      
        }
        
+       return serviceBean.toString();
        
-       throw _Exceptions.unrecoverable(
-                       String.format("Could not extract a service id from the 
given bean '%s', "
-                                       + "implementedTypes='%s' 
requiredTypes='%s' from types %s.", 
-                                       serviceBean, 
-                                       implementedTypes,
-                                       requiredTypes,
-                                       serviceBean.getTypes()));
+//     throw _Exceptions.unrecoverable(
+//                     String.format("Could not extract a service id from the 
given bean '%s', "
+//                                     + "implementedTypes='%s' 
requiredTypes='%s' from types %s.", 
+//                                     serviceBean, 
+//                                     implementedTypes,
+//                                     requiredTypes,
+//                                     serviceBean.getTypes()));
        
 
     }
diff --git 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextBridge.java
 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextBridge.java
new file mode 100644
index 0000000..a05728c
--- /dev/null
+++ 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextBridge.java
@@ -0,0 +1,27 @@
+package domainapp.modules.spring;
+
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.inject.Singleton;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import lombok.val;
+
+public class SpringContextBridge {
+       
+       @Produces @Singleton
+       public ApplicationContext springContext() {
+               val springContext = new SpringApplication(SpringModule.class);
+               return springContext.run();
+       }
+       
+       public void close(@Disposes ApplicationContext springContext) {
+               if(springContext instanceof ConfigurableApplicationContext) {
+                       
((ConfigurableApplicationContext)springContext).close();        
+               }
+       }
+
+}
diff --git 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextListener.java
 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextListener.java
deleted file mode 100644
index 7d266aa..0000000
--- 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package domainapp.modules.spring;
-
-import java.util.NoSuchElementException;
-
-import javax.enterprise.inject.Vetoed;
-
-import org.apache.isis.commons.internal.context._Context;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-
-@Vetoed // must not be managed by CDI
-public class SpringContextListener implements ApplicationContextAware {
-
-       @Override
-       public void setApplicationContext(ApplicationContext springContext) 
throws BeansException {
-               _Context.putSingleton(ApplicationContext.class, springContext);
-       }
-       
-       public static ApplicationContext currentContext() {
-               return _Context.getOrThrow(ApplicationContext.class, 
-                               ()-> new NoSuchElementException(
-                                               "There is no Spring 
ApplicationContext stored on framework's _Context."));
-       }
-       
-}
diff --git 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
index c7dbef3..666fab0 100644
--- 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
+++ 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
@@ -18,6 +18,15 @@
  */
 package domainapp.modules.spring;
 
+import javax.enterprise.inject.Vetoed;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+
+@Vetoed // must not be managed by CDI
+@Configuration
+//@ComponentScan(basePackages= {"domainapp.modules.spring"})
+@EnableAutoConfiguration
 public class SpringModule {
 
 }
diff --git 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleBridge.java
 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleBridge.java
new file mode 100644
index 0000000..a35e278
--- /dev/null
+++ 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleBridge.java
@@ -0,0 +1,20 @@
+package domainapp.modules.spring;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+import org.springframework.context.ApplicationContext;
+
+import domainapp.modules.spring.dom.customer.CustomerRepository;
+
+// not to be managed by Spring
+public class SpringModuleBridge {
+
+       @Inject ApplicationContext springContext;
+       
+       @Produces
+       public CustomerRepository getCustomerRepository() {
+               return springContext.getBean(CustomerRepository.class);
+       }
+       
+}
diff --git 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleCDIBridge.java
 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleCDIBridge.java
deleted file mode 100644
index f0b4ba4..0000000
--- 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleCDIBridge.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package domainapp.modules.spring;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
-import javax.inject.Singleton;
-
-import domainapp.modules.spring.dom.customer.CustomerRepository;
-
-@ApplicationScoped // not to be managed by Spring
-public class SpringModuleCDIBridge {
-
-       @Produces @Singleton
-       public CustomerRepository getCustomerRepository() {
-               return 
SpringContextListener.currentContext().getBean(CustomerRepository.class);
-       }
-       
-}
diff --git 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
index 1af74d8..0dbaa79 100644
--- 
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
+++ 
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
@@ -3,28 +3,45 @@ package domainapp.modules.spring.dom.customer;
 import java.util.List;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.ParameterLayout;
 
 @DomainService(
         nature = NatureOfService.VIEW_MENU_ONLY,
         objectType = "simple.CustomerMenu"
 )
-@DomainObjectLayout(named="Customer (Spring Demo)")
-@Singleton
+@DomainServiceLayout(named="Customer (Spring Demo)")
 public class CustomerMenu {
 
        @Inject private CustomerRepository customerRepository;
        
        @Action
        @ActionLayout(cssClassFa="fa-leaf")
-       public List<Customer> findByLastName(String lastName) {
+       public List<Customer> findByLastName(
+                       @ParameterLayout(named="Last Name")
+                       String lastName) {
+               
                return customerRepository.findByLastName(lastName);
        }
        
+       @Action
+       @ActionLayout(cssClassFa="fa-leaf")
+       public Customer createCustomer ( 
+                       
+                       @ParameterLayout(named="First Name")
+                       String firstName,
+                       
+                       @ParameterLayout(named="Last Name")
+                       String lastName
+                       
+                       ) {
+
+               return customerRepository.save(new Customer(firstName, 
lastName));
+       }
+       
 }

Reply via email to