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/a9597d75 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/a9597d75 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/a9597d75 Branch: refs/heads/ISIS-993 Commit: a9597d750fc527956e9a6444b7bebf68012ba1ab Parents: 8ff81a7 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Wed Jan 6 21:21:19 2016 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Mon Jan 25 14:38:24 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/a9597d75/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/a9597d75/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/a9597d75/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/a9597d75/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/a9597d75/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/a9597d75/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/a9597d75/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/a9597d75/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())); + } + } + }