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 11:49:27 UTC

[isis] branch master updated (c1d590c -> 8814a04)

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

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


    from c1d590c  ISIS-1766: adds some documentation about MenuBarsSevice and MenuBarsLoaderService and the new MenuBars layout classes.  Also...
     new 6c83e36  ISIS-1766: adds the ability to download a fallback menubars.layout.xml.
     new 8814a04  ISIS-1766: changes ServiceActionLayoutData#oid to just #objectType

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../main/asciidoc/applib/layout/menus/menubars.xsd |  2 +-
 ...esentation-layer-spi_MenuBarsLoaderService.adoc | 16 ++------
 ...svc_presentation-layer-spi_MenuBarsService.adoc | 29 ++++++--------
 .../layout/menus/ServiceActionLayoutData.java      | 18 ++++-----
 .../applib/services/layout/LayoutService2.java     |  4 +-
 .../applib/services/layout/LayoutServiceMenu.java  | 13 +++++--
 .../isis/applib/services/menu/MenuBarsService.java | 20 ++++++++++
 .../layout/menus/MenuBars_roundtrip_Test.java      | 10 ++---
 .../services/layout/LayoutServiceDefault.java      |  4 +-
 .../services/menubars/menubars.layout.xml          | 40 ++++++++++----------
 .../services/menu/MenuBarsServiceDefault.java      | 20 ++++++++--
 .../system/persistence/PersistenceSession.java     |  5 ++-
 .../resources/MenuBarsResourceServerside.java      |  6 +--
 .../serviceactions/ServiceActionUtil.java          |  8 +++-
 .../java/domainapp/application/menubars.layout.xml | 44 +++++++++++-----------
 15 files changed, 136 insertions(+), 103 deletions(-)

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

[isis] 01/02: ISIS-1766: adds the ability to download a fallback menubars.layout.xml.

Posted by da...@apache.org.
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 6c83e3693f3053004c0d38c91729b38a8e14fa94
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Nov 1 11:27:30 2017 +0000

    ISIS-1766: adds the ability to download a fallback menubars.layout.xml.
    
    Also updates some docs
---
 ...esentation-layer-spi_MenuBarsLoaderService.adoc | 16 +++---------
 ...svc_presentation-layer-spi_MenuBarsService.adoc | 29 +++++++++-------------
 .../applib/services/layout/LayoutService2.java     |  4 ++-
 .../applib/services/layout/LayoutServiceMenu.java  | 13 +++++++---
 .../isis/applib/services/menu/MenuBarsService.java | 20 +++++++++++++++
 .../services/layout/LayoutServiceDefault.java      |  4 +--
 .../services/menubars/menubars.layout.xml          |  2 +-
 .../services/menu/MenuBarsServiceDefault.java      | 16 ++++++++++--
 .../java/domainapp/application/menubars.layout.xml |  8 +++---
 9 files changed, 69 insertions(+), 43 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsLoaderService.adoc b/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsLoaderService.adoc
index b67e97d..cc0cac4 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsLoaderService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsLoaderService.adoc
@@ -6,17 +6,10 @@
 
 
 
-The `MenuBarsLoaderService` is used by the default implementation of xref:rgsvc.adoc#_rgsvc_presentation-layer-spi_MenuBarsService[MenuBarsService] to return a `MenuBars` instance read from the classpath.
+The `MenuBarsLoaderService` is used by the default implementation of xref:rgsvc.adoc#_rgsvc_presentation-layer-spi_MenuBarsService[MenuBarsService] to return a a xref:../rgcms/rgcms.adoc#_rgcms_classes_menubars[`MenuBars`] instance deserialized from the `menubars.layout.xml` file read from the classpath.
 
 
-
-[NOTE]
-====
-TODO: need to flesh this out...
-====
-
-
-== SPI
+== SPI and Implementation
 
 The SPI defined by this service is:
 
@@ -32,9 +25,8 @@ If not, then the xref:rgsvc.adoc#_rgsvc_presentation-layer-spi_MenuBarsService[M
 <2> Returns a new instance of `MenuBars` if possible, otherwise null.
 
 
+The framework provides a default implementation of this service, namely `o.a.i.core.runtime.services.menu.MenuBarsLayoutServiceDefault`.
 
-== Implementation
+This searches for a file resource `menubars.layout.xml`, expected to reside in the same package as the `AppManifest` used to bootstrap the application.
 
-The framework provides a default implementation of this service, namely `o.a.i.core.runtime.services.menu.MenuBarsLayoutServiceDefault`.
-This searches for a file resource `menubars.layout.xml` in the same package as the `AppManifest` used to bootstrap the application.
 It supports reloading only in prototype mode.
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsService.adoc b/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsService.adoc
index 583e0d4..b13ebd5 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_MenuBarsService.adoc
@@ -6,35 +6,30 @@
 
 
 
-The `MenuBarsService` is responsible for returning a `MenuBars` instance, a data structure representing the arrangement of domain service actions across multiple menu bars, menus and sections.
+The `MenuBarsService` is responsible for returning a xref:../rgcms/rgcms.adoc#_rgcms_classes_menubars[`MenuBars`] instance, a data structure representing the arrangement of domain service actions across multiple menu bars, menus and sections.
 This is used by the Wicket viewer to build up the menu, and is also served as the "menuBars" resource by the xref:../ugvro/ugvro.adoc#[Restful Objects] viewer.
 
 
-[NOTE]
-====
-TODO: need to flesh this out...
-====
 
-
-== SPI
+== SPI and Implementation
 
 The SPI defined by this service is:
 
 [source,java]
 ----
 public interface MenuBarsService {
-    MenuBars menuBars();                    // <1>
+    enum Strategy {                         // <1>
+        DEFAULT,
+        FALLBACK
+    }
+    MenuBars menuBars();                    // <2>
+    MenuBars menuBars(Strategy strategy);   // <3>
 }
 ----
-<1> An instance of `MenuBars`.
-
-[NOTE]
-====
-TODO: need to document `MenuBars` in the rgcms.adoc guide.
-====
-
+<1> Select whether to return the "default" `MenuBars` instance - which may be obtained from anywhere, eg read from the classpath, or to "fallback"" and derive from the metamodel facet/annotations.
+<2> Convenience API to return the default `MenuBars` instance
+<3> Returns an instance of `MenuBars` according the specified strategy.
 
-== Implementation
 
 The framework provides a default implementation of this service, namely `o.a.i.core.runtime.services.menu.MenuBarsServiceDefault`.
-This uses the xref:rgsvc.adoc#_rgsvc_presentation-layer-spi_MenuBarsLoaderService[MenuBarsLoaderService]
\ No newline at end of file
+This uses the xref:rgsvc.adoc#_rgsvc_presentation-layer-spi_MenuBarsLoaderService[MenuBarsLoaderService] to load a serialized form of `MenuBars` instance, called `menubars.layout.xml`, from the classpath.
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService2.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService2.java
index fde7b16..06aa829 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService2.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutService2.java
@@ -24,7 +24,9 @@ public interface LayoutService2 extends LayoutService {
 
     /**
      * Obtains the serialized XML form of the menu bars layout ({@link MenuBarsService}).
+     * @param type - either the current menubars (could be loaded from a file) or the fallback (obtained from metamodel facets)
      */
     @Programmatic
-    String toMenuBarsXml();
+    String toMenuBarsXml(final MenuBarsService.Type type);
+
 }
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java
index 30c9bb5..435b1ff 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/LayoutServiceMenu.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.menu.MenuBarsService;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
 
@@ -66,7 +67,7 @@ public class LayoutServiceMenu {
     )
     @ActionLayout(
             cssClassFa = "fa-download",
-            named = "Download Layouts (ZIP)"
+            named = "Download Object Layouts (ZIP)"
     )
     @MemberOrder(sequence="500.400.1")
     public Blob downloadLayouts(final LayoutService.Style style) {
@@ -95,10 +96,10 @@ public class LayoutServiceMenu {
     )
     @MemberOrder(sequence="500.400.2")
     public Clob downloadMenuBarsLayout(
-            @ParameterLayout(named = "File name")
-            final String fileName) {
+            @ParameterLayout(named = "File name") final String fileName,
+            final MenuBarsService.Type type) {
 
-        final String xml = layoutService.toMenuBarsXml();
+        final String xml = layoutService.toMenuBarsXml(type);
 
         return new Clob(Util.withSuffix(fileName,  ".xml"), "text/xml", xml);
     }
@@ -107,6 +108,10 @@ public class LayoutServiceMenu {
         return "menubars.layout.xml";
     }
 
+    public MenuBarsService.Type default1DownloadMenuBarsLayout() {
+        return MenuBarsService.Type.DEFAULT;
+    }
+
 
     // //////////////////////////////////////
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java b/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java
index c1e0b1b..298da1d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java
@@ -22,6 +22,26 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.layout.menus.MenuBars;
 
 public interface MenuBarsService {
+
+    enum Type {
+        /**
+         * Either derived from annotations or as obtained elsewhere (eg using the {@link MenuBarsLoaderService} if the
+         * default implementation of this service is in use).
+         */
+        DEFAULT,
+        /**
+         * As derived from annotations.
+         */
+        FALLBACK
+    }
+
+    /**
+     * Returns {@link #menuBars()} with a type of {@link Type#DEFAULT}.
+     * @return
+     */
     @Programmatic
     MenuBars menuBars();
+
+    @Programmatic
+    MenuBars menuBars(final Type type);
 }
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 7064abb..c27b262 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
@@ -141,8 +141,8 @@ public class LayoutServiceDefault implements LayoutService2 {
 
     @Programmatic
     @Override
-    public String toMenuBarsXml() {
-        final MenuBars menuBars = menuBarsService.menuBars();
+    public String toMenuBarsXml(final MenuBarsService.Type type) {
+        final MenuBars menuBars = menuBarsService.menuBars(type);
 
         return jaxbService.toXml(menuBars,
                 ImmutableMap.<String,Object>of(
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
index 4c345ef..0a7b7a3 100644
--- 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
@@ -1,5 +1,5 @@
 <?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:menuBars xsi:schemaLocation="http://isis.apache.org/applib/layout/menus http://isis.apache.org/applib/layout/menus/menus.xsd http://isis.apache.org/applib/layout/links http://isis.apache.org/applib/layout/links/links.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>
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 86b2dde..bf7c584 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
@@ -71,7 +71,18 @@ public class MenuBarsServiceDefault implements MenuBarsService {
     @Override
     @Programmatic
     public MenuBars menuBars() {
+        return menuBars(Type.DEFAULT);
+    }
+
+    @Override
+    @Programmatic
+    public MenuBars menuBars(final Type type) {
+
+        if(type == Type.FALLBACK) {
+            return deriveMenuBarsFromMetaModelFacets();
+        }
 
+        // else load (and only fallback if nothing could be loaded)...
         if(menuBars == null || menuBarsLoaderService.supportsReloading()) {
 
             MenuBars menuBars = menuBarsLoaderService.menuBars();
@@ -83,8 +94,6 @@ public class MenuBarsServiceDefault implements MenuBarsService {
             this.menuBars = menuBars;
         }
 
-        menuBars.setTnsAndSchemaLocation(tnsAndSchemaLocation());
-
         return menuBars;
     }
 
@@ -98,6 +107,9 @@ public class MenuBarsServiceDefault implements MenuBarsService {
         append(serviceAdapters, menuBars.getPrimary(), DomainServiceLayout.MenuBar.PRIMARY);
         append(serviceAdapters, menuBars.getSecondary(), DomainServiceLayout.MenuBar.SECONDARY);
         append(serviceAdapters, menuBars.getTertiary(), DomainServiceLayout.MenuBar.TERTIARY);
+
+        menuBars.setTnsAndSchemaLocation(tnsAndSchemaLocation());
+
         return menuBars;
     }
 
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
index 84034a0..0a7b7a3 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml
+++ b/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml
@@ -1,5 +1,5 @@
 <?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:menuBars xsi:schemaLocation="http://isis.apache.org/applib/layout/menus http://isis.apache.org/applib/layout/menus/menus.xsd http://isis.apache.org/applib/layout/links http://isis.apache.org/applib/layout/links/links.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>
@@ -7,12 +7,12 @@
                 <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:action oid="helloworld.HelloWorldObjects:1" id="listAll">
+                    <mnu:named>List All</mnu:named>
+                </mnu:action>
             </mnu:section>
         </mnu:menu>
     </mnu:primary>

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

[isis] 02/02: ISIS-1766: changes ServiceActionLayoutData#oid to just #objectType

Posted by da...@apache.org.
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 8814a046a20ad65a5d787ed0392b38ae2d88e1c1
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Nov 1 11:49:05 2017 +0000

    ISIS-1766: changes ServiceActionLayoutData#oid to just #objectType
---
 .../main/asciidoc/applib/layout/menus/menubars.xsd |  2 +-
 .../layout/menus/ServiceActionLayoutData.java      | 18 +++++-----
 .../layout/menus/MenuBars_roundtrip_Test.java      | 10 +++---
 .../services/menubars/menubars.layout.xml          | 38 +++++++++++-----------
 .../services/menu/MenuBarsServiceDefault.java      |  4 +--
 .../system/persistence/PersistenceSession.java     |  5 ++-
 .../resources/MenuBarsResourceServerside.java      |  6 ++--
 .../serviceactions/ServiceActionUtil.java          |  8 +++--
 .../java/domainapp/application/menubars.layout.xml | 38 +++++++++++-----------
 9 files changed, 68 insertions(+), 61 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd
index 15f440b..28a5250 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/menus/menubars.xsd
@@ -55,7 +55,7 @@
             <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="objectType" 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"/>
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/ServiceActionLayoutData.java b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/ServiceActionLayoutData.java
index 57612f1..df671ec 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/menus/ServiceActionLayoutData.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/menus/ServiceActionLayoutData.java
@@ -43,7 +43,7 @@ import org.apache.isis.applib.layout.links.Link;
 @XmlType(
     name = "action"
     , propOrder = {
-        "oid"
+        "objectType"
         , "id"
         , "named"
         , "namedEscaped"
@@ -62,21 +62,21 @@ public class ServiceActionLayoutData implements Serializable {
 
     public ServiceActionLayoutData() {
     }
-    public ServiceActionLayoutData(final String oid, final String id) {
-        this.oid = oid;
+    public ServiceActionLayoutData(final String objectType, final String id) {
+        this.objectType = objectType;
         this.id = id;
     }
 
 
-    private String oid;
+    private String objectType;
 
     @XmlAttribute(required = true)
-    public String getOid() {
-        return oid;
+    public String getObjectType() {
+        return objectType;
     }
 
-    public void setOid(final String oid) {
-        this.oid = oid;
+    public void setObjectType(final String objectType) {
+        this.objectType = objectType;
     }
 
 
@@ -234,7 +234,7 @@ public class ServiceActionLayoutData implements Serializable {
     @Override
     public String toString() {
         return "ActionLayoutData{" +
-                "oid='" + oid + '\'' +
+                "oid='" + objectType + '\'' +
                 ", id='" + id + '\'' +
                 '}';
     }
diff --git a/core/applib/src/test/java/org/apache/isis/applib/layout/menus/MenuBars_roundtrip_Test.java b/core/applib/src/test/java/org/apache/isis/applib/layout/menus/MenuBars_roundtrip_Test.java
index 4923cc3..c29bc4b 100644
--- a/core/applib/src/test/java/org/apache/isis/applib/layout/menus/MenuBars_roundtrip_Test.java
+++ b/core/applib/src/test/java/org/apache/isis/applib/layout/menus/MenuBars_roundtrip_Test.java
@@ -49,14 +49,14 @@ public class MenuBars_roundtrip_Test {
         menu.setNamed("Parties");
 
         MenuSection organisationMenu = new MenuSection();
-        organisationMenu.getActions().add(new ServiceActionLayoutData("parties.OrganisationMenu:1", "findByReference"));
-        organisationMenu.getActions().add(new ServiceActionLayoutData("parties.OrganisationMenu:1", "findByName"));
-        organisationMenu.getActions().add(new ServiceActionLayoutData("parties.OrganisationMenu:1", "create"));
+        organisationMenu.getActions().add(new ServiceActionLayoutData("parties.OrganisationMenu", "findByReference"));
+        organisationMenu.getActions().add(new ServiceActionLayoutData("parties.OrganisationMenu", "findByName"));
+        organisationMenu.getActions().add(new ServiceActionLayoutData("parties.OrganisationMenu", "create"));
         menu.getSections().add(organisationMenu);
 
         MenuSection personMenu = new MenuSection();
-        personMenu.getActions().add(new ServiceActionLayoutData("parties.PersonMenu:1", "findByUsername"));
-        personMenu.getActions().add(new ServiceActionLayoutData("parties.PersonMenu:1", "create"));
+        personMenu.getActions().add(new ServiceActionLayoutData("parties.PersonMenu", "findByUsername"));
+        personMenu.getActions().add(new ServiceActionLayoutData("parties.PersonMenu", "create"));
         menu.getSections().add(personMenu);
 
         menuBars.getPrimary().getMenus().add(menu);
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
index 0a7b7a3..9adb982 100644
--- 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
@@ -4,13 +4,13 @@
         <mnu:menu>
             <mnu:named>Hello World Objects</mnu:named>
             <mnu:section>
-                <mnu:action oid="helloworld.HelloWorldObjects:1" id="create">
+                <mnu:action objectType="helloworld.HelloWorldObjects" id="create">
                     <mnu:named>Create</mnu:named>
                 </mnu:action>
-                <mnu:action oid="helloworld.HelloWorldObjects:1" id="findByName">
+                <mnu:action objectType="helloworld.HelloWorldObjects" id="findByName">
                     <mnu:named>Find By Name</mnu:named>
                 </mnu:action>
-                <mnu:action oid="helloworld.HelloWorldObjects:1" id="listAll">
+                <mnu:action objectType="helloworld.HelloWorldObjects" id="listAll">
                     <mnu:named>List All</mnu:named>
                 </mnu:action>
             </mnu:section>
@@ -20,56 +20,56 @@
         <mnu:menu>
             <mnu:named>Prototyping</mnu:named>
             <mnu:section>
-                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScript">
+                <mnu:action objectType="isisApplib.FixtureScriptsDefault" id="runFixtureScript">
                     <mnu:named>Run Fixture Script</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScriptWithAutoComplete">
+                <mnu:action objectType="isisApplib.FixtureScriptsDefault" id="runFixtureScriptWithAutoComplete">
                     <mnu:named>Run Fixture Script</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="recreateObjectsAndReturnFirst">
+                <mnu:action objectType="isisApplib.FixtureScriptsDefault" 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 objectType="isisApplib.LayoutServiceMenu" id="downloadLayouts">
+                    <mnu:named>Download Object Layouts (ZIP)</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.LayoutServiceMenu:1" id="downloadMenuBarsLayout">
+                <mnu:action objectType="isisApplib.LayoutServiceMenu" 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:action objectType="isisApplib.MetaModelServicesMenu" 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:action objectType="isisApplib.SwaggerServiceMenu" id="openSwaggerUi">
                     <mnu:named>Open Swagger Ui</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="openRestApi">
+                <mnu:action objectType="isisApplib.SwaggerServiceMenu" id="openRestApi">
                     <mnu:named>Open Rest Api</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="downloadSwaggerSchemaDefinition">
+                <mnu:action objectType="isisApplib.SwaggerServiceMenu" 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:action objectType="isisApplib.TranslationServicePoMenu" id="downloadTranslations">
                     <mnu:named>Download Translations</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="resetTranslationCache">
+                <mnu:action objectType="isisApplib.TranslationServicePoMenu" id="resetTranslationCache">
                     <mnu:named>Clear translation cache</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToReadingTranslations">
+                <mnu:action objectType="isisApplib.TranslationServicePoMenu" id="switchToReadingTranslations">
                     <mnu:named>Switch To Reading Translations</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToWritingTranslations">
+                <mnu:action objectType="isisApplib.TranslationServicePoMenu" 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:action objectType="isisApplib.HsqlDbManagerMenu" id="hsqlDbManager">
                     <mnu:named>HSQL DB Manager</mnu:named>
                 </mnu:action>
             </mnu:section>
@@ -79,7 +79,7 @@
         <mnu:menu>
             <mnu:named>Configuration Service Menu</mnu:named>
             <mnu:section>
-                <mnu:action oid="isisApplib.ConfigurationServiceMenu:1" id="configuration">
+                <mnu:action objectType="isisApplib.ConfigurationServiceMenu" id="configuration">
                     <mnu:named>Configuration</mnu:named>
                 </mnu:action>
             </mnu:section>
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 bf7c584..128b299 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
@@ -157,8 +157,8 @@ public class MenuBarsServiceDefault implements MenuBarsService {
                 }
 
                 ObjectAction objectAction = serviceAndAction.objectAction;
-                final String serviceOid = serviceAndAction.serviceAdapter.getOid().enString();
-                ServiceActionLayoutData action = new ServiceActionLayoutData(serviceOid, objectAction.getId());
+                final String objectType = serviceAndAction.serviceAdapter.getSpecification().getSpecId().asString();
+                ServiceActionLayoutData action = new ServiceActionLayoutData(objectType, objectAction.getId());
                 action.setNamed(objectAction.getName());
                 menuSection.getActions().add(action);
             }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index 2c090f7..1dfacc4 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -165,6 +165,9 @@ public class PersistenceSession implements
      * Append regular <a href="http://www.datanucleus.org/products/accessplatform/persistence_properties.html">datanucleus properties</a> to this key
      */
     public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
+
+    public static final String SERVICE_IDENTIFIER = "1";
+
     //endregion
 
     //region > constructor, fields, finalize()
@@ -2139,7 +2142,7 @@ public class PersistenceSession implements
     private RootOid newIdentifier(final Object pojo, final Type type) {
         final ObjectSpecification spec = objectSpecFor(pojo);
         if(spec.isService()) {
-            return newRootId(spec, "1", type);
+            return newRootId(spec, SERVICE_IDENTIFIER, type);
         }
 
         final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java
index b97ef4b..45ed298 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.layout.menus.MenuBars;
 import org.apache.isis.applib.layout.menus.MenuSection;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.menu.MenuBarsService;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
@@ -82,13 +83,12 @@ public class MenuBarsResourceServerside extends ResourceAbstract implements Menu
             for (MenuSection section : sections) {
                 List<ServiceActionLayoutData> actions = section.getActions();
                 for (ServiceActionLayoutData actionLayoutData : actions) {
-                    String oid = actionLayoutData.getOid();
-                    Bookmark bookmark = new Bookmark(oid);
+                    final String objectType = actionLayoutData.getObjectType();
                     Link link = new Link(
                             Rel.ACTION.getName(),
                             RestfulHttpMethod.GET.getJavaxRsMethod(),
                             getResourceContext().urlFor(
-                                    "objects/" + bookmark.getObjectType() + "/" + bookmark.getIdentifier() + "/actions/" + actionLayoutData.getId()
+                                    "objects/" + objectType + "/" + PersistenceSession.SERVICE_IDENTIFIER + "/actions/" + actionLayoutData.getId()
                             ),
                             RepresentationType.OBJECT_ACTION.getJsonMediaType().toString());
                     actionLayoutData.setLink(link);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index e2be143..1142a13 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -38,16 +38,18 @@ import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.applib.layout.menus.ServiceActionLayoutData;
 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.layout.menus.ServiceActionLayoutData;
+import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.system.IsisSystem;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ServiceActionsModel;
@@ -225,7 +227,9 @@ public final class ServiceActionUtil {
                 boolean firstSection = true;
 
                 for (final ServiceActionLayoutData actionLayoutData : menuSection.getActions()) {
-                    final String oid = actionLayoutData.getOid();
+                    final String objectType = actionLayoutData.getObjectType();
+                    final Bookmark bookmark = new Bookmark(objectType, PersistenceSession.SERVICE_IDENTIFIER);
+                    final String oid = bookmark.toString();
                     final ObjectAdapter serviceAdapter = serviceAdapterByOid.get(oid);
                     final EntityModel entityModel = new EntityModel(serviceAdapter);
                     final ObjectAction objectAction = serviceAdapter.getSpecification()
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
index 0a7b7a3..9adb982 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml
+++ b/example/application/helloworld/src/main/java/domainapp/application/menubars.layout.xml
@@ -4,13 +4,13 @@
         <mnu:menu>
             <mnu:named>Hello World Objects</mnu:named>
             <mnu:section>
-                <mnu:action oid="helloworld.HelloWorldObjects:1" id="create">
+                <mnu:action objectType="helloworld.HelloWorldObjects" id="create">
                     <mnu:named>Create</mnu:named>
                 </mnu:action>
-                <mnu:action oid="helloworld.HelloWorldObjects:1" id="findByName">
+                <mnu:action objectType="helloworld.HelloWorldObjects" id="findByName">
                     <mnu:named>Find By Name</mnu:named>
                 </mnu:action>
-                <mnu:action oid="helloworld.HelloWorldObjects:1" id="listAll">
+                <mnu:action objectType="helloworld.HelloWorldObjects" id="listAll">
                     <mnu:named>List All</mnu:named>
                 </mnu:action>
             </mnu:section>
@@ -20,56 +20,56 @@
         <mnu:menu>
             <mnu:named>Prototyping</mnu:named>
             <mnu:section>
-                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScript">
+                <mnu:action objectType="isisApplib.FixtureScriptsDefault" id="runFixtureScript">
                     <mnu:named>Run Fixture Script</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="runFixtureScriptWithAutoComplete">
+                <mnu:action objectType="isisApplib.FixtureScriptsDefault" id="runFixtureScriptWithAutoComplete">
                     <mnu:named>Run Fixture Script</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.FixtureScriptsDefault:1" id="recreateObjectsAndReturnFirst">
+                <mnu:action objectType="isisApplib.FixtureScriptsDefault" 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 objectType="isisApplib.LayoutServiceMenu" id="downloadLayouts">
+                    <mnu:named>Download Object Layouts (ZIP)</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.LayoutServiceMenu:1" id="downloadMenuBarsLayout">
+                <mnu:action objectType="isisApplib.LayoutServiceMenu" 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:action objectType="isisApplib.MetaModelServicesMenu" 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:action objectType="isisApplib.SwaggerServiceMenu" id="openSwaggerUi">
                     <mnu:named>Open Swagger Ui</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="openRestApi">
+                <mnu:action objectType="isisApplib.SwaggerServiceMenu" id="openRestApi">
                     <mnu:named>Open Rest Api</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.SwaggerServiceMenu:1" id="downloadSwaggerSchemaDefinition">
+                <mnu:action objectType="isisApplib.SwaggerServiceMenu" 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:action objectType="isisApplib.TranslationServicePoMenu" id="downloadTranslations">
                     <mnu:named>Download Translations</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="resetTranslationCache">
+                <mnu:action objectType="isisApplib.TranslationServicePoMenu" id="resetTranslationCache">
                     <mnu:named>Clear translation cache</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToReadingTranslations">
+                <mnu:action objectType="isisApplib.TranslationServicePoMenu" id="switchToReadingTranslations">
                     <mnu:named>Switch To Reading Translations</mnu:named>
                 </mnu:action>
-                <mnu:action oid="isisApplib.TranslationServicePoMenu:1" id="switchToWritingTranslations">
+                <mnu:action objectType="isisApplib.TranslationServicePoMenu" 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:action objectType="isisApplib.HsqlDbManagerMenu" id="hsqlDbManager">
                     <mnu:named>HSQL DB Manager</mnu:named>
                 </mnu:action>
             </mnu:section>
@@ -79,7 +79,7 @@
         <mnu:menu>
             <mnu:named>Configuration Service Menu</mnu:named>
             <mnu:section>
-                <mnu:action oid="isisApplib.ConfigurationServiceMenu:1" id="configuration">
+                <mnu:action objectType="isisApplib.ConfigurationServiceMenu" id="configuration">
                     <mnu:named>Configuration</mnu:named>
                 </mnu:action>
             </mnu:section>

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