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

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

commit 5326283cde5c2c02a934ed109ff890bcba233ef4
Author: danhaywood <d...@haywood-associates.co.uk>
AuthorDate: Thu Dec 13 23:27:03 2018 +0000

    ISIS-2050:
    
    - removes contributingDomainServiceTypes from AppManifest.Registry once 
more ... will just eagerly introspect type and members for all domain services
    - fixes introspectUpTo algorithm
    - skip type hierarchy traversal for domain services with 
natureOfService=DOMAIN
    - improves/reduces logging
    - lazily introspect up to type and members whenever any of the members 
(properties/collections/actions) are referenced of an ObjectSpecAbstract
---
 .../java/org/apache/isis/applib/AppManifest.java   | 20 +----
 .../commons/config/IsisConfigurationDefault.java   |  6 +-
 .../metamodel/specloader/SpecificationLoader.java  | 53 +++++++-----
 .../specimpl/ObjectSpecificationAbstract.java      | 98 +++++++++++++---------
 .../specimpl/dflt/ObjectSpecificationDefault.java  | 33 +++++---
 .../runner/opts/OptionHandlerInitParameters.java   |  4 +-
 .../IsisComponentProvider.java                     | 10 ---
 .../wicket/viewer/IsisWicketApplication.java       | 12 +--
 .../src/main/webapp/WEB-INF/logging.properties     | 10 ++-
 9 files changed, 132 insertions(+), 114 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java 
b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index 1316315..8bd09bb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -37,7 +37,6 @@ import org.reflections.vfs.SystemDir;
 import org.reflections.vfs.Vfs;
 
 import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 
 /**
@@ -200,7 +199,7 @@ public interface AppManifest {
         private Set<Class<?>> mixinTypes;
 
         /**
-         * Along with {@link #getContributingDomainServiceTypes()}, these are 
introspected eagerly.
+         * Along with {@link #getDomainServiceTypes()}, these are introspected 
eagerly.
          *
          * @return <tt>null</tt> if no appManifest is defined
          */
@@ -239,23 +238,6 @@ public interface AppManifest {
         }
         //endregion
 
-        //region > contributingDomainServiceTypes
-        private Set<Class<?>> contributingDomainServiceTypes;
-        /**
-         * A subset of {@link #getDomainServiceTypes()}, whose nature is either
-         * {@link 
org.apache.isis.applib.annotation.NatureOfService#VIEW_CONTRIBUTIONS_ONLY} or
-         * {@link NatureOfService#VIEW}.
-         *
-         * Along with {@link #getMixinTypes()}, these are introspected eagerly.
-         */
-        public Set<Class<?>> getContributingDomainServiceTypes() {
-            return contributingDomainServiceTypes;
-        }
-        public void setContributingDomainServiceTypes(final Set<Class<?>> 
contributingDomainServiceTypes) {
-            this.contributingDomainServiceTypes = 
contributingDomainServiceTypes;
-        }
-        //endregion
-
         //region > urlTypes
         public List<Vfs.UrlType> getUrlTypes() {
             final List<Vfs.UrlType> urlTypes = Lists.newArrayList();
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
index acd2d76..9235c23 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/IsisConfigurationDefault.java
@@ -161,10 +161,10 @@ public class IsisConfigurationDefault implements 
ConfigurationServiceInternal {
         if (properties.containsKey(key)) {
             switch (policy) {
             case IGNORE:
-                LOG.info("ignoring {}={} as value already set (with {})", key, 
value, properties.get(key));
+                LOG.debug("ignoring {}={} as value already set (with {})", 
key, value, properties.get(key));
                 break;
             case OVERWRITE:
-                LOG.info("overwriting {}={} (previous value was {})", key, 
value, properties.get(key));
+                LOG.debug("overwriting {}={} (previous value was {})", key, 
value, properties.get(key));
                 properties.put(key, value);
                 break;
             case EXCEPTION:
@@ -172,7 +172,7 @@ public class IsisConfigurationDefault implements 
ConfigurationServiceInternal {
                         "Configuration already has a key {}, value of {}%s, 
value of %s", key, properties.get(key)));
             }
         } else {
-            LOG.info("adding {} = {}", key , safe(key, value));
+            LOG.debug("adding {} = {}", key , safe(key, value));
             properties.put(key, value);
         }
     }
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 628370d..787f304 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
@@ -95,7 +95,7 @@ public class SpecificationLoader implements 
ApplicationScopedComponent {
             new 
ConfigPropertyBoolean("isis.reflector.introspector.parallelize", true);
 
     public static final ConfigPropertyBoolean 
CONFIG_PROPERTY_FULL_INTROSPECTION =
-            new 
ConfigPropertyBoolean("isis.reflector.introspector.fullIntrospection", true);
+            new 
ConfigPropertyBoolean("isis.reflector.introspector.fullIntrospection", false);
 
 
     //region > constructor, fields
@@ -133,11 +133,6 @@ public class SpecificationLoader implements 
ApplicationScopedComponent {
         this.layoutMetadataReaders = layoutMetadataReaders;
     }
 
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        LOG.info("finalizing reflector factory", this);
-    }
 
 
     //endregion
@@ -171,25 +166,25 @@ public class SpecificationLoader implements 
ApplicationScopedComponent {
 
 
         // need to completely load services and mixins (synchronously)
+        LOG.info("Loading all specs (up to state of {})", 
IntrospectionState.NOT_INTROSPECTED);
+
         final List<ObjectSpecification> specificationsFromRegistry = 
Lists.newArrayList();
 
-        final List<ObjectSpecification> contributingSpecs = 
Lists.newArrayList();
-        contributingSpecs.addAll(
-            loadSpecificationsFor(
-                
AppManifest.Registry.instance().getContributingDomainServiceTypes(), 
NatureOfService.DOMAIN,
+        // we use allServiceClasses() - obtained from servicesInjector - 
rather than reading from the
+        // AppManifest.Registry.instance().getDomainServiceTypes(), because 
the former also has the fallback
+        // services set up in IsisSessionFactoryBuilder beforehand.
+        final List<ObjectSpecification> domainServiceSpecs =
+        loadSpecificationsFor(
+                allServiceClasses(), NatureOfService.DOMAIN,
                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
-        ));
-        contributingSpecs.addAll(
+        );
+        final List<ObjectSpecification> mixinSpecs =
             loadSpecificationsFor(
                 AppManifest.Registry.instance().getMixinTypes(), null,
                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
-        ));
-        loadSpecificationsFor(
-                CommonDtoUtils.VALUE_TYPES, null,
-                specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
         );
         loadSpecificationsFor(
-                AppManifest.Registry.instance().getDomainServiceTypes(), 
NatureOfService.DOMAIN,
+                CommonDtoUtils.VALUE_TYPES, null,
                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
         );
         loadSpecificationsFor(
@@ -211,23 +206,33 @@ public class SpecificationLoader implements 
ApplicationScopedComponent {
 
         logBefore(specificationsFromRegistry, cachedSpecifications);
 
-        introspect(contributingSpecs, 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+        LOG.info("Introspecting domainService specs up to {}", 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+        introspect(domainServiceSpecs, 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
+        LOG.info("Introspecting mixin specs up to {}", 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+        introspect(mixinSpecs, 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
+        LOG.info("Introspecting all specs up to {}", 
IntrospectionState.TYPE_INTROSPECTED);
         introspect(specificationsFromRegistry, 
IntrospectionState.TYPE_INTROSPECTED);
 
         logAfter(cachedSpecifications);
 
         final boolean validate = 
CONFIG_PROPERTY_FULL_INTROSPECTION.from(configuration);
         if(validate) {
-            LOG.info("Meta model being fully introspected (enables subsequent 
meta model validation)");
+            LOG.info("Introspecting all cached specs up to {}", 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
             introspect(cachedSpecifications, 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
         }
 
+        LOG.info("init() - done");
     }
 
     private void logBefore(
             final List<ObjectSpecification> specificationsFromRegistry,
             final Collection<ObjectSpecification> cachedSpecifications) {
-        LOG.info(String.format(
+        if(!LOG.isDebugEnabled()) {
+            return;
+        }
+        LOG.debug(String.format(
                 "specificationsFromRegistry.size = %d ; 
cachedSpecifications.size = %d",
                 specificationsFromRegistry.size(), 
cachedSpecifications.size()));
 
@@ -246,12 +251,16 @@ public class SpecificationLoader implements 
ApplicationScopedComponent {
                     }
                 }).toList();
 
-        LOG.info(String.format(
+        LOG.debug(String.format(
                 "registryNotCached.size = %d ; cachedNotRegistry.size = %d",
                 registryNotCached.size(), cachedNotRegistry.size()));
     }
 
     private void logAfter(final Collection<ObjectSpecification> 
cachedSpecifications) {
+        if(!LOG.isDebugEnabled()) {
+            return;
+        }
+
         final Collection<ObjectSpecification> cachedSpecificationsAfter = 
cache.allSpecifications();
         ImmutableList<ObjectSpecification> cachedAfterNotBefore = 
FluentIterable.from(cachedSpecificationsAfter)
                 .filter(new Predicate<ObjectSpecification>() {
@@ -260,7 +269,7 @@ public class SpecificationLoader implements 
ApplicationScopedComponent {
                         return 
!cachedSpecifications.contains(objectSpecification);
                     }
                 }).toList();
-        LOG.info(String.format("cachedSpecificationsAfter.size = %d ; 
cachedAfterNotBefore.size = %d",
+        LOG.debug(String.format("cachedSpecificationsAfter.size = %d ; 
cachedAfterNotBefore.size = %d",
                 cachedSpecificationsAfter.size(), 
cachedAfterNotBefore.size()));
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index df5d7a6..f402648 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -257,44 +257,41 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
      */
     public void introspectUpTo(final IntrospectionState upTo) {
 
-        LOG.info("introspectingUpTo: {}, {}", getFullIdentifier(), upTo);
-
-        while(this.introspectionState.compareTo(upTo) < 0) {
-
-            switch (introspectionState) {
-            case NOT_INTROSPECTED:
+        LOG.debug("introspectingUpTo: {}, {}", getFullIdentifier(), upTo);
 
+        switch (introspectionState) {
+        case NOT_INTROSPECTED:
+            if(this.introspectionState.compareTo(upTo) < 0) {
                 // set to avoid infinite loops
                 this.introspectionState = 
IntrospectionState.TYPE_BEING_INTROSPECTED;
-                try {
-                    introspectTypeHierarchy();
-                    updateFromFacetValues();
-                    this.introspectionState = 
IntrospectionState.TYPE_INTROSPECTED;
-                } catch(Exception ex) {
-                    this.introspectionState = 
IntrospectionState.NOT_INTROSPECTED;
-                    throw ex;
-                }
-                break;
-            case TYPE_BEING_INTROSPECTED:
-                // nothing to do
-                break;
-            case TYPE_INTROSPECTED:
+                introspectTypeHierarchy();
+                updateFromFacetValues();
+                this.introspectionState = IntrospectionState.TYPE_INTROSPECTED;
+            }
+
+            if(this.introspectionState.compareTo(upTo) < 0) {
+                this.introspectionState = 
IntrospectionState.MEMBERS_BEING_INTROSPECTED;
+                introspectMembers();
+                this.introspectionState = 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED;
+            }
+            // set to avoid infinite loops
+            break;
+        case TYPE_BEING_INTROSPECTED:
+            // nothing to do
+            break;
+        case TYPE_INTROSPECTED:
+            if(this.introspectionState.compareTo(upTo) < 0) {
                 // set to avoid infinite loops
                 this.introspectionState = 
IntrospectionState.MEMBERS_BEING_INTROSPECTED;
-                try {
-                    introspectMembers();
-                    this.introspectionState = 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED;
-                } catch(Exception ex) {
-                    this.introspectionState = 
IntrospectionState.TYPE_INTROSPECTED;
-                    throw ex;
-                }
-                break;
-            case MEMBERS_BEING_INTROSPECTED:
-                // nothing to do
-            case TYPE_AND_MEMBERS_INTROSPECTED:
-                // nothing to do
-                break;
+                introspectMembers();
+                this.introspectionState = 
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED;
             }
+            break;
+        case MEMBERS_BEING_INTROSPECTED:
+            // nothing to do
+        case TYPE_AND_MEMBERS_INTROSPECTED:
+            // nothing to do
+            break;
         }
     }
 
@@ -634,7 +631,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
         return transitiveSubclasses;
     }
 
-    private SubclassList appendSubclasses(
+    private void appendSubclasses(
             final ObjectSpecification objectSpecification,
             final SubclassList appendTo) {
 
@@ -644,7 +641,6 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
             appendSubclasses(subclass, appendTo);
         }
 
-        return appendTo;
     }
 
     @Override
@@ -662,6 +658,8 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     //region > Associations
     @Override
     public List<ObjectAssociation> getAssociations(final Contributed 
contributed) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         // the "contributed.isIncluded()" guard is required because we cannot 
do this too early;
         // there must be a session available
         if(contributed.isIncluded() && 
!contributeeAndMixedInAssociationsAdded) {
@@ -687,6 +685,8 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
 
     @Override
     public ObjectMember getMember(final String memberId) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         final ObjectAction objectAction = getObjectAction(memberId);
         if(objectAction != null) {
             return objectAction;
@@ -715,6 +715,8 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
      */
     @Override
     public ObjectAssociation getAssociation(final String id) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         ObjectAssociation oa = getAssociationWithId(id);
         if(oa != null) {
             return oa;
@@ -756,11 +758,15 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     @Deprecated
     @Override
     public List<ObjectAssociation> getAssociations(Filter<ObjectAssociation> 
filter) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         return getAssociations(Contributed.INCLUDED, filter);
     }
 
     @Override
     public List<ObjectAssociation> getAssociations(Contributed contributed, 
final Filter<ObjectAssociation> filter) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         final List<ObjectAssociation> allAssociations = 
getAssociations(contributed);
         return Lists.newArrayList(
                 FluentIterable.from(allAssociations)
@@ -772,6 +778,8 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public List<OneToOneAssociation> getProperties(Contributed contributed) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         final List list = getAssociations(contributed, 
ObjectAssociation.Filters.PROPERTIES);
         return list;
     }
@@ -779,6 +787,8 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     @Override
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public List<OneToManyAssociation> getCollections(Contributed contributed) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         final List list = getAssociations(contributed, 
ObjectAssociation.Filters.COLLECTIONS);
         return list;
     }
@@ -792,6 +802,10 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
             final Contributed contributed, 
             final Filter<ObjectAction> filter) {
 
+        LOG.debug("{} : getObjectActions(...)", this.getFullIdentifier());
+
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         // update our list of actions if requesting for contributed actions
         // and they have not yet been added
         // the "contributed.isIncluded()" guard is required because we cannot 
do this too early;
@@ -831,6 +845,8 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     @Override
     public List<ObjectAction> getObjectActions(
             final Contributed contributed) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         return getObjectActions(ActionType.ALL, contributed, 
Filters.<ObjectAction>any());
     }
 
@@ -839,6 +855,9 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
             final ActionType type, 
             final Contributed contributed, 
             final Filter<ObjectAction> filter) {
+
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         return getObjectActions(Collections.singletonList(type), contributed, 
filter);
     }
 
@@ -846,7 +865,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
 
     //region > sorting
 
-    protected List<ObjectAssociation> sortAssociations(final 
List<ObjectAssociation> associations) {
+    private List<ObjectAssociation> sortAssociations(final 
List<ObjectAssociation> associations) {
         final DeweyOrderSet orderSet = 
DeweyOrderSet.createOrderSet(associations);
         final MemberGroupLayoutFacet memberGroupLayoutFacet = 
this.getFacet(MemberGroupLayoutFacet.class);
         
@@ -879,7 +898,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
         }
     }
 
-    protected static List<ObjectAction> sortActions(final List<ObjectAction> 
actions) {
+    private static List<ObjectAction> sortActions(final List<ObjectAction> 
actions) {
         final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(actions);
         final List<ObjectAction> orderedActions = Lists.newArrayList();
         sortActions(orderSet, orderedActions);
@@ -1103,7 +1122,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
      * If this specification {@link #isService() is actually for} a service,
      * then returns an empty list.
      */
-    protected List<ObjectAction> createContributeeActions() {
+    private List<ObjectAction> createContributeeActions() {
         if (isService() || isValue()) {
             return Collections.emptyList();
         }
@@ -1118,6 +1137,9 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     private void addContributeeActionsIfAny(
             final Object servicePojo,
             final List<ObjectAction> contributeeActionsToAppendTo) {
+
+        LOG.debug("{} : addContributeeActionsIfAny(...); servicePojo class is: 
{}", this.getFullIdentifier(), servicePojo.getClass().getName());
+
         final Class<?> serviceType = servicePojo.getClass();
         final ObjectSpecification specification = 
getSpecificationLoader().loadSpecification(serviceType,
                 IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
@@ -1182,7 +1204,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
      * If this specification {@link #isService() is actually for} a service,
      * then returns an empty list.
      */
-    protected List<ObjectAction> createMixedInActions() {
+    private List<ObjectAction> createMixedInActions() {
         if (isService() || isValue()) {
             return Collections.emptyList();
         }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 81c289d..931e532 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -126,7 +126,16 @@ public class ObjectSpecificationDefault extends 
ObjectSpecificationAbstract impl
         // go no further if a value
         if(this.containsFacet(ValueFacet.class)) {
             if (LOG.isDebugEnabled()) {
-                LOG.debug("skipping full introspection for value type {}", 
getFullIdentifier());
+                LOG.debug("skipping type hierarchy introspection for value 
type {}", getFullIdentifier());
+            }
+            return;
+        }
+
+        final DomainServiceFacet facet = getFacet(DomainServiceFacet.class);
+        final boolean serviceWithNatureOfDomain = facet != null && 
facet.getNatureOfService() == NatureOfService.DOMAIN;
+        if (serviceWithNatureOfDomain) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("skipping type hierarchy introspection for domain 
service with natureOfService = DOMAIN {}", getFullIdentifier());
             }
             return;
         }
@@ -178,11 +187,6 @@ public class ObjectSpecificationDefault extends 
ObjectSpecificationAbstract impl
         final List<ObjectAction> actions = createActions(metadataProperties);
         sortCacheAndUpdateActions(actions);
 
-        // ensure the spec is fully rebuilt
-        // TODO: this probably isn't required...
-        getObjectActions(Contributed.INCLUDED);
-        getAssociations(Contributed.INCLUDED);
-
         postProcess();
     }
 
@@ -324,21 +328,27 @@ public class ObjectSpecificationDefault extends 
ObjectSpecificationAbstract impl
 
     @Override
     public ObjectAction getObjectAction(final ActionType type, final String 
id, final List<ObjectSpecification> parameters) {
-        final List<ObjectAction> actions = 
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
+        final List<ObjectAction> actions =
                 getObjectActions(type, Contributed.INCLUDED, 
Filters.<ObjectAction>any());
         return firstAction(actions, id, parameters);
     }
 
     @Override
     public ObjectAction getObjectAction(final ActionType type, final String 
id) {
-        final List<ObjectAction> actions = 
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
+        final List<ObjectAction> actions =
                 getObjectActions(type, Contributed.INCLUDED, 
Filters.<ObjectAction>any()); 
         return firstAction(actions, id);
     }
 
     @Override
     public ObjectAction getObjectAction(final String id) {
-        final List<ObjectAction> actions = 
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
+        final List<ObjectAction> actions =
                 getObjectActions(ActionType.ALL, Contributed.INCLUDED, 
Filters.<ObjectAction>any()); 
         return firstAction(actions, id);
     }
@@ -389,6 +399,8 @@ public class ObjectSpecificationDefault extends 
ObjectSpecificationAbstract impl
     //region > getMember, catalog... (not API)
 
     public ObjectMember getMember(final Method method) {
+        introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+
         if (membersByMethod == null) {
             this.membersByMethod = catalogueMembers();
         }
@@ -405,8 +417,7 @@ public class ObjectSpecificationDefault extends 
ObjectSpecificationAbstract impl
     private void cataloguePropertiesAndCollections(final Map<Method, 
ObjectMember> membersByMethod) {
         final Filter<ObjectAssociation> noop = 
Filters.anyOfType(ObjectAssociation.class);
         final List<ObjectAssociation> fields = 
getAssociations(Contributed.EXCLUDED, noop);
-        for (int i = 0; i < fields.size(); i++) {
-            final ObjectAssociation field = fields.get(i);
+        for (final ObjectAssociation field : fields) {
             final List<Facet> facets = field.getFacets(ImperativeFacet.FILTER);
             for (final Facet facet : facets) {
                 final ImperativeFacet imperativeFacet = 
ImperativeFacet.Util.getImperativeFacet(facet);
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerInitParameters.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerInitParameters.java
index dee668a..64c871f 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerInitParameters.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/opts/OptionHandlerInitParameters.java
@@ -57,7 +57,7 @@ public class OptionHandlerInitParameters extends 
OptionHandlerAbstract {
     @Override
     public void prime(final IsisConfigurationBuilder isisConfigurationBuilder) 
{
         Map<String,String> additionalProperties = asMap(servletContext);
-        LOG.info("priming configuration builder: {} properties to prime", 
additionalProperties.size());
+        LOG.debug("priming configuration builder: {} properties to prime", 
additionalProperties.size());
         addConfigurationProperties(isisConfigurationBuilder, 
additionalProperties);
     }
 
@@ -78,7 +78,7 @@ public class OptionHandlerInitParameters extends 
OptionHandlerAbstract {
         for (final String propertyKey : additionalProperties.keySet()) {
             final String propertyValue = additionalProperties.get(propertyKey);
 
-            LOG.info("priming: {}={}", propertyKey, propertyValue);
+            LOG.debug("priming: {}={}", propertyKey, propertyValue);
             isisConfigurationBuilder.add(propertyKey, propertyValue);
         }
     }
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index d5f5fe0..06d7ba6 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -46,7 +46,6 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Nature;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.ViewModel;
 import org.apache.isis.applib.annotation.ViewModelLayout;
@@ -153,14 +152,6 @@ public abstract class IsisComponentProvider {
 
         final Set<Class<?>> domainServiceTypes = Sets.newLinkedHashSet();
         
domainServiceTypes.addAll(reflections.getTypesAnnotatedWith(DomainService.class));
-        final Set<Class<?>> contributingDomainServiceTypes = 
FluentIterable.from(domainServiceTypes)
-                .filter(new Predicate<Class<?>>() {
-                    @Override public boolean apply(@Nullable final Class<?> 
aClass) {
-                        final DomainService domainService = 
aClass.getAnnotation(DomainService.class);
-                        return domainService.nature() == NatureOfService.VIEW 
||
-                                domainService.nature() == 
NatureOfService.VIEW_CONTRIBUTIONS_ONLY;
-                    }
-                }).toSet();
 
         
domainServiceTypes.addAll(reflections.getTypesAnnotatedWith(DomainServiceLayout.class));
 
@@ -227,7 +218,6 @@ public abstract class IsisComponentProvider {
                 }).toList();
 
         
registry.setDomainServiceTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix,
 domainServiceTypes));
-        
registry.setContributingDomainServiceTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix,
 contributingDomainServiceTypes));
         
registry.setPersistenceCapableTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix,
 persistenceCapableTypes));
         
registry.setFixtureScriptTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix,
 fixtureScriptTypes));
         
registry.setMixinTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix, 
mixinTypes));
diff --git 
a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
 
b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index b15f156..deff2d1 100644
--- 
a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ 
b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -407,8 +407,8 @@ public class IsisWicketApplication
 
             if(getDeploymentCategory().isPrototyping()) {
                 DebugDiskDataStore.register(this);
-                LOG.info("DebugDiskDataStore registered; access via 
~/wicket/internal/debug/diskDataStore");
-                LOG.info("DebugDiskDataStore: eg, 
http://localhost:8080/wicket/wicket/internal/debug/diskDataStore";);
+                LOG.debug("DebugDiskDataStore registered; access via 
~/wicket/internal/debug/diskDataStore");
+                LOG.debug("DebugDiskDataStore: eg, 
http://localhost:8080/wicket/wicket/internal/debug/diskDataStore";);
             }
 
             if(!getDebugSettings().isDevelopmentUtilitiesEnabled()) {
@@ -429,10 +429,10 @@ public class IsisWicketApplication
                 }
             }
 
-            LOG.info("storeSettings.inmemoryCacheSize        : {}", 
getStoreSettings().getInmemoryCacheSize());
-            LOG.info("storeSettings.asynchronousQueueCapacity: {}", 
getStoreSettings().getAsynchronousQueueCapacity());
-            LOG.info("storeSettings.maxSizePerSession        : {}", 
getStoreSettings().getMaxSizePerSession());
-            LOG.info("storeSettings.fileStoreFolder          : {}", 
getStoreSettings().getFileStoreFolder());
+            LOG.debug("storeSettings.inmemoryCacheSize        : {}", 
getStoreSettings().getInmemoryCacheSize());
+            LOG.debug("storeSettings.asynchronousQueueCapacity: {}", 
getStoreSettings().getAsynchronousQueueCapacity());
+            LOG.debug("storeSettings.maxSizePerSession        : {}", 
getStoreSettings().getMaxSizePerSession());
+            LOG.debug("storeSettings.fileStoreFolder          : {}", 
getStoreSettings().getFileStoreFolder());
 
         } catch(RuntimeException ex) {
             // because Wicket's handling in its WicketFilter (that calls this 
method) does not log the exception.
diff --git 
a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
 
b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
index 573a664..b0a0872 100644
--- 
a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
+++ 
b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
@@ -27,7 +27,7 @@ log4j.rootCategory=INFO, Console
 log4j.appender.Console=org.apache.log4j.ConsoleAppender
 log4j.appender.Console.target=System.out
 log4j.appender.Console.layout=org.apache.log4j.PatternLayout
-log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE}  [%-20c{1} %-10t 
%-5p]  %m%n
+log4j.appender.Console.layout.ConversionPattern=%-5r %d{ABSOLUTE}  [%-20c{1} 
%-10t %-5p]  %m%n
 
 
 # The stderr appender
@@ -122,8 +122,8 @@ 
log4j.additivity.org.apache.isis.core.runtime.threadpool.ThreadPoolSupport=false
 
 # DataNucleus
 # the first two log the DML and DDL (if set to DEBUG)
-log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console, sql-dml
-log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console, sql-ddl
+log4j.logger.DataNucleus.Datastore.Native=INFO, Console, sql-dml
+log4j.logger.DataNucleus.Datastore.Schema=INFO, Console, sql-ddl
 #log4j.logger.DataNucleus.Datastore.Native=WARN, Console, sql-dml
 #log4j.logger.DataNucleus.Datastore.Schema=WARN, Console, sql-ddl
 # the remainder can probably be left to WARN
@@ -207,6 +207,8 @@ log4j.additivity.DataNucleus.Datastore.IDE=false
 
log4j.logger.org.apache.isis.viewer.wicket.viewer.TargetRespondListenerToResetQueryResultCache=DEBUG,Console
 
log4j.additivity.org.apache.isis.viewer.wicket.viewer.TargetRespondListenerToResetQueryResultCache=false
 
+log4j.logger.org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract=INFO,Console
+log4j.additivity.org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract=false
 
 
 # quieten some of the noisier classes in Isis' bootstrapping
@@ -242,3 +244,5 @@ log4j.additivity.dom.simple.SimpleObject=false
 # ERROR to suppress the WARNings we get as of 1.15.0
 log4j.logger.org.apache.wicket.page.XmlPartialPageUpdate=ERROR,Console
 log4j.additivity.org.apache.wicket.page.XmlPartialPageUpdate=false
+
+

Reply via email to