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