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>.