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)