ISIS-993: metadata classes, facet factory, starting on the wicket component
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/99f808c1 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/99f808c1 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/99f808c1 Branch: refs/heads/ISIS-993 Commit: 99f808c1ddae5eeff63a57f8a2616d6e92b78957 Parents: 3fc1eb2 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Wed Jan 6 08:59:52 2016 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Mon Jan 25 14:38:24 2016 +0000 ---------------------------------------------------------------------- .../schema/applib/layout/layout-1.0.xsd | 210 +++++++++++++++++++ .../asciidoc/schema/applib/layout/layout.xsd | 210 +++++++++++++++++++ .../isis/applib/annotation/ActionLayout.java | 8 + .../isis/applib/annotation/BookmarkPolicy.java | 5 + .../applib/annotation/CollectionLayout.java | 4 +- .../isis/applib/annotation/Contributed.java | 5 + .../isis/applib/annotation/LabelPosition.java | 5 + .../isis/applib/annotation/RenderType.java | 5 + .../apache/isis/applib/annotation/Where.java | 5 + .../isis/applib/annotation/package-info.java | 31 --- .../apache/isis/applib/layout/v1_0/Action.java | 62 ++++++ .../isis/applib/layout/v1_0/ActionLayout.java | 161 ++++++++++++++ .../isis/applib/layout/v1_0/Collection.java | 79 +++++++ .../applib/layout/v1_0/CollectionLayout.java | 148 +++++++++++++ .../apache/isis/applib/layout/v1_0/Column.java | 76 +++++++ .../isis/applib/layout/v1_0/DomainObject.java | 69 ++++++ .../isis/applib/layout/v1_0/Property.java | 77 +++++++ .../isis/applib/layout/v1_0/PropertyGroup.java | 86 ++++++++ .../isis/applib/layout/v1_0/PropertyLayout.java | 147 +++++++++++++ .../org/apache/isis/applib/layout/v1_0/Tab.java | 81 +++++++ .../isis/applib/layout/v1_0/TabGroup.java | 46 ++++ .../isis/applib/layout/v1_0/package-info.java | 25 +++ .../jaxb/CatalogingSchemaOutputResolver.java | 83 ++++++++ .../isis/applib/services/jaxb/JaxbService.java | 152 +++++++++++++- .../services/jaxb/StreamResultWithWriter.java | 45 ++++ .../DomainServiceLayoutFacetFactory.java | 84 ++++++++ .../DomainServiceLayoutFactory.java | 84 -------- .../facets/object/layoutxml/LayoutXmlFacet.java | 32 +++ .../object/layoutxml/LayoutXmlFacetDefault.java | 85 ++++++++ .../object/layoutxml/LayoutXmlFacetFactory.java | 98 +++++++++ .../dflt/ProgrammingModelFacetsJava5.java | 7 +- .../DomainServiceLayoutFacetFactoryTest.java | 129 ++++++++++++ .../DomainServiceLayoutFactoryTest.java | 129 ------------ .../layoutxml/v1_0/DomainObjectTest.java | 101 +++++++++ .../jaxb/CatalogingSchemaOutputResolver.java | 85 -------- .../services/jaxb/JaxbServiceDefault.java | 111 +--------- .../services/jaxb/StreamResultWithWriter.java | 45 ---- .../ComponentFactoryRegistrarDefault.java | 28 ++- .../entity/EntityComponentFactoryAbstract.java | 14 +- .../entity/tabbed/EntityTabbedPanel.html | 27 +++ .../entity/tabbed/EntityTabbedPanel.java | 59 ++++++ .../entity/tabbed/EntityTabbedPanelFactory.java | 56 +++++ .../dom/simple/SimpleObject.layout.xml | 44 ++++ 43 files changed, 2557 insertions(+), 486 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd ---------------------------------------------------------------------- diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd new file mode 100644 index 0000000..97ab131 --- /dev/null +++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd @@ -0,0 +1,210 @@ +<?xml version="1.0" standalone="yes"?> +<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout" xmlns:tns="http://isis.apache.org/schema/applib/layout" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="domainObject" type="tns:domainObject"/> + + <xs:complexType name="domainObject"> + <xs:sequence> + <xs:element name="actions"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="tabGroups"> + <xs:complexType> + <xs:sequence> + <xs:element name="tabGroup" type="tns:tabGroup" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="action"> + <xs:sequence> + <xs:element name="layout" type="tns:actionLayout"/> + </xs:sequence> + <xs:attribute name="identifier" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="actionLayout"> + <xs:sequence> + <xs:element name="bookmarking" type="tns:bookmarkPolicy" default="NEVER" minOccurs="0"/> + <xs:element name="cssClass" type="xs:string" minOccurs="0"/> + <xs:element name="cssClassFa" type="xs:string" minOccurs="0"/> + <xs:element name="cssClassFaPosition" type="tns:cssClassFaPosition" minOccurs="0"/> + <xs:element name="describedAs" type="xs:string" minOccurs="0"/> + <xs:element name="hidden" type="tns:where" minOccurs="0"/> + <xs:element name="named" type="xs:string" minOccurs="0"/> + <xs:element name="namedEscaped" type="xs:boolean" minOccurs="0"/> + <xs:element name="position" type="tns:position" default="BELOW"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tabGroup"> + <xs:sequence> + <xs:element name="tabs"> + <xs:complexType> + <xs:sequence> + <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tab"> + <xs:sequence> + <xs:element name="name" type="xs:string" minOccurs="0"/> + <xs:element name="left" type="tns:column"/> + <xs:element name="middle" type="tns:column" minOccurs="0"/> + <xs:element name="right" type="tns:column" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="column"> + <xs:sequence> + <xs:element name="span" type="xs:int" default="4"/> + <xs:element name="propertyGroups"> + <xs:complexType> + <xs:sequence> + <xs:element name="propertyGroup" type="tns:propertyGroup" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="collections"> + <xs:complexType> + <xs:sequence> + <xs:element name="collection" type="tns:collection" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="propertyGroup"> + <xs:sequence> + <xs:element name="actions"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="properties"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" type="tns:property" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="property"> + <xs:sequence> + <xs:element name="layout" type="tns:propertyLayout"/> + <xs:element name="actions" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="identifier" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="propertyLayout"> + <xs:sequence> + <xs:element name="cssClass" type="xs:string" minOccurs="0"/> + <xs:element name="describedAs" type="xs:string" minOccurs="0"/> + <xs:element name="hidden" type="tns:where" minOccurs="0"/> + <xs:element name="labelPosition" type="tns:labelPosition" default="LEFT"/> + <xs:element name="multiLine" type="xs:int" minOccurs="0"/> + <xs:element name="named" type="xs:string" minOccurs="0"/> + <xs:element name="namedEscaped" type="xs:boolean" minOccurs="0"/> + <xs:element name="renderedAsDayBefore" type="xs:boolean" minOccurs="0"/> + <xs:element name="typicalLength" type="xs:int" default="-1"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="collection"> + <xs:sequence> + <xs:element name="layout" type="tns:collectionLayout"/> + <xs:element name="actions"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="identifier" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="collectionLayout"> + <xs:sequence> + <xs:element name="cssClass" type="xs:string" minOccurs="0"/> + <xs:element name="describedAs" type="xs:string" minOccurs="0"/> + <xs:element name="defaultView" type="xs:string" default="table"/> + <xs:element name="hidden" type="tns:where" minOccurs="0"/> + <xs:element name="named" type="xs:string" minOccurs="0"/> + <xs:element name="namedEscaped" type="xs:boolean" minOccurs="0"/> + <xs:element name="paged" type="xs:int" minOccurs="0"/> + <xs:element name="sortedBy" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + + <xs:simpleType name="bookmarkPolicy"> + <xs:restriction base="xs:string"> + <xs:enumeration value="AS_ROOT"/> + <xs:enumeration value="AS_CHILD"/> + <xs:enumeration value="NEVER"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="cssClassFaPosition"> + <xs:restriction base="xs:string"> + <xs:enumeration value="LEFT"/> + <xs:enumeration value="RIGHT"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="where"> + <xs:restriction base="xs:string"> + <xs:enumeration value="EVERYWHERE"/> + <xs:enumeration value="ANYWHERE"/> + <xs:enumeration value="OBJECT_FORMS"/> + <xs:enumeration value="REFERENCES_PARENT"/> + <xs:enumeration value="PARENTED_TABLES"/> + <xs:enumeration value="STANDALONE_TABLES"/> + <xs:enumeration value="ALL_TABLES"/> + <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/> + <xs:enumeration value="NOWHERE"/> + <xs:enumeration value="NOT_SPECIFIED"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="position"> + <xs:restriction base="xs:string"> + <xs:enumeration value="BELOW"/> + <xs:enumeration value="RIGHT"/> + <xs:enumeration value="PANEL"/> + <xs:enumeration value="PANEL_DROPDOWN"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="labelPosition"> + <xs:restriction base="xs:string"> + <xs:enumeration value="DEFAULT"/> + <xs:enumeration value="LEFT"/> + <xs:enumeration value="RIGHT"/> + <xs:enumeration value="TOP"/> + <xs:enumeration value="NONE"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd ---------------------------------------------------------------------- diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd new file mode 100644 index 0000000..97ab131 --- /dev/null +++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd @@ -0,0 +1,210 @@ +<?xml version="1.0" standalone="yes"?> +<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://isis.apache.org/schema/applib/layout" xmlns:tns="http://isis.apache.org/schema/applib/layout" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="domainObject" type="tns:domainObject"/> + + <xs:complexType name="domainObject"> + <xs:sequence> + <xs:element name="actions"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="tabGroups"> + <xs:complexType> + <xs:sequence> + <xs:element name="tabGroup" type="tns:tabGroup" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="action"> + <xs:sequence> + <xs:element name="layout" type="tns:actionLayout"/> + </xs:sequence> + <xs:attribute name="identifier" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="actionLayout"> + <xs:sequence> + <xs:element name="bookmarking" type="tns:bookmarkPolicy" default="NEVER" minOccurs="0"/> + <xs:element name="cssClass" type="xs:string" minOccurs="0"/> + <xs:element name="cssClassFa" type="xs:string" minOccurs="0"/> + <xs:element name="cssClassFaPosition" type="tns:cssClassFaPosition" minOccurs="0"/> + <xs:element name="describedAs" type="xs:string" minOccurs="0"/> + <xs:element name="hidden" type="tns:where" minOccurs="0"/> + <xs:element name="named" type="xs:string" minOccurs="0"/> + <xs:element name="namedEscaped" type="xs:boolean" minOccurs="0"/> + <xs:element name="position" type="tns:position" default="BELOW"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tabGroup"> + <xs:sequence> + <xs:element name="tabs"> + <xs:complexType> + <xs:sequence> + <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tab"> + <xs:sequence> + <xs:element name="name" type="xs:string" minOccurs="0"/> + <xs:element name="left" type="tns:column"/> + <xs:element name="middle" type="tns:column" minOccurs="0"/> + <xs:element name="right" type="tns:column" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="column"> + <xs:sequence> + <xs:element name="span" type="xs:int" default="4"/> + <xs:element name="propertyGroups"> + <xs:complexType> + <xs:sequence> + <xs:element name="propertyGroup" type="tns:propertyGroup" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="collections"> + <xs:complexType> + <xs:sequence> + <xs:element name="collection" type="tns:collection" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="propertyGroup"> + <xs:sequence> + <xs:element name="actions"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="properties"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" type="tns:property" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="property"> + <xs:sequence> + <xs:element name="layout" type="tns:propertyLayout"/> + <xs:element name="actions" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="identifier" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="propertyLayout"> + <xs:sequence> + <xs:element name="cssClass" type="xs:string" minOccurs="0"/> + <xs:element name="describedAs" type="xs:string" minOccurs="0"/> + <xs:element name="hidden" type="tns:where" minOccurs="0"/> + <xs:element name="labelPosition" type="tns:labelPosition" default="LEFT"/> + <xs:element name="multiLine" type="xs:int" minOccurs="0"/> + <xs:element name="named" type="xs:string" minOccurs="0"/> + <xs:element name="namedEscaped" type="xs:boolean" minOccurs="0"/> + <xs:element name="renderedAsDayBefore" type="xs:boolean" minOccurs="0"/> + <xs:element name="typicalLength" type="xs:int" default="-1"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="collection"> + <xs:sequence> + <xs:element name="layout" type="tns:collectionLayout"/> + <xs:element name="actions"> + <xs:complexType> + <xs:sequence> + <xs:element name="action" type="tns:action" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="identifier" type="xs:string" use="required"/> + </xs:complexType> + + <xs:complexType name="collectionLayout"> + <xs:sequence> + <xs:element name="cssClass" type="xs:string" minOccurs="0"/> + <xs:element name="describedAs" type="xs:string" minOccurs="0"/> + <xs:element name="defaultView" type="xs:string" default="table"/> + <xs:element name="hidden" type="tns:where" minOccurs="0"/> + <xs:element name="named" type="xs:string" minOccurs="0"/> + <xs:element name="namedEscaped" type="xs:boolean" minOccurs="0"/> + <xs:element name="paged" type="xs:int" minOccurs="0"/> + <xs:element name="sortedBy" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + + <xs:simpleType name="bookmarkPolicy"> + <xs:restriction base="xs:string"> + <xs:enumeration value="AS_ROOT"/> + <xs:enumeration value="AS_CHILD"/> + <xs:enumeration value="NEVER"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="cssClassFaPosition"> + <xs:restriction base="xs:string"> + <xs:enumeration value="LEFT"/> + <xs:enumeration value="RIGHT"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="where"> + <xs:restriction base="xs:string"> + <xs:enumeration value="EVERYWHERE"/> + <xs:enumeration value="ANYWHERE"/> + <xs:enumeration value="OBJECT_FORMS"/> + <xs:enumeration value="REFERENCES_PARENT"/> + <xs:enumeration value="PARENTED_TABLES"/> + <xs:enumeration value="STANDALONE_TABLES"/> + <xs:enumeration value="ALL_TABLES"/> + <xs:enumeration value="ALL_EXCEPT_STANDALONE_TABLES"/> + <xs:enumeration value="NOWHERE"/> + <xs:enumeration value="NOT_SPECIFIED"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="position"> + <xs:restriction base="xs:string"> + <xs:enumeration value="BELOW"/> + <xs:enumeration value="RIGHT"/> + <xs:enumeration value="PANEL"/> + <xs:enumeration value="PANEL_DROPDOWN"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="labelPosition"> + <xs:restriction base="xs:string"> + <xs:enumeration value="DEFAULT"/> + <xs:enumeration value="LEFT"/> + <xs:enumeration value="RIGHT"/> + <xs:enumeration value="TOP"/> + <xs:enumeration value="NONE"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java index 52a652f..d8255c5 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java @@ -25,6 +25,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.xml.bind.annotation.XmlType; + /** * Layout hints for actions. */ @@ -72,6 +74,9 @@ public @interface ActionLayout { */ CssClassFaPosition cssClassFaPosition() default CssClassFaPosition.LEFT; + @XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" + ) enum CssClassFaPosition { LEFT, RIGHT } @@ -109,6 +114,9 @@ public @interface ActionLayout { */ Position position() default Position.BELOW; + @XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" + ) enum Position { BELOW, RIGHT, http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java index 83a90f3..b6b1fb3 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/BookmarkPolicy.java @@ -19,6 +19,11 @@ package org.apache.isis.applib.annotation; +import javax.xml.bind.annotation.XmlType; + +@XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" +) public enum BookmarkPolicy { /** * Can be bookmarked, and is a top-level 'root' (or parent) bookmark. http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java index 8216c66..d73f3c6 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java @@ -103,7 +103,7 @@ public @interface CollectionLayout { * If annotated on a type, then the page size refers to standalone * collections (eg as returned from a repository query). */ - public int paged() default -1; + int paged() default -1; // ////////////////////////////////////// @@ -124,7 +124,7 @@ public @interface CollectionLayout { * There is some similarity between this concept and that of eager-loading as supported by some object stores. * </p> */ - public RenderType render() default RenderType.LAZILY; + RenderType render() default RenderType.LAZILY; // ////////////////////////////////////// http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java index 88c46ea..81821bb 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Contributed.java @@ -19,9 +19,14 @@ package org.apache.isis.applib.annotation; +import javax.xml.bind.annotation.XmlType; + /** * The means by which a domain service action will be contributed to a domain object. */ +@XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" +) public enum Contributed { /** * Default: contributed as both an action and also (if takes a single argument and has safe semantics) as an association http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java index c4cdc10..a91d280 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/LabelPosition.java @@ -18,12 +18,17 @@ */ package org.apache.isis.applib.annotation; +import javax.xml.bind.annotation.XmlType; + /** * The positioning of a label for a property or action parameter. * * @see org.apache.isis.applib.annotation.PropertyLayout * @see org.apache.isis.applib.annotation.ParameterLayout */ +@XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" +) public enum LabelPosition { DEFAULT, LEFT, http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java index 776f8f6..5363b38 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/RenderType.java @@ -18,6 +18,11 @@ */ package org.apache.isis.applib.annotation; +import javax.xml.bind.annotation.XmlType; + +@XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" +) public enum RenderType { EAGERLY, LAZILY; http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java index 5dbbded..e89403d 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java +++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Where.java @@ -19,6 +19,8 @@ package org.apache.isis.applib.annotation; +import javax.xml.bind.annotation.XmlType; + import org.apache.isis.applib.util.Enums; /** @@ -38,6 +40,9 @@ import org.apache.isis.applib.util.Enums; * This enum is also used internally within the framework. When rendering an element, * the framework developer should only use those values that represent concrete locations. */ +@XmlType( + namespace = "http://isis.apache.org/schema/applib/layout" +) public enum Where { /** * The member should be disabled/hidden everywhere. http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/annotation/package-info.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/package-info.java deleted file mode 100644 index fbea3bc..0000000 --- a/core/applib/src/main/java/org/apache/isis/applib/annotation/package-info.java +++ /dev/null @@ -1,31 +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. - */ - -/** - * This package defines all of the annotations that are recognized within - * the default Isis programming model. - * - * <p> - * For example, {@link org.apache.isis.applib.annotation.Optional} is used to - * indicate that a property or a parameter is optional rather than mandatory. - * The {@link org.apache.isis.applib.annotation.MaxLength} annotation is used - * to indicate the maximum length allowable for a (string) property or - * parameter, or to indicate the maximum length of a (string-based) value type. - */ -package org.apache.isis.applib.annotation; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Action.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Action.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Action.java new file mode 100644 index 0000000..9037c04 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Action.java @@ -0,0 +1,62 @@ +/* + * 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 javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +@XmlType( + propOrder = { + "identifier" + , "layout" + } +) +public class Action { + + + private String identifier; + /** + * Method name. + * + * <p> + * Overloaded methods are not supported. + * </p> + */ + @XmlAttribute(required = true) + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + + + private ActionLayout layout = new ActionLayout(); + @XmlElement(required = true) + public ActionLayout getLayout() { + return layout; + } + + public void setLayout(ActionLayout layout) { + this.layout = layout; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayout.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayout.java new file mode 100644 index 0000000..4fb4934 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayout.java @@ -0,0 +1,161 @@ +/** + * 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 javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.isis.applib.annotation.BookmarkPolicy; +import org.apache.isis.applib.annotation.Where; + +/** + * Broadly corresponds to {@link org.apache.isis.applib.annotation.ActionLayout}. + * + * <p> + * Note that {@link org.apache.isis.applib.annotation.ActionLayout#contributed()} is omitted because this only applies + * to domain services. + * </p> + */ +@XmlType( + propOrder = { + "bookmarking" + , "cssClass" + , "cssClassFa" + , "cssClassFaPosition" + , "describedAs" + , "hidden" + , "named" + , "namedEscaped" + , "position" + } +) +public class ActionLayout { + + private BookmarkPolicy bookmarking = BookmarkPolicy.NEVER; + + @XmlElement(required = false, defaultValue = "NEVER") + public BookmarkPolicy getBookmarking() { + return bookmarking; + } + + public void setBookmarking(BookmarkPolicy bookmarking) { + this.bookmarking = bookmarking; + } + + + private String cssClass; + + @XmlElement(required = false) + public String getCssClass() { + return cssClass; + } + + public void setCssClass(String cssClass) { + this.cssClass = cssClass; + } + + + private String cssClassFa; + + @XmlElement(required = false) + public String getCssClassFa() { + return cssClassFa; + } + + public void setCssClassFa(String cssClassFa) { + this.cssClassFa = cssClassFa; + } + + + + private org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition; + + @XmlElement(required = false) + public org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition getCssClassFaPosition() { + return cssClassFaPosition; + } + + public void setCssClassFaPosition(org.apache.isis.applib.annotation.ActionLayout.CssClassFaPosition cssClassFaPosition) { + this.cssClassFaPosition = cssClassFaPosition; + } + + + private String describedAs; + + @XmlElement(required = false) + public String getDescribedAs() { + return describedAs; + } + + public void setDescribedAs(String describedAs) { + this.describedAs = describedAs; + } + + + + private Where hidden; + + @XmlElement(required = false) + public Where getHidden() { + return hidden; + } + + public void setHidden(Where hidden) { + this.hidden = hidden; + } + + + + private String named; + + @XmlElement(required = false) + public String getNamed() { + return named; + } + + public void setNamed(String named) { + this.named = named; + } + + + + private Boolean namedEscaped; + + @XmlElement(required = false) + public Boolean getNamedEscaped() { + return namedEscaped; + } + + public void setNamedEscaped(Boolean namedEscaped) { + this.namedEscaped = namedEscaped; + } + + + + private org.apache.isis.applib.annotation.ActionLayout.Position position = org.apache.isis.applib.annotation.ActionLayout.Position.BELOW; + + @XmlElement(required = true, defaultValue = "BELOW") + public org.apache.isis.applib.annotation.ActionLayout.Position getPosition() { + return position; + } + + public void setPosition(org.apache.isis.applib.annotation.ActionLayout.Position position) { + this.position = position; + } + +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/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 new file mode 100644 index 0000000..3796f5f --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Collection.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.layout.v1_0; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlType; + +import com.google.common.collect.Lists; + +@XmlType( + propOrder = { + "identifier" + , "layout" + , "actions" + } +) +public class Collection { + + private String identifier; + + /** + * Collection identifier, being the getter method without "get" prefix, first letter lower cased. + */ + @XmlAttribute(required = true) + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + + + private CollectionLayout layout = new CollectionLayout(); + + @XmlElement(required = true) + public CollectionLayout getLayout() { + return layout; + } + + public void setLayout(CollectionLayout layout) { + this.layout = layout; + } + + + + private List<Action> actions = Lists.newArrayList(); + + @XmlElementWrapper(required = true) + @XmlElement(name = "action", required = false) + public List<Action> getActions() { + return actions; + } + + public void setActions(List<Action> actions) { + this.actions = actions; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayout.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayout.java new file mode 100644 index 0000000..21c9273 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayout.java @@ -0,0 +1,148 @@ +/** + * 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 javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.isis.applib.annotation.Where; + +/** + * Broadly corresponds to the {@link org.apache.isis.applib.annotation.CollectionLayout} annotation. + * + * <p> + * Note that {@link org.apache.isis.applib.annotation.CollectionLayout#render()} is omitted because + * {@link #defaultView} is its replacement. + * </p> + */ +@XmlType( + propOrder = { + "cssClass" + ,"describedAs" + ,"defaultView" + ,"hidden" + ,"named" + ,"namedEscaped" + ,"paged" + ,"sortedBy" + } +) +public class CollectionLayout { + + private String cssClass; + + @XmlElement(required = false) + public String getCssClass() { + return cssClass; + } + + public void setCssClass(String cssClass) { + this.cssClass = cssClass; + } + + + + private String describedAs; + + @XmlElement(required = false) + public String getDescribedAs() { + return describedAs; + } + + public void setDescribedAs(String describedAs) { + this.describedAs = describedAs; + } + + + + private String defaultView = "table"; + + /** + * Typically <code>table</code> or <code>hidden</code>, but could be any other named view that is configured and + * appropriate, eg <code>gmap3</code> or <code>fullcalendar2</code>. + */ + @XmlElement(required = true, defaultValue = "table") + public String getDefaultView() { + return defaultView; + } + + public void setDefaultView(String defaultView) { + this.defaultView = defaultView; + } + + + private Where hidden; + + @XmlElement(required = false) + public Where getHidden() { + return hidden; + } + + public void setHidden(Where hidden) { + this.hidden = hidden; + } + + + private String named; + + @XmlElement(required = false) + public String getNamed() { + return named; + } + + public void setNamed(String named) { + this.named = named; + } + + + private Boolean namedEscaped; + + @XmlElement(required = false) + public Boolean getNamedEscaped() { + return namedEscaped; + } + + public void setNamedEscaped(Boolean namedEscaped) { + this.namedEscaped = namedEscaped; + } + + + private Integer paged; + + @XmlElement(required = false) + public Integer getPaged() { + return paged; + } + + public void setPaged(Integer paged) { + this.paged = paged; + } + + + + private String sortedBy; + + @XmlElement(required = false) + public String getSortedBy() { + return sortedBy; + } + + public void setSortedBy(String sortedBy) { + this.sortedBy = sortedBy; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java new file mode 100644 index 0000000..84534c0 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java @@ -0,0 +1,76 @@ +/* + * 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; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlType; + +import com.google.common.collect.Lists; + +@XmlType( + propOrder = { + "span" + , "propertyGroups" + , "collections" + } +) +public class Column { + + private int span = 4; + + @XmlElement(required = true, defaultValue = "4") + public int getSpan() { + return span; + } + + public void setSpan(final int span) { + this.span = span; + } + + + + private List<PropertyGroup> propertyGroups = Lists.newArrayList(); + + @XmlElementWrapper(required = true) + @XmlElement(name = "propertyGroup", required = false) + public List<PropertyGroup> getPropertyGroups() { + return propertyGroups; + } + + public void setPropertyGroups(List<PropertyGroup> propertyGroups) { + this.propertyGroups = propertyGroups; + } + + + + private List<Collection> collections = Lists.newArrayList(); + + @XmlElementWrapper(required = true) + @XmlElement(name = "collection", required = false) + public List<Collection> getCollections() { + return collections; + } + + public void setCollections(List<Collection> collections) { + this.collections = collections; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/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 new file mode 100644 index 0000000..2ac2e54 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/DomainObject.java @@ -0,0 +1,69 @@ +/* + * 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.ArrayList; +import java.util.List; + +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.collect.Lists; + +import org.apache.isis.applib.services.dto.Dto; + +@XmlRootElement +@XmlType( + propOrder = { + "actions" + , "tabGroups" + } +) +public class DomainObject implements Dto { + + private List<Action> actions = Lists.newArrayList(); + + @XmlElementWrapper(required = true) + @XmlElement(name = "action", required = false) + public List<Action> getActions() { + return actions; + } + + public void setActions(List<Action> actions) { + this.actions = actions; + } + + + // must have at least one tab group + private List<TabGroup> tabGroups = new ArrayList<TabGroup>() {{ + add(new TabGroup()); + }}; + + @XmlElementWrapper(required = true) + @XmlElement(name = "tabGroup", required = true) + public List<TabGroup> getTabGroups() { + return tabGroups; + } + + public void setTabGroups(List<TabGroup> tabGroups) { + this.tabGroups = tabGroups; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/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 new file mode 100644 index 0000000..ed08541 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Property.java @@ -0,0 +1,77 @@ +/* + * 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; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlType; + +import com.google.common.collect.Lists; + +@XmlType( + propOrder = { + "identifier" + , "layout" + , "actions" + } +) +public class Property { + + private String identifier; + + /** + * Property identifier, being the getter method without "get" or "is" prefix, first letter lower cased. + */ + @XmlAttribute(required = true) + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + + private PropertyLayout layout = new PropertyLayout(); + + @XmlElement(required = true) + public PropertyLayout getLayout() { + return layout; + } + + public void setLayout(PropertyLayout layout) { + this.layout = layout; + } + + + private List<Action> actions = Lists.newArrayList(); + + @XmlElementWrapper(required = false) + @XmlElement(name = "action", required = true) + public List<Action> getActions() { + return actions; + } + + public void setActions(List<Action> actions) { + this.actions = actions; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/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 new file mode 100644 index 0000000..f62c316 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java @@ -0,0 +1,86 @@ +/* + * 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.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlType; + +import com.google.common.collect.Lists; + +import org.apache.isis.applib.annotation.MemberOrder; + +@XmlType( + propOrder = { + "name" + , "actions" + , "properties" + } +) +public class PropertyGroup { + + private String name; + + /** + * Corresponds to the {@link MemberOrder#name()} (when applied to properties). + */ + @XmlAttribute(required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + + private List<Action> actions = Lists.newArrayList(); + + @XmlElementWrapper(required = true) + @XmlElement(name = "action", required = false) + public List<Action> getActions() { + return actions; + } + + public void setActions(List<Action> actions) { + this.actions = actions; + } + + + + // must be at least one property in the property group + private List<Property> properties = new ArrayList<Property>() {{ + add(new Property()); + }}; + + @XmlElementWrapper(required = true) + @XmlElement(name = "property", required = true) + public List<Property> getProperties() { + return properties; + } + + public void setProperties(List<Property> properties) { + this.properties = properties; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayout.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayout.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayout.java new file mode 100644 index 0000000..0728c1f --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayout.java @@ -0,0 +1,147 @@ +/** + * 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 javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.isis.applib.annotation.LabelPosition; +import org.apache.isis.applib.annotation.Where; + +@XmlType( + propOrder = { + "cssClass" + , "describedAs" + , "hidden" + , "labelPosition" + , "multiLine" + , "named" + , "namedEscaped" + , "renderedAsDayBefore" + , "typicalLength" + } +) +public class PropertyLayout { + + private String cssClass; + + @XmlElement(required = false) + public String getCssClass() { + return cssClass; + } + + public void setCssClass(String cssClass) { + this.cssClass = cssClass; + } + + + private String describedAs; + + @XmlElement(required = false) + public String getDescribedAs() { + return describedAs; + } + + public void setDescribedAs(String describedAs) { + this.describedAs = describedAs; + } + + + private Where hidden; + + @XmlElement(required = false) + public Where getHidden() { + return hidden; + } + + public void setHidden(Where hidden) { + this.hidden = hidden; + } + + + private LabelPosition labelPosition = LabelPosition.LEFT; + + @XmlElement(required = true, defaultValue = "LEFT") + public LabelPosition getLabelPosition() { + return labelPosition; + } + + public void setLabelPosition(LabelPosition labelPosition) { + this.labelPosition = labelPosition; + } + + + private Integer multiLine; + + @XmlElement(required = false) + public Integer getMultiLine() { + return multiLine; + } + + public void setMultiLine(Integer multiLine) { + this.multiLine = multiLine; + } + + + private String named; + + @XmlElement(required = false) + public String getNamed() { + return named; + } + + public void setNamed(String named) { + this.named = named; + } + + + private Boolean namedEscaped; + + @XmlElement(required = false) + public Boolean getNamedEscaped() { + return namedEscaped; + } + + public void setNamedEscaped(Boolean namedEscaped) { + this.namedEscaped = namedEscaped; + } + + + private Boolean renderedAsDayBefore; + + @XmlElement(required = false) + public Boolean getRenderedAsDayBefore() { + return renderedAsDayBefore; + } + + public void setRenderedAsDayBefore(Boolean renderedAsDayBefore) { + this.renderedAsDayBefore = renderedAsDayBefore; + } + + + private Integer typicalLength = -1; + + @XmlElement(required = true, defaultValue = "-1") + public Integer getTypicalLength() { + return typicalLength; + } + + public void setTypicalLength(Integer typicalLength) { + this.typicalLength = typicalLength; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java new file mode 100644 index 0000000..b8b311a --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java @@ -0,0 +1,81 @@ +/* + * 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 javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +@XmlType( + propOrder = { + "name" + , "left" + , "middle" + , "right" + } +) +public class Tab { + + private String name; + + @XmlElement(required = false) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + + private Column left = new Column(); + + @XmlElement(required = true) + public Column getLeft() { + return left; + } + + public void setLeft(final Column left) { + this.left = left; + } + + + private Column middle; + + @XmlElement(required = false) + public Column getMiddle() { + return middle; + } + + public void setMiddle(final Column middle) { + this.middle = middle; + } + + + private Column right; + + @XmlElement(required = false) + public Column getRight() { + return right; + } + + public void setRight(final Column right) { + this.right = right; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java new file mode 100644 index 0000000..3d57c19 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java @@ -0,0 +1,46 @@ +/* + * 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.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlType; + +@XmlType( + propOrder = {"tabs"} +) public class TabGroup { + + // must be at least one tab. + private List<Tab> tabs = new ArrayList<Tab>(){{ + add(new Tab()); + }}; + + @XmlElementWrapper(required = true) + @XmlElement(name = "tab", required = true) + public List<Tab> getTabs() { + return tabs; + } + + public void setTabs(List<Tab> tabs) { + this.tabs = tabs; + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.java new file mode 100644 index 0000000..f187ff2 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/package-info.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. + */ +@javax.xml.bind.annotation.XmlSchema( + namespace = "http://isis.apache.org/schema/applib/layout", + elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED + // specifying the location seems to cause JaxbService#toXsd() to not generate the schema; not sure why... + //, location = "http://isis.apache.org/schema/metamodel/layout/layout-1.0.xsd" +) +package org.apache.isis.applib.layout.v1_0; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/CatalogingSchemaOutputResolver.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/CatalogingSchemaOutputResolver.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/CatalogingSchemaOutputResolver.java new file mode 100644 index 0000000..5d16c95 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/CatalogingSchemaOutputResolver.java @@ -0,0 +1,83 @@ +/** + * 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.services.jaxb; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.SchemaOutputResolver; +import javax.xml.transform.Result; +import javax.xml.transform.stream.StreamResult; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +/** + * An implementation of {@link SchemaOutputResolver} that keeps track of all the schemas for which it has + * {@link #createOutput(String, String) created} an output {@link StreamResult} containing the content of the schema. + */ +class CatalogingSchemaOutputResolver extends SchemaOutputResolver +{ + private final JaxbService.IsisSchemas isisSchemas; + private List<String> namespaceUris = Lists.newArrayList(); + + public CatalogingSchemaOutputResolver(final JaxbService.IsisSchemas isisSchemas) { + this.isisSchemas = isisSchemas; + } + + public List<String> getNamespaceUris() { + return namespaceUris; + } + + private Map<String, StreamResultWithWriter> schemaResultByNamespaceUri = Maps.newLinkedHashMap(); + + public String getSchemaTextFor(final String namespaceUri) { + final StreamResultWithWriter streamResult = schemaResultByNamespaceUri.get(namespaceUri); + return streamResult != null? streamResult.asString(): null; + } + + @Override + public Result createOutput( + final String namespaceUri, final String suggestedFileName) throws IOException { + + final StreamResultWithWriter result = new StreamResultWithWriter(); + + result.setSystemId(namespaceUri); + + if (isisSchemas.shouldIgnore(namespaceUri)) { + // skip + } else { + namespaceUris.add(namespaceUri); + schemaResultByNamespaceUri.put(namespaceUri, result); + } + + return result; + } + + public Map<String, String> asMap() { + final Map<String,String> map = Maps.newLinkedHashMap(); + final List<String> namespaceUris = getNamespaceUris(); + + for (String namespaceUri : namespaceUris) { + map.put(namespaceUri, getSchemaTextFor(namespaceUri)); + } + + return Collections.unmodifiableMap(map); + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java index ed42609..ae0be24 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java @@ -16,8 +16,27 @@ */ package org.apache.isis.applib.services.jaxb; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.util.List; import java.util.Map; +import javax.inject.Inject; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; + +import com.google.common.base.Function; +import com.google.common.base.Joiner; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; + +import org.apache.isis.applib.ApplicationException; +import org.apache.isis.applib.DomainObjectContainer; +import org.apache.isis.applib.NonRecoverableException; import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.services.dto.Dto_downloadXsd; @@ -26,7 +45,14 @@ public interface JaxbService { @Programmatic <T> T fromXml(Class<T> domainClass, String xml); - @Programmatic String toXml(final Object domainObject); + @Programmatic + <T> T fromXml(Class<T> domainClass, String xml, Map<String,Object> unmarshallerProperties); + + @Programmatic + String toXml(final Object domainObject); + + @Programmatic + String toXml(final Object domainObject, Map<String,Object> marshallerProperties); /** @@ -60,4 +86,128 @@ public interface JaxbService { @Programmatic Map<String, String> toXsd(final Object domainObject, final IsisSchemas isisSchemas); + + + public static class Simple implements JaxbService { + + @Override + public <T> T fromXml(final Class<T> domainClass, final String xml) { + return fromXml(domainClass, xml, Maps.<String,Object>newHashMap()); + } + @Override + public <T> T fromXml(final Class<T> domainClass, final String xml, final Map<String, Object> unmarshallerProperties) { + try { + final JAXBContext context = JAXBContext.newInstance(domainClass); + + final Unmarshaller unmarshaller = context.createUnmarshaller(); + + for (Map.Entry<String, Object> entry : unmarshallerProperties.entrySet()) { + unmarshaller.setProperty(entry.getKey(), entry.getValue()); + } + + configure(unmarshaller); + + final Object unmarshal = unmarshaller.unmarshal(new StringReader(xml)); + return (T) unmarshal; + + } catch (final JAXBException ex) { + throw new NonRecoverableException("Error unmarshalling domain object from XML; domain object class is '" + domainClass.getName() + "'", ex); + } + } + + @Override + public String toXml(final Object domainObject) { + return toXml(domainObject, Maps.<String,Object>newHashMap()); + } + + @Override + public String toXml(final Object domainObject, final Map<String, Object> marshallerProperties) { + + final Class<?> domainClass = domainObject.getClass(); + try { + final JAXBContext context = JAXBContext.newInstance(domainClass); + + final Marshaller marshaller = context.createMarshaller(); + + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + for (Map.Entry<String, Object> entry : marshallerProperties.entrySet()) { + marshaller.setProperty(entry.getKey(), entry.getValue()); + } + + configure(marshaller); + + final StringWriter sw = new StringWriter(); + marshaller.marshal(domainObject, sw); + final String xml = sw.toString(); + + return xml; + + } catch (final JAXBException ex) { + final Class<? extends JAXBException> exClass = ex.getClass(); + + final String name = exClass.getName(); + if(name.equals("com.sun.xml.bind.v2.runtime.IllegalAnnotationsException")) { + // report a better error if possible + // this is done reflectively so as to not have to bring in a new Maven dependency + List<? extends Exception> errors = null; + String annotationExceptionMessages = null; + try { + final Method getErrorsMethod = exClass.getMethod("getErrors"); + errors = (List<? extends Exception>) getErrorsMethod.invoke(ex); + annotationExceptionMessages = ": " + Joiner.on("; ").join( + Iterables.transform(errors, new Function<Exception, String>() { + @Override public String apply(final Exception e) { + return e.getMessage(); + } + })); + } catch (Exception e) { + // fall through if we hit any snags, and instead throw the more generic error message. + } + if(errors != null) { + throw new NonRecoverableException( + "Error marshalling domain object to XML, due to illegal annotations on domain object class '" + + domainClass.getName() + "'; " + errors.size() + " error" + + (errors.size() == 1? "": "s") + + " reported" + (!errors + .isEmpty() ? annotationExceptionMessages : ""), ex); + } + } + + throw new NonRecoverableException("Error marshalling domain object to XML; domain object class is '" + domainClass.getName() + "'", ex); + } + } + + /** + * Optional hook + */ + protected void configure(final Unmarshaller unmarshaller) { + } + + /** + * Optional hook + */ + protected void configure(final Marshaller marshaller) { + } + + public Map<String,String> toXsd(final Object domainObject, final IsisSchemas isisSchemas) { + + try { + final Class<?> domainClass = domainObject.getClass(); + final JAXBContext context = JAXBContext.newInstance(domainClass); + + final CatalogingSchemaOutputResolver outputResolver = new CatalogingSchemaOutputResolver(isisSchemas); + context.generateSchema(outputResolver); + + return outputResolver.asMap(); + } catch (final JAXBException | IOException ex) { + throw new ApplicationException(ex); + } + } + + + @Inject + DomainObjectContainer container; + } + + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/StreamResultWithWriter.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/StreamResultWithWriter.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/StreamResultWithWriter.java new file mode 100644 index 0000000..40db209 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/StreamResultWithWriter.java @@ -0,0 +1,45 @@ +/** + * 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.services.jaxb; + +import java.io.StringWriter; + +import javax.xml.transform.stream.StreamResult; + +/** + * A {@link StreamResult} that contains its own writer. + * + * <p> + * The point is that the writer is only ever queried lazily AFTER the result has been generated. + * </p> + */ +class StreamResultWithWriter extends StreamResult { + private final StringWriter writer; + + public StreamResultWithWriter() { + this(new StringWriter()); + } + + private StreamResultWithWriter(StringWriter writer) { + super(writer); + this.writer = writer; + } + + public String asString() { + return writer.toString(); + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java new file mode 100644 index 0000000..f9d75a4 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java @@ -0,0 +1,84 @@ +/* + * 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.object.domainservicelayout; + + +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.core.metamodel.facetapi.FacetHolder; +import org.apache.isis.core.metamodel.facetapi.FacetUtil; +import org.apache.isis.core.metamodel.facetapi.FeatureType; +import org.apache.isis.core.metamodel.facets.Annotations; +import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; +import org.apache.isis.core.metamodel.facets.object.domainservicelayout.annotation.DomainServiceLayoutFacetAnnotation; + + +public class DomainServiceLayoutFacetFactory extends FacetFactoryAbstract { + + public DomainServiceLayoutFacetFactory() { + super(FeatureType.OBJECTS_ONLY); + } + + @Override + public void process(ProcessClassContext processClassContext) { + final Class<?> cls = processClassContext.getCls(); + + final FacetHolder facetHolder = processClassContext.getFacetHolder(); + + final DomainService domainService = Annotations.getAnnotation(cls, DomainService.class); + final DomainServiceLayout domainServiceLayout = Annotations.getAnnotation(cls, DomainServiceLayout.class); + + if (domainService == null && domainServiceLayout == null) { + return; + } + + final String domainServiceMenuOrder = + domainService != null && !domainService.menuOrder().equals("" + Integer.MAX_VALUE) + ? domainService.menuOrder() + : null; + final String domainServiceLayoutMenuOrder = + domainServiceLayout != null && !domainServiceLayout.menuOrder().equals("" + Integer.MAX_VALUE) + ? domainServiceLayout.menuOrder() + : null; + final String menuOrder = coalesce(domainServiceLayoutMenuOrder, domainServiceMenuOrder); + + DomainServiceLayout.MenuBar menuBar = + domainServiceLayout != null + ? domainServiceLayout.menuBar() + : DomainServiceLayout.MenuBar.PRIMARY; + + FacetUtil.addFacet( + new DomainServiceLayoutFacetAnnotation( + facetHolder, + menuBar, menuOrder)); + + FacetUtil.addFacet(NamedFacetForDomainServiceLayoutAnnotation.create(domainServiceLayout, facetHolder)); + } + + + private static String coalesce(final String... reasons) { + for (final String reason : reasons) { + if(reason != null) { + return reason; + } + } + return null; + } + +} http://git-wip-us.apache.org/repos/asf/isis/blob/99f808c1/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFactory.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFactory.java deleted file mode 100644 index 9803198..0000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFactory.java +++ /dev/null @@ -1,84 +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.core.metamodel.facets.object.domainservicelayout; - - -import org.apache.isis.applib.annotation.DomainService; -import org.apache.isis.applib.annotation.DomainServiceLayout; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facetapi.FacetUtil; -import org.apache.isis.core.metamodel.facetapi.FeatureType; -import org.apache.isis.core.metamodel.facets.Annotations; -import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; -import org.apache.isis.core.metamodel.facets.object.domainservicelayout.annotation.DomainServiceLayoutFacetAnnotation; - - -public class DomainServiceLayoutFactory extends FacetFactoryAbstract { - - public DomainServiceLayoutFactory() { - super(FeatureType.OBJECTS_ONLY); - } - - @Override - public void process(ProcessClassContext processClassContext) { - final Class<?> cls = processClassContext.getCls(); - - final FacetHolder facetHolder = processClassContext.getFacetHolder(); - - final DomainService domainService = Annotations.getAnnotation(cls, DomainService.class); - final DomainServiceLayout domainServiceLayout = Annotations.getAnnotation(cls, DomainServiceLayout.class); - - if (domainService == null && domainServiceLayout == null) { - return; - } - - final String domainServiceMenuOrder = - domainService != null && !domainService.menuOrder().equals("" + Integer.MAX_VALUE) - ? domainService.menuOrder() - : null; - final String domainServiceLayoutMenuOrder = - domainServiceLayout != null && !domainServiceLayout.menuOrder().equals("" + Integer.MAX_VALUE) - ? domainServiceLayout.menuOrder() - : null; - final String menuOrder = coalesce(domainServiceLayoutMenuOrder, domainServiceMenuOrder); - - DomainServiceLayout.MenuBar menuBar = - domainServiceLayout != null - ? domainServiceLayout.menuBar() - : DomainServiceLayout.MenuBar.PRIMARY; - - FacetUtil.addFacet( - new DomainServiceLayoutFacetAnnotation( - facetHolder, - menuBar, menuOrder)); - - FacetUtil.addFacet(NamedFacetForDomainServiceLayoutAnnotation.create(domainServiceLayout, facetHolder)); - } - - - private static String coalesce(final String... reasons) { - for (final String reason : reasons) { - if(reason != null) { - return reason; - } - } - return null; - } - -}