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/05/04 12:24:51 UTC

[isis] branch master updated (9a51b98 -> 318c156)

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

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


    from 9a51b98  ISIS-1940 let the SortedSet-of-list adapter return a comparator=null
     new dfe84e1  ISIS-898: hardcode AjaxFallbackLink to be enabled in hierarchy
     new 5b92468  ISIS-1841: IsisContext: adds shortcuts for convenience
     new 318c156  ISIS-898: completes proof of concept

The 3 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.


Summary of changes:
 .../core/integtestsupport/IsisSystemForTest.java   |   2 +-
 .../runtime/headless/IsisSystemBootstrapper.java   |   2 +-
 .../core/runtime/system/context/IsisContext.java   |  45 ++++++--
 .../components/tree/IsisToWicketTreeAdapter.java   | 123 ++++++++++++++++++---
 4 files changed, 146 insertions(+), 26 deletions(-)

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

[isis] 03/03: ISIS-898: completes proof of concept

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

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

commit 318c15612abc5c3c50f4cdff0ee0dfbc732779a6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 4 14:24:14 2018 +0200

    ISIS-898: completes proof of concept
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-898
---
 .../components/tree/IsisToWicketTreeAdapter.java   | 85 ++++++++++++++--------
 1 file changed, 56 insertions(+), 29 deletions(-)

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
index 020d4ef..222623e 100644
--- 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
@@ -2,16 +2,18 @@ package org.apache.isis.viewer.wicket.ui.components.tree;
 
 import java.io.Serializable;
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import javax.resource.spi.IllegalStateException;
+
 import org.apache.isis.applib.internal.collections._Lists;
-import org.apache.isis.applib.internal.exceptions._Exceptions;
 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.metamodel.adapter.oid.RootOid;
 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;
@@ -52,9 +54,6 @@ class IsisToWicketTreeAdapter {
 		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
-			
-			super.setEnabled(true);
-			super.setVisible(true);
 		}
 		
 		/**
@@ -72,10 +71,10 @@ class IsisToWicketTreeAdapter {
 		 */
 		@Override
 		public Component newNodeComponent(String id, IModel<EntityModel> model) {
-			return new Node<EntityModel>(id, this, model)
-			{
+			
+			final Node<EntityModel> node =  new Node<EntityModel>(id, this, model) {
 				private static final long serialVersionUID = 1L;
-
+				
 				@Override
 				protected Component createContent(String id, IModel<EntityModel> model) {
 					return EntityTree.this.newContentComponent(id, model);
@@ -84,43 +83,51 @@ class IsisToWicketTreeAdapter {
 				@Override
 				protected MarkupContainer createJunctionComponent(String id) {
 					
-					final Node<EntityModel> self = this;
+					final Node<EntityModel> node = this;
+					final Runnable toggleExpandCollapse = (Runnable & Serializable) this::toggle;
 					
 					return new AjaxFallbackLink<Void>(id) {
 						private static final long serialVersionUID = 1L;
 						
 						@Override
 						public void onClick(AjaxRequestTarget target) {
-							toggle();
+							System.out.println("!!! before toggle");
+							toggleExpandCollapse.run();
+							System.out.println("!!! after toggle");
 						}
 
 						@Override
 						public boolean isEnabled() {
-							return EntityTree.this.getProvider().hasChildren(self.getModelObject());
+							return EntityTree.this.getProvider().hasChildren(node.getModelObject());
 						}
 						
 						@Override
 						public boolean isEnabledInHierarchy() {
-							return true;
+							return true; // hardcoded -> true
 						}
 						
 					};
 				}
+				
 			};
+			
+			node.setOutputMarkupId(true);
+			
+			return node;
+			
 		}
-
 		
 	}
 	
 	// -- HELPER
 	
-	private static class EntitiyModelTreeAdapter implements TreeAdapter<EntityModel>, Serializable {
+	private static class EntityModelTreeAdapter 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) {
+		private EntityModelTreeAdapter(Class<? extends TreeAdapter> treeAdapterClass) {
 			this.treeAdapterClass = treeAdapterClass;
 		}
 		
@@ -172,7 +179,7 @@ class IsisToWicketTreeAdapter {
 		}
 		
 		private PersistenceSession persistenceSession() {
-			return IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession();
+			return IsisContext.getPersistenceSession().orElse(null);
 		}
 		
 	}
@@ -185,9 +192,9 @@ class IsisToWicketTreeAdapter {
 		private static final long serialVersionUID = 1L;
 		
 		private final EntityModel primaryValue;
-		private final EntitiyModelTreeAdapter treeAdapter;
+		private final EntityModelTreeAdapter treeAdapter;
 
-		private EntityModelTreeProvider(EntityModel primaryValue, EntitiyModelTreeAdapter treeAdapter) {
+		private EntityModelTreeProvider(EntityModel primaryValue, EntityModelTreeAdapter treeAdapter) {
 			this.primaryValue = primaryValue;
 			this.treeAdapter = treeAdapter;
 		}
@@ -225,7 +232,7 @@ class IsisToWicketTreeAdapter {
 	private static ITreeProvider<EntityModel> toITreeProvider(ModelAbstract<ObjectAdapter> model) {
 		
 		final TreeNode tree = (TreeNode) model.getObject().getObject();
-		final EntitiyModelTreeAdapter wrappingTreeAdapter = new EntitiyModelTreeAdapter(tree.getTreeAdapterClass());
+		final EntityModelTreeAdapter wrappingTreeAdapter = new EntityModelTreeAdapter(tree.getTreeAdapterClass());
 		
 		return new EntityModelTreeProvider(wrappingTreeAdapter.wrap(tree.getValue()), wrappingTreeAdapter);		
 	}
@@ -233,33 +240,53 @@ class IsisToWicketTreeAdapter {
 	private static class LoadableDetachableEntityModel extends LoadableDetachableModel<EntityModel> {
 		private static final long serialVersionUID = 1L;
 
-		private final Oid id;
+		private final RootOid id;
 
 		public LoadableDetachableEntityModel(EntityModel eModel) {
 			super(eModel);
-
-			id = eModel.getObject().getOid();
+			id = (RootOid) eModel.getObject().getOid();
 		}
 
+		/*
+		 * loads EntityModel using Oid (id)
+		 */
 		@Override
 		protected EntityModel load() {
-			//FIXME load EntityModel by id
-			throw _Exceptions.notImplemented();
+			
+			final PersistenceSession persistenceSession = IsisContext.getPersistenceSession()
+					.orElseThrow(()->new RuntimeException(new IllegalStateException(
+							String.format("Tree creation: missing a PersistenceSession to recreate EntityModel "
+									+ "from Oid: '%s'", id)))
+					);
+			
+			final ObjectAdapter objAdapter = persistenceSession.adapterFor(id);
+			if(objAdapter==null) {
+				throw new NoSuchElementException(
+						String.format("Tree creation: could not recreate EntityModel from Oid: '%s'", id)); 
+			}
+			
+			final Object pojo = objAdapter.getObject();
+			if(pojo==null) {
+				throw new NoSuchElementException(
+						String.format("Tree creation: could not recreate Pojo from Oid: '%s'", id)); 
+			}
+			
+			return new EntityModel(objAdapter);
 		}
 
-		/**
+		/*
 		 * Important! Models must be identifiable by their contained object.
 		 */
 		@Override
 		public boolean equals(Object obj) {
-			if (obj instanceof EntityModel) {
-				final EntityModel other = (EntityModel) obj;
-				return other.getObject().getOid().equals(id);
+			if (obj instanceof LoadableDetachableEntityModel) {
+				final LoadableDetachableEntityModel other = (LoadableDetachableEntityModel) obj;
+				return id.equals(other.id);
 			}
 			return false;
 		}
 
-		/**
+		/*
 		 * Important! Models must be identifiable by their contained object.
 		 */
 		@Override

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

[isis] 02/03: ISIS-1841: IsisContext: adds shortcuts for convenience

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

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

commit 5b92468d60dbdfe6c9c3a837b10f50484642d75f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 4 12:34:51 2018 +0200

    ISIS-1841: IsisContext: adds shortcuts for convenience
    
    also removes deprecated testReset()
---
 .../core/integtestsupport/IsisSystemForTest.java   |  2 +-
 .../runtime/headless/IsisSystemBootstrapper.java   |  2 +-
 .../core/runtime/system/context/IsisContext.java   | 45 ++++++++++++++++++----
 3 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index 1149542..c2fef4d 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -327,7 +327,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
 
                 // for subsequent tests; the attempt to bootstrap the framework will leave
                 // the IsisContext singleton as set.
-                IsisContext.testReset();
+                IsisContext.clear();
 
                 final Set<String> validationErrors = ex.getValidationErrors();
                 final StringBuilder buf = new StringBuilder();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
index b167b51..e587ec5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/headless/IsisSystemBootstrapper.java
@@ -187,7 +187,7 @@ public class IsisSystemBootstrapper {
         isisSessionFactory.destroyServicesAndShutdown();
         pmf.close();
 
-        IsisContext.testReset();
+        IsisContext.clear();
     }
 
     public void tearDownAllModules() {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
index 9763ff5..3e4bf99 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java
@@ -19,8 +19,15 @@
 
 package org.apache.isis.core.runtime.system.context;
 
+import java.util.Optional;
+
 import org.apache.isis.applib.internal.context._Context;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
 /**
@@ -40,6 +47,7 @@ public interface IsisContext {
 	/**
 	 * 
 	 * @return Isis's session factory
+	 * @throws IllegalStateException if IsisSessionFactory not initialized
 	 */
 	// Implementation Note: Populated only by {@link IsisSessionFactoryBuilder}.
 	public static IsisSessionFactory getSessionFactory() {
@@ -68,16 +76,39 @@ public interface IsisContext {
     	resetLogging();
     }
     
-    // -- DEPRECATIONS
+    // -- CONVENIENT SHORTCUTS
     
     /**
-     * Resets
-     * @deprecated replaced by {@link #clear()}
-     * 
+     * @return framework's current PersistenceSession (if any)
+     * @throws IllegalStateException if IsisSessionFactory not initialized
+     */
+    public static Optional<PersistenceSession> getPersistenceSession() {
+        return Optional.ofNullable(getSessionFactory().getCurrentSession())
+        		.map(IsisSession::getPersistenceSession);
+    }
+    
+    /**
+     * @return framework's IsisConfiguration
+     * @throws IllegalStateException if IsisSessionFactory not initialized
+     */
+    public static IsisConfiguration getConfiguration() {
+        return getSessionFactory().getConfiguration();
+    }
+
+    /**
+     * @return framework's SpecificationLoader
+     * @throws IllegalStateException if IsisSessionFactory not initialized
+     */
+    public static SpecificationLoader getSpecificationLoader() {
+        return getSessionFactory().getSpecificationLoader();
+    }
+
+    /**
+     * @return framework's ServicesInjector
+     * @throws IllegalStateException if IsisSessionFactory not initialized
      */
-    @Deprecated
-    public static void testReset() {
-    	clear();
+    public static ServicesInjector getServicesInjector() {
+        return getSessionFactory().getServicesInjector();
     }
 
 	// -- HELPER

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

[isis] 01/03: ISIS-898: hardcode AjaxFallbackLink to be enabled in hierarchy

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

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

commit dfe84e10c740cfadb19fe6bb68f6b15248227d43
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 4 11:56:18 2018 +0200

    ISIS-898: hardcode AjaxFallbackLink to be enabled in hierarchy
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-898
---
 .../components/tree/IsisToWicketTreeAdapter.java   | 70 ++++++++++++++++++++--
 1 file changed, 66 insertions(+), 4 deletions(-)

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
index 021d447..020d4ef 100644
--- 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
@@ -7,6 +7,7 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.internal.collections._Lists;
+import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.tree.TreeAdapter;
 import org.apache.isis.applib.tree.TreeNode;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -19,8 +20,12 @@ 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.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
 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.Node;
 import org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
@@ -37,6 +42,9 @@ class IsisToWicketTreeAdapter {
 	
 	// -- RENDERING
 	
+	/**
+	 * Wicket's Tree Component implemented for Isis
+	 */
 	private static class EntityTree extends NestedTree<EntityModel> {
 
 		private static final long serialVersionUID = 1L;
@@ -44,6 +52,9 @@ class IsisToWicketTreeAdapter {
 		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
+			
+			super.setEnabled(true);
+			super.setVisible(true);
 		}
 		
 		/**
@@ -52,7 +63,50 @@ class IsisToWicketTreeAdapter {
 		@Override
 		protected Component newContentComponent(String id, IModel<EntityModel> node) {
 			final EntityModel entityModel = node.getObject();
-			return new EntityIconAndTitlePanel(id, entityModel);
+			final Component entityIconAndTitle = new EntityIconAndTitlePanel(id, entityModel);
+			return entityIconAndTitle;
+		}
+		
+		/**
+		 * To hardcode Node's <pre>AjaxFallbackLink.isEnabledInHierarchy()->true</pre> we override this method.
+		 */
+		@Override
+		public Component newNodeComponent(String id, IModel<EntityModel> model) {
+			return new Node<EntityModel>(id, this, model)
+			{
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected Component createContent(String id, IModel<EntityModel> model) {
+					return EntityTree.this.newContentComponent(id, model);
+				}
+				
+				@Override
+				protected MarkupContainer createJunctionComponent(String id) {
+					
+					final Node<EntityModel> self = this;
+					
+					return new AjaxFallbackLink<Void>(id) {
+						private static final long serialVersionUID = 1L;
+						
+						@Override
+						public void onClick(AjaxRequestTarget target) {
+							toggle();
+						}
+
+						@Override
+						public boolean isEnabled() {
+							return EntityTree.this.getProvider().hasChildren(self.getModelObject());
+						}
+						
+						@Override
+						public boolean isEnabledInHierarchy() {
+							return true;
+						}
+						
+					};
+				}
+			};
 		}
 
 		
@@ -123,7 +177,9 @@ class IsisToWicketTreeAdapter {
 		
 	}
 
-	
+	/**
+	 * Wicket's ITreeProvider implemented for Isis
+	 */
 	private static class EntityModelTreeProvider implements ITreeProvider<EntityModel> {
 
 		private static final long serialVersionUID = 1L;
@@ -162,6 +218,10 @@ class IsisToWicketTreeAdapter {
 		
 	}
 	
+	/**
+	 * @param model
+	 * @return Wicket's ITreeProvider
+	 */
 	private static ITreeProvider<EntityModel> toITreeProvider(ModelAbstract<ObjectAdapter> model) {
 		
 		final TreeNode tree = (TreeNode) model.getObject().getObject();
@@ -183,7 +243,8 @@ class IsisToWicketTreeAdapter {
 
 		@Override
 		protected EntityModel load() {
-			return null; //TODO [ahuber] load model by id, possibly not required
+			//FIXME load EntityModel by id
+			throw _Exceptions.notImplemented();
 		}
 
 		/**
@@ -192,7 +253,8 @@ class IsisToWicketTreeAdapter {
 		@Override
 		public boolean equals(Object obj) {
 			if (obj instanceof EntityModel) {
-				return ((EntityModel) obj).getObject().getOid().equals(id);
+				final EntityModel other = (EntityModel) obj;
+				return other.getObject().getOid().equals(id);
 			}
 			return false;
 		}

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