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 2018/10/09 09:27:11 UTC

[isis] 01/03: ISIS-2003: adds further config options

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

danhaywood pushed a commit to branch ISIS-2003
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 68d36bf9d6c4c039be330503ebc5758d07d81d76
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Oct 9 00:32:41 2018 +0100

    ISIS-2003: adds further config options
---
 .../services/metamodel/MetaModelService6.java      | 30 ++++++--
 .../services/metamodel/MetaModelExporter.java      | 90 +++++++++++++---------
 2 files changed, 74 insertions(+), 46 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService6.java b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService6.java
index e5f61a7..319954e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService6.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService6.java
@@ -18,6 +18,11 @@
  */
 package org.apache.isis.applib.services.metamodel;
 
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.schema.metamodel.v1.MetamodelDto;
 
@@ -29,16 +34,17 @@ public interface MetaModelService6 extends MetaModelService5 {
         private static final int IGNORE_INTERFACES = 2;
         private static final int IGNORE_ABSTRACT_CLASSES = 4;
         private static final int IGNORE_BUILT_IN_VALUE_TYPES = 8;
+        private static final int IGNORE_MIXINS = 16;
 
         private final int mask;
-        private final String packagePrefix;
+        private final List<String> packagePrefixes;
 
         public Config() {
-            this(0, null);
+            this(0, Collections.<String>emptyList());
         }
-        private Config(final int mask, final String packagePrefix) {
+        private Config(final int mask, final List<String> packagePrefixes) {
             this.mask = mask;
-            this.packagePrefix = packagePrefix;
+            this.packagePrefixes = Collections.unmodifiableList(packagePrefixes);
         }
         private Config(final int mask) {
             this(mask, null);
@@ -58,13 +64,18 @@ public interface MetaModelService6 extends MetaModelService5 {
         public Config withIgnoreBuiltInValueTypes() {
             return newConfigWith(IGNORE_BUILT_IN_VALUE_TYPES);
         }
+        public Config withIgnoreMixins() {
+            return newConfigWith(IGNORE_MIXINS);
+        }
 
         private Config newConfigWith(final int x) {
-            return new Config(mask | x, packagePrefix);
+            return new Config(mask | x, packagePrefixes);
         }
 
         public Config withPackagePrefix(final String packagePrefix) {
-            return new Config(mask, packagePrefix);
+            final List<String> prefixes = Lists.newArrayList(packagePrefix);
+            prefixes.add(packagePrefix);
+            return new Config(mask, prefixes);
         }
 
         public boolean isIgnoreNoop() {
@@ -81,9 +92,12 @@ public interface MetaModelService6 extends MetaModelService5 {
         public boolean isIgnoreBuiltInValueTypes() {
             return hasFlag(IGNORE_BUILT_IN_VALUE_TYPES);
         }
+        public boolean isIgnoreMixins() {
+            return hasFlag(IGNORE_MIXINS);
+        }
 
-        public String getPackagePrefix() {
-            return packagePrefix;
+        public List<String> getPackagePrefixes() {
+            return packagePrefixes;
         }
 
         private boolean hasFlag(final int x) {
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 109ef20..06c51f2 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
@@ -34,6 +34,7 @@ import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
@@ -41,6 +42,7 @@ import org.apache.isis.applib.services.metamodel.MetaModelService6;
 import org.apache.isis.applib.spec.Specification;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -91,8 +93,10 @@ class MetaModelExporter {
         // these are added into a map for lookups in phase 2
         Map<ObjectSpecification, DomainClass> domainClassByObjectSpec = Maps.newHashMap();
         for (final ObjectSpecification specification : specificationLookup.allSpecifications()) {
-            if(config.getPackagePrefix() != null &&
-               !specification.getCorrespondingClass().getCanonicalName().startsWith(config.getPackagePrefix())) {
+            if(notInPackagePrefixes(specification, config)) {
+                continue;
+            }
+            if(config.isIgnoreMixins() && specification.isMixin()) {
                 continue;
             }
             if(config.isIgnoreInterfaces() && specification.getCorrespondingClass().isInterface()) {
@@ -112,7 +116,7 @@ class MetaModelExporter {
         // phase 2: now flesh out the domain class types, passing the map for lookups of the domainClassTypes that
         // correspond to each object members types.
         for (final ObjectSpecification specification : Lists.newArrayList(domainClassByObjectSpec.keySet())) {
-            addMembersTo(specification, domainClassByObjectSpec, config);
+            addFacetsAndMembersTo(specification, domainClassByObjectSpec, config);
         }
 
         // phase 3: now copy all domain classes into the metamodel
@@ -125,6 +129,23 @@ class MetaModelExporter {
         return metamodelDto;
     }
 
+    private boolean notInPackagePrefixes(
+            final ObjectSpecification specification, final MetaModelService6.Config config) {
+        return !inPackagePrefixes(specification, config);
+    }
+
+    private boolean inPackagePrefixes(
+            final ObjectSpecification specification,
+            final MetaModelService6.Config config) {
+        final String canonicalName = specification.getCorrespondingClass().getCanonicalName();
+        for (final String s : config.getPackagePrefixes()) {
+            if(canonicalName.startsWith(s)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private DomainClass asXsdType(
             final ObjectSpecification specification,
             final MetaModelService6.Config config) {
@@ -132,61 +153,47 @@ class MetaModelExporter {
         final DomainClass domainClass = new DomainClass();
 
         domainClass.setId(specification.getFullIdentifier());
-        domainClass.setFacets(new org.apache.isis.schema.metamodel.v1.FacetHolder.Facets());
 
-        if (!isValueType(specification)) {
-            if(!isEnum(specification)) {
-                domainClass.setActions(new DomainClass.Actions());
-            }
-            if(specification.isService()) {
-                domainClass.setService(true);
-            } else {
-                domainClass.setProperties(new DomainClass.Properties());
-                domainClass.setCollections(new DomainClass.Collections());
-            }
+        if(specification.isService()) {
+            domainClass.setService(true);
         }
 
         return domainClass;
     }
 
-    private void addMembersTo(
+    private void addFacetsAndMembersTo(
             final ObjectSpecification specification,
             final Map<ObjectSpecification, DomainClass> domainClassByObjectSpec,
             final MetaModelService6.Config config) {
 
         final DomainClass domainClass = lookupDomainClass(specification, domainClassByObjectSpec, config);
+        if(domainClass.getFacets() == null) {
+            domainClass.setFacets(new org.apache.isis.schema.metamodel.v1.FacetHolder.Facets());
+        }
         addFacets(specification, domainClass.getFacets(), config);
 
-        if(!isValueType(specification)) {
-            if(!isEnum(specification)) {
+        if(specification.isValueOrIsParented() || isEnum(specification)) {
+            return;
+        }
+
+        if (specification.isService()) {
+            if(!hasNatureOfServiceOfDomain(specification)) {
                 addActions(specification, domainClassByObjectSpec, config);
             }
-            if(! specification.isService()) {
-                addProperties(specification, domainClassByObjectSpec, config);
-                addCollections(specification, domainClassByObjectSpec, config);
-            }
+        } else {
+            addProperties(specification, domainClassByObjectSpec, config);
+            addCollections(specification, domainClassByObjectSpec, config);
+            addActions(specification, domainClassByObjectSpec, config);
         }
-
     }
 
     private boolean isEnum(final ObjectSpecification specification) {
         return specification.getCorrespondingClass().isEnum();
     }
 
-    private void addMembers(
-            final ObjectSpecification specification,
-            final Map<ObjectSpecification, DomainClass> domainClassByObjectSpec,
-            final MetaModelService6.Config config) {
-
-        if(specification.isValueOrIsParented()) {
-            return;
-        }
-
-        if(! specification.isService()) {
-            addProperties(specification, domainClassByObjectSpec, config);
-            addCollections(specification, domainClassByObjectSpec, config);
-        }
-        addActions(specification, domainClassByObjectSpec, config);
+    private boolean hasNatureOfServiceOfDomain(final ObjectSpecification specification) {
+        final DomainServiceFacet domainServiceFacet = specification.getFacet(DomainServiceFacet.class);
+        return domainServiceFacet != null && domainServiceFacet.getNatureOfService() == NatureOfService.DOMAIN;
     }
 
     private void addProperties(
@@ -197,6 +204,9 @@ class MetaModelExporter {
 
         final List<ObjectAssociation> oneToOneAssociations =
                 specification.getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.PROPERTIES);
+        if(domainClass.getProperties() == null) {
+            domainClass.setProperties(new DomainClass.Properties());
+        }
         final List<Property> properties = domainClass.getProperties().getProp();
         for (final ObjectAssociation association : oneToOneAssociations) {
             final OneToOneAssociation otoa = (OneToOneAssociation) association;
@@ -212,6 +222,9 @@ class MetaModelExporter {
         final DomainClass domainClass = lookupDomainClass(specification, domainClassByObjectSpec, config);
         final List<ObjectAssociation> oneToManyAssociations =
                 specification.getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.COLLECTIONS);
+        if(domainClass.getCollections() == null) {
+            domainClass.setCollections(new DomainClass.Collections());
+        }
         final List<Collection> collections = domainClass.getCollections().getColl();
         for (final ObjectAssociation association : oneToManyAssociations) {
             final OneToManyAssociation otma = (OneToManyAssociation) association;
@@ -227,6 +240,9 @@ class MetaModelExporter {
         final DomainClass domainClass = lookupDomainClass(specification, domainClassByObjectSpec, config);
         final List<ObjectAction> objectActions =
                 specification.getObjectActions(Contributed.INCLUDED);
+        if(domainClass.getActions() == null) {
+            domainClass.setActions(new DomainClass.Actions());
+        }
         final List<Action> actions = domainClass.getActions().getAct();
         for (final ObjectAction action : objectActions) {
             actions.add(asXsdType(action, domainClassByObjectSpec, config));
@@ -296,8 +312,6 @@ class MetaModelExporter {
         if(value == null) {
             final DomainClass domainClass = asXsdType(specification, config);
             domainClassByObjectSpec.put(specification, domainClass);
-            addFacets(specification, domainClass.getFacets(), config);
-            addMembers(specification, domainClassByObjectSpec, config);
             value = domainClass;
         }
         return value;