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/02/14 15:15:21 UTC

[isis] 05/13: ISIS-1817 + ISIS-1818 allow configuration of where-am-i feature

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 <ah...@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 ahuber@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 ahuber@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
danhaywood@apache.org.