You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/01/25 14:16:14 UTC

[isis] branch 2033-IoC updated: ISIS-2033: fixes services we want the service registry to know about

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 6bbfda1  ISIS-2033: fixes services we want the service registry to know about
6bbfda1 is described below

commit 6bbfda11e54a338cdff40f1e42d19edb060683e0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jan 25 15:16:08 2019 +0100

    ISIS-2033: fixes services we want the service registry to know about
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../services/confview/ConfigurationMenu.java       |  2 +
 .../services/metamodel/MetaModelServicesMenu.java  |  8 ++-
 .../services/metamodel/MetaModelExporter.java      | 16 ++---
 .../metamodel/MetaModelServiceDefault.java         | 24 +++-----
 .../services/registry/ServiceRegistryDefault.java  | 70 ++++++++++------------
 .../services/swagger/SwaggerServiceDefault.java    |  9 +++
 .../services/swagger/internal/Generation.java      |  5 ++
 .../metamodel/specloader/SpecificationLoader.java  | 38 ++++++++++--
 .../java/domainapp/dom/impl/HelloWorldObjects.java |  2 +
 9 files changed, 107 insertions(+), 67 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
index 75aa89e..ea4b3f4 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
@@ -22,6 +22,7 @@ package org.apache.isis.applib.services.confview;
 import java.util.Set;
 
 import javax.inject.Inject;
+import javax.inject.Singleton;
 
 import org.apache.isis.applib.IsisApplibModule;
 import org.apache.isis.applib.annotation.Action;
@@ -40,6 +41,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
         menuBar = DomainServiceLayout.MenuBar.TERTIARY,
         menuOrder = "500.900"
         )
+@Singleton
 public class ConfigurationMenu {
 
     public static abstract class ActionDomainEvent
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
index 473b5a5..62031bc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
@@ -123,9 +123,11 @@ public class MetaModelServicesMenu {
             
             @ParameterLayout(named = ".xml file name")
             final String fileName,
+            
             @ParameterLayout(named = "Packages",
                 describedAs="Subset of the complete meta model, only including packages starting with given prefix.")
             final List<String> packages,
+            
             @ParameterLayout(named = "Ignore Interfaces")
             @Parameter(optionality=Optionality.MANDATORY)
             final boolean ignoreInterfaces
@@ -136,15 +138,15 @@ public class MetaModelServicesMenu {
                 new MetaModelService.Config()
                 .withIgnoreNoop()
                 .withIgnoreAbstractClasses()
-                        .withIgnoreInterfaces()
-                        .withIgnoreBuiltInValueTypes();
+                .withIgnoreBuiltInValueTypes();
+        
         for (final String pkg : packages) {
             config = config.withPackagePrefix(pkg);
         }
+        
         if(ignoreInterfaces) {
             config = config.withIgnoreInterfaces();
         }
-        
 
         final MetamodelDto metamodelDto =  metaModelService.exportMetaModel(config);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
index 67fc316..228a013 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
@@ -66,10 +66,10 @@ class MetaModelExporter {
     @SuppressWarnings("unused")
     private final static Logger LOG = LoggerFactory.getLogger(MetaModelExporter.class);
 
-    SpecificationLoader specificationLookup;
+    SpecificationLoader specificationLoader;
 
-    public MetaModelExporter(final SpecificationLoader specificationLookup) {
-        this.specificationLookup = specificationLookup;
+    public MetaModelExporter(final SpecificationLoader specificationLoader) {
+        this.specificationLoader = specificationLoader;
     }
 
     /**
@@ -87,7 +87,7 @@ class MetaModelExporter {
         // phase 1: create a domainClassType for each ObjectSpecification
         // these are added into a map for lookups in phase 2
         final Map<ObjectSpecification, DomainClassDto> domainClassByObjectSpec = _Maps.newHashMap();
-        for (final ObjectSpecification specification : specificationLookup.allSpecifications()) {
+        for (final ObjectSpecification specification : specificationLoader.allSpecifications()) {
             DomainClassDto domainClassType = asXsdType(specification, config);
             domainClassByObjectSpec.put(specification, domainClassType);
         }
@@ -466,9 +466,9 @@ class MetaModelExporter {
         } else if(attributeObj instanceof String) {
             str = asStr((String) attributeObj);
         } else if(attributeObj instanceof Enum) {
-            str = asStr((Enum) attributeObj);
+            str = asStr((Enum<?>) attributeObj);
         } else if(attributeObj instanceof Class) {
-            str = asStr((Class) attributeObj);
+            str = asStr((Class<?>) attributeObj);
         } else if(attributeObj instanceof Specification) {
             str = asStr((Specification) attributeObj);
         } else if(attributeObj instanceof Facet) {
@@ -525,11 +525,11 @@ class MetaModelExporter {
         return attributeObj.getId();
     }
 
-    private String asStr(final Class attributeObj) {
+    private String asStr(final Class<?> attributeObj) {
         return attributeObj.getCanonicalName();
     }
 
-    private String asStr(final Enum attributeObj) {
+    private String asStr(final Enum<?> attributeObj) {
         return attributeObj.name();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 617c4d1..93fc625 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -29,7 +29,6 @@ import javax.inject.Singleton;
 
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.AppManifest2;
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
 import org.apache.isis.applib.services.grid.GridService;
@@ -58,24 +57,20 @@ import org.apache.isis.schema.metamodel.v1.MetamodelDto;
 @Singleton
 public class MetaModelServiceDefault implements MetaModelService {
 
-    // private final static Logger LOG = LoggerFactory.getLogger(MetaModelServiceDefault.class);
-
     private MetaModelExporter metaModelExporter;
 
     @PostConstruct
-    @Programmatic
     public void init() {
-        metaModelExporter = new MetaModelExporter(specificationLookup);
+        metaModelExporter = new MetaModelExporter(specificationLoader);
     }
 
     @Override
-    @Programmatic
     public Class<?> fromObjectType(final String objectType) {
         if(objectType == null) {
             return null;
         }
         final ObjectSpecId objectSpecId = ObjectSpecId.of(objectType);
-        final ObjectSpecification objectSpecification = specificationLookup.lookupBySpecId(objectSpecId);
+        final ObjectSpecification objectSpecification = specificationLoader.lookupBySpecId(objectSpecId);
         return objectSpecification != null? objectSpecification.getCorrespondingClass(): null;
     }
 
@@ -84,7 +79,7 @@ public class MetaModelServiceDefault implements MetaModelService {
         if(domainType == null) {
             return null;
         }
-        final ObjectSpecification objectSpecification = specificationLookup.loadSpecification(domainType);
+        final ObjectSpecification objectSpecification = specificationLoader.loadSpecification(domainType);
         final ObjectSpecIdFacet objectSpecIdFacet = objectSpecification.getFacet(ObjectSpecIdFacet.class);
         final ObjectSpecId objectSpecId = objectSpecIdFacet.value();
         return objectSpecId.asString();
@@ -92,11 +87,11 @@ public class MetaModelServiceDefault implements MetaModelService {
 
     @Override
     public void rebuild(final Class<?> domainType) {
-        specificationLookup.invalidateCache(domainType);
+        specificationLoader.invalidateCache(domainType);
         
         GridService gridService = _CDI.getManagedBean(GridService.class).get();
         gridService.remove(domainType);
-        specificationLookup.loadSpecification(domainType);
+        specificationLoader.loadSpecification(domainType);
     }
 
     // //////////////////////////////////////
@@ -104,10 +99,9 @@ public class MetaModelServiceDefault implements MetaModelService {
 
 
     @Override
-    @Programmatic
     public DomainModel getDomainModel() {
 
-        final Collection<ObjectSpecification> specifications = specificationLookup.allSpecifications();
+        final Collection<ObjectSpecification> specifications = specificationLoader.allSpecifications();
 
         final List<DomainMember> rows = _Lists.newArrayList();
         for (final ObjectSpecification spec : specifications) {
@@ -183,7 +177,7 @@ public class MetaModelServiceDefault implements MetaModelService {
         if(domainType == null) {
             return null;
         }
-        final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainType);
+        final ObjectSpecification objectSpec = specificationLoader.loadSpecification(domainType);
         if(objectSpec.isService()) {
             return Sort.DOMAIN_SERVICE;
         }
@@ -248,7 +242,7 @@ public class MetaModelServiceDefault implements MetaModelService {
             return null;
         }
 
-        final ObjectSpecification spec = specificationLookup.lookupBySpecId(objectSpecId);
+        final ObjectSpecification spec = specificationLoader.lookupBySpecId(objectSpecId);
         if(spec == null) {
             return null;
         }
@@ -279,7 +273,7 @@ public class MetaModelServiceDefault implements MetaModelService {
         return metaModelExporter.exportMetaModel(config);
     }
     
-    @Inject SpecificationLoader specificationLookup;
+    @Inject SpecificationLoader specificationLoader;
     //@Inject GridService gridService; // to break circular dependency
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
index 59073c0..85c2caa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java
@@ -78,6 +78,8 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
                 .map(Instance::get);
     }
     
+   
+    
     @Override
     public Stream<Object> streamServices() {
         
@@ -86,18 +88,10 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
             registeredServiceBeans.stream()
             .forEach(bean->{
                 
+            	//FIXME [2033] properly filter those services we want the service registry to know about, 
+            	// or categorize them ?
             	val scope = bean.getScope().getSimpleName();
-            	
-            	if(!"Singleton".equals(scope)) {
-            		return;
-            	}
-            	
                 val type = bean.getBeanClass();
-                val logScope = type.getName().startsWith("org.apache.isis.");
-                
-                if(logScope) {
-                    log.info("processing bean {}", bean);
-                } 
                 
                 Optional<?> managedObject = 
                         _CDI.getManagedBean(type, bean.getQualifiers());
@@ -105,21 +99,20 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
                 if(managedObject.isPresent()) {
                     registeredServiceInstances.add(managedObject.get());
                     
-                    if(logScope) {
-                        log.info("registering as a {} service {}", scope, managedObject.get());
-                    }
+                    log.info("registering as a {}-scoped service {}", scope, managedObject.get());
                     
                 } else {
                     
-                    if(logScope) {
-                        log.warn("failed to register bean as a service {}", bean);
-                    }
+                    log.warn("failed to register bean {}-scoped as a service {}", scope, bean);
+                    
                 }
             });
         }
         
         return registeredServiceInstances.stream();
     }
+    
+    // --
 
     @Override
     public <T> Stream<T> streamServices(final Class<T> serviceClass) {
@@ -159,37 +152,40 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
         validate(streamServiceBeans());
     }
 
-    // -- HELPER ...
+    
+    // -- HELPER - FILTER
+    
+    private boolean isBeanToBeAcceptedForRegistration(Bean<?> bean) {
+    	val scope = bean.getScope().getSimpleName();
+    	if("Singleton".equals(scope)) { //this is to also accept producer methods, that produce singletons
+    		return true;
+    	}
+    	val type = bean.getBeanClass();
+		if(isServiceType(type)) {
+			return true;
+		}
+    	
+    	log.warn("not a singleton: {} {}", scope, bean);
+    	
+    	return false;
+    }
     
     private Stream<Bean<?>> streamServiceBeans() {
         
     	if(registeredServiceBeans.isEmpty()) {
 
-    		_CDI.streamAllBeans().forEach(bean->{
-
-    			val type = bean.getBeanClass();
-    			val logScope = type.getName().startsWith("org.apache.isis.");
-
-    			//                if(logScope) {
-    			//                    log.info("processing bean {}", bean);
-    			//                } 
-
-    			if(!isServiceType(type)) {
-    				return;
-    			}
-
-    			if(logScope) {
-    				log.info("registering as a service {}", bean);
-    				registeredServiceBeans.add(bean);
-    			}
-
+    		_CDI.streamAllBeans()
+    		.filter(this::isBeanToBeAcceptedForRegistration)
+    		.forEach(bean->{
+    			registeredServiceBeans.add(bean);
     		});
             
         }
         
         return registeredServiceBeans.stream();
     }        
-    // -- VALIDATE
+    
+    // -- HELPER - VALIDATE
         
     private static void validate(final Stream<Bean<?>> serviceBeans) {
 
@@ -222,7 +218,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
     }
 
         
-    // -- LOOKUP SERVICE(S)
+    // -- HELPER - LOOKUP SERVICE(S)
 
     private <T> Set<Object> locateMatchingServices(final Class<T> serviceClass) {
         final Set<Object> matchingServices = streamServices()
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
index 517c46d..c92d5c6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/SwaggerServiceDefault.java
@@ -28,6 +28,7 @@ import javax.inject.Singleton;
 
 import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.core.metamodel.services.swagger.internal.SwaggerSpecGenerator;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
@@ -36,6 +37,8 @@ public class SwaggerServiceDefault implements SwaggerService {
 
 	@Inject SpecificationLoader specificationLoader;
 
+	private final static _Probe probe = _Probe.unlimited().label("SwaggerServiceDefault"); 
+	
     @Override
     public String generateSwaggerSpec(
             final Visibility visibility,
@@ -43,6 +46,12 @@ public class SwaggerServiceDefault implements SwaggerService {
 
         final SwaggerSpecGenerator swaggerSpecGenerator = new SwaggerSpecGenerator(specificationLoader);
         final String swaggerSpec = swaggerSpecGenerator.generate(basePath.get(), visibility, format);
+        
+        System.out.println("----------------------------------------------------------------------------");
+        probe.println("spec contains ConfigurationMenu=" + swaggerSpec.contains("ConfigurationMenu"));
+        probe.println("spec contains HelloWorldObjects=" + swaggerSpec.contains("HelloWorldObjects"));
+        System.out.println("----------------------------------------------------------------------------");
+        
         return swaggerSpec;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
index abd5304..1355f48 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
@@ -30,6 +30,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
@@ -175,10 +176,14 @@ class Generation {
 //        System .out.println(all);
 //    }
 
+    private final static _Probe probe = _Probe.unlimited().label("Generation");
+    
     void appendObjectPathsAndDefinitions() {
         // (previously we took a protective copy to avoid a concurrent modification exception,
         // but this is now done by SpecificationLoader itself)
         for (final ObjectSpecification objectSpec : specificationLoader.allSpecifications()) {
+        	
+        	probe.println("objectSpec %s", objectSpec);
 
             final DomainServiceFacet domainServiceFacet = objectSpec.getFacet(DomainServiceFacet.class);
             if (domainServiceFacet != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index 6f334d5..2e607ed 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -25,17 +25,18 @@ import java.util.stream.Stream;
 
 import javax.enterprise.inject.Vetoed;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.commons.internal.cdi._CDI;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.config.property.ConfigPropertyBoolean;
@@ -60,13 +61,17 @@ import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbs
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelDeficiencies;
-import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolExecutionMode;
 import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
+import org.apache.isis.schema.metamodel.v1.MetamodelDto;
 import org.apache.isis.schema.utils.CommonDtoUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import lombok.val;
 
 /**
  * Builds the meta-model.
@@ -210,7 +215,32 @@ public class SpecificationLoader {
         }
 
         LOG.info("init() - done");
+        
+        //FIXME [2033] remove
+        {
+        	streamServiceClasses()
+        	.forEach(service->probe.println("using service %s", service));
+        	
+        	
+        	val metaModelService = _CDI.getSingleton(MetaModelService.class);
+        	val jaxbService = _CDI.getSingleton(JaxbService.class);
+        	
+        	val metamodelDto =
+        			metaModelService.exportMetaModel(
+        					new MetaModelService.Config()
+        							.withIgnoreNoop()
+        							.withIgnoreAbstractClasses()
+        							.withIgnoreBuiltInValueTypes()
+        							.withIgnoreInterfaces()
+        							.withPackagePrefix("domainapp")
+        			);
+			
+			final String xml = jaxbService.toXml(metamodelDto);
+			//probe.println(xml);
+        }
     }
+    
+    private final static _Probe probe = _Probe.unlimited().label("SpecificationLoader");
 
     private void logBefore(
             final List<ObjectSpecification> specificationsFromRegistry,
diff --git a/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObjects.java b/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObjects.java
index 8bd33ee..3950b19 100644
--- a/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObjects.java
+++ b/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObjects.java
@@ -21,6 +21,7 @@ package domainapp.dom.impl;
 import java.util.List;
 
 import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.jdo.JDOQLTypedQuery;
 
 import org.apache.isis.applib.annotation.Action;
@@ -39,6 +40,7 @@ import domainapp.dom.types.Name;
         nature = NatureOfService.VIEW_MENU_ONLY,
         objectType = "helloworld.HelloWorldObjects"
 )
+@Singleton
 public class HelloWorldObjects {
 
     @Action(semantics = SemanticsOf.NON_IDEMPOTENT)