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

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

commit 08ce1a64f305287be398f610db5f734c685fda29
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Fri Jan 12 18:30:07 2018 +0100

    ISIS-1817 + ISIS-1818 allow configuration of where-am-i feature
---
 .../core/metamodel/util/pchain/ParentChain.java    | 20 ++++++++---
 .../model/models/whereami/WhereAmIModel.java       |  7 ++++
 .../models/whereami/WhereAmIModelDefault.java      | 41 ++++++++++++++++++++--
 3 files changed, 61 insertions(+), 7 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/pchain/ParentChain.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/pchain/ParentChain.java
index 8f9471c..80a1724 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/pchain/ParentChain.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/pchain/ParentChain.java
@@ -35,6 +35,7 @@ import 
org.apache.isis.core.metamodel.spec.ObjectSpecification;
  * startNode --@Parent--&gt; node2 --@Parent--&gt; node3 ...
  * 
  * @author ahu...@apache.org
+ * @since 2.0.0
  *
  */
 public interface ParentChain {
@@ -51,23 +52,32 @@ public interface ParentChain {
        public Object parentOf(Object node);
        
        /**
-        * Returns a Stream of nodes that are chained together by parent 
references. 
-        * The startNode is excluded from the Stream.
+        * Returns a Stream of nodes that are chained together by parent 
references. <br/> 
+        * The {@code startNode} is excluded from the Stream.  <br/><br/>
+        * The chain stops either because there is no more resolvable 
parent,<br/>
+        * or we reached the {@code maxChainLength},<br/>
+        * or we reached a node that is already part of the chain.
+        * 
         * @param startNode
+        * @param maxChainLength maximum length of the chain returned 
         * @return
         */
-       public default Stream<Object> streamParentChainOf(Object startNode){
+       public default Stream<Object> streamParentChainOf(Object startNode, int 
maxChainLength){
                final Set<Object> chain = new LinkedHashSet<>();
                
                Object next = startNode;
                
+               chain.add(startNode); // for infinite loop detection
+               
                while((next = parentOf(next))!=null) {
-                       final boolean doContinue = chain.add(next);
+                       final boolean doContinue = chain.add(next); // stops if 
the we get to a node we already traversed before
                        if(!doContinue)
                                break;
+                       if(chain.size()>=maxChainLength)
+                               break;
                }
                
-               return chain.stream();
+               return chain.stream().skip(1);
        }
 
        
diff --git 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java
 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java
index 7d4a8ce..9de0c22 100644
--- 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java
+++ 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModel.java
@@ -33,6 +33,13 @@ import 
org.apache.isis.viewer.wicket.model.models.EntityModel;
  */
 public interface WhereAmIModel {
 
+       public final static String CONFIG_KEY_IS_WHERE_AM_I_FEATURE_ENABLED = 
"isis.viewer.whereAmI.enabled";
+       public final static String CONFIG_KEY_MAX_NAVIGABLE_PARENT_CHAIN_LENGTH 
= "isis.viewer.whereAmI.maxParentChainLength";
+       
+       public final static boolean IS_WHERE_AM_I_FEATURE_ENABLED_DEFAULT = 
true;
+       public final static int MAX_NAVIGABLE_PARENT_CHAIN_LENGTH_DEFAULT = 64;
+       
+       
        public static WhereAmIModel of(EntityModel startOfChain) {
                return new WhereAmIModelDefault(startOfChain);
        }
diff --git 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java
 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java
index 042595f..ff06907 100644
--- 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java
+++ 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/whereami/WhereAmIModelDefault.java
@@ -22,27 +22,40 @@ package org.apache.isis.viewer.wicket.model.models.whereami;
 import java.util.LinkedList;
 import java.util.stream.Stream;
 
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.util.pchain.ParentChain;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
+/**
+ * 
+ * @author ahu...@apache.org
+ * @since 2.0.0
+ *
+ */
 class WhereAmIModelDefault implements WhereAmIModel {
 
        private final LinkedList<Object> reversedChainOfParents = new 
LinkedList<>();
        private final EntityModel startOfChain;
        
+       private static boolean isWhereAmIEnabled = 
IS_WHERE_AM_I_FEATURE_ENABLED_DEFAULT;
+       private static int maxChainLength = 
MAX_NAVIGABLE_PARENT_CHAIN_LENGTH_DEFAULT;
+       private static int configHash = 0;
+       
        public WhereAmIModelDefault(EntityModel startOfChain) {
                this.startOfChain = startOfChain;
                
+               
overrideFromConfigIfNew(startOfChain.getPersistenceSession().getConfiguration());
               
+               
                final ObjectAdapter adapter = startOfChain.getObject();
                final Object startNode = adapter.getObject();
                
                
ParentChain.of(IsisContext.getSessionFactory().getSpecificationLoader()::loadSpecification)
-               .streamParentChainOf(startNode)
+               .streamParentChainOf(startNode, maxChainLength)
                .forEach(reversedChainOfParents::addFirst);
        }
-       
+
        @Override
        public EntityModel getStartOfChain() {
                return startOfChain;
@@ -50,11 +63,17 @@ class WhereAmIModelDefault implements WhereAmIModel {
        
        @Override
        public boolean isShowWhereAmI() {
+               if(!isWhereAmIEnabled)
+                       return false; // this will prevent rendering 
+               
                return !reversedChainOfParents.isEmpty();
        }
 
        @Override
        public Stream<EntityModel> streamParentChainReversed() {
+               if(!isWhereAmIEnabled)
+                       return Stream.empty(); // unexpected call, we could log 
a warning
+               
                return reversedChainOfParents.stream()
                .map(this::toEntityModel);
        }
@@ -67,4 +86,22 @@ class WhereAmIModelDefault implements WhereAmIModel {
                                .adapterFor(domainObject)       );
        }
        
+       private void overrideFromConfigIfNew(IsisConfiguration configuration) {
+               
+               //[ahuber] without evidence that this significantly improves 
performance, 
+               // we use the smart update idiom here ...
+               final int newConfigHash = 
System.identityHashCode(configuration);
+               if(newConfigHash == configHash)
+                       return;
+               
+               isWhereAmIEnabled = configuration.getBoolean(
+                               CONFIG_KEY_IS_WHERE_AM_I_FEATURE_ENABLED,
+                               IS_WHERE_AM_I_FEATURE_ENABLED_DEFAULT);
+               maxChainLength = configuration.getInteger(
+                               CONFIG_KEY_MAX_NAVIGABLE_PARENT_CHAIN_LENGTH,
+                               MAX_NAVIGABLE_PARENT_CHAIN_LENGTH_DEFAULT);
+               
+       }
+
+       
 }

-- 
To stop receiving notification emails like this one, please contact
danhayw...@apache.org.

Reply via email to