You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/02/10 22:46:20 UTC

[13/13] isis git commit: ISIS-993: GridFacetDefault now derives a grid from facets if no XML is available.

ISIS-993: GridFacetDefault now derives a grid from facets if no XML is available.

This design probably means that a lot of the existing "fixedcol" code could be removed; in effect we always render using BS3.  Will leave in for the moment, though.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/959d4247
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/959d4247
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/959d4247

Branch: refs/heads/ISIS-993
Commit: 959d42477b4aefa383c562f166a91be630e3f3eb
Parents: 4104039
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Feb 10 21:23:47 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Feb 10 21:23:47 2016 +0000

----------------------------------------------------------------------
 .../applib/layout/grid/bootstrap3/BS3Col.java   |  3 +-
 .../facets/object/grid/GridFacetDefault.java    | 98 ++++++++++++++++++--
 .../json/LayoutMetadataReaderFromJson.java      |  4 +-
 .../services/grid/GridServiceDefault.java       |  6 +-
 .../services/metamodel/MetadataMenu.java        |  3 +-
 core/pom.xml                                    |  2 +
 .../ui/components/layout/bs3/col/Col.java       |  5 +
 .../dom/simple/SimpleObject.layout.xml          |  6 ++
 8 files changed, 112 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/applib/src/main/java/org/apache/isis/applib/layout/grid/bootstrap3/BS3Col.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/grid/bootstrap3/BS3Col.java b/core/applib/src/main/java/org/apache/isis/applib/layout/grid/bootstrap3/BS3Col.java
index bc289d8..2b33287 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/grid/bootstrap3/BS3Col.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/grid/bootstrap3/BS3Col.java
@@ -247,11 +247,10 @@ public class BS3Col extends BS3RowContent
         return "col-" + size.toCssClassFragment() + "-" + getSpan();
     }
 
-
     @Override public String toString() {
         return "BS3Col{" +
                 "id='" + id + '\'' +
+                ", span=" + span +
                 '}';
     }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
index 69ada55..b4329db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
@@ -18,16 +18,29 @@
  */
 package org.apache.isis.core.metamodel.facets.object.grid;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.annotation.MemberGroupLayout;
+import org.apache.isis.applib.layout.component.CollectionLayoutData;
+import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
+import org.apache.isis.applib.layout.component.FieldSet;
 import org.apache.isis.applib.layout.component.Grid;
+import org.apache.isis.applib.layout.grid.bootstrap3.BS3Col;
+import org.apache.isis.applib.layout.grid.bootstrap3.BS3Grid;
+import org.apache.isis.applib.layout.grid.bootstrap3.BS3Row;
 import org.apache.isis.applib.services.layout.GridService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
 public class GridFacetDefault
             extends FacetAbstract
@@ -52,7 +65,6 @@ public class GridFacetDefault
     private final GridService gridService;
 
     private Grid grid;
-    private boolean blacklisted;
 
     private GridFacetDefault(
             final FacetHolder facetHolder,
@@ -63,22 +75,91 @@ public class GridFacetDefault
         this.deploymentCategory = deploymentCategory;
     }
 
-    /**
-     * Blacklisting only occurs if running in production mode.
-     */
     public Grid getGrid() {
-        if (deploymentCategory.isProduction() || blacklisted) {
+        if (deploymentCategory.isProduction() && this.grid != null) {
             return this.grid;
         }
         final Class<?> domainClass = getSpecification().getCorrespondingClass();
-        final Grid grid = gridService.fromXml(domainClass);
-        if(deploymentCategory.isProduction() && grid == null) {
-            blacklisted = true;
+        Grid grid = gridService.fromXml(domainClass);
+        if(grid == null) {
+            grid = deriveGrid();
         }
+
         this.grid = normalize(grid);
         return this.grid;
     }
 
+    private Grid deriveGrid() {
+        final BS3Grid bs3Grid = new BS3Grid();
+        bs3Grid.setDomainClass(getSpecification().getCorrespondingClass());
+
+        final BS3Row headerRow = new BS3Row();
+        bs3Grid.getRows().add(headerRow);
+        final BS3Col headerRowCol = new BS3Col();
+        headerRowCol.setSpan(12);
+        headerRowCol.setUnreferencedActions(true);
+        headerRowCol.setDomainObject(new DomainObjectLayoutData());
+        headerRow.getCols().add(headerRowCol);
+
+        final BS3Row propsRow = new BS3Row();
+        bs3Grid.getRows().add(propsRow);
+
+        final MemberGroupLayoutFacet memberGroupLayoutFacet =
+                getSpecification().getFacet(MemberGroupLayoutFacet.class);
+        if(memberGroupLayoutFacet != null) {
+            // if have @MemberGroupLayout (or equally, a .layout.json file)
+            final MemberGroupLayout.ColumnSpans columnSpans = memberGroupLayoutFacet.getColumnSpans();
+            addFieldSetsToColumn(propsRow, columnSpans.getLeft(), memberGroupLayoutFacet.getLeft(), true);
+            addFieldSetsToColumn(propsRow, columnSpans.getMiddle(), memberGroupLayoutFacet.getMiddle(), false);
+            addFieldSetsToColumn(propsRow, columnSpans.getRight(), memberGroupLayoutFacet.getRight(), false);
+
+            final BS3Col col = new BS3Col();
+            final int collectionSpan = columnSpans.getCollections();
+            col.setUnreferencedCollections(true);
+            col.setSpan(collectionSpan > 0? collectionSpan: 12);
+            propsRow.getCols().add(col);
+
+            // will already be sorted per @MemberOrder
+            final List<OneToManyAssociation> collections = getSpecification().getCollections(Contributed.INCLUDED);
+            for (OneToManyAssociation collection : collections) {
+                col.getCollections().add(new CollectionLayoutData(collection.getId()));
+            }
+        } else {
+
+            // if no layout hints other than @MemberOrder
+            addFieldSetsToColumn(propsRow, 4, Arrays.asList("General"), true);
+
+            final BS3Col col = new BS3Col();
+            col.setUnreferencedCollections(true);
+            col.setSpan(12);
+            propsRow.getCols().add(col);
+        }
+        return bs3Grid;
+    }
+
+    void addFieldSetsToColumn(
+            final BS3Row propsRow,
+            final int span,
+            final List<String> memberGroupNames,
+            final boolean unreferencedProperties) {
+
+        if(span > 0 || unreferencedProperties) {
+            final BS3Col col = new BS3Col();
+            col.setSpan(span); // in case we are here because of 'unreferencedProperties' needs setting
+            propsRow.getCols().add(col);
+            final List<String> leftMemberGroups = memberGroupNames;
+            for (String memberGroup : leftMemberGroups) {
+                final FieldSet fieldSet = new FieldSet(memberGroup);
+                if(unreferencedProperties && col.getFieldSets().isEmpty()) {
+                    fieldSet.setUnreferencedProperties(true);
+                }
+                col.getFieldSets().add(fieldSet);
+            }
+        }
+    }
+
+
+
     private Grid normalize(final Grid grid) {
         if(grid == null) {
             return null;
@@ -88,6 +169,7 @@ public class GridFacetDefault
         return gridService.normalize(grid);
     }
 
+
     private ObjectSpecification getSpecification() {
         return (ObjectSpecification) getFacetHolder();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index 05b84fc..59cdb77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -415,7 +415,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader2, Serv
         }
 
         try {
-            final GridService gridService = getObjectLayoutMetadataService();
+            final GridService gridService = getGridService();
             if(gridService.exists(domainClass)) {
                 blacklisted.add(domainClass);
                 return null;
@@ -699,7 +699,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader2, Serv
 
 
 
-    private GridService getObjectLayoutMetadataService() {
+    private GridService getGridService() {
         return servicesInjector.lookupService(GridService.class);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index 6da6da7..e9dc2b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@ -41,13 +41,14 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.layout.GridNormalizerService;
 import org.apache.isis.applib.layout.component.Grid;
 import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.applib.services.layout.GridNormalizerService;
 import org.apache.isis.applib.services.layout.GridService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryAware;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
+import org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
@@ -69,6 +70,8 @@ public class GridServiceDefault
     // cache (used only in prototyping mode)
     private final Map<String, Grid> pageByXml = Maps.newHashMap();
 
+    private LayoutMetadataReaderFromJson layoutMetadataReaderFromJson = new LayoutMetadataReaderFromJson();
+
     @Override
     @Programmatic
     public boolean exists(final Class<?> domainClass) {
@@ -94,7 +97,6 @@ public class GridServiceDefault
             return null;
         }
 
-
         if(!deploymentCategory.isProduction()) {
             final Grid grid = pageByXml.get(xml);
             if(grid != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
index e5f469b..2872f1e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java
@@ -88,7 +88,8 @@ public class MetadataMenu implements SpecificationLoaderSpiAware {
             restrictTo = RestrictTo.PROTOTYPING
     )
     @ActionLayout(
-            cssClassFa = "fa-download"
+            cssClassFa = "fa-download",
+            named = "Download Layouts (XML)"
     )
     @MemberOrder(sequence="500.400.1")
     public Blob downloadLayouts(final GridService.Style style) {

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 3734a80..0f609dd 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -96,6 +96,8 @@
 	    ISIS-1288: seen integration tests to fail;
 	    domain object date holding 1-Aug-2015 after xactn retrieved as 31-Jul-2015
 
+        https://github.com/datanucleus/datanucleus-jodatime/commit/b85795a1bf5f92909a95d2c8f8822bba2ba38b5f
+
         <datanucleus-jodatime.version>4.1.1</datanucleus-jodatime.version>
 	-->
         <datanucleus-maven-plugin.version>4.0.2</datanucleus-maven-plugin.version>

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
index 93198b2..057ea4b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
@@ -86,6 +86,11 @@ public class Col extends PanelAbstract<EntityModel> {
 
         setRenderBodyOnly(true);
 
+        if(bs3Col.getSpan() == 0) {
+            Components.permanentlyHide(this, ID_COL);
+            return;
+        }
+
         final WebMarkupContainer div = new WebMarkupContainer(ID_COL);
 
         CssClassAppender.appendCssClassTo(div, bs3Col.toCssClass());

http://git-wip-us.apache.org/repos/asf/isis/blob/959d4247/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
index 47529e2..5072933 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
@@ -15,6 +15,12 @@
                             <c:fieldSet name="Properties">
                                 <c:property id="name"/>
                             </c:fieldSet>
+                        </bs3:col>
+                    </bs3:row>
+                </bs3:tab>
+                <bs3:tab name="Misc">
+                    <bs3:row>
+                        <bs3:col span="12">
                             <c:fieldSet name="Misc">
                                 <c:property id="versionSequence"/>
                             </c:fieldSet>