ISIS-993: more on the layout service, ability to download a zip of all layouts
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/c5de434e Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/c5de434e Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/c5de434e Branch: refs/heads/ISIS-993 Commit: c5de434e66194088cf4cec1fd7c46819b3998b27 Parents: 1574fb6 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Fri Jan 8 17:01:24 2016 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Mon Jan 25 15:06:07 2016 +0000 ---------------------------------------------------------------------- .../applib/services/dto/Dto_downloadXml.java | 9 +- .../applib/services/dto/Dto_downloadXsd.java | 2 + .../layout/ObjectLayoutMetadataService.java | 21 ++- .../layout/Object_downloadLayoutXml.java | 30 ++-- .../services/layout/Object_viewLayout.java | 70 +++++++++ .../ObjectLayoutMetadataFacet.java | 35 +++++ .../ObjectLayoutMetadataFacetDefault.java | 65 ++++++++ .../ObjectLayoutMetadataFacetFactory.java | 61 ++++++++ .../object/layoutxml/LayoutXmlFacetFactory.java | 61 -------- .../layoutxml/ObjectLayoutMetadataFacet.java | 35 ----- .../ObjectLayoutMetadataFacetDefault.java | 65 -------- .../ObjectLayoutMetadataServiceDefault.java | 13 +- .../services/metamodel/MetadataMenu.java | 150 +++++++++++++++++++ .../core/metamodel/services/metamodel/Util.java | 33 ++++ .../dflt/ProgrammingModelFacetsJava5.java | 4 +- .../combined/EntityCombinedPanelFactory.java | 2 +- .../entity/tabgroups/EntityTabGroupsPanel.java | 2 +- .../tabgroups/EntityTabGroupsPanelFactory.java | 2 +- .../dom/simple/SimpleObject.layout.xml | 13 +- 19 files changed, 481 insertions(+), 192 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXml.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXml.java index 3cd9ad4..34b1072 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXml.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXml.java @@ -16,15 +16,13 @@ */ package org.apache.isis.applib.services.dto; -import java.io.IOException; - import javax.inject.Inject; -import javax.xml.bind.JAXBException; import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.ActionLayout; import org.apache.isis.applib.annotation.MemberOrder; import org.apache.isis.applib.annotation.Mixin; +import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.RestrictTo; import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.applib.services.jaxb.JaxbService; @@ -50,8 +48,9 @@ public class Dto_downloadXml { cssClassFa = "fa-download" ) @MemberOrder(sequence = "500.1") - public Object $$(final String fileName) throws JAXBException, IOException { - + public Object $$( + @ParameterLayout(named = "File name") + final String fileName) { final String xml = jaxbService.toXml(dto); return new Clob(Util.withSuffix(fileName, "xml"), "text/xml", xml); } http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXsd.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXsd.java b/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXsd.java index 9366ec4..a139f15 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXsd.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/dto/Dto_downloadXsd.java @@ -33,6 +33,7 @@ import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.ActionLayout; import org.apache.isis.applib.annotation.MemberOrder; import org.apache.isis.applib.annotation.Mixin; +import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.RestrictTo; import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.applib.services.jaxb.JaxbService; @@ -67,6 +68,7 @@ public class Dto_downloadXsd { ) @MemberOrder(sequence = "500.2") public Object $$( + @ParameterLayout(named = "File name") final String fileName, final JaxbService.IsisSchemas isisSchemas) { http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java index 56efd62..f0da669 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/ObjectLayoutMetadataService.java @@ -21,14 +21,29 @@ import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; public interface ObjectLayoutMetadataService { - @Programmatic ObjectLayoutMetadata fromXml(Class<?> domainClass); + /** + * Returns raw (unnormalized) metadata, per the <code>.layout.xml</code> file. + */ + @Programmatic + ObjectLayoutMetadata fromXml(Class<?> domainClass); /** * @param objectLayoutMetadata - the layout to be validated. * @param domainClass - as per domain class. */ - @Programmatic ObjectLayoutMetadata normalize(final ObjectLayoutMetadata objectLayoutMetadata, final Class<?> domainClass); + @Programmatic + ObjectLayoutMetadata normalize(final ObjectLayoutMetadata objectLayoutMetadata, final Class<?> domainClass); - @Programmatic String toXml(ObjectLayoutMetadata objectLayoutMetadata); + /** + * Obtains the layout metadata for the specified domain object. It will have been {@link #normalize(ObjectLayoutMetadata, Class) normalized} already. + */ + @Programmatic + ObjectLayoutMetadata toMetadata(Object domainObject); + + /** + * Obtains the layout metadata for the specified domain class. It will have been {@link #normalize(ObjectLayoutMetadata, Class) normalized} already. + */ + @Programmatic + ObjectLayoutMetadata toMetadata(Class<?> domainClass); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java index 9a3f5d2..aca104c 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java @@ -16,18 +16,16 @@ */ package org.apache.isis.applib.services.layout; -import java.io.IOException; - import javax.inject.Inject; -import javax.xml.bind.JAXBException; import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.ActionLayout; import org.apache.isis.applib.annotation.MemberOrder; import org.apache.isis.applib.annotation.Mixin; +import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.RestrictTo; import org.apache.isis.applib.annotation.SemanticsOf; -import org.apache.isis.applib.services.dto.Dto; +import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; import org.apache.isis.applib.services.jaxb.JaxbService; import org.apache.isis.applib.value.Clob; @@ -36,7 +34,7 @@ public class Object_downloadLayoutXml { private final Object object; - public Object_downloadLayoutXml(final Dto object) { + public Object_downloadLayoutXml(final Object object) { this.object = object; } @@ -51,17 +49,31 @@ public class Object_downloadLayoutXml { cssClassFa = "fa-download" ) @MemberOrder(sequence = "550.1") - public Object $$(final String fileName) throws JAXBException, IOException { - final String xml = layoutXmlService.toXml(object); + public Object $$( + @ParameterLayout(named = "File name") + final String fileName) { + final ObjectLayoutMetadata metadata = getObjectLayoutMetadata(); + final String xml = jaxbService.toXml(metadata); return new Clob(Util.withSuffix(fileName, "xml"), "text/xml", xml); } + public boolean hide$$() { + return getObjectLayoutMetadata() == null; + } public String default0$$() { - return Util.withSuffix(object.getClass().getName(), "xml"); + return Util.withSuffix(object.getClass().getSimpleName(), "layout.xml"); + } + + protected ObjectLayoutMetadata getObjectLayoutMetadata() { + return objectLayoutMetadataService.toMetadata(object); } + + @Inject + ObjectLayoutMetadataService objectLayoutMetadataService; + @Inject - JaxbService layoutXmlService; + JaxbService jaxbService; } http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java new file mode 100644 index 0000000..4957e9c --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_viewLayout.java @@ -0,0 +1,70 @@ +/** + * 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.layout; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Mixin; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.annotation.RestrictTo; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; + +@Mixin +public class Object_viewLayout { + + private final Object object; + + public Object_viewLayout(final Object object) { + this.object = object; + } + + public static class ActionDomainEvent extends org.apache.isis.applib.IsisApplibModule.ActionDomainEvent<Object_viewLayout> {} + + + + @Programmatic // TODO ... excluded for now (getting an Isis framework exception in the view model rendering). + @Action( + domainEvent = ActionDomainEvent.class, + semantics = SemanticsOf.SAFE, + restrictTo = RestrictTo.PROTOTYPING + ) + @ActionLayout( + cssClassFa = "fa-th" + ) + @MemberOrder(sequence = "550.2") + public ObjectLayoutMetadata $$() { + return getObjectLayoutMetadata(); + } + + public boolean hide$$() { + return getObjectLayoutMetadata() == null; + } + + protected ObjectLayoutMetadata getObjectLayoutMetadata() { + return objectLayoutMetadataService.toMetadata(object); + } + + + + @Inject + ObjectLayoutMetadataService objectLayoutMetadataService; + +} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java new file mode 100644 index 0000000..4d8db93 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacet.java @@ -0,0 +1,35 @@ +/* + * 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.layoutmetadata; + + +import org.apache.isis.core.metamodel.facetapi.Facet; +import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; + +/** + * Corresponds to providing a <code>.layout.xml</code> file for the domain object's class. + */ +public interface ObjectLayoutMetadataFacet extends Facet { + + /** + * Will have been {@link org.apache.isis.applib.services.layout.ObjectLayoutMetadataService#normalize(ObjectLayoutMetadata, Class) normalized}. + */ + ObjectLayoutMetadata getMetadata(); + +} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java new file mode 100644 index 0000000..95e3712 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java @@ -0,0 +1,65 @@ +/* + * 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.layoutmetadata; + +import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; +import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService; +import org.apache.isis.core.metamodel.facetapi.Facet; +import org.apache.isis.core.metamodel.facetapi.FacetAbstract; +import org.apache.isis.core.metamodel.facetapi.FacetHolder; +import org.apache.isis.core.metamodel.spec.ObjectSpecification; + +public class ObjectLayoutMetadataFacetDefault + extends FacetAbstract + implements ObjectLayoutMetadataFacet { + + private final ObjectLayoutMetadata metadata; + private final ObjectLayoutMetadataService objectLayoutMetadataService; + + public static Class<? extends Facet> type() { + return ObjectLayoutMetadataFacet.class; + } + + + public static ObjectLayoutMetadataFacet create( + final FacetHolder facetHolder, + final ObjectLayoutMetadata objectLayoutMetadata, + final ObjectLayoutMetadataService objectLayoutMetadataService) { + if(objectLayoutMetadata == null) { + return null; + } + return new ObjectLayoutMetadataFacetDefault(facetHolder, objectLayoutMetadata, objectLayoutMetadataService); + } + + private ObjectLayoutMetadataFacetDefault( + final FacetHolder facetHolder, + final ObjectLayoutMetadata metadata, + final ObjectLayoutMetadataService objectLayoutMetadataService) { + super(ObjectLayoutMetadataFacetDefault.type(), facetHolder, Derivation.NOT_DERIVED); + this.metadata = metadata; + this.objectLayoutMetadataService = objectLayoutMetadataService; + } + + + public ObjectLayoutMetadata getMetadata() { + final ObjectSpecification objectSpecification = (ObjectSpecification) getFacetHolder(); + return objectLayoutMetadataService.normalize(metadata, objectSpecification.getCorrespondingClass()); + } + +} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java new file mode 100644 index 0000000..0f1b4e8 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetFactory.java @@ -0,0 +1,61 @@ +/* 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.layoutmetadata; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; +import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService; +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.FacetFactoryAbstract; +import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; +import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware; + +public class ObjectLayoutMetadataFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware { + + private static final Logger LOG = LoggerFactory.getLogger(ObjectLayoutMetadataFacetFactory.class); + + public ObjectLayoutMetadataFacetFactory() { + super(FeatureType.OBJECTS_ONLY); + } + + @Override + public void process(final ProcessClassContext processClassContext) { + final Class<?> cls = processClassContext.getCls(); + final FacetHolder facetHolder = processClassContext.getFacetHolder(); + + final ObjectLayoutMetadataService objectLayoutMetadataService = servicesInjector.lookupService(ObjectLayoutMetadataService.class); + FacetUtil.addFacet( + ObjectLayoutMetadataFacetDefault.create(facetHolder, readMetadata(cls), objectLayoutMetadataService)); + } + + private ObjectLayoutMetadata readMetadata(final Class<?> domainClass) { + final ObjectLayoutMetadataService objectLayoutMetadataService = servicesInjector.lookupService(ObjectLayoutMetadataService.class); + return objectLayoutMetadataService.fromXml(domainClass); + } + + private ServicesInjector servicesInjector; + + @Override + public void setServicesInjector(final ServicesInjector servicesInjector) { + this.servicesInjector = servicesInjector; + } + +} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetFactory.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetFactory.java deleted file mode 100644 index f898f61..0000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/LayoutXmlFacetFactory.java +++ /dev/null @@ -1,61 +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.layoutxml; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; -import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService; -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.FacetFactoryAbstract; -import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; -import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware; - -public class LayoutXmlFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware { - - private static final Logger LOG = LoggerFactory.getLogger(LayoutXmlFacetFactory.class); - - public LayoutXmlFacetFactory() { - super(FeatureType.OBJECTS_ONLY); - } - - @Override - public void process(final ProcessClassContext processClassContext) { - final Class<?> cls = processClassContext.getCls(); - final FacetHolder facetHolder = processClassContext.getFacetHolder(); - - final ObjectLayoutMetadataService objectLayoutMetadataService = servicesInjector.lookupService(ObjectLayoutMetadataService.class); - FacetUtil.addFacet( - ObjectLayoutMetadataFacetDefault.create(facetHolder, readMetadata(cls), objectLayoutMetadataService)); - } - - private ObjectLayoutMetadata readMetadata(final Class<?> domainClass) { - final ObjectLayoutMetadataService objectLayoutMetadataService = servicesInjector.lookupService(ObjectLayoutMetadataService.class); - return objectLayoutMetadataService.fromXml(domainClass); - } - - private ServicesInjector servicesInjector; - - @Override - public void setServicesInjector(final ServicesInjector servicesInjector) { - this.servicesInjector = servicesInjector; - } - -} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacet.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacet.java deleted file mode 100644 index 7285fc0..0000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacet.java +++ /dev/null @@ -1,35 +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.layoutxml; - - -import org.apache.isis.core.metamodel.facetapi.Facet; -import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; - -/** - * Corresponds to providing a <code>.layout.xml</code> file for the domain object's class. - */ -public interface ObjectLayoutMetadataFacet extends Facet { - - /** - * Will have been {@link org.apache.isis.applib.services.layout.ObjectLayoutMetadataService#normalize(ObjectLayoutMetadata, Class) normalized}. - */ - ObjectLayoutMetadata getMetadata(); - -} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefault.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefault.java deleted file mode 100644 index 05d3cc8..0000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutxml/ObjectLayoutMetadataFacetDefault.java +++ /dev/null @@ -1,65 +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.layoutxml; - -import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; -import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService; -import org.apache.isis.core.metamodel.facetapi.Facet; -import org.apache.isis.core.metamodel.facetapi.FacetAbstract; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.spec.ObjectSpecification; - -public class ObjectLayoutMetadataFacetDefault - extends FacetAbstract - implements ObjectLayoutMetadataFacet { - - private final ObjectLayoutMetadata metadata; - private final ObjectLayoutMetadataService objectLayoutMetadataService; - - public static Class<? extends Facet> type() { - return ObjectLayoutMetadataFacet.class; - } - - - public static ObjectLayoutMetadataFacet create( - final FacetHolder facetHolder, - final ObjectLayoutMetadata objectLayoutMetadata, - final ObjectLayoutMetadataService objectLayoutMetadataService) { - if(objectLayoutMetadata == null) { - return null; - } - return new ObjectLayoutMetadataFacetDefault(facetHolder, objectLayoutMetadata, objectLayoutMetadataService); - } - - private ObjectLayoutMetadataFacetDefault( - final FacetHolder facetHolder, - final ObjectLayoutMetadata metadata, - final ObjectLayoutMetadataService objectLayoutMetadataService) { - super(ObjectLayoutMetadataFacetDefault.type(), facetHolder, Derivation.NOT_DERIVED); - this.metadata = metadata; - this.objectLayoutMetadataService = objectLayoutMetadataService; - } - - - public ObjectLayoutMetadata getMetadata() { - final ObjectSpecification objectSpecification = (ObjectSpecification) getFacetHolder(); - return objectLayoutMetadataService.normalize(metadata, objectSpecification.getCorrespondingClass()); - } - -} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java index c9daf91..294531a 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/ObjectLayoutMetadataServiceDefault.java @@ -68,6 +68,7 @@ import org.apache.isis.core.metamodel.facets.collections.layout.NamedFacetForCol import org.apache.isis.core.metamodel.facets.collections.layout.PagedFacetForCollectionXml; import org.apache.isis.core.metamodel.facets.collections.layout.SortedByFacetForCollectionXml; import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetXml; +import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet; import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet; import org.apache.isis.core.metamodel.facets.properties.propertylayout.CssClassFacetForPropertyXml; import org.apache.isis.core.metamodel.facets.properties.propertylayout.DescribedAsFacetForPropertyXml; @@ -436,10 +437,18 @@ public class ObjectLayoutMetadataServiceDefault @Override - public String toXml(final ObjectLayoutMetadata objectLayoutMetadata) { - return jaxbService.toXml(objectLayoutMetadata); + public ObjectLayoutMetadata toMetadata(final Object domainObject) { + return toMetadata(domainObject.getClass()); } + @Override + public ObjectLayoutMetadata toMetadata(final Class<?> domainClass) { + final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainClass); + final ObjectLayoutMetadataFacet facet = objectSpec.getFacet(ObjectLayoutMetadataFacet.class); + return facet != null? facet.getMetadata(): null; + } + + //region > injected dependencies private DeploymentCategory deploymentCategory; http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java new file mode 100644 index 0000000..fadfae2 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetadataMenu.java @@ -0,0 +1,150 @@ +/** + * 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.services.metamodel; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Collection; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import javax.activation.MimeType; +import javax.activation.MimeTypeParseException; +import javax.inject.Inject; + +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; + +import org.apache.isis.applib.FatalException; +import org.apache.isis.applib.IsisApplibModule; +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.annotation.RestrictTo; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; +import org.apache.isis.applib.services.jaxb.JaxbService; +import org.apache.isis.applib.services.layout.ObjectLayoutMetadataService; +import org.apache.isis.applib.value.Blob; +import org.apache.isis.core.metamodel.spec.ObjectSpecification; +import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; +import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpiAware; + +@DomainService( + nature = NatureOfService.VIEW_MENU_ONLY +) +@DomainServiceLayout( + named = "Prototyping", + menuBar = DomainServiceLayout.MenuBar.SECONDARY, + menuOrder = "500.400" +) +public class MetadataMenu implements SpecificationLoaderSpiAware { + + public static abstract class ActionDomainEvent extends IsisApplibModule.ActionDomainEvent<MetadataMenu> { + } + + // ////////////////////////////////////// + + + private final MimeType mimeTypeApplicationZip; + + public MetadataMenu() { + try { + mimeTypeApplicationZip = new MimeType("application", "zip"); + } catch (final MimeTypeParseException ex) { + throw new RuntimeException(ex); + } + } + + + // ////////////////////////////////////// + + public static class DownloadLayoutsDomainEvent extends ActionDomainEvent { + } + + @Action( + domainEvent = DownloadLayoutsDomainEvent.class, + semantics = SemanticsOf.SAFE, + restrictTo = RestrictTo.PROTOTYPING + ) + @ActionLayout( + cssClassFa = "fa-download" + ) + @MemberOrder(sequence="500.400.1") + public Blob downloadLayouts() { + final Collection<ObjectSpecification> allSpecs = specificationLoader.allSpecifications(); + final Collection<ObjectSpecification> domainObjectSpecs = Collections2 + .filter(allSpecs, new Predicate<ObjectSpecification>(){ + @Override + public boolean apply(final ObjectSpecification input) { + return !input.isAbstract() && + !input.isService() && + !input.isValue() && + !input.isParentedOrFreeCollection(); + }}); + try { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final ZipOutputStream zos = new ZipOutputStream(baos); + final OutputStreamWriter writer = new OutputStreamWriter(zos); + for (final ObjectSpecification objectSpec : domainObjectSpecs) { + final Class<?> domainClass = objectSpec.getCorrespondingClass(); + final ObjectLayoutMetadata metadata = objectLayoutMetadataService.toMetadata(domainClass); + if(metadata != null) { + zos.putNextEntry(new ZipEntry(zipEntryNameFor(objectSpec))); + String xml = jaxbService.toXml(metadata); + writer.write(xml); + writer.flush(); + zos.closeEntry(); + } + } + writer.close(); + return new Blob("layouts.zip", mimeTypeApplicationZip, baos.toByteArray()); + } catch (final IOException ex) { + throw new FatalException("Unable to create zip of layouts", ex); + } + } + + private static String zipEntryNameFor(final ObjectSpecification objectSpec) { + final String fqn = objectSpec.getFullIdentifier(); + return fqn.replace(".", File.separator)+".layout.xml"; + } + + + // ////////////////////////////////////// + + @Inject + ObjectLayoutMetadataService objectLayoutMetadataService; + + @Inject + JaxbService jaxbService; + + private SpecificationLoaderSpi specificationLoader; + + @Programmatic + @Override + public void setSpecificationLoaderSpi(final SpecificationLoaderSpi specificationLoader) { + this.specificationLoader = specificationLoader; + } + + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/Util.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/Util.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/Util.java new file mode 100644 index 0000000..810de04 --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/Util.java @@ -0,0 +1,33 @@ +/** + * 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.services.metamodel; + +class Util { + + private Util(){} + + static String withSuffix(String fileName, String suffix) { + if(!suffix.startsWith(".")) { + suffix = "." + suffix; + } + if(!fileName.endsWith(suffix)) { + fileName += suffix; + } + return fileName; + } + +} http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java index 9fc19be..b17cebe 100644 --- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java +++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java @@ -108,7 +108,7 @@ import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoEnhancem import org.apache.isis.core.metamodel.facets.object.ignore.jdo.RemoveJdoPrefixedMethodsFacetFactory; import org.apache.isis.core.metamodel.facets.object.immutable.immutableannot.CopyImmutableFacetOntoMembersFactory; import org.apache.isis.core.metamodel.facets.object.immutable.immutablemarkerifc.ImmutableFacetMarkerInterfaceFactory; -import org.apache.isis.core.metamodel.facets.object.layoutxml.LayoutXmlFacetFactory; +import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacetFactory; import org.apache.isis.core.metamodel.facets.object.mask.annotation.MaskFacetOnTypeAnnotationFactory; import org.apache.isis.core.metamodel.facets.object.maxlen.annotation.MaxLengthFacetOnTypeAnnotationFactory; import org.apache.isis.core.metamodel.facets.object.membergroups.annotprop.MemberGroupLayoutFacetFactory; @@ -391,7 +391,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract // must come after DomainObjectAnnotationFacetFactory & MixinFacetFactory addFactory(NotContributedFacetDerivedFromMixinFacetFactory.class); - addFactory(LayoutXmlFacetFactory.class); + addFactory(ObjectLayoutMetadataFacetFactory.class); addFactory(DomainServiceLayoutFacetFactory.class); addFactory(DomainObjectLayoutFacetFactory.class); http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java index 1602ff0..32c0900 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java @@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.entity.combined; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; -import org.apache.isis.core.metamodel.facets.object.layoutxml.ObjectLayoutMetadataFacet; +import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.viewer.wicket.model.models.EntityModel; import org.apache.isis.viewer.wicket.ui.ComponentFactory; http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java index cce3292..6f49a68 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java @@ -37,7 +37,7 @@ import org.apache.isis.applib.layout.v1_0.TabGroup; import org.apache.isis.applib.services.jaxb.JaxbService; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet; -import org.apache.isis.core.metamodel.facets.object.layoutxml.ObjectLayoutMetadataFacet; +import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet; import org.apache.isis.viewer.wicket.model.models.EntityModel; import org.apache.isis.viewer.wicket.ui.ComponentType; import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract; http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanelFactory.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanelFactory.java index 05e3b68..4171d89 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanelFactory.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanelFactory.java @@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.entity.tabgroups; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; -import org.apache.isis.core.metamodel.facets.object.layoutxml.ObjectLayoutMetadataFacet; +import org.apache.isis.core.metamodel.facets.object.layoutmetadata.ObjectLayoutMetadataFacet; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.viewer.wicket.model.models.EntityModel; import org.apache.isis.viewer.wicket.ui.ComponentFactory; http://git-wip-us.apache.org/repos/asf/isis/blob/c5de434e/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml ---------------------------------------------------------------------- diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml index 8d69476..a50bdcf 100644 --- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml +++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml @@ -16,24 +16,23 @@ </left> <middle span="4"> </middle> - <right span="4"> - <propertyGroup name="Metadata"> + </tab> + <tab name="Metadata"> + <left span="4"> + <propertyGroup name="Persistence"> <actions> <action id="downloadJdoMetadata"/> + <action id="downloadLayoutXml"/> </actions> <property id="versionSequence"/> </propertyGroup> - </right> - </tab> - <tab name="Other"> - <left span="4"> </left> </tab> </tabGroup> <tabGroup> <tab name="Similar To"> <left span="12"> - <collection id="similarTox"/> + <collection id="similarTo"/> </left> </tab> </tabGroup>