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/c998c76d
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/c998c76d
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/c998c76d

Branch: refs/heads/ISIS-993
Commit: c998c76d2a692ab66165a194d7d1c877e625acdb
Parents: fb0f127
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 14:38:24 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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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/c998c76d/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>

Reply via email to