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/01/25 16:07:33 UTC

[12/50] [abbrv] isis git commit: ISIS-993: working on the fleshing out stuff (to default missing layout metadata)

ISIS-993: working on the fleshing out stuff (to default missing layout metadata)


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

Branch: refs/heads/ISIS-993
Commit: c93071b43c2137de44f49f2c628bb69b62f51270
Parents: 017fab9
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 6 21:21:19 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Jan 25 15:06:07 2016 +0000

----------------------------------------------------------------------
 .../isis/applib/layout/v1_0/ActionHolder.java   |  25 +++++
 .../isis/applib/layout/v1_0/Collection.java     |   2 +-
 .../isis/applib/layout/v1_0/DomainObject.java   | 109 ++++++++++++++++++-
 .../isis/applib/layout/v1_0/Property.java       |   2 +-
 .../isis/applib/layout/v1_0/PropertyGroup.java  |   2 +-
 .../object/layoutxml/LayoutXmlFacetDefault.java |  57 ++++++++--
 .../metamodel/spec/feature/ObjectAction.java    |   5 +-
 .../metamodel/spec/feature/ObjectMember.java    |  31 ++++++
 8 files changed, 219 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java
new file mode 100644
index 0000000..bac4ebb
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java
@@ -0,0 +1,25 @@
+/*
+ *  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.layout.v1_0;
+
+import java.util.List;
+
+public interface ActionHolder {
+    List<Action> getActions();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Collection.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Collection.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Collection.java
index f7de5d8..6439807 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Collection.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Collection.java
@@ -34,7 +34,7 @@ import com.google.common.collect.Lists;
                 , "layout"
         }
 )
-public class Collection implements ColumnContent {
+public class Collection implements ColumnContent, ActionHolder {
 
     private String id;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/DomainObject.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/DomainObject.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/DomainObject.java
index 052eb22..836a732 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/DomainObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/DomainObject.java
@@ -21,11 +21,15 @@ package org.apache.isis.applib.layout.v1_0;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.services.dto.Dto;
@@ -38,7 +42,7 @@ import org.apache.isis.applib.services.dto.Dto;
                 , "tabGroups"
         }
 )
-public class DomainObject implements Dto {
+public class DomainObject implements Dto, ActionHolder {
 
     private List<Action> actions = Lists.newArrayList();
 
@@ -67,4 +71,107 @@ public class DomainObject implements Dto {
     public void setTabGroups(List<TabGroup> tabGroups) {
         this.tabGroups = tabGroups;
     }
+
+
+    public interface Visitor {
+        void visit(DomainObject domainObject);
+        void visit(Property property);
+        void visit(Collection collection);
+        void visit(Action action);
+        void visit(TabGroup tabGroup);
+        void visit(Tab tab);
+        void visit(Column column);
+    }
+
+    public static class VisitorAdapter implements Visitor {
+        @Override
+        public void visit(final DomainObject domainObject) { }
+        @Override
+        public void visit(final TabGroup tabGroup) { }
+        @Override
+        public void visit(final Tab tab) { }
+        @Override
+        public void visit(final Column column) { }
+        @Override
+        public void visit(Property property) {}
+        @Override
+        public void visit(Collection collection) {}
+        @Override
+        public void visit(Action action) {}
+    }
+
+
+    public void traverse(final Visitor visitor) {
+        visitor.visit(this);
+        traverseActions(this, visitor);
+        final List<TabGroup> tabGroups = getTabGroups();
+        for (final TabGroup tabGroup : tabGroups) {
+            visitor.visit(tabGroup);
+            final List<Tab> tabs = tabGroup.getTabs();
+            for (final Tab tab : tabs) {
+                visitor.visit(tab);
+                traverseColumn(tab.getLeft(), visitor);
+                traverseColumn(tab.getMiddle(), visitor);
+                traverseColumn(tab.getRight(), visitor);
+            }
+        }
+    }
+
+    private void traverseColumn(final Column column, final Visitor visitor) {
+        visitor.visit(column);
+        traversePropertyGroups(column, visitor);
+        traverseCollections(column, visitor);
+    }
+
+    private void traversePropertyGroups(final Column column, final Visitor visitor) {
+        final Iterable<PropertyGroup> propertyGroups =
+                Iterables.transform(
+                        Iterables.filter(column.getContent(), is(PropertyGroup.class)),
+                        cast(PropertyGroup.class));
+        for (final PropertyGroup propertyGroup : propertyGroups) {
+            final List<Property> properties = propertyGroup.getProperties();
+            for (final Property property : properties) {
+                visitor.visit(property);
+                traverseActions(property, visitor);
+            }
+        }
+    }
+
+    private void traverseCollections(final Column column, final Visitor visitor) {
+        final Iterable<Collection> collections =
+                Iterables.transform(
+                        Iterables.filter(column.getContent(), is(Collection.class)),
+                        cast(Collection.class));
+        for (final Collection collection : collections) {
+            visitor.visit(collection);
+            traverseActions(collection, visitor);
+        }
+    }
+
+    private void traverseActions(final ActionHolder actionHolder, final Visitor visitor) {
+        final List<Action> actions = actionHolder.getActions();
+        for (final Action action : actions) {
+            visitor.visit(action);
+        }
+    }
+
+    private <F, T extends F> CastFunction<F, T> cast(final Class<T> cls) {
+        return new CastFunction<>();
+    }
+
+    private <F,T> Predicate<F> is(final Class<T> cls) {
+        return new Predicate<F>() {
+            @Override public boolean apply(@Nullable final F from) {
+                return cls.isAssignableFrom(from.getClass());
+            }
+        };
+    }
+
+    private static class CastFunction<F, T extends F> implements Function<F, T> {
+        @Override
+        public final T apply(final F from) {
+            return (T) from;
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Property.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Property.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Property.java
index ad29288..9e8136b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Property.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Property.java
@@ -34,7 +34,7 @@ import com.google.common.collect.Lists;
                 , "layout"
         }
 )
-public class Property {
+public class Property implements ActionHolder {
 
     private String id;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java
index 4aeebba..0b9b632 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java
@@ -37,7 +37,7 @@ import org.apache.isis.applib.annotation.MemberOrder;
                 , "properties"
         }
 )
-public class PropertyGroup implements ColumnContent {
+public class PropertyGroup implements ColumnContent, ActionHolder {
 
     private String name;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetDefault.java
index f515ccc..bbd2281 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetDefault.java
@@ -18,16 +18,22 @@
  */
 package org.apache.isis.core.metamodel.facets.object.layoutxml;
 
-
 import java.util.List;
+import java.util.Map;
 
+import org.apache.isis.applib.layout.v1_0.Action;
+import org.apache.isis.applib.layout.v1_0.Collection;
+import org.apache.isis.applib.layout.v1_0.DomainObject;
+import org.apache.isis.applib.layout.v1_0.Property;
 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.applib.layout.v1_0.DomainObject;
-import org.apache.isis.applib.layout.v1_0.TabGroup;
 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.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public class LayoutXmlFacetDefault
@@ -74,12 +80,49 @@ public class LayoutXmlFacetDefault
 
     private void doFleshOut(final DomainObject metadata) {
         ObjectSpecification objectSpec = (ObjectSpecification) getFacetHolder();
-        List<OneToOneAssociation> properties = getProperties(objectSpec);
-        List<TabGroup> tabses = metadata.getTabGroups();
+
+        final List<OneToOneAssociation> oneToOneAssociations = getOneToOneAssociations(objectSpec);
+        final Map<String, OneToOneAssociation> oneToOneAssociationById = ObjectMember.Util.mapById(oneToOneAssociations);
+
+        final List<OneToManyAssociation> oneToManyAssociations = getOneToManyAssociations(objectSpec);
+        final Map<String, OneToManyAssociation> oneToManyAssociationById = ObjectMember.Util.mapById(oneToManyAssociations);
+
+        final List<ObjectAction> objectActions = objectSpec.getObjectActions(Contributed.INCLUDED);
+        final Map<String, ObjectAction> objectActionById = ObjectMember.Util.mapById(objectActions);
+
+        metadata.traverse(new DomainObject.VisitorAdapter() {
+            @Override
+            public void visit(final Property property) {
+                oneToOneAssociationById.remove(property.getId());
+            }
+            @Override
+            public void visit(final Collection collection) {
+                oneToManyAssociationById.remove(collection.getId());
+            }
+            @Override
+            public void visit(final Action action) {
+                objectActionById.remove(action.getId());
+            }
+        });
+
+        if(!oneToOneAssociationById.isEmpty()) {
+
+        }
+        if(!oneToManyAssociationById.isEmpty()) {
+
+        }
+        if(!objectActionById.isEmpty()) {
+
+        }
     }
 
-    private List getProperties(final ObjectSpecification objectSpec) {
+
+    private List getOneToOneAssociations(final ObjectSpecification objectSpec) {
+        return objectSpec
+                .getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.PROPERTIES);
+    }
+    private List getOneToManyAssociations(final ObjectSpecification objectSpec) {
         return objectSpec
-                .getAssociations(Contributed.INCLUDED, OneToOneAssociation.Filters.PROPERTIES);
+                .getAssociations(Contributed.INCLUDED, ObjectAssociation.Filters.COLLECTIONS);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 65f0115..a09c077 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -19,7 +19,6 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import java.util.List;
 
-import com.google.common.base.Functions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
@@ -452,9 +451,9 @@ public interface ObjectAction extends ObjectMember {
 
             final List<ObjectAssociation> associations = adapterSpec.getAssociations(Contributed.INCLUDED);
             final List<String> associationNames = Lists.transform(associations,
-                    Functions.compose(StringFunctions.toLowerCase(), ObjectAssociation.Functions.toName()));
+                    com.google.common.base.Functions.compose(StringFunctions.toLowerCase(), ObjectAssociation.Functions.toName()));
             final List<String> associationIds = Lists.transform(associations,
-                    Functions.compose(StringFunctions.toLowerCase(), ObjectAssociation.Functions.toId()));
+                    com.google.common.base.Functions.compose(StringFunctions.toLowerCase(), ObjectAssociation.Functions.toId()));
 
             return new Filter<ObjectAction>() {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c93071b4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
index 277c734..9d8fa15 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
@@ -19,6 +19,14 @@
 
 package org.apache.isis.core.metamodel.spec.feature;
 
+import java.util.HashMap;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Maps;
+
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -154,4 +162,27 @@ public interface ObjectMember extends ObjectFeature {
         }
 
     }
+
+    class Functions {
+
+        private Functions(){}
+        public static Function<ObjectMember, String> getId() {
+            return new Function<ObjectMember, String>() {
+                @Nullable @Override public String apply(@Nullable final ObjectMember oneToOneAssociation) {
+                    return oneToOneAssociation.getId();
+                }
+            };
+        }
+
+    }
+
+    class Util {
+
+        private Util(){}
+
+        public static <T extends ObjectMember> HashMap<String, T> mapById(final List<T> members) {
+            return Maps.newHashMap(Maps.uniqueIndex(members, ObjectMember.Functions.getId()));
+        }
+    }
+
 }