You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/04/17 07:25:56 UTC

[isis] branch dev/2.0.0/ISIS-898-treeview created (now 0e3abd9)

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

ahuber pushed a change to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 0e3abd9  ISIS-898 initial (naive) lazy tree feature

This branch includes the following new commits:

     new d337130  ISIS-898 applib: introduces initial tree model
     new a8c547d  ISIS-898 refine TreeNode interface
     new b4535da  ISIS-898 interim TreePanel stubs
     new fe0cbe7  ISIS-898 simplify markup panel factories
     new 275252b  ISIS-898 adds missing license head
     new a25c43c  ISIS-898 register TreePanel factories
     new 28f1b61  ISIS-898 Internal API: introduces _Lazy a memoizing supplier
     new a9215a8  ISIS-898 refine, also add missing license headers
     new f960d6e  ISIS-898 add missing cases, add serial version ids
     new b02c336  ISIS-898 further reduce compiler warnings
     new 0e3abd9  ISIS-898 initial (naive) lazy tree feature

The 11 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


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

[isis] 06/11: ISIS-898 register TreePanel factories

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit a25c43ce61a56d8e27fb2eefc973857da0d6cfec
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Apr 16 07:46:59 2018 +0200

    ISIS-898 register TreePanel factories
---
 .../ComponentFactoryRegistrarDefault.java          |   3 +
 .../ui/components/tree/TreePanelFactories.java     | 102 +++++++++++++++++++
 .../ui/components/tree/TreePanelFactory.java       | 110 ---------------------
 3 files changed, 105 insertions(+), 110 deletions(-)

diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index da812b9..2e03d81 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -79,6 +79,7 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.uuid.UuidPanelFactory
 import org.apache.isis.viewer.wicket.ui.components.scalars.value.ValuePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2PanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.standalonecollection.StandaloneCollectionPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.tree.TreePanelFactories;
 import org.apache.isis.viewer.wicket.ui.components.unknown.UnknownModelPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.value.StandaloneValuePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.voidreturn.VoidReturnPanelFactory;
@@ -193,6 +194,7 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
 
     protected void addComponentFactoriesForValue(final ComponentFactoryList componentFactories) {
     	componentFactories.add(MarkupPanelFactories.standalone());
+    	componentFactories.add(TreePanelFactories.standalone());
         componentFactories.add(new StandaloneValuePanelFactory());
     }
 
@@ -200,6 +202,7 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
 
         componentFactories.add(new ReferencePanelFactory());
         componentFactories.add(MarkupPanelFactories.parented());
+        componentFactories.add(TreePanelFactories.parented());
         
         componentFactories.add(new BooleanPanelFactory());
         componentFactories.add(new BytePanelFactory());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java
new file mode 100644
index 0000000..70b0470
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java
@@ -0,0 +1,102 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.tree;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanel;
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+/**
+ * {@link ComponentFactory} for {@link MarkupPanel}.
+ */
+public class TreePanelFactories {
+	
+	// -- PARENTED
+
+	static class Parented extends ComponentFactoryAbstract {
+		private static final long serialVersionUID = 1L;
+
+		public Parented() {
+			super(ComponentType.SCALAR_NAME_AND_VALUE, TreePanel.class);
+		}
+		
+		@Override
+		public ApplicationAdvice appliesTo(final IModel<?> model) {
+			if (!(model instanceof ScalarModel))
+				return ApplicationAdvice.DOES_NOT_APPLY;
+
+			final ScalarModel scalarModel = (ScalarModel) model;
+
+			if(!scalarModel.isScalarTypeAnyOf(org.apache.isis.applib.tree.TreeNode.class)) 
+				return ApplicationAdvice.DOES_NOT_APPLY;
+
+			return appliesIf( !scalarModel.hasChoices() );
+		}
+		
+		@Override
+		public final Component createComponent(final String id, final IModel<?> model) {
+			return new TreePanel(id, (ScalarModel) model);
+		}
+	}
+	
+	// -- STANDALONE
+
+	static class Standalone extends ComponentFactoryAbstract {
+		private static final long serialVersionUID = 1L;
+
+		public Standalone() {
+			super(ComponentType.VALUE, StandaloneTreePanel.class);
+		}
+		
+		@Override
+		public ApplicationAdvice appliesTo(final IModel<?> model) {
+			if (!(model instanceof ValueModel))
+				return ApplicationAdvice.DOES_NOT_APPLY;
+			final ValueModel valueModel = (ValueModel) model;
+			final ObjectAdapter adapter = valueModel.getObject();
+			if(adapter==null || adapter.getObject()==null)
+				return ApplicationAdvice.DOES_NOT_APPLY;
+
+			return appliesIf( adapter.getObject() instanceof org.apache.isis.applib.tree.TreeNode );
+		}
+		
+		@Override
+		public final Component createComponent(final String id, final IModel<?> model) {
+			return new StandaloneTreePanel(id, (ValueModel) model);
+		}
+	}
+
+	// -- CONSTRUCTION
+	
+	public static ComponentFactory parented() {
+		return new Parented();
+	}
+	
+	public static ComponentFactory standalone() {
+		return new Standalone();
+	}
+
+}
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactory.java
deleted file mode 100644
index dc87f49..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactory.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.viewer.wicket.ui.components.tree;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ValueModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.wicket.Component;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.IModel;
-
-/**
- * {@link ComponentFactory} for {@link TreePanel}.
- */
-public class TreePanelFactory extends ComponentFactoryAbstract {
-
-    private static final long serialVersionUID = 1L;
-    
-    public TreePanelFactory(ComponentType componentType) {
-        super(componentType, TreePanel.class);
-    }
-
-    @Override
-    public ApplicationAdvice appliesTo(final IModel<?> model) {
-    	switch (getComponentType()) {
-		case SCALAR_NAME_AND_VALUE:
-			return appliesToIfScalar(model);
-		case VALUE:
-			return appliesToIfValue(model);
-		default:
-			return ApplicationAdvice.DOES_NOT_APPLY;
-		}
-    }
-    
-    @Override
-    public final Component createComponent(final String id, final IModel<?> model) {
-    	
-    	switch (getComponentType()) {
-		case SCALAR_NAME_AND_VALUE:
-			return createComponentIfScalar(id, model);
-		case VALUE:
-			return createComponentIfValue(id, model);
-		default:
-			return new Label(id, "TreePanelFactory.createComponent: case not handled '"+getComponentType()+"'");
-		}
-    }
-    
-    // -- VARIANTS OF APPLIES TO
-    
-	private ApplicationAdvice appliesToIfScalar(IModel<?> model) {
-		if (!(model instanceof ScalarModel))
-            return ApplicationAdvice.DOES_NOT_APPLY;
-        
-        final ScalarModel scalarModel = (ScalarModel) model;
-        
-        if(!scalarModel.isScalarTypeSubtypingAnyOf(org.apache.isis.applib.tree.TreeNode.class)) 
-            return ApplicationAdvice.DOES_NOT_APPLY;
-
-        return appliesIf( !scalarModel.hasChoices() );
-	}
-	
-    private ApplicationAdvice appliesToIfValue(IModel<?> model) {
-    	if (!(model instanceof ValueModel))
-            return ApplicationAdvice.DOES_NOT_APPLY;
-    	final ValueModel valueModel = (ValueModel) model;
-    	final ObjectAdapter adapter = valueModel.getObject();
-    	if(adapter==null || adapter.getObject()==null)
-    		return ApplicationAdvice.DOES_NOT_APPLY;
-    	
-    	return appliesIf( adapter.getObject() instanceof org.apache.isis.applib.tree.TreeNode );
-	}
-
-    // -- VARIANTS OF CREATE COMPONENT
-    
-    private final Component createComponentIfScalar(final String id, final IModel<?> model) {
-    	
-    	System.out.println("!!! BINGO createComponentIfScalar");
-    	
-        return new TreePanel(id, (ScalarModel) model);
-    }
-    
-    private final Component createComponentIfValue(final String id, final IModel<?> model) {
-    	
-    	System.out.println("!!! BINGO createComponentIfValue");
-    	
-        return new StandaloneTreePanel(id, (ValueModel) model);
-    }
-    
-
-}

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

[isis] 09/11: ISIS-898 add missing cases, add serial version ids

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f960d6e2585b2fae4bd8b7d22cd476c531c8d9b6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Apr 17 05:15:07 2018 +0200

    ISIS-898 add missing cases, add serial version ids
---
 .../components/scalars/ScalarPanelAbstract2.java   | 25 +++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index fa47ecb..4e03256 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -624,7 +624,12 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
     private void configureInlinePromptLinkCallback(final WebMarkupContainer inlinePromptLink) {
 
         inlinePromptLink.add(new AjaxEventBehavior("click") {
-            @Override
+            /**
+			 * 
+			 */
+			private static final long serialVersionUID = -3034584614218331440L;
+
+			@Override
             protected void onEvent(final AjaxRequestTarget target) {
 
                 scalarModel.toEditMode();
@@ -649,7 +654,12 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
             final ActionLink actionLink) {
 
         inlinePromptLink.add(new AjaxEventBehavior("click") {
-            @Override
+            /**
+			 * 
+			 */
+			private static final long serialVersionUID = 2171203212348044948L;
+
+			@Override
             protected void onEvent(final AjaxRequestTarget target) {
                 actionLink.onClick(target);
             }
@@ -692,7 +702,12 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
             scalarIfRegularFormGroup.addOrReplace(editProperty);
 
             editProperty.add(new AjaxEventBehavior("click") {
-                protected void onEvent(AjaxRequestTarget target) {
+                /**
+				 * 
+				 */
+				private static final long serialVersionUID = -3561635292986591682L;
+
+				protected void onEvent(AjaxRequestTarget target) {
 
                     final ActionPrompt prompt = ActionPromptProvider.Util
                             .getFrom(ScalarPanelAbstract2.this).getActionPrompt();
@@ -767,6 +782,10 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
                 return "label-none";
             case TOP:
                 return "label-top";
+			case DEFAULT:
+			case NOT_SPECIFIED:
+			default:
+				break;
             }
         }
         return "label-left";

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

[isis] 07/11: ISIS-898 Internal API: introduces _Lazy a memoizing supplier

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 28f1b610e3182404d1d83ef1a816738a2e44f2a0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Apr 16 08:17:56 2018 +0200

    ISIS-898 Internal API: introduces _Lazy a memoizing supplier
---
 .../apache/isis/applib/internal/base/_Lazy.java    | 79 ++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Lazy.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Lazy.java
new file mode 100644
index 0000000..802ec57
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Lazy.java
@@ -0,0 +1,79 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.applib.internal.base;
+
+import java.util.Objects;
+import java.util.function.Supplier;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Supplier with memoization.
+ * </p>
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
+ * These may be changed or removed without notice!
+ * </p>
+ * 
+ * @since 2.0.0
+ */
+public final class _Lazy<T> implements Supplier<T> {
+
+	private final Supplier<? extends T> supplier;
+	private T value;
+	private boolean memoized;
+
+	public static <T> _Lazy<T> of(Supplier<? extends T> supplier) {
+		return new _Lazy<T>(supplier);
+	}
+	
+	private _Lazy(Supplier<? extends T> supplier) {
+		Objects.requireNonNull(supplier, "supplier required");
+		this.supplier = supplier;
+	}
+
+	public boolean isMemoized() {
+		return memoized;
+	}
+
+	/**
+	 * Clears the lazy's memoized value. Resets this lazy to its initial state.<br> 
+	 * isMemoized() = false;
+	 * 
+	 */
+	public void clear() {
+		this.memoized = false;
+		this.value = null;
+	}
+
+	/**
+	 * Evaluates this lazy value and memoizes it, when called the first time 
+	 * after initialization or clear().
+	 */
+	@Override
+	public T get() {
+		if(memoized) {
+			return value;
+		}
+		memoized=true;
+		return value = supplier.get();
+	}
+
+}

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

[isis] 11/11: ISIS-898 initial (naive) lazy tree feature

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 0e3abd90395665e94d76bacf55e39b3286ec39c3
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Apr 17 09:24:52 2018 +0200

    ISIS-898 initial (naive) lazy tree feature
    
    fails when lazily fetching child nodes
---
 .../org/apache/isis/applib/tree/LazyTreeNode.java  |   7 +-
 .../java/org/apache/isis/applib/tree/TreeNode.java |  51 ++---
 .../facets/value/treenode/TreeNodeValueFacet.java} |  17 +-
 ...deValueFacetUsingSemanticsProviderFactory.java} |  30 +--
 .../treenode/TreeNodeValueSemanticsProvider.java   | 133 +++++++++++++
 .../ComponentFactoryRegistrarDefault.java          |   3 +-
 .../wicket/model/models/tree/TreeViewModel.java    |   1 +
 .../components/tree/IsisToWicketTreeAdapter.java   | 209 +++++++++++++++++++++
 .../ui/components/tree/StandaloneTreePanel.html    |   4 +-
 .../ui/components/tree/StandaloneTreePanel.java    |  14 +-
 .../wicket/ui/components/tree/TreePanel.html       |  66 +++++++
 .../wicket/ui/components/tree/TreePanel.java       |  54 ++++--
 .../ui/components/tree/TreePanelFactories.java     |  14 +-
 13 files changed, 519 insertions(+), 84 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java
index e464373..1d75d33 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java
@@ -21,15 +21,17 @@ package org.apache.isis.applib.tree;
 import java.util.Objects;
 import java.util.stream.Stream;
 
+import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.internal.base._Lazy;
 
+@Value(semanticsProviderName="org.apache.isis.core.metamodel.facets.value.treenode.TreeNodeValueSemanticsProvider")
 public class LazyTreeNode<T> implements TreeNode<T> {
 	
 	private final T value;
 	private final Class<? extends TreeAdapter<T>> treeAdapterClass;
 	private final _Lazy<TreeAdapter<T>> treeAdapter = _Lazy.of(this::newTreeAdapter);
 	
-	static <T> TreeNode<T> of(T value, Class<? extends TreeAdapter<T>> treeAdapterClass) {
+	public static <T> TreeNode<T> of(T value, Class<? extends TreeAdapter<T>> treeAdapterClass) {
 		return new LazyTreeNode<T>(value, treeAdapterClass);
 	}
 	
@@ -66,6 +68,7 @@ public class LazyTreeNode<T> implements TreeNode<T> {
 				;
 	}
 
+	@Override
 	public Class<? extends TreeAdapter<T>> getTreeAdapterClass() {
 		return treeAdapterClass;
 	}
@@ -77,7 +80,7 @@ public class LazyTreeNode<T> implements TreeNode<T> {
 			return treeAdapterClass.newInstance();
 		} catch (InstantiationException | IllegalAccessException e) {
 			throw new IllegalArgumentException(
-					String.format("failed to instanciate treeAdapter '%s'", treeAdapterClass.getName()), e);
+					String.format("failed to instantiate TreeAdapter '%s'", treeAdapterClass.getName()), e);
 		}
 	}
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
index 0b07924..e387c0c 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
@@ -27,33 +27,33 @@ import java.util.stream.StreamSupport;
 import javax.annotation.Nullable;
 
 public interface TreeNode<T> {
-	
+
 	// -- VALUE
-	
+
 	public T getValue();
-	
+
 	// -- PARENT
-	
+
 	public @Nullable TreeNode<T> getParentIfAny();
-	
+
 	// -- CHILDREN
-	
+
 	public int getChildCount();
 
 	public Stream<TreeNode<T>> streamChildren();
-	
+
 	// -- BASIC PREDICATES
-	
+
 	public default boolean isRoot() {
 		return getParentIfAny() == null;
 	}
-	
+
 	public default boolean isLeaf() {
 		return getChildCount() == 0;
 	}
 
 	// -- CONSTRUCTION
-	
+
 	/**
 	 * Convenient shortcut.
 	 * @param node
@@ -63,43 +63,52 @@ public interface TreeNode<T> {
 	public static <T> TreeNode<T> lazy(T node, Class<? extends TreeAdapter<T>> treeAdapterClass) {
 		return LazyTreeNode.of(node, treeAdapterClass);
 	}
-	
+
 	// -- PARENT NODE ITERATION
-	
+
 	public default Iterator<TreeNode<T>> iteratorHierarchyUp(){
 		return new TreeNode_iteratorHierarchyUp<>(this);
 	}
-	
+
 	// -- PARENT NODE STREAMING
-	
+
 	public default Stream<TreeNode<T>> streamHierarchyUp(){
 		return StreamSupport.stream(
 				Spliterators.spliteratorUnknownSize(iteratorHierarchyUp(), Spliterator.ORDERED), 
 				false); // not parallel
 	}
-	
+
 	// -- CHILD NODE ITERATION
-	
+
 	public default Iterator<TreeNode<T>> iteratorDepthFirst(){
 		return new TreeNode_iteratorDepthFirst<>(this);
 	}
-	
+
 	public default Iterator<TreeNode<T>> iteratorBreadthFirst(){
 		return new TreeNode_iteratorBreadthFirst<>(this);
 	}
-	
+
 	// -- CHILD NODE STREAMING
-	
+
 	public default Stream<TreeNode<T>> streamDepthFirst(){
 		return StreamSupport.stream(
 				Spliterators.spliteratorUnknownSize(iteratorDepthFirst(), Spliterator.ORDERED), 
 				false); // not parallel
 	}
-	
+
 	public default Stream<TreeNode<T>> streamBreadthFirst(){
 		return StreamSupport.stream(
 				Spliterators.spliteratorUnknownSize(iteratorBreadthFirst(), Spliterator.ORDERED), 
 				false); // not parallel
 	}
-	
+
+	// -- LAZY NODE ADAPTING
+
+	/**
+	 * @return
+	 */
+	// [ahuber] Implementation Note: a class rather than an instance, because otherwise 
+	// the adapter would need to be serializable for Wicket's trees to work correctly.
+	public Class<? extends TreeAdapter<T>> getTreeAdapterClass();
+
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacet.java
similarity index 56%
copy from core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacet.java
index 7375410..90c1796 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacet.java
@@ -17,20 +17,11 @@
  *  under the License.
  */
 
-package org.apache.isis.viewer.wicket.ui.components.tree;
+package org.apache.isis.core.metamodel.facets.value.treenode;
 
-import org.apache.isis.viewer.wicket.model.models.ValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 
-public class StandaloneTreePanel extends PanelAbstract<ValueModel> {
-
-    private static final long serialVersionUID = 1L;
-    private static final String ID_STANDALONE_VALUE = "standaloneValue";
-
-    public StandaloneTreePanel(final String id, final ValueModel valueModel) {
-        super(id, valueModel);
-        add(new MarkupComponent(ID_STANDALONE_VALUE, getModel()));
-    }
+public interface TreeNodeValueFacet extends Facet {
+	
 
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java
similarity index 52%
copy from core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java
index 7375410..53281e7 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java
@@ -17,20 +17,24 @@
  *  under the License.
  */
 
-package org.apache.isis.viewer.wicket.ui.components.tree;
+package org.apache.isis.core.metamodel.facets.value.treenode;
 
-import org.apache.isis.viewer.wicket.model.models.ValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.applib.tree.TreeNode;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
 
-public class StandaloneTreePanel extends PanelAbstract<ValueModel> {
-
-    private static final long serialVersionUID = 1L;
-    private static final String ID_STANDALONE_VALUE = "standaloneValue";
-
-    public StandaloneTreePanel(final String id, final ValueModel valueModel) {
-        super(id, valueModel);
-        add(new MarkupComponent(ID_STANDALONE_VALUE, getModel()));
-    }
+@SuppressWarnings("rawtypes")
+public class TreeNodeValueFacetUsingSemanticsProviderFactory 
+extends ValueFacetUsingSemanticsProviderFactory<TreeNode> {
+	
+	@Override
+	public void process(final ProcessClassContext processClassContext) {
+		final Class<?> type = processClassContext.getCls();
+		final FacetHolder holder = processClassContext.getFacetHolder();
 
+		if (!TreeNode.class.isAssignableFrom(type)) {
+			return;
+		}
+		addFacets(new TreeNodeValueSemanticsProvider(holder, getContext()));
+	}
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java
new file mode 100644
index 0000000..66f3a8b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java
@@ -0,0 +1,133 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.treenode;
+
+import org.apache.isis.applib.adapters.DefaultsProvider;
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.internal.memento._Mementos;
+import org.apache.isis.applib.internal.memento._Mementos.Memento;
+import org.apache.isis.applib.internal.memento._Mementos.SerializingAdapter;
+import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
+import org.apache.isis.applib.tree.TreeNode;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+
+@SuppressWarnings("rawtypes")
+public class TreeNodeValueSemanticsProvider extends ValueSemanticsProviderAndFacetAbstract<TreeNode> 
+implements TreeNodeValueFacet {
+
+	private static final int TYPICAL_LENGTH = 0;
+
+	private static Class<? extends Facet> type() {
+		return TreeNodeValueFacet.class;
+	}
+
+	private static final TreeNode DEFAULT_VALUE = null;
+	private static final Class<TreeNode> VALUE_TYPE = TreeNode.class;
+	
+	 /**
+     * Required because implementation of {@link Parser} and
+     * {@link EncoderDecoder}.
+     */
+    public TreeNodeValueSemanticsProvider() {
+        this(null, null);
+    }
+    
+	public TreeNodeValueSemanticsProvider(final FacetHolder holder, final ServicesInjector context) {
+        super(type(), holder, VALUE_TYPE, TYPICAL_LENGTH, null, Immutability.IMMUTABLE, 
+        		EqualByContent.NOT_HONOURED, DEFAULT_VALUE, context);
+    }
+
+	@Override
+	public String titleString(final Object object) {
+		return object != null ? ((TreeNode<?>)object).toString() : "[null]"; //TODO implement
+	}
+
+	@Override
+	public String titleStringWithMask(final Object value, final String usingMask) {
+		return titleString(value);
+	}
+
+    // //////////////////////////////////////////////////////////////////
+    // Parser
+    // //////////////////////////////////////////////////////////////////
+
+    @Override
+    public Parser<TreeNode> getParser() {
+        return null;
+    }
+
+    // //////////////////////////////////////////////////////////////////
+    // DefaultsProvider
+    // //////////////////////////////////////////////////////////////////
+    
+    @Override
+    public DefaultsProvider<TreeNode> getDefaultsProvider() {
+        return null;
+    }
+	
+	// //////////////////////////////////////////////////////////////////
+	// EncoderDecoder
+	// //////////////////////////////////////////////////////////////////
+
+	@Override
+	protected String doEncode(final Object object) {
+		TreeNode<?> treeNode = (TreeNode<?>)object;
+		
+		final Memento memento = newMemento();
+		memento.put("primaryValue", treeNode.getValue());
+		memento.put("adapterClass", treeNode.getTreeAdapterClass());
+		return memento.asString(); 
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	protected TreeNode<?> doRestore(final String input) {
+		final Memento memento = parseMemento(input);
+		return TreeNode.lazy(
+				memento.get("primaryValue", Object.class), 
+				memento.get("adapterClass", Class.class));
+	}
+
+	// /////// toString ///////
+
+	@Override
+	public String toString() {
+		return "TreeNodeValueSemanticsProvider";
+	}
+	
+	// -- HELPER
+	
+	private _Mementos.Memento newMemento(){
+		final UrlEncodingService codec = getServicesInjector().lookupService(UrlEncodingService.class);
+		final SerializingAdapter serializer = getServicesInjector().lookupService(SerializingAdapter.class);
+		return _Mementos.create(codec, serializer);
+	}
+	
+	private _Mementos.Memento parseMemento(String input){
+		final UrlEncodingService codec = getServicesInjector().lookupService(UrlEncodingService.class);
+		final SerializingAdapter serializer = getServicesInjector().lookupService(SerializingAdapter.class);
+		return _Mementos.parse(codec, serializer, input);
+	}
+
+}
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 2e03d81..52c2c44 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -200,9 +200,10 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
 
     protected void addComponentFactoriesForScalar(final ComponentFactoryList componentFactories) {
 
+    	componentFactories.add(TreePanelFactories.parented());
+    	
         componentFactories.add(new ReferencePanelFactory());
         componentFactories.add(MarkupPanelFactories.parented());
-        componentFactories.add(TreePanelFactories.parented());
         
         componentFactories.add(new BooleanPanelFactory());
         componentFactories.add(new BytePanelFactory());
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java
index 7e75eb9..bb89d1c 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java
@@ -3,6 +3,7 @@ package org.apache.isis.viewer.wicket.model.models.tree;
 import org.apache.isis.applib.tree.TreeNode;
 import org.apache.isis.viewer.wicket.model.models.ModelAbstract;
 
+@Deprecated //[ahuber] temporary
 public class TreeViewModel extends ModelAbstract<TreeNode<Object>> {
 
 	private static final long serialVersionUID = 1L;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/IsisToWicketTreeAdapter.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/IsisToWicketTreeAdapter.java
new file mode 100644
index 0000000..021d447
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/IsisToWicketTreeAdapter.java
@@ -0,0 +1,209 @@
+package org.apache.isis.viewer.wicket.ui.components.tree;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.internal.collections._Lists;
+import org.apache.isis.applib.tree.TreeAdapter;
+import org.apache.isis.applib.tree.TreeNode;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ModelAbstract;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.components.entity.icontitle.EntityIconAndTitlePanel;
+import org.apache.wicket.Component;
+import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree;
+import org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+
+class IsisToWicketTreeAdapter {
+
+	public static EntityTree adapt(String id, ValueModel valueModel) {
+		return new EntityTree(id, toITreeProvider( valueModel ));
+	}
+	
+	public static EntityTree adapt(String id, ScalarModel scalarModel) {
+		return new EntityTree(id, toITreeProvider( scalarModel ));
+	}
+	
+	// -- RENDERING
+	
+	private static class EntityTree extends NestedTree<EntityModel> {
+
+		private static final long serialVersionUID = 1L;
+
+		public EntityTree(String id, ITreeProvider<EntityModel> provider) {
+			super(id, provider);
+			add(new WindowsTheme()); // TODO not required if Isis provides it's own css styles for tree-nodes
+		}
+		
+		/**
+		 * To use a custom component for the representation of a node's content we override this method.
+		 */
+		@Override
+		protected Component newContentComponent(String id, IModel<EntityModel> node) {
+			final EntityModel entityModel = node.getObject();
+			return new EntityIconAndTitlePanel(id, entityModel);
+		}
+
+		
+	}
+	
+	// -- HELPER
+	
+	private static class EntitiyModelTreeAdapter implements TreeAdapter<EntityModel>, Serializable {
+		private static final long serialVersionUID = 1L;
+		
+		private final Class<? extends TreeAdapter> treeAdapterClass;
+		private transient TreeAdapter wrappedTreeAdapter;
+		
+		private EntitiyModelTreeAdapter(Class<? extends TreeAdapter> treeAdapterClass) {
+			this.treeAdapterClass = treeAdapterClass;
+		}
+		
+		private TreeAdapter wrappedTreeAdapter() {
+			if(wrappedTreeAdapter!=null) {
+				return wrappedTreeAdapter;
+			}
+			try {
+				return wrappedTreeAdapter = treeAdapterClass.newInstance();
+			} catch (InstantiationException | IllegalAccessException e) {
+				throw new RuntimeException("failed to instantiate tree adapter", e);
+			}
+		}
+
+		@Override
+		public Optional<EntityModel> parentOf(EntityModel entityModel) {
+			if(entityModel==null) {
+				return Optional.empty();
+			}
+			return wrappedTreeAdapter().parentOf(unwrap(entityModel))
+					.map(this::wrap);
+		}
+
+		@Override
+		public int childCountOf(EntityModel entityModel) {
+			if(entityModel==null) {
+				return 0;
+			}
+			return wrappedTreeAdapter().childCountOf(unwrap(entityModel));
+		}
+
+		@Override
+		public Stream<EntityModel> childrenOf(EntityModel entityModel) {
+			if(entityModel==null) {
+				return Stream.empty();
+			}
+			return wrappedTreeAdapter().childrenOf(unwrap(entityModel))
+					.map(this::wrap);
+		}
+		
+		private EntityModel wrap(Object pojo) {
+			Objects.requireNonNull(pojo);
+			return new EntityModel(persistenceSession().getAdapterFor(pojo));
+		}
+		
+		private Object unwrap(EntityModel model) {
+			Objects.requireNonNull(model);
+			return model.getObject().getObject();
+		}
+		
+		private PersistenceSession persistenceSession() {
+			return IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession();
+		}
+		
+	}
+
+	
+	private static class EntityModelTreeProvider implements ITreeProvider<EntityModel> {
+
+		private static final long serialVersionUID = 1L;
+		
+		private final EntityModel primaryValue;
+		private final EntitiyModelTreeAdapter treeAdapter;
+
+		private EntityModelTreeProvider(EntityModel primaryValue, EntitiyModelTreeAdapter treeAdapter) {
+			this.primaryValue = primaryValue;
+			this.treeAdapter = treeAdapter;
+		}
+
+		@Override
+		public void detach() {
+		}
+
+		@Override
+		public Iterator<? extends EntityModel> getRoots() {
+			return _Lists.singleton(primaryValue).iterator();
+		}
+
+		@Override
+		public boolean hasChildren(EntityModel node) {
+			return treeAdapter.childCountOf(node)>0;
+		}
+
+		@Override
+		public Iterator<? extends EntityModel> getChildren(EntityModel node) {
+			return treeAdapter.childrenOf(node).iterator();
+		}
+
+		@Override
+		public IModel<EntityModel> model(final EntityModel entityModel) {
+			return new LoadableDetachableEntityModel(entityModel);
+		}
+		
+	}
+	
+	private static ITreeProvider<EntityModel> toITreeProvider(ModelAbstract<ObjectAdapter> model) {
+		
+		final TreeNode tree = (TreeNode) model.getObject().getObject();
+		final EntitiyModelTreeAdapter wrappingTreeAdapter = new EntitiyModelTreeAdapter(tree.getTreeAdapterClass());
+		
+		return new EntityModelTreeProvider(wrappingTreeAdapter.wrap(tree.getValue()), wrappingTreeAdapter);		
+	}
+	
+	private static class LoadableDetachableEntityModel extends LoadableDetachableModel<EntityModel> {
+		private static final long serialVersionUID = 1L;
+
+		private final Oid id;
+
+		public LoadableDetachableEntityModel(EntityModel eModel) {
+			super(eModel);
+
+			id = eModel.getObject().getOid();
+		}
+
+		@Override
+		protected EntityModel load() {
+			return null; //TODO [ahuber] load model by id, possibly not required
+		}
+
+		/**
+		 * Important! Models must be identifiable by their contained object.
+		 */
+		@Override
+		public boolean equals(Object obj) {
+			if (obj instanceof EntityModel) {
+				return ((EntityModel) obj).getObject().getOid().equals(id);
+			}
+			return false;
+		}
+
+		/**
+		 * Important! Models must be identifiable by their contained object.
+		 */
+		@Override
+		public int hashCode() {
+			return id.hashCode();
+		}
+	}
+
+}
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html
index cfd86c4..6f2a25b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html
@@ -25,9 +25,7 @@
     <body>
         <wicket:panel>
 
-            <div wicket:id="standaloneTree">
-
-            </div>
+            <div wicket:id="tree">[tree]</div>
 
         </wicket:panel>
     </body>
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
index 7375410..66ee3b2 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
@@ -20,17 +20,17 @@
 package org.apache.isis.viewer.wicket.ui.components.tree;
 
 import org.apache.isis.viewer.wicket.model.models.ValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
 public class StandaloneTreePanel extends PanelAbstract<ValueModel> {
 
-    private static final long serialVersionUID = 1L;
-    private static final String ID_STANDALONE_VALUE = "standaloneValue";
+	private static final long serialVersionUID = 1L;
+	private static final String ID_TREE = "tree";
+
+	public StandaloneTreePanel(final String id, final ValueModel valueModel) {
+		super(id, valueModel);
+		add(IsisToWicketTreeAdapter.adapt(ID_TREE, valueModel));
+	}
 
-    public StandaloneTreePanel(final String id, final ValueModel valueModel) {
-        super(id, valueModel);
-        add(new MarkupComponent(ID_STANDALONE_VALUE, getModel()));
-    }
 
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.html
new file mode 100644
index 0000000..ae0dfd5
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.html
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+	xmlns:wicket="http://wicket.apache.org" xml:lang="en" lang="en">
+<body>
+
+	<!-- a stripped down copy of ScalarPanelTextFieldAbstract.html -->
+
+	<wicket:panel>
+		<div class="scalarNameAndValueComponentType"
+			wicket:id="scalarTypeContainer">
+
+			<div class="form-group" wicket:id="scalarIfRegular">
+
+				<label class="scalarName control-label" wicket:id="scalarName">[Label text]</label> 
+				<span class="scalarValueWrapper">
+					<div class="tree-theme-windows">
+						<span> 
+							<wicket:container wicket:id="scalarValueContainer" />
+						</span> 
+						<span class="associatedActionLinksRight"
+							wicket:id="associatedActionLinksRight">[drop down]</span>
+					</div> 
+					<span wicket:id="feedback" class="help-block" />
+					<span wicket:id="associatedActionLinksBelow" />
+				</span>
+				<div class="clearfix"></div>
+			</div>
+
+			<div class="tree-theme-windows">
+				<wicket:container wicket:id="scalarIfCompact"/>
+			</div>
+			
+		</div>
+
+		<wicket:fragment wicket:id="textInlinePrompt">
+			<span wicket:id="scalarValue" />
+		</wicket:fragment>
+
+		<wicket:fragment wicket:id="textarea">
+			<textarea name="scalarValue"
+				class="form-control input-sm scalarValue" wicket:id="scalarValue" />
+		</wicket:fragment>
+
+	</wicket:panel>
+</body>
+</html>
+
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java
index 8377bc0..2de3334 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java
@@ -20,46 +20,60 @@
 package org.apache.isis.viewer.wicket.ui.components.tree;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
 
-public class TreePanel extends ScalarPanelAbstract2 {
+/**
+ * Immutable tree, reuses the ScalarPanelTextField functionality without the need of its text field.
+ */
+public class TreePanel extends ScalarPanelTextFieldParseableAbstract {
+
+	private static final long serialVersionUID = 1L;
 
-    public TreePanel(String id, ScalarModel scalarModel) {
+	public TreePanel(final String id, final ScalarModel scalarModel) {
 		super(id, scalarModel);
 	}
 
-	private static final long serialVersionUID = 1L;
-
 	@Override
 	protected String getScalarPanelType() {
 		return "treePanel";
 	}
 
 	@Override
-	protected InlinePromptConfig getInlinePromptConfig() {
-		// TODO Auto-generated method stub
-		return null;
-	}
+	protected MarkupContainer createScalarIfRegularFormGroup() {
 
-	@Override
-	protected MarkupContainer createComponentForRegular() {
-		// TODO Auto-generated method stub
-		return null;
+		if(getModel().isEditMode()) {
+			// fallback to text editor
+			return super.createScalarIfRegularFormGroup();
+		}
+
+		final Component treeComponent = createTreeComponent("scalarValueContainer");
+
+		getTextField().setLabel(Model.of(getModel().getName()));
+
+		final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, getTextField());
+		formGroup.add(treeComponent);
+
+		final String labelCaption = getRendering().getLabelCaption(getTextField());
+		final Label scalarName = createScalarName(ID_SCALAR_NAME, labelCaption);
+		formGroup.add(scalarName);
+
+		return formGroup;
 	}
 
 	@Override
 	protected Component createComponentForCompact() {
-		// TODO Auto-generated method stub
-		return null;
+		return createTreeComponent(ID_SCALAR_IF_COMPACT);
 	}
 
-	@Override
-	protected Component getScalarValueComponent() {
-		// TODO Auto-generated method stub
-		return null;
+	// -- HELPER
+
+	private Component createTreeComponent(String id) {
+		return IsisToWicketTreeAdapter.adapt(id, getModel());
 	}
-    
 
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java
index 70b0470..606c848 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactories.java
@@ -45,19 +45,22 @@ public class TreePanelFactories {
 		
 		@Override
 		public ApplicationAdvice appliesTo(final IModel<?> model) {
-			if (!(model instanceof ScalarModel))
+			if (!(model instanceof ScalarModel)) {
 				return ApplicationAdvice.DOES_NOT_APPLY;
+			}
 
 			final ScalarModel scalarModel = (ScalarModel) model;
 
-			if(!scalarModel.isScalarTypeAnyOf(org.apache.isis.applib.tree.TreeNode.class)) 
+			if(!scalarModel.isScalarTypeSubtypingAnyOf(org.apache.isis.applib.tree.TreeNode.class)) {
 				return ApplicationAdvice.DOES_NOT_APPLY;
+			}
 
 			return appliesIf( !scalarModel.hasChoices() );
 		}
 		
 		@Override
 		public final Component createComponent(final String id, final IModel<?> model) {
+			
 			return new TreePanel(id, (ScalarModel) model);
 		}
 	}
@@ -73,12 +76,15 @@ public class TreePanelFactories {
 		
 		@Override
 		public ApplicationAdvice appliesTo(final IModel<?> model) {
-			if (!(model instanceof ValueModel))
+			if (!(model instanceof ValueModel)) {
 				return ApplicationAdvice.DOES_NOT_APPLY;
+			}
+			
 			final ValueModel valueModel = (ValueModel) model;
 			final ObjectAdapter adapter = valueModel.getObject();
-			if(adapter==null || adapter.getObject()==null)
+			if(adapter==null || adapter.getObject()==null) {
 				return ApplicationAdvice.DOES_NOT_APPLY;
+			}
 
 			return appliesIf( adapter.getObject() instanceof org.apache.isis.applib.tree.TreeNode );
 		}

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

[isis] 02/11: ISIS-898 refine TreeNode interface

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit a8c547dc2546fb73c2a82bb46e8de28c8473e8b2
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Apr 15 19:55:11 2018 +0200

    ISIS-898 refine TreeNode interface
---
 .../src/main/java/org/apache/isis/applib/tree/TreeNode.java    | 10 ++++++----
 .../main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java   |  4 ++--
 .../apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java  |  2 +-
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
index f8f6fc4..6d641a5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
@@ -1,12 +1,14 @@
 package org.apache.isis.applib.tree;
 
 import java.util.Iterator;
-import java.util.Optional;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
+import org.apache.isis.applib.annotation.ViewModel;
+
+@ViewModel
 public interface TreeNode<T> {
 	
 	// -- VALUE
@@ -15,7 +17,7 @@ public interface TreeNode<T> {
 	
 	// -- PARENT
 	
-	public Optional<TreeNode<T>> getParent();
+	public TreeNode<T> getParentIfAny();
 	
 	// -- CHILDREN
 	
@@ -26,7 +28,7 @@ public interface TreeNode<T> {
 	// -- BASIC PREDICATES
 	
 	public default boolean isRoot() {
-		return !getParent().isPresent();
+		return getParentIfAny() == null;
 	}
 	
 	public default boolean isLeaf() {
@@ -36,7 +38,7 @@ public interface TreeNode<T> {
 	// -- CONSTRUCTION
 	
 	public static <T> TreeNode<T> of(T node, TreeAdapter<T> treeAdapter) {
-		return TreeNode_Lazy.of(node, treeAdapter);
+		return TreeNodeBean.of(node, treeAdapter);
 	}
 	
 	// -- PARENT NODE ITERATION
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
index 83cd503..1bc2341 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
@@ -1,7 +1,6 @@
 package org.apache.isis.applib.tree;
 
 import java.util.Objects;
-import java.util.Optional;
 import java.util.stream.Stream;
 
 class TreeNode_Lazy<T> implements TreeNode<T> {
@@ -26,9 +25,10 @@ class TreeNode_Lazy<T> implements TreeNode<T> {
 	}
 
 	@Override
-	public Optional<TreeNode<T>> getParent() {
+	public TreeNode<T> getParentIfAny() {
 		return treeAdapter.parentOf(getValue())
 				.map(this::toTreeNode)
+				.orElse(null)
 				;
 	}
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
index 62813b2..9b29e2b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
@@ -29,7 +29,7 @@ class TreeNode_iteratorHierarchyUp<T> implements Iterator<TreeNode<T>> {
 	// -- HELPER
 
 	private TreeNode<T> fetchNext(TreeNode<T> current) {
-		return current.getParent().orElse(null);
+		return current.getParentIfAny();
 	}
 
 }

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

[isis] 03/11: ISIS-898 interim TreePanel stubs

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit b4535dae220ab738e5cc64d957daad754e6e6a65
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Apr 15 21:05:15 2018 +0200

    ISIS-898 interim TreePanel stubs
---
 .../java/org/apache/isis/applib/tree/TreeNode.java |   2 +-
 .../ui/components/tree/StandaloneTreePanel.html    |  34 +++++++
 .../ui/components/tree/StandaloneTreePanel.java    |  36 +++++++
 .../wicket/ui/components/tree/TreePanel.java       |  65 ++++++++++++
 .../ui/components/tree/TreePanelFactory.java       | 110 +++++++++++++++++++++
 5 files changed, 246 insertions(+), 1 deletion(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
index 6d641a5..6ce17a3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
@@ -38,7 +38,7 @@ public interface TreeNode<T> {
 	// -- CONSTRUCTION
 	
 	public static <T> TreeNode<T> of(T node, TreeAdapter<T> treeAdapter) {
-		return TreeNodeBean.of(node, treeAdapter);
+		return TreeNode_Lazy.of(node, treeAdapter);
 	}
 	
 	// -- PARENT NODE ITERATION
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html
new file mode 100644
index 0000000..cfd86c4
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.html
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
+      xml:lang="en"  
+      lang="en">
+    <body>
+        <wicket:panel>
+
+            <div wicket:id="standaloneTree">
+
+            </div>
+
+        </wicket:panel>
+    </body>
+</html>
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
new file mode 100644
index 0000000..7375410
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/StandaloneTreePanel.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.tree;
+
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class StandaloneTreePanel extends PanelAbstract<ValueModel> {
+
+    private static final long serialVersionUID = 1L;
+    private static final String ID_STANDALONE_VALUE = "standaloneValue";
+
+    public StandaloneTreePanel(final String id, final ValueModel valueModel) {
+        super(id, valueModel);
+        add(new MarkupComponent(ID_STANDALONE_VALUE, getModel()));
+    }
+
+}
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java
new file mode 100644
index 0000000..8377bc0
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanel.java
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.tree;
+
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+
+public class TreePanel extends ScalarPanelAbstract2 {
+
+    public TreePanel(String id, ScalarModel scalarModel) {
+		super(id, scalarModel);
+	}
+
+	private static final long serialVersionUID = 1L;
+
+	@Override
+	protected String getScalarPanelType() {
+		return "treePanel";
+	}
+
+	@Override
+	protected InlinePromptConfig getInlinePromptConfig() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	protected MarkupContainer createComponentForRegular() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	protected Component createComponentForCompact() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	protected Component getScalarValueComponent() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+    
+
+}
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactory.java
new file mode 100644
index 0000000..dc87f49
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/tree/TreePanelFactory.java
@@ -0,0 +1,110 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.tree;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.IModel;
+
+/**
+ * {@link ComponentFactory} for {@link TreePanel}.
+ */
+public class TreePanelFactory extends ComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+    
+    public TreePanelFactory(ComponentType componentType) {
+        super(componentType, TreePanel.class);
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+    	switch (getComponentType()) {
+		case SCALAR_NAME_AND_VALUE:
+			return appliesToIfScalar(model);
+		case VALUE:
+			return appliesToIfValue(model);
+		default:
+			return ApplicationAdvice.DOES_NOT_APPLY;
+		}
+    }
+    
+    @Override
+    public final Component createComponent(final String id, final IModel<?> model) {
+    	
+    	switch (getComponentType()) {
+		case SCALAR_NAME_AND_VALUE:
+			return createComponentIfScalar(id, model);
+		case VALUE:
+			return createComponentIfValue(id, model);
+		default:
+			return new Label(id, "TreePanelFactory.createComponent: case not handled '"+getComponentType()+"'");
+		}
+    }
+    
+    // -- VARIANTS OF APPLIES TO
+    
+	private ApplicationAdvice appliesToIfScalar(IModel<?> model) {
+		if (!(model instanceof ScalarModel))
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        
+        final ScalarModel scalarModel = (ScalarModel) model;
+        
+        if(!scalarModel.isScalarTypeSubtypingAnyOf(org.apache.isis.applib.tree.TreeNode.class)) 
+            return ApplicationAdvice.DOES_NOT_APPLY;
+
+        return appliesIf( !scalarModel.hasChoices() );
+	}
+	
+    private ApplicationAdvice appliesToIfValue(IModel<?> model) {
+    	if (!(model instanceof ValueModel))
+            return ApplicationAdvice.DOES_NOT_APPLY;
+    	final ValueModel valueModel = (ValueModel) model;
+    	final ObjectAdapter adapter = valueModel.getObject();
+    	if(adapter==null || adapter.getObject()==null)
+    		return ApplicationAdvice.DOES_NOT_APPLY;
+    	
+    	return appliesIf( adapter.getObject() instanceof org.apache.isis.applib.tree.TreeNode );
+	}
+
+    // -- VARIANTS OF CREATE COMPONENT
+    
+    private final Component createComponentIfScalar(final String id, final IModel<?> model) {
+    	
+    	System.out.println("!!! BINGO createComponentIfScalar");
+    	
+        return new TreePanel(id, (ScalarModel) model);
+    }
+    
+    private final Component createComponentIfValue(final String id, final IModel<?> model) {
+    	
+    	System.out.println("!!! BINGO createComponentIfValue");
+    	
+        return new StandaloneTreePanel(id, (ValueModel) model);
+    }
+    
+
+}

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

[isis] 10/11: ISIS-898 further reduce compiler warnings

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit b02c336eebb0507e1bf2dd552ad1062947dfed1c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Apr 17 05:54:24 2018 +0200

    ISIS-898 further reduce compiler warnings
---
 .../value/ValueSemanticsProviderAbstractTemporal.java   |  3 ++-
 .../facets/value/image/ImageValueSemanticsProvider.java |  1 -
 .../imageawt/JavaAwtImageValueSemanticsProvider.java    |  1 -
 .../bookmarks/BookmarkServiceInternalDefault.java       | 17 +++++++++--------
 .../core/runtime/persistence/adapter/PojoAdapter.java   |  8 +++-----
 .../isis/viewer/wicket/model/models/ScalarModel.java    |  2 +-
 .../actions/ActionParametersFormPanelFactory.java       |  6 ++----
 .../ui/components/actions/ActionParametersPanel.java    |  4 +++-
 .../bookmarkedpages/BookmarkedPagesPanel.java           |  8 ++++++--
 .../ui/components/scalars/markup/MarkupPanel.java       |  3 +--
 10 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
index 1d4fa11..41cd71a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
@@ -33,6 +33,7 @@ import java.util.TimeZone;
 import com.google.common.collect.Maps;
 
 import org.apache.isis.applib.adapters.EncodingException;
+import org.apache.isis.applib.internal.base._Casts;
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -200,7 +201,7 @@ public abstract class ValueSemanticsProviderAbstractTemporal<T> extends ValueSem
         }
 
         try {
-            T date = (T) object;
+            T date = _Casts.uncheckedCast(object);
             final StringTokenizer st = new StringTokenizer(str.substring(1), " ");
             while (st.hasMoreTokens()) {
                 final String token = st.nextToken();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProvider.java
index ceea52e..0b5cd74 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProvider.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.value.image;
 
 import org.apache.isis.applib.value.Image;
-import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java
index 422cf73..c6e768b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueSemanticsProvider.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.facets.value.imageawt;
 
 import java.awt.Image;
 
-import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.value.image.ImageValueSemanticsProviderAbstract;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java
index 771629d..e08334a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java
@@ -202,14 +202,15 @@ public class BookmarkServiceInternalDefault implements BookmarkService, Serializ
 	// -- HELPER
 	
     private final static Set<Class<? extends Serializable>> serializableFinalTypes = _Sets.of(
-    		String.class,
-    		Boolean.class, boolean.class,
-    		Byte.class, byte.class,
-    		Short.class, short.class,
-    		Integer.class, int.class,
-    		Long.class, long.class,
-    		Float.class, float.class,
-    		Double.class, double.class
+    		String.class, String[].class,
+    		Class.class, Class[].class,
+    		Boolean.class, boolean.class, Boolean[].class, boolean[].class, 
+    		Byte.class, byte.class, Byte[].class, byte[].class,
+    		Short.class, short.class, Short[].class, short[].class,
+    		Integer.class, int.class, Integer[].class, int[].class,
+    		Long.class, long.class, Long[].class, long[].class,
+    		Float.class, float.class, Float[].class, float[].class,
+    		Double.class, double.class, Double[].class, double[].class
     );
     
     private final static List<Class<? extends Serializable>> serializableTypes = _Lists.of(
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index f9ad222..09e6bd8 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -19,14 +19,9 @@
 
 package org.apache.isis.core.runtime.persistence.adapter;
 
-import org.datanucleus.enhancement.Persistable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.Objects;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -45,6 +40,9 @@ import org.apache.isis.core.metamodel.spec.Specification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
+import org.datanucleus.enhancement.Persistable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 64be5e7..b92f239 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -80,7 +80,7 @@ import com.google.common.collect.Lists;
  *     common superclass for both EntityModel and ScalarModel.
  * </p>
  */
-public class ScalarModel extends EntityModel implements LinksProvider,FormExecutorContext, ActionArgumentModel {
+public class ScalarModel extends EntityModel implements LinksProvider, FormExecutorContext, ActionArgumentModel {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanelFactory.java
index bb515d0..8ae4779 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanelFactory.java
@@ -19,14 +19,12 @@
 
 package org.apache.isis.viewer.wicket.ui.components.actions;
 
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.resource.CssResourceReference;
-
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
 
 /**
  * {@link ComponentFactory} for {@link ActionParametersFormPanel}.
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
index dc17e3c..48349cc 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
@@ -83,7 +83,9 @@ public class ActionParametersPanel extends PanelAbstract<ActionModel> {
 
 
         WebMarkupContainer header = new WebMarkupContainer(ID_HEADER) {
-            @Override
+			private static final long serialVersionUID = 5410724436024228792L;
+
+			@Override
             protected void onConfigure() {
                 super.onConfigure();
                 setVisible(showHeader);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
index 5c455c2..eee3102 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/bookmarkedpages/BookmarkedPagesPanel.java
@@ -205,14 +205,18 @@ public class BookmarkedPagesPanel extends PanelAbstract<BookmarkedPagesModel> {
     protected Component addHelpText(final BookmarkedPagesModel bookmarkedPagesModel) {
 
         IModel<String> helpTextModel = new AbstractReadOnlyModel<String>() {
-            @Override
+			private static final long serialVersionUID = -2445813533787596379L;
+
+			@Override
             public String getObject() {
                 return bookmarkedPagesModel.isEmpty() ? "You have no bookmarks!" : "";
             }
         };
 
         Label helpText = new Label(ID_BOOKMARKS_HELP_TEXT, helpTextModel) {
-            @Override
+			private static final long serialVersionUID = -8364098044839077580L;
+
+			@Override
             protected void onConfigure() {
                 super.onConfigure();
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java
index 633daac..cbd5573 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java
@@ -30,8 +30,7 @@ import org.apache.wicket.model.Model;
 /**
  * Panel for rendering scalars of type {@link org.apache.isis.applib.value.Markup}.
  */
-public class MarkupPanel extends ScalarPanelTextFieldParseableAbstract 
-{
+public class MarkupPanel extends ScalarPanelTextFieldParseableAbstract {
 
 	private static final long serialVersionUID = 1L;
 

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

[isis] 08/11: ISIS-898 refine, also add missing license headers

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit a9215a8939a8ae0095b586c27e8e8ef5049e6ddf
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Apr 16 08:33:31 2018 +0200

    ISIS-898 refine, also add missing license headers
---
 .../org/apache/isis/applib/tree/LazyTreeNode.java  | 93 ++++++++++++++++++++++
 .../org/apache/isis/applib/tree/TreeAdapter.java   | 18 +++++
 .../java/org/apache/isis/applib/tree/TreeNode.java | 33 ++++++--
 .../org/apache/isis/applib/tree/TreeNode_Lazy.java | 57 -------------
 .../applib/tree/TreeNode_iteratorBreadthFirst.java | 18 +++++
 .../applib/tree/TreeNode_iteratorDepthFirst.java   | 18 +++++
 .../applib/tree/TreeNode_iteratorHierarchyUp.java  | 18 +++++
 .../wicket/model/models/tree/TreeViewModel.java    | 27 +++++++
 8 files changed, 220 insertions(+), 62 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java
new file mode 100644
index 0000000..e464373
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/LazyTreeNode.java
@@ -0,0 +1,93 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.tree;
+
+import java.util.Objects;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.internal.base._Lazy;
+
+public class LazyTreeNode<T> implements TreeNode<T> {
+	
+	private final T value;
+	private final Class<? extends TreeAdapter<T>> treeAdapterClass;
+	private final _Lazy<TreeAdapter<T>> treeAdapter = _Lazy.of(this::newTreeAdapter);
+	
+	static <T> TreeNode<T> of(T value, Class<? extends TreeAdapter<T>> treeAdapterClass) {
+		return new LazyTreeNode<T>(value, treeAdapterClass);
+	}
+	
+	protected LazyTreeNode(T value, Class<? extends TreeAdapter<T>> treeAdapterClass) {
+		this.value = Objects.requireNonNull(value);
+		this.treeAdapterClass = Objects.requireNonNull(treeAdapterClass);
+	}
+
+	@Override
+	public T getValue() {
+		return value;
+	}
+
+	@Override
+	public TreeNode<T> getParentIfAny() {
+		return treeAdapter().parentOf(getValue())
+				.map(this::toTreeNode)
+				.orElse(null)
+				;
+	}
+
+	@Override
+	public int getChildCount() {
+		return treeAdapter().childCountOf(value);
+	}
+
+	@Override
+	public Stream<TreeNode<T>> streamChildren() {
+		if(isLeaf()) {
+			return Stream.empty();
+		}
+		return treeAdapter().childrenOf(value)
+				.map(this::toTreeNode)
+				;
+	}
+
+	public Class<? extends TreeAdapter<T>> getTreeAdapterClass() {
+		return treeAdapterClass;
+	}
+	
+	// -- HELPER
+	
+	private TreeAdapter<T> newTreeAdapter() {
+		try {
+			return treeAdapterClass.newInstance();
+		} catch (InstantiationException | IllegalAccessException e) {
+			throw new IllegalArgumentException(
+					String.format("failed to instanciate treeAdapter '%s'", treeAdapterClass.getName()), e);
+		}
+	}
+
+	private TreeAdapter<T> treeAdapter() {
+		return treeAdapter.get();
+	}
+	
+	private TreeNode<T> toTreeNode(T value){
+		return of(value, getTreeAdapterClass());
+	}
+
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java
index 5c39b59..379e902 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.applib.tree;
 
 import java.util.Optional;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
index 6ce17a3..0b07924 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.applib.tree;
 
 import java.util.Iterator;
@@ -6,9 +24,8 @@ import java.util.Spliterators;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
-import org.apache.isis.applib.annotation.ViewModel;
+import javax.annotation.Nullable;
 
-@ViewModel
 public interface TreeNode<T> {
 	
 	// -- VALUE
@@ -17,7 +34,7 @@ public interface TreeNode<T> {
 	
 	// -- PARENT
 	
-	public TreeNode<T> getParentIfAny();
+	public @Nullable TreeNode<T> getParentIfAny();
 	
 	// -- CHILDREN
 	
@@ -37,8 +54,14 @@ public interface TreeNode<T> {
 
 	// -- CONSTRUCTION
 	
-	public static <T> TreeNode<T> of(T node, TreeAdapter<T> treeAdapter) {
-		return TreeNode_Lazy.of(node, treeAdapter);
+	/**
+	 * Convenient shortcut.
+	 * @param node
+	 * @param treeAdapterClass
+	 * @return new LazyTreeNode
+	 */
+	public static <T> TreeNode<T> lazy(T node, Class<? extends TreeAdapter<T>> treeAdapterClass) {
+		return LazyTreeNode.of(node, treeAdapterClass);
 	}
 	
 	// -- PARENT NODE ITERATION
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
deleted file mode 100644
index 1bc2341..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.apache.isis.applib.tree;
-
-import java.util.Objects;
-import java.util.stream.Stream;
-
-class TreeNode_Lazy<T> implements TreeNode<T> {
-	
-	private final T value;
-	private final TreeAdapter<T> treeAdapter;
-	
-	static <T> TreeNode_Lazy<T> of(T value, TreeAdapter<T> treeAdapter) {
-		Objects.requireNonNull(value);
-		Objects.requireNonNull(treeAdapter);
-		return new TreeNode_Lazy<T>(value, treeAdapter);
-	}
-
-	private TreeNode_Lazy(T value, TreeAdapter<T> treeAdapter) {
-		this.value = value;
-		this.treeAdapter = treeAdapter;
-	}
-
-	@Override
-	public T getValue() {
-		return value;
-	}
-
-	@Override
-	public TreeNode<T> getParentIfAny() {
-		return treeAdapter.parentOf(getValue())
-				.map(this::toTreeNode)
-				.orElse(null)
-				;
-	}
-
-	@Override
-	public int getChildCount() {
-		return treeAdapter.childCountOf(value);
-	}
-
-	@Override
-	public Stream<TreeNode<T>> streamChildren() {
-		if(isLeaf()) {
-			return Stream.empty();
-		}
-		return treeAdapter.childrenOf(value)
-				.map(this::toTreeNode)
-				;
-	}
-
-	// -- HELPER
-	
-	private TreeNode<T> toTreeNode(T value){
-		return of(value, treeAdapter);
-	}
-
-
-}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java
index 4f620c2..09de16a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.applib.tree;
 
 import java.util.ArrayDeque;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java
index a9f63d3..6a04120 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.applib.tree;
 
 import java.util.Iterator;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
index 9b29e2b..83300ee 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.applib.tree;
 
 import java.util.Iterator;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java
new file mode 100644
index 0000000..7e75eb9
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/tree/TreeViewModel.java
@@ -0,0 +1,27 @@
+package org.apache.isis.viewer.wicket.model.models.tree;
+
+import org.apache.isis.applib.tree.TreeNode;
+import org.apache.isis.viewer.wicket.model.models.ModelAbstract;
+
+public class TreeViewModel extends ModelAbstract<TreeNode<Object>> {
+
+	private static final long serialVersionUID = 1L;
+	
+	private TreeNode<Object> primaryNode;
+	
+	
+	public TreeNode<Object> getPrimaryNode() {
+		return primaryNode;
+	}
+
+	public void setPrimaryNode(TreeNode<Object> primaryNode) {
+		this.primaryNode = primaryNode;
+	}
+
+	@Override
+	protected TreeNode<Object> load() {
+		return primaryNode;
+	}
+	
+	
+}

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

[isis] 04/11: ISIS-898 simplify markup panel factories

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit fe0cbe7ee8029c8b40b8098b46ef67ec0112c915
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Apr 16 07:34:10 2018 +0200

    ISIS-898 simplify markup panel factories
---
 .../ComponentFactoryRegistrarDefault.java          |   8 +-
 .../scalars/markup/MarkupPanelFactories.java       | 102 ++++++++++++++++++++
 .../scalars/markup/MarkupPanelFactory.java         | 105 ---------------------
 3 files changed, 105 insertions(+), 110 deletions(-)

diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 52058f8..da812b9 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -23,7 +23,6 @@ import java.util.ServiceLoader;
 
 import org.apache.isis.applib.internal.context._Plugin;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistrar;
 import org.apache.isis.viewer.wicket.ui.components.about.AboutPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.actioninfo.ActionInfoPanelFactory;
@@ -65,7 +64,7 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath.JavaMathBigIn
 import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaDateTimePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaLocalDatePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaLocalDateTimePanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactories;
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BytePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.CharacterPanelFactory;
@@ -193,15 +192,14 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
     }
 
     protected void addComponentFactoriesForValue(final ComponentFactoryList componentFactories) {
-    	componentFactories.add(new MarkupPanelFactory(ComponentType.VALUE));
+    	componentFactories.add(MarkupPanelFactories.standalone());
         componentFactories.add(new StandaloneValuePanelFactory());
     }
 
     protected void addComponentFactoriesForScalar(final ComponentFactoryList componentFactories) {
 
         componentFactories.add(new ReferencePanelFactory());
-
-        componentFactories.add(new MarkupPanelFactory(ComponentType.SCALAR_NAME_AND_VALUE));
+        componentFactories.add(MarkupPanelFactories.parented());
         
         componentFactories.add(new BooleanPanelFactory());
         componentFactories.add(new BytePanelFactory());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactories.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactories.java
new file mode 100644
index 0000000..79e62b0
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactories.java
@@ -0,0 +1,102 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.scalars.markup;
+
+import org.apache.isis.applib.value.Markup;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+/**
+ * {@link ComponentFactory} for {@link MarkupPanel}.
+ */
+public class MarkupPanelFactories {
+	
+	// -- PARENTED
+
+	static class Parented extends ComponentFactoryAbstract {
+		private static final long serialVersionUID = 1L;
+
+		public Parented() {
+			super(ComponentType.SCALAR_NAME_AND_VALUE, MarkupPanel.class);
+		}
+		
+		@Override
+		public ApplicationAdvice appliesTo(final IModel<?> model) {
+			if (!(model instanceof ScalarModel))
+				return ApplicationAdvice.DOES_NOT_APPLY;
+
+			final ScalarModel scalarModel = (ScalarModel) model;
+
+			if(!scalarModel.isScalarTypeAnyOf(org.apache.isis.applib.value.Markup.class)) 
+				return ApplicationAdvice.DOES_NOT_APPLY;
+
+			return appliesIf( !scalarModel.hasChoices() );
+		}
+		
+		@Override
+		public final Component createComponent(final String id, final IModel<?> model) {
+			return new MarkupPanel(id, (ScalarModel) model);
+		}
+	}
+	
+	// -- STANDALONE
+
+	static class Standalone extends ComponentFactoryAbstract {
+		private static final long serialVersionUID = 1L;
+
+		public Standalone() {
+			super(ComponentType.VALUE, StandaloneMarkupPanel.class);
+		}
+		
+		@Override
+		public ApplicationAdvice appliesTo(final IModel<?> model) {
+			if (!(model instanceof ValueModel))
+				return ApplicationAdvice.DOES_NOT_APPLY;
+			final ValueModel valueModel = (ValueModel) model;
+			final ObjectAdapter adapter = valueModel.getObject();
+			if(adapter==null || adapter.getObject()==null)
+				return ApplicationAdvice.DOES_NOT_APPLY;
+
+			return appliesIf( adapter.getObject() instanceof Markup );
+		}
+		
+		@Override
+		public final Component createComponent(final String id, final IModel<?> model) {
+			return new StandaloneMarkupPanel(id, (ValueModel) model);
+		}
+	}
+
+	// -- CONSTRUCTION
+	
+	public static ComponentFactory parented() {
+		return new Parented();
+	}
+	
+	public static ComponentFactory standalone() {
+		return new Standalone();
+	}
+
+}
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java
deleted file mode 100644
index c039489..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.viewer.wicket.ui.components.scalars.markup;
-
-import org.apache.isis.applib.value.Markup;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ValueModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.wicket.Component;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.IModel;
-
-/**
- * {@link ComponentFactory} for {@link MarkupPanel}.
- */
-public class MarkupPanelFactory extends ComponentFactoryAbstract {
-
-    private static final long serialVersionUID = 1L;
-
-    public MarkupPanelFactory(ComponentType componentType) {
-        super(componentType, MarkupPanel.class);
-    }
-
-    @Override
-    public ApplicationAdvice appliesTo(final IModel<?> model) {
-    	switch (getComponentType()) {
-		case SCALAR_NAME_AND_VALUE:
-			return appliesToIfScalar(model);
-		case VALUE:
-			return appliesToIfValue(model);
-		default:
-			return ApplicationAdvice.DOES_NOT_APPLY;
-		}
-    }
-    
-    @Override
-    public final Component createComponent(final String id, final IModel<?> model) {
-    	
-    	switch (getComponentType()) {
-		case SCALAR_NAME_AND_VALUE:
-			return createComponentIfScalar(id, model);
-		case VALUE:
-			return createComponentIfValue(id, model);
-		default:
-			return new Label(id, "MarkupPanelFactory.createComponent: case not handled '"+getComponentType()+"'");
-		}
-    }
-    
-    // -- VARIANTS OF APPLIES TO
-    
-	private ApplicationAdvice appliesToIfScalar(IModel<?> model) {
-		if (!(model instanceof ScalarModel))
-            return ApplicationAdvice.DOES_NOT_APPLY;
-        
-        final ScalarModel scalarModel = (ScalarModel) model;
-        
-        if(!scalarModel.isScalarTypeAnyOf(org.apache.isis.applib.value.Markup.class)) 
-            return ApplicationAdvice.DOES_NOT_APPLY;
-
-        return appliesIf( !scalarModel.hasChoices() );
-	}
-	
-    private ApplicationAdvice appliesToIfValue(IModel<?> model) {
-    	if (!(model instanceof ValueModel))
-            return ApplicationAdvice.DOES_NOT_APPLY;
-    	final ValueModel valueModel = (ValueModel) model;
-    	final ObjectAdapter adapter = valueModel.getObject();
-    	if(adapter==null || adapter.getObject()==null)
-    		return ApplicationAdvice.DOES_NOT_APPLY;
-    	
-    	return appliesIf( adapter.getObject() instanceof Markup );
-	}
-
-    // -- VARIANTS OF CREATE COMPONENT
-    
-    private final Component createComponentIfScalar(final String id, final IModel<?> model) {
-        return new MarkupPanel(id, (ScalarModel) model);
-    }
-    
-    private final Component createComponentIfValue(final String id, final IModel<?> model) {
-        return new StandaloneMarkupPanel(id, (ValueModel) model);
-    }
-    
-
-}

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

[isis] 05/11: ISIS-898 adds missing license head

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 275252ba496d9e35241bff6aa0a2b4eae32df8f3
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Apr 16 07:35:19 2018 +0200

    ISIS-898 adds missing license head
---
 .../apache/isis/applib/internal/base/_Reduction.java  |  5 ++++-
 .../apache/isis/viewer/wicket/model/models/Util.java  | 19 +++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Reduction.java b/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Reduction.java
index b915938..a65aef1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Reduction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/base/_Reduction.java
@@ -11,7 +11,10 @@ import javax.annotation.Nullable;
 /**
  * <h1>- internal use only -</h1>
  * <p>
- *  Provides a generic reduction class. Most intuitive example of a reduction is finding the 
+ *  Provides a generic (left-fold) reduction class. 
+ *  </p>
+ *  <p>
+ *  Most intuitive example of a reduction is finding the 
  *  minimum value from a list of values. See {@link ReductionTest} for examples.
  * </p>
  * <p>
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/Util.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/Util.java
index ce0c86b..52de9fc 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/Util.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/Util.java
@@ -1,3 +1,22 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
 package org.apache.isis.viewer.wicket.model.models;
 
 import java.util.Optional;

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

[isis] 01/11: ISIS-898 applib: introduces initial tree model

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch dev/2.0.0/ISIS-898-treeview
in repository https://gitbox.apache.org/repos/asf/isis.git

commit d337130decc55615a92e7272b5c0100fe6d36bac
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Apr 14 09:13:34 2018 +0200

    ISIS-898 applib: introduces initial tree model
---
 .../org/apache/isis/applib/tree/TreeAdapter.java   | 14 ++++
 .../java/org/apache/isis/applib/tree/TreeNode.java | 80 ++++++++++++++++++++++
 .../org/apache/isis/applib/tree/TreeNode_Lazy.java | 57 +++++++++++++++
 .../applib/tree/TreeNode_iteratorBreadthFirst.java | 42 ++++++++++++
 .../applib/tree/TreeNode_iteratorDepthFirst.java   | 53 ++++++++++++++
 .../applib/tree/TreeNode_iteratorHierarchyUp.java  | 35 ++++++++++
 6 files changed, 281 insertions(+)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java
new file mode 100644
index 0000000..5c39b59
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeAdapter.java
@@ -0,0 +1,14 @@
+package org.apache.isis.applib.tree;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+public interface TreeAdapter<T> {
+
+	public Optional<T> parentOf(T value);
+	
+	public int childCountOf(T value);
+	
+	public Stream<T> childrenOf(T value);
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
new file mode 100644
index 0000000..f8f6fc4
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
@@ -0,0 +1,80 @@
+package org.apache.isis.applib.tree;
+
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+public interface TreeNode<T> {
+	
+	// -- VALUE
+	
+	public T getValue();
+	
+	// -- PARENT
+	
+	public Optional<TreeNode<T>> getParent();
+	
+	// -- CHILDREN
+	
+	public int getChildCount();
+
+	public Stream<TreeNode<T>> streamChildren();
+	
+	// -- BASIC PREDICATES
+	
+	public default boolean isRoot() {
+		return !getParent().isPresent();
+	}
+	
+	public default boolean isLeaf() {
+		return getChildCount() == 0;
+	}
+
+	// -- CONSTRUCTION
+	
+	public static <T> TreeNode<T> of(T node, TreeAdapter<T> treeAdapter) {
+		return TreeNode_Lazy.of(node, treeAdapter);
+	}
+	
+	// -- PARENT NODE ITERATION
+	
+	public default Iterator<TreeNode<T>> iteratorHierarchyUp(){
+		return new TreeNode_iteratorHierarchyUp<>(this);
+	}
+	
+	// -- PARENT NODE STREAMING
+	
+	public default Stream<TreeNode<T>> streamHierarchyUp(){
+		return StreamSupport.stream(
+				Spliterators.spliteratorUnknownSize(iteratorHierarchyUp(), Spliterator.ORDERED), 
+				false); // not parallel
+	}
+	
+	// -- CHILD NODE ITERATION
+	
+	public default Iterator<TreeNode<T>> iteratorDepthFirst(){
+		return new TreeNode_iteratorDepthFirst<>(this);
+	}
+	
+	public default Iterator<TreeNode<T>> iteratorBreadthFirst(){
+		return new TreeNode_iteratorBreadthFirst<>(this);
+	}
+	
+	// -- CHILD NODE STREAMING
+	
+	public default Stream<TreeNode<T>> streamDepthFirst(){
+		return StreamSupport.stream(
+				Spliterators.spliteratorUnknownSize(iteratorDepthFirst(), Spliterator.ORDERED), 
+				false); // not parallel
+	}
+	
+	public default Stream<TreeNode<T>> streamBreadthFirst(){
+		return StreamSupport.stream(
+				Spliterators.spliteratorUnknownSize(iteratorBreadthFirst(), Spliterator.ORDERED), 
+				false); // not parallel
+	}
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
new file mode 100644
index 0000000..83cd503
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_Lazy.java
@@ -0,0 +1,57 @@
+package org.apache.isis.applib.tree;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+class TreeNode_Lazy<T> implements TreeNode<T> {
+	
+	private final T value;
+	private final TreeAdapter<T> treeAdapter;
+	
+	static <T> TreeNode_Lazy<T> of(T value, TreeAdapter<T> treeAdapter) {
+		Objects.requireNonNull(value);
+		Objects.requireNonNull(treeAdapter);
+		return new TreeNode_Lazy<T>(value, treeAdapter);
+	}
+
+	private TreeNode_Lazy(T value, TreeAdapter<T> treeAdapter) {
+		this.value = value;
+		this.treeAdapter = treeAdapter;
+	}
+
+	@Override
+	public T getValue() {
+		return value;
+	}
+
+	@Override
+	public Optional<TreeNode<T>> getParent() {
+		return treeAdapter.parentOf(getValue())
+				.map(this::toTreeNode)
+				;
+	}
+
+	@Override
+	public int getChildCount() {
+		return treeAdapter.childCountOf(value);
+	}
+
+	@Override
+	public Stream<TreeNode<T>> streamChildren() {
+		if(isLeaf()) {
+			return Stream.empty();
+		}
+		return treeAdapter.childrenOf(value)
+				.map(this::toTreeNode)
+				;
+	}
+
+	// -- HELPER
+	
+	private TreeNode<T> toTreeNode(T value){
+		return of(value, treeAdapter);
+	}
+
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java
new file mode 100644
index 0000000..4f620c2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorBreadthFirst.java
@@ -0,0 +1,42 @@
+package org.apache.isis.applib.tree;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+class TreeNode_iteratorBreadthFirst<T> implements Iterator<TreeNode<T>> {
+
+	private Deque<TreeNode<T>> deque = new ArrayDeque<>();
+	private TreeNode<T> next;
+
+	TreeNode_iteratorBreadthFirst(TreeNode<T> treeNode) {
+		next = treeNode;
+	}
+
+	@Override
+	public boolean hasNext() {
+		return next!=null;
+	}
+
+	@Override
+	public TreeNode<T> next() {
+		if(next==null) {
+			throw new NoSuchElementException("Iterator has run out of elements.");
+		}
+		final TreeNode<T> result = next; 
+		next = fetchNext(next);		
+		return result;
+	}
+	
+	// -- HELPER
+
+	private TreeNode<T> fetchNext(TreeNode<T> current) {
+		if(!current.isLeaf()) {
+			current.streamChildren()
+			.forEach(deque::offerLast);
+		}
+		return deque.pollFirst();
+	}
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java
new file mode 100644
index 0000000..a9f63d3
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorDepthFirst.java
@@ -0,0 +1,53 @@
+package org.apache.isis.applib.tree;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Stack;
+
+class TreeNode_iteratorDepthFirst<T> implements Iterator<TreeNode<T>> {
+
+	private Stack<TreeNode<T>> stack = new Stack<>();
+	private TreeNode<T> next;
+
+	TreeNode_iteratorDepthFirst(TreeNode<T> treeNode) {
+		next = treeNode;
+	}
+
+	@Override
+	public boolean hasNext() {
+		return next!=null;
+	}
+
+	@Override
+	public TreeNode<T> next() {
+		if(next==null) {
+			throw new NoSuchElementException("Iterator has run out of elements.");
+		}
+		final TreeNode<T> result = next; 
+		next = fetchNext(next);		
+		return result;
+	}
+	
+	// -- HELPER
+
+	private TreeNode<T> fetchNext(TreeNode<T> current) {
+		if(!current.isLeaf()) {
+			pushChildrenToStackInReverseOrder(current);
+		}
+		return stack.isEmpty() ? null : stack.pop();
+	}
+
+	private Stack<TreeNode<T>> fifo = new Stack<>(); // declared as field only to reduce heap pollution
+	
+	private void pushChildrenToStackInReverseOrder(TreeNode<T> node) {
+		
+		node.streamChildren()
+		.forEach(fifo::push);
+		
+		while(!fifo.isEmpty()) {
+			stack.push(fifo.pop());
+		}
+	}
+	
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
new file mode 100644
index 0000000..62813b2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/tree/TreeNode_iteratorHierarchyUp.java
@@ -0,0 +1,35 @@
+package org.apache.isis.applib.tree;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+class TreeNode_iteratorHierarchyUp<T> implements Iterator<TreeNode<T>> {
+
+	private TreeNode<T> next;
+
+	TreeNode_iteratorHierarchyUp(TreeNode<T> treeNode) {
+		next = treeNode;
+	}
+
+	@Override
+	public boolean hasNext() {
+		return next!=null;
+	}
+
+	@Override
+	public TreeNode<T> next() {
+		if(next==null) {
+			throw new NoSuchElementException("Iterator has run out of elements.");
+		}
+		final TreeNode<T> result = next; 
+		next = fetchNext(next);		
+		return result;
+	}
+	
+	// -- HELPER
+
+	private TreeNode<T> fetchNext(TreeNode<T> current) {
+		return current.getParent().orElse(null);
+	}
+
+}

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