You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/11/01 10:49:39 UTC

[isis] 01/02: ISIS-1766: adds MenuBarsLoaderService, support for reading menu bars layout from file (overriding facets)

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 42000bbe26f189ccfe5c3a70fe14ed2bafba43cb
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Nov 1 09:29:43 2017 +0000

    ISIS-1766: adds MenuBarsLoaderService, support for reading menu bars layout from file (overriding facets)
---
 .../asciidoc/applib/layout/component/component.xsd | 44 ++++++-----
 .../applib/layout/grid/bootstrap3/bootstrap3.xsd   | 19 ++++-
 .../main/asciidoc/applib/layout/links/links.xsd    | 16 ++++
 .../main/asciidoc/applib/layout/menus/menubars.xsd | 65 ++++++++++++++++
 .../org/apache/isis/applib/layout/menus/Menu.java  |  2 +-
 .../apache/isis/applib/layout/menus/MenuBar.java   |  2 +-
 .../apache/isis/applib/layout/menus/MenuBars.java  | 12 +++
 .../isis/applib/layout/menus/MenuSection.java      |  2 +-
 .../services/menu/MenuBarsLoaderService.java       | 20 +++++
 .../core/integtestsupport/IsisSystemForTest.java   |  2 +-
 .../services/grid/GridServiceDefault.java          |  8 ++
 .../services/layout/LayoutServiceDefault.java      | 21 +-----
 .../metamodel/services/menubars/MenuBarsTest.java  | 60 +++++++++++++++
 .../services/menubars/menubars.layout.xml          | 88 ++++++++++++++++++++++
 .../isis/core/runtime/runner/IsisInjectModule.java |  2 +-
 .../menu/MenuBarsLoaderServiceDefault.java         | 67 ++++++++++++++++
 .../services/menu/MenuBarsServiceDefault.java      | 58 +++++++++++---
 .../runtime/system/session/IsisSessionFactory.java | 11 ++-
 .../system/session/IsisSessionFactoryBuilder.java  | 21 ++++--
 .../java/domainapp/application/menubars.layout.xml | 88 ++++++++++++++++++++++
 20 files changed, 547 insertions(+), 61 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
index c7ff585..f780c27 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
@@ -1,4 +1,14 @@
-<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://isis.apache.org/applib/layout/component" elementFormDefault="qualified" targetNamespace="http://isis.apache.org/applib/layout/component" version="1.0">
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns:lnk="http://isis.apache.org/applib/layout/links"
+           xmlns:tns="http://isis.apache.org/applib/layout/component"
+           elementFormDefault="qualified"
+           targetNamespace="http://isis.apache.org/applib/layout/component"
+           version="1.0">
+
+  <xs:import
+          namespace="http://isis.apache.org/applib/layout/links"
+          schemaLocation="../links/links.xsd"/>
 
   <xs:element name="action" type="tns:action"/>
 
@@ -16,6 +26,7 @@
       <xs:element minOccurs="0" name="describedAs" type="xs:string"/>
       <xs:element minOccurs="0" name="plural" type="xs:string"/>
       <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
+      <xs:element minOccurs="0" name="link" type="lnk:link"/>
     </xs:sequence>
     <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
     <xs:attribute name="cssClass" type="xs:string"/>
@@ -29,6 +40,7 @@
       <xs:element minOccurs="0" name="named" type="xs:string"/>
       <xs:element minOccurs="0" name="describedAs" type="xs:string"/>
       <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
+      <xs:element minOccurs="0" name="link" type="lnk:link"/>
     </xs:sequence>
     <xs:attribute name="bookmarking" type="tns:bookmarkPolicy"/>
     <xs:attribute name="cssClass" type="xs:string"/>
@@ -37,10 +49,8 @@
     <xs:attribute name="hidden" type="tns:where"/>
     <xs:attribute name="id" type="xs:string" use="required"/>
     <xs:attribute name="namedEscaped" type="xs:boolean"/>
-
-    <xs:attribute name="promptStyle" type="tns:promptStyle"/>
-
     <xs:attribute name="position" type="tns:position"/>
+    <xs:attribute name="promptStyle" type="tns:promptStyle"/>
   </xs:complexType>
 
   <xs:complexType name="fieldSet">
@@ -49,7 +59,7 @@
       <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:property"/>
       <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
     </xs:sequence>
-    <xs:attribute name="name" type="xs:string" use="optional"/>
+    <xs:attribute name="name" type="xs:string"/>
     <xs:attribute name="id" type="xs:string"/>
     <xs:attribute name="unreferencedActions" type="xs:boolean"/>
     <xs:attribute name="unreferencedProperties" type="xs:boolean"/>
@@ -61,6 +71,7 @@
       <xs:element minOccurs="0" name="describedAs" type="xs:string"/>
       <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:action"/>
       <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
+      <xs:element minOccurs="0" name="link" type="lnk:link"/>
     </xs:sequence>
     <xs:attribute name="cssClass" type="xs:string"/>
     <xs:attribute name="hidden" type="tns:where"/>
@@ -68,9 +79,7 @@
     <xs:attribute name="labelPosition" type="tns:labelPosition"/>
     <xs:attribute name="multiLine" type="xs:int"/>
     <xs:attribute name="namedEscaped" type="xs:boolean"/>
-
     <xs:attribute name="promptStyle" type="tns:promptStyle"/>
-
     <xs:attribute name="renderedAsDayBefore" type="xs:boolean"/>
     <xs:attribute name="typicalLength" type="xs:int"/>
     <xs:attribute name="unchanging" type="xs:boolean"/>
@@ -83,6 +92,7 @@
       <xs:element minOccurs="0" name="sortedBy" type="xs:string"/>
       <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:action"/>
       <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
+      <xs:element minOccurs="0" name="link" type="lnk:link"/>
     </xs:sequence>
     <xs:attribute name="cssClass" type="xs:string"/>
     <xs:attribute name="defaultView" type="xs:string"/>
@@ -107,15 +117,6 @@
     </xs:restriction>
   </xs:simpleType>
 
-  <xs:simpleType name="promptStyle">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="DIALOG"/>
-      <xs:enumeration value="INLINE"/>
-      <xs:enumeration value="INLINE_AS_IF_EDIT"/>
-      <xs:enumeration value="AS_CONFIGURED"/>
-    </xs:restriction>
-  </xs:simpleType>
-
   <xs:simpleType name="where">
     <xs:restriction base="xs:string">
       <xs:enumeration value="EVERYWHERE"/>
@@ -140,6 +141,15 @@
     </xs:restriction>
   </xs:simpleType>
 
+  <xs:simpleType name="promptStyle">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="AS_CONFIGURED"/>
+      <xs:enumeration value="DIALOG"/>
+      <xs:enumeration value="INLINE"/>
+      <xs:enumeration value="INLINE_AS_IF_EDIT"/>
+    </xs:restriction>
+  </xs:simpleType>
+
   <xs:simpleType name="labelPosition">
     <xs:restriction base="xs:string">
       <xs:enumeration value="DEFAULT"/>
@@ -149,4 +159,4 @@
       <xs:enumeration value="NONE"/>
     </xs:restriction>
   </xs:simpleType>
-</xs:schema>
\ No newline at end of file
+</xs:schema>
diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/grid/bootstrap3/bootstrap3.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/grid/bootstrap3/bootstrap3.xsd
index f01916d..f494e81 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/grid/bootstrap3/bootstrap3.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/grid/bootstrap3/bootstrap3.xsd
@@ -1,6 +1,19 @@
-<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:tns="http://isis.apache.org/applib/layout/grid/bootstrap3" elementFormDefault="qualified" targetNamespace="http://isis.apache.org/applib/layout/grid/bootstrap3" version="1.0">
-
-    <xs:import namespace="http://isis.apache.org/applib/layout/component" schemaLocation="../../component/component.xsd"/>
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+        xmlns:xs="http://www.w3.org/2001/XMLSchema"
+        xmlns:cpt="http://isis.apache.org/applib/layout/component"
+        xmlns:tns="http://isis.apache.org/applib/layout/grid/bootstrap3"
+        elementFormDefault="qualified"
+        targetNamespace="http://isis.apache.org/applib/layout/grid/bootstrap3"
+        version="1.0">
+
+    <xs:import
+            namespace="http://isis.apache.org/applib/layout/component"
+            schemaLocation="../../component/component.xsd"/>
+
+    <xs:import
+            namespace="http://isis.apache.org/applib/layout/links"
+            schemaLocation="../../links/links.xsd"/>
 
     <xs:element name="clearFixHidden" type="tns:clearFixHidden"/>
 
diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/links/links.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/links/links.xsd
new file mode 100644
index 0000000..a3daff3
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/links/links.xsd
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+        xmlns:xs="http://www.w3.org/2001/XMLSchema"
+        elementFormDefault="qualified"
+        targetNamespace="http://isis.apache.org/applib/layout/links"
+        version="1.0">
+
+    <xs:complexType name="link">
+        <xs:sequence>
+            <xs:element name="rel" type="xs:string"/>
+            <xs:element name="method" type="xs:string"/>
+            <xs:element name="href" type="xs:string"/>
+            <xs:element name="type" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+</xs:schema>
diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd
new file mode 100644
index 0000000..15f440b
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+        xmlns:xs="http://www.w3.org/2001/XMLSchema"
+        xmlns:cpt="http://isis.apache.org/applib/layout/component"
+        xmlns:lnk="http://isis.apache.org/applib/layout/links"
+        xmlns:tns="http://isis.apache.org/applib/layout/menus"
+        elementFormDefault="qualified"
+        targetNamespace="http://isis.apache.org/applib/layout/menus" version="1.0">
+
+    <xs:import
+            namespace="http://isis.apache.org/applib/layout/component"
+            schemaLocation="../component/component.xsd"/>
+
+    <xs:import
+            namespace="http://isis.apache.org/applib/layout/links"
+            schemaLocation="../links/links.xsd"/>
+
+    <xs:element name="action" type="tns:action"/>
+
+    <xs:element name="menuBars" type="tns:menuBars"/>
+
+    <xs:complexType name="menuBars">
+        <xs:sequence>
+            <xs:element minOccurs="0" name="primary" type="tns:menuBar"/>
+            <xs:element minOccurs="0" name="secondary" type="tns:menuBar"/>
+            <xs:element minOccurs="0" name="tertiary" type="tns:menuBar"/>
+            <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="menuBar">
+        <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="1" name="menu" type="tns:menu"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="menu">
+        <xs:sequence>
+            <xs:element name="named" type="xs:string"/>
+            <xs:element maxOccurs="unbounded" minOccurs="1" name="section" type="tns:section"/>
+        </xs:sequence>
+        <xs:attribute name="cssClassFa" type="xs:string"/>
+    </xs:complexType>
+
+    <xs:complexType name="section">
+        <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="1" ref="tns:action"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="action">
+        <xs:sequence>
+            <xs:element minOccurs="0" name="named" type="xs:string"/>
+            <xs:element minOccurs="0" name="describedAs" type="xs:string"/>
+            <xs:element minOccurs="0" name="metadataError" type="xs:string"/>
+            <xs:element minOccurs="0" name="link" type="lnk:link"/>
+        </xs:sequence>
+        <xs:attribute name="oid" type="xs:string" use="required"/>
+        <xs:attribute name="id" type="xs:string" use="required"/>
+        <xs:attribute name="namedEscaped" type="xs:boolean"/>
+        <xs:attribute name="bookmarking" type="cpt:bookmarkPolicy"/>
+        <xs:attribute name="cssClass" type="xs:string"/>
+        <xs:attribute name="cssClassFa" type="xs:string"/>
+    </xs:complexType>
+</xs:schema>
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/Menu.java b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/Menu.java
index d17b3d6..a32b7e3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/Menu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/Menu.java
@@ -81,7 +81,7 @@ public class Menu implements Serializable {
     private List<MenuSection> sections = Lists.newArrayList();
 
     // no wrapper
-    @XmlElement(name = "section", required = false)
+    @XmlElement(name = "section", required = true)
     public List<MenuSection> getSections() {
         return sections;
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBar.java b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBar.java
index a349915..cda23df 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBar.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBar.java
@@ -48,7 +48,7 @@ public class MenuBar implements Serializable {
     private List<Menu> menus = Lists.newArrayList();
 
     // no wrapper
-    @XmlElement(name = "menu", required = false)
+    @XmlElement(name = "menu", required = true)
     public List<Menu> getMenus() {
         return menus;
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBars.java b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBars.java
index 9abc3c1..668984e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBars.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuBars.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
@@ -48,6 +49,17 @@ public class MenuBars implements Serializable {
     public MenuBars() {
     }
 
+    private String tnsAndSchemaLocation;
+
+    @XmlTransient
+    public String getTnsAndSchemaLocation() {
+        return tnsAndSchemaLocation;
+    }
+
+    public void setTnsAndSchemaLocation(final String tnsAndSchemaLocation) {
+        this.tnsAndSchemaLocation = tnsAndSchemaLocation;
+    }
+
     private MenuBar primary = new MenuBar();
 
     public MenuBar getPrimary() {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuSection.java b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuSection.java
index ae5b0e8..8d9bb62 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuSection.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/MenuSection.java
@@ -48,7 +48,7 @@ public class MenuSection implements Serializable, ActionLayoutDataOwner {
 
     // no wrapper
     @Override
-    @XmlElement(name = "action", required = false)
+    @XmlElement(name = "action", required = true)
     public List<ActionLayoutData> getActions() {
         return actions;
     }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsLoaderService.java b/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsLoaderService.java
new file mode 100644
index 0000000..19df252
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsLoaderService.java
@@ -0,0 +1,20 @@
+package org.apache.isis.applib.services.menu;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.layout.menus.MenuBars;
+
+public interface MenuBarsLoaderService {
+
+    /**
+     * Whether dynamic reloading of layouts is enabled.
+     */
+    @Programmatic
+    boolean supportsReloading();
+
+    /**
+     * Returns a new instance of a {@link MenuBars}, else <tt>null</tt>.
+     */
+    @Programmatic
+    MenuBars menuBars();
+
+}
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index f9afd98..e39f952 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -307,7 +307,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
                     configurationOverride
             );
 
-            final IsisSessionFactoryBuilder isisSessionFactoryBuilder = new IsisSessionFactoryBuilder(componentProvider, DeploymentCategory.PRODUCTION);
+            final IsisSessionFactoryBuilder isisSessionFactoryBuilder = new IsisSessionFactoryBuilder(componentProvider, DeploymentCategory.PRODUCTION, appManifestIfAny);
 
             // ensures that a FixtureClock is installed as the singleton underpinning the ClockService
             FixtureClock.initialize();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index 1d05ba9..60cce85 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@ -47,6 +47,9 @@ public class GridServiceDefault implements GridService {
     public static final String COMMON_TNS = "http://isis.apache.org/applib/layout/component";
     public static final String COMMON_SCHEMA_LOCATION = "http://isis.apache.org/applib/layout/component/component.xsd";
 
+    public static final String LINKS_TNS = "http://isis.apache.org/applib/layout/links";
+    public static final String LINKS_SCHEMA_LOCATION = "http://isis.apache.org/applib/layout/links/links.xsd";
+
     // //////////////////////////////////////
 
     @Override
@@ -141,8 +144,13 @@ public class GridServiceDefault implements GridService {
     @Programmatic
     public String tnsAndSchemaLocation(final Grid grid) {
         final List<String> parts = Lists.newArrayList();
+
         parts.add(COMMON_TNS);
         parts.add(COMMON_SCHEMA_LOCATION);
+
+        parts.add(LINKS_TNS);
+        parts.add(LINKS_SCHEMA_LOCATION);
+
         for (GridSystemService gridSystemService : gridSystemServices) {
             final Class<? extends Grid> gridImpl = gridSystemService.gridImplementation();
             if(gridImpl.isAssignableFrom(grid.getClass())) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
index f8f0a9c..7064abb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
@@ -21,17 +21,14 @@ import java.io.File;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.util.Collection;
-import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 import javax.xml.bind.Marshaller;
 
-import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,14 +45,10 @@ import org.apache.isis.applib.services.layout.LayoutService2;
 import org.apache.isis.applib.services.menu.MenuBarsService;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.services.grid.bootstrap3.GridSystemServiceBS3;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 
-import static org.apache.isis.core.metamodel.services.grid.GridServiceDefault.COMMON_SCHEMA_LOCATION;
-import static org.apache.isis.core.metamodel.services.grid.GridServiceDefault.COMMON_TNS;
-
 @DomainService(
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
@@ -149,22 +142,12 @@ public class LayoutServiceDefault implements LayoutService2 {
     @Programmatic
     @Override
     public String toMenuBarsXml() {
-        MenuBars menuBars = menuBarsService.menuBars();
-
-        // TODO: need something equivalent to GridSystemServiceBS3
-
-        final List<String> parts = Lists.newArrayList();
-        parts.add(COMMON_TNS);
-        parts.add(COMMON_SCHEMA_LOCATION);
-        parts.add(GridSystemServiceBS3.TNS);
-        parts.add(GridSystemServiceBS3.SCHEMA_LOCATION);
-
-        final String tnsAndSchemaLocation = Joiner.on(" ").join(parts);
+        final MenuBars menuBars = menuBarsService.menuBars();
 
         return jaxbService.toXml(menuBars,
                 ImmutableMap.<String,Object>of(
                         Marshaller.JAXB_SCHEMA_LOCATION,
-                        tnsAndSchemaLocation
+                        menuBars.getTnsAndSchemaLocation()
                 ));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/menubars/MenuBarsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/menubars/MenuBarsTest.java
new file mode 100644
index 0000000..759b812
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/menubars/MenuBarsTest.java
@@ -0,0 +1,60 @@
+/*
+ *  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.menubars;
+
+import java.net.URL;
+import java.util.Map;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Resources;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.layout.menus.MenuBars;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+
+public class MenuBarsTest {
+
+    private JaxbService jaxbService;
+
+    @Before
+    public void setUp() throws Exception {
+        jaxbService = new JaxbService.Simple();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void happy_case() throws Exception {
+
+        URL resource = Resources.getResource(getClass(), "menubars.layout.xml");
+        MenuBars menuBars = jaxbService.fromXml(MenuBars.class, Resources.toString(resource, Charsets.UTF_8));
+
+        Map<String, String> schemas = jaxbService.toXsd(menuBars, JaxbService.IsisSchemas.INCLUDE);
+        for (Map.Entry<String, String> entry : schemas.entrySet()) {
+            System.out.println(entry.getKey() + ":");
+            System.out.println(entry.getValue());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/services/menubars/menubars.layout.xml b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/services/menubars/menubars.layout.xml
new file mode 100644
index 0000000..4c345ef
--- /dev/null
+++ b/core/metamodel/src/test/resources/org/apache/isis/core/metamodel/services/menubars/menubars.layout.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<mnu:menuBars xsi:schemaLocation="http://isis.apache.org/applib/layout/menus http://isis.apache.org/applib/layout/menus/menus.xsd" xmlns:mnu="http://isis.apache.org/applib/layout/menus" xmlns:lnk="http://isis.apache.org/applib/layout/links" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <mnu:primary>
+        <mnu:menu>
+            <mnu:named>Hello World Objects</mnu:named>
+            <mnu:section>
+                <mnu:action oid="helloworld.HelloWorldObjects:1" id="create">
+                    <mnu:named>Create</mnu:named>
+                </mnu:action>
+                <mnu:action oid="helloworld.HelloWorldObjects:1" id="findByName">
+                    <mnu:named>Find By Name</mnu:named>
+                </mnu:action>
+                <mnu:action oid="helloworld.HelloWorldObjects:1" id="listAll">
+                    <mnu:named>List All</mnu:named>
+                </mnu:action>
+            </mnu:section>
+        </mnu:menu>
+    </mnu:primary>
+    <mnu:secondary>
+        <mnu:menu>
+            <mnu:named>Prototyping</mnu:named>
+            <mnu:section>
+                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScript">
+                    <mnu:named>Run Fixture Script</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScriptWithAutoComplete">
+                    <mnu:named>Run Fixture Script</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="recreateObjectsAndReturnFirst">
+                    <mnu:named>Recreate Objects And Return First</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.LayoutServiceMenu:1" id="downloadLayouts">
+                    <mnu:named>Download Layouts (ZIP)</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.LayoutServiceMenu:1" id="downloadMenuBarsLayout">
+                    <mnu:named>Download Menu Bars Layout (XML)</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.MetaModelServicesMenu:1" id="downloadMetaModel">
+                    <mnu:named>Download Meta Model (CSV)</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="openSwaggerUi">
+                    <mnu:named>Open Swagger Ui</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="openRestApi">
+                    <mnu:named>Open Rest Api</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="downloadSwaggerSchemaDefinition">
+                    <mnu:named>Download Swagger Schema Definition</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="downloadTranslations">
+                    <mnu:named>Download Translations</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="resetTranslationCache">
+                    <mnu:named>Clear translation cache</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToReadingTranslations">
+                    <mnu:named>Switch To Reading Translations</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToWritingTranslations">
+                    <mnu:named>Switch To Writing Translations</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.HsqlDbManagerMenu:1" id="hsqlDbManager">
+                    <mnu:named>HSQL DB Manager</mnu:named>
+                </mnu:action>
+            </mnu:section>
+        </mnu:menu>
+    </mnu:secondary>
+    <mnu:tertiary>
+        <mnu:menu>
+            <mnu:named>Configuration Service Menu</mnu:named>
+            <mnu:section>
+                <mnu:action oid="isisApplib.ConfigurationServiceMenu:1" id="configuration">
+                    <mnu:named>Configuration</mnu:named>
+                </mnu:action>
+            </mnu:section>
+        </mnu:menu>
+    </mnu:tertiary>
+</mnu:menuBars>
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
index f317dc5..1d9f3cd 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
@@ -111,7 +111,7 @@ public class IsisInjectModule extends AbstractModule {
         final IsisComponentProviderUsingInstallers componentProvider =
                 new IsisComponentProviderUsingInstallers(appManifest, isisConfiguration);
 
-        final IsisSessionFactoryBuilder builder = new IsisSessionFactoryBuilder(componentProvider, deploymentCategory);
+        final IsisSessionFactoryBuilder builder = new IsisSessionFactoryBuilder(componentProvider, deploymentCategory, componentProvider.getAppManifest());
 
         // as a side-effect, if the metamodel turns out to be invalid, then
         // this will push the MetaModelInvalidException into IsisContext.
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsLoaderServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsLoaderServiceDefault.java
new file mode 100644
index 0000000..07f55ce
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsLoaderServiceDefault.java
@@ -0,0 +1,67 @@
+/*
+ *  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.runtime.services.menu;
+
+import java.io.IOException;
+import java.net.URL;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Resources;
+
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.layout.menus.MenuBars;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.applib.services.menu.MenuBarsLoaderService;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+
+@DomainService(nature = NatureOfService.DOMAIN)
+public class MenuBarsLoaderServiceDefault implements MenuBarsLoaderService {
+
+    @Override
+    public boolean supportsReloading() {
+        return !deploymentCategoryProvider.getDeploymentCategory().isProduction();
+    }
+
+    @Override
+    public MenuBars menuBars() {
+        final AppManifest appManifest = isisSessionFactory.getAppManifest();
+        final URL resource = Resources.getResource(appManifest.getClass(), "menubars.layout.xml");
+        try {
+            String xml = Resources.toString(resource, Charsets.UTF_8);
+
+            return jaxbService.fromXml(MenuBars.class, xml);
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+    @javax.inject.Inject
+    DeploymentCategoryProvider deploymentCategoryProvider;
+
+    @javax.inject.Inject
+    JaxbService jaxbService;
+
+    @javax.inject.Inject
+    IsisSessionFactory isisSessionFactory;
+
+}
+
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsServiceDefault.java
index 684b365..d476586 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/menu/MenuBarsServiceDefault.java
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
 import com.google.common.collect.FluentIterable;
@@ -41,6 +42,7 @@ import org.apache.isis.applib.layout.menus.Menu;
 import org.apache.isis.applib.layout.menus.MenuBar;
 import org.apache.isis.applib.layout.menus.MenuBars;
 import org.apache.isis.applib.layout.menus.MenuSection;
+import org.apache.isis.applib.services.menu.MenuBarsLoaderService;
 import org.apache.isis.applib.services.menu.MenuBarsService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.NotInServiceMenuFacet;
@@ -48,6 +50,7 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacet;
+import org.apache.isis.core.metamodel.services.grid.GridServiceDefault;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -57,28 +60,48 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 @DomainService(nature = NatureOfService.DOMAIN)
 public class MenuBarsServiceDefault implements MenuBarsService {
 
+    public static final String MENUS_TNS = "http://isis.apache.org/applib/layout/menus";
+    public static final String MENUS_SCHEMA_LOCATION = "http://isis.apache.org/applib/layout/menus/menus.xsd";
+
+    public static final String LINKS_TNS = GridServiceDefault.LINKS_TNS;
+    public static final String LINKS_SCHEMA_LOCATION = GridServiceDefault.LINKS_SCHEMA_LOCATION;
+
     MenuBars menuBars;
 
-    @Override @Programmatic
+    @Override
+    @Programmatic
     public MenuBars menuBars() {
 
-        if(menuBars == null) {
-
-            MenuBars menuBars = new MenuBars();
+        if(menuBars == null || menuBarsLoaderService.supportsReloading()) {
 
-            final List<ObjectAdapter> serviceAdapters =
-                    isisSessionFactory.getCurrentSession().getPersistenceSession().getServices();
+            MenuBars menuBars = menuBarsLoaderService.menuBars();
 
-            append(serviceAdapters, menuBars.getPrimary(), DomainServiceLayout.MenuBar.PRIMARY);
-            append(serviceAdapters, menuBars.getSecondary(), DomainServiceLayout.MenuBar.SECONDARY);
-            append(serviceAdapters, menuBars.getTertiary(), DomainServiceLayout.MenuBar.TERTIARY);
+            if(menuBars == null) {
+                menuBars = deriveMenuBarsFromMetaModelFacets();
+            }
 
             this.menuBars = menuBars;
         }
 
+        menuBars.setTnsAndSchemaLocation(tnsAndSchemaLocation());
+
+        return menuBars;
+    }
+
+    private MenuBars deriveMenuBarsFromMetaModelFacets() {
+        final MenuBars menuBars;// fallback
+        menuBars = new MenuBars();
+
+        final List<ObjectAdapter> serviceAdapters =
+                isisSessionFactory.getCurrentSession().getPersistenceSession().getServices();
+
+        append(serviceAdapters, menuBars.getPrimary(), DomainServiceLayout.MenuBar.PRIMARY);
+        append(serviceAdapters, menuBars.getSecondary(), DomainServiceLayout.MenuBar.SECONDARY);
+        append(serviceAdapters, menuBars.getTertiary(), DomainServiceLayout.MenuBar.TERTIARY);
         return menuBars;
     }
 
+
     private void append(
             final List<ObjectAdapter> serviceAdapters,
             final MenuBar menuBar,
@@ -237,9 +260,26 @@ public class MenuBarsServiceDefault implements MenuBarsService {
         };
     }
 
+
+    private String tnsAndSchemaLocation() {
+        final List<String> parts = Lists.newArrayList();
+
+        parts.add(MENUS_TNS);
+        parts.add(MENUS_SCHEMA_LOCATION);
+
+        parts.add(LINKS_TNS);
+        parts.add(LINKS_SCHEMA_LOCATION);
+
+        return Joiner.on(" ").join(parts);
+    }
+
+
     @Inject
     IsisSessionFactory isisSessionFactory;
 
+    @Inject
+    MenuBarsLoaderService menuBarsLoaderService;
+
 
 }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
index a2650b8..558d494 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
@@ -28,6 +28,7 @@ import com.google.common.collect.Lists;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.applib.services.i18n.TranslationService;
@@ -71,7 +72,7 @@ public class IsisSessionFactory implements ApplicationScopedComponent {
     @SuppressWarnings("unused")
     private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactory.class);
 
-    //region > constructor, fields
+    //region > constructor, fields, accessors
 
     private final DeploymentCategory deploymentCategory;
     private final IsisConfiguration configuration;
@@ -80,10 +81,12 @@ public class IsisSessionFactory implements ApplicationScopedComponent {
     private final AuthenticationManager authenticationManager;
     private final AuthorizationManager authorizationManager;
     private final PersistenceSessionFactory persistenceSessionFactory;
+    private final AppManifest appManifest;
 
     public IsisSessionFactory(
             final DeploymentCategory deploymentCategory,
-            final ServicesInjector servicesInjector) {
+            final ServicesInjector servicesInjector,
+            final AppManifest appManifest) {
 
         this.servicesInjector = servicesInjector;
         this.deploymentCategory = deploymentCategory;
@@ -93,8 +96,12 @@ public class IsisSessionFactory implements ApplicationScopedComponent {
         this.authenticationManager = servicesInjector.getAuthenticationManager();
         this.authorizationManager = servicesInjector.getAuthorizationManager();
         this.persistenceSessionFactory = servicesInjector.lookupServiceElseFail(PersistenceSessionFactory.class);
+        this.appManifest = appManifest;
     }
 
+    public AppManifest getAppManifest() {
+        return appManifest;
+    }
 
     //endregion
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
index 3002b3f..8cd1e81 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
@@ -58,22 +58,27 @@ public class IsisSessionFactoryBuilder {
 
     private boolean initialized = false;
 
-    //region > constructors, fields
+    //region > constructors, accessors
 
     private final IsisComponentProvider componentProvider;
     private final DeploymentCategory deploymentCategory;
+    private final AppManifest appManifest;
 
     private final IsisLocaleInitializer localeInitializer;
     private final IsisTimeZoneInitializer timeZoneInitializer;
 
-    public IsisSessionFactoryBuilder(final AppManifest manifest) {
-        this(new IsisComponentProviderDefault2(manifest, null), DeploymentCategory.PRODUCTION);
+    public IsisSessionFactoryBuilder(final AppManifest appManifest) {
+        this(new IsisComponentProviderDefault2(appManifest, null), DeploymentCategory.PRODUCTION, appManifest);
     }
 
-    public IsisSessionFactoryBuilder(final IsisComponentProvider componentProvider, final DeploymentCategory deploymentCategory) {
+    public IsisSessionFactoryBuilder(
+            final IsisComponentProvider componentProvider,
+            final DeploymentCategory deploymentCategory,
+            final AppManifest appManifest) {
 
         this.componentProvider = componentProvider;
         this.deploymentCategory = deploymentCategory;
+        this.appManifest = appManifest;
 
         this.localeInitializer = new IsisLocaleInitializer();
         this.timeZoneInitializer = new IsisTimeZoneInitializer();
@@ -82,8 +87,12 @@ public class IsisSessionFactoryBuilder {
     public DeploymentCategory getDeploymentCategory() {
         return deploymentCategory;
     }
-    //endregion
 
+    public AppManifest getAppManifest() {
+        return appManifest;
+    }
+
+    //endregion
 
     //region > buildSessionFactory
 
@@ -151,7 +160,7 @@ public class IsisSessionFactoryBuilder {
             servicesInjector.validateServices();
 
             // instantiate the IsisSessionFactory
-            isisSessionFactory = new IsisSessionFactory(deploymentCategory, servicesInjector);
+            isisSessionFactory = new IsisSessionFactory(deploymentCategory, servicesInjector, appManifest);
 
 
             // now, add the IsisSessionFactory itself into ServicesInjector, so it can be @javax.inject.Inject'd
diff --git a/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml b/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml
new file mode 100644
index 0000000..84034a0
--- /dev/null
+++ b/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<mnu:menuBars xsi:schemaLocation="http://isis.apache.org/applib/layout/menus http://isis.apache.org/applib/layout/menus/menus.xsd" xmlns:mnu="http://isis.apache.org/applib/layout/menus" xmlns:lnk="http://isis.apache.org/applib/layout/links" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <mnu:primary>
+        <mnu:menu>
+            <mnu:named>Hello World Objects</mnu:named>
+            <mnu:section>
+                <mnu:action oid="helloworld.HelloWorldObjects:1" id="create">
+                    <mnu:named>Create</mnu:named>
+                </mnu:action>
+                <mnu:action oid="helloworld.HelloWorldObjects:1" id="listAll">
+                    <mnu:named>List All</mnu:named>
+                </mnu:action>
+                <mnu:action oid="helloworld.HelloWorldObjects:1" id="findByName">
+                    <mnu:named>Find By Name</mnu:named>
+                </mnu:action>
+            </mnu:section>
+        </mnu:menu>
+    </mnu:primary>
+    <mnu:secondary>
+        <mnu:menu>
+            <mnu:named>Prototyping</mnu:named>
+            <mnu:section>
+                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScript">
+                    <mnu:named>Run Fixture Script</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScriptWithAutoComplete">
+                    <mnu:named>Run Fixture Script</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="recreateObjectsAndReturnFirst">
+                    <mnu:named>Recreate Objects And Return First</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.LayoutServiceMenu:1" id="downloadLayouts">
+                    <mnu:named>Download Layouts (ZIP)</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.LayoutServiceMenu:1" id="downloadMenuBarsLayout">
+                    <mnu:named>Download Menu Bars Layout (XML)</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.MetaModelServicesMenu:1" id="downloadMetaModel">
+                    <mnu:named>Download Meta Model (CSV)</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="openSwaggerUi">
+                    <mnu:named>Open Swagger Ui</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="openRestApi">
+                    <mnu:named>Open Rest Api</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="downloadSwaggerSchemaDefinition">
+                    <mnu:named>Download Swagger Schema Definition</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="downloadTranslations">
+                    <mnu:named>Download Translations</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="resetTranslationCache">
+                    <mnu:named>Clear translation cache</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToReadingTranslations">
+                    <mnu:named>Switch To Reading Translations</mnu:named>
+                </mnu:action>
+                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToWritingTranslations">
+                    <mnu:named>Switch To Writing Translations</mnu:named>
+                </mnu:action>
+            </mnu:section>
+            <mnu:section>
+                <mnu:action oid="isisApplib.HsqlDbManagerMenu:1" id="hsqlDbManager">
+                    <mnu:named>HSQL DB Manager</mnu:named>
+                </mnu:action>
+            </mnu:section>
+        </mnu:menu>
+    </mnu:secondary>
+    <mnu:tertiary>
+        <mnu:menu>
+            <mnu:named>Configuration Service Menu</mnu:named>
+            <mnu:section>
+                <mnu:action oid="isisApplib.ConfigurationServiceMenu:1" id="configuration">
+                    <mnu:named>Configuration</mnu:named>
+                </mnu:action>
+            </mnu:section>
+        </mnu:menu>
+    </mnu:tertiary>
+</mnu:menuBars>

-- 
To stop receiving notification emails like this one, please contact
"commits@isis.apache.org" <co...@isis.apache.org>.