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--> node2 --@Parent--> 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.