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 2015/11/15 22:37:33 UTC

[1/2] isis git commit: ISIS-1249: updating docs

Repository: isis
Updated Branches:
  refs/heads/ISIS-1249 [created] f0cb5cbf4


http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationService.adoc
index 2008ca0..636b2dd 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationService.adoc
@@ -61,14 +61,14 @@ For more details on the implementation, see xref:ug.adoc#_ug_more-advanced_i18n[
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `TranslationService` service (along with the supporting menu service) are automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+If the menu items are not required then these can be suppressed either using security or by implementing a xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
 
-then Apache Isis' core implementation of `TranslationService` service (along with the supporting menu service) are automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.  If the menu items are not required then these can be suppressed either using security or by implementing a xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationsResolver.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationsResolver.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationsResolver.adoc
index e263894..1a4a94f 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationsResolver.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-TranslationsResolver.adoc
@@ -47,14 +47,13 @@ Currently there is no equivalent implementation for the xref:ug.adoc#_ug_restful
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]), _and_ that the xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used, then an implementation of `TranslationsResolver` is
+automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
-and that the xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used then an implementation of `TranslationsResolver` is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UrlEncodingService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UrlEncodingService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UrlEncodingService.adoc
new file mode 100644
index 0000000..1d21696
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UrlEncodingService.adoc
@@ -0,0 +1,37 @@
+[[_rg_services-spi_manpage-UrlEncodingService]]
+= `UrlEncodingService` (`1.11.0-SNAPSHOT`)
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+
+The `UrlEncodingService` (`1.11.0-SNAPSHOT`) is used by the framework to map view model mementos (derived from the state
+of the view model itself) into a form that can be used as a view model.  When the framework needs to recreate the
+view model (for example to invoke an action on it), this URL is converted back into a view model memento, from which
+the view model can then be hydrated.
+
+The framework provides a default implementation of this service, `UrlEncodingServiceUsingBaseEncoding` (also in the
+applib) that uses `base-64` encoding to `UTF-8` charset.
+
+
+== SPI
+
+The SPI defined by the service is:
+
+[source,java]
+----
+public interface UrlEncodingService {
+    @Programmatic
+    public String encode(final String str);     // <1>
+    @Programmatic
+    public String decode(String str);           // <2>
+}
+----
+<1> convert the string (eg view model memento) into a string safe for use within an URL
+<2> unconvert the string from its URL form into its original form URL
+
+
+
+== Implementation
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserProfileService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserProfileService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserProfileService.adoc
index 00048c5..8f55eea 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserProfileService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserProfileService.adoc
@@ -33,7 +33,10 @@ In the future this API may be expanded; one obvious possibility is to return a p
 
 == Implementation
 
-The (non-ASF) http://github.com/isisaddons/isis-app-todoapp[Isis addons' todoapp] has a simple implementation of this service:
+There is no default implementation of this service provided by the core Apache Isis framework.
+
+An example implementation can be found in the (non-ASF)
+http://github.com/isisaddons/isis-app-todoapp[Isis addons' todoapp]:
 
 image::{_imagesdir}reference-services-spi/UserProfileService/todoapp.png[width="800px",link="{_imagesdir}reference-services-spi/UserProfileService/todoapp.png"]
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserRegistrationService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserRegistrationService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserRegistrationService.adoc
index 745c241..25865f2 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserRegistrationService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-UserRegistrationService.adoc
@@ -58,16 +58,32 @@ This is needed so that the self-registered users are assigned automatically to y
 
 == Registering the Services
 
-Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+There is no default implementation of this service provided by the core Apache Isis framework.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+If using the (non-ASF) http://github.com/isisaddons/isis-module-security[Isis addons' security] module) for
+authentication and authorization, then note that it provides an adapter class,
+`SecurityModuleAppUserRegistrationServiceAbstract`, that provides most of the implementation.  You are still required
+to implement a subclass and register.
 
-then (if using the (non-ASF) http://github.com/isisaddons/isis-module-security[Isis addons' security] module) you will need to register your concrete implementation of `SecurityModuleAppUserRegistrationServiceAbstract`.
+For example:
 
+[source,java]
+----
+@DomainService(nature=NatureOfService.DOMAIN)
+public class AppUserRegistrationService extends SecurityModuleAppUserRegistrationServiceAbstract {
+    protected ApplicationRole getInitialRole() {
+    return findRole("regular-user");
+    }
+    protected Set<ApplicationRole> getAdditionalInitialRoles() {
+        return Collections.singleton(findRole("self-registered-user"));
+    }
+    private ApplicationRole findRole(final String roleName) {
+        return applicationRoles.findRoleByName(roleName);
+    }
+    @Inject
+    private ApplicationRoles applicationRoles;
+}
+----
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/rg.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/rg.adoc b/adocs/documentation/src/main/asciidoc/guides/rg.adoc
index 670052f..d3c44f8 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rg.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rg.adoc
@@ -27,4 +27,5 @@ include::_rg_services-spi.adoc[leveloffset=+1]
 include::_rg_classes.adoc[leveloffset=+1]
 include::_rg_object-layout.adoc[leveloffset=+1]
 include::_rg_runtime.adoc[leveloffset=+1]
+include::_rg_schema.adoc[leveloffset=+1]
 include::_rg_web-xml.adoc[leveloffset=+1]

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/migration-notes.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/migration-notes.adoc b/adocs/documentation/src/main/asciidoc/migration-notes.adoc
index eef8ed1..0506693 100644
--- a/adocs/documentation/src/main/asciidoc/migration-notes.adoc
+++ b/adocs/documentation/src/main/asciidoc/migration-notes.adoc
@@ -7,6 +7,7 @@
 
 
 
+include::_migration-notes_1.10.0-to-1.11.0.adoc[leveloffset=+1]
 include::_migration-notes_1.9.0-to-1.10.0.adoc[leveloffset=+1]
 include::_migration-notes_1.8.0-to-1.9.0.adoc[leveloffset=+1]
 include::_migration-notes_1.7.0-to-1.8.0.adoc[leveloffset=+1]

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index 515ea54..5ac3ef8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -170,6 +170,7 @@ public interface AppManifest {
                 "org.apache.isis.core.wrapper" ,
                 "org.apache.isis.core.metamodel.services" ,
                 "org.apache.isis.core.runtime.services" ,
+                "org.apache.isis.schema.services" ,
                 "org.apache.isis.objectstore.jdo.applib.service" ,
                 "org.apache.isis.viewer.restfulobjects.rendering.service" ,
                 "org.apache.isis.objectstore.jdo.datanucleus.service.support" ,

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java
index 9c8c25f..9f02e84 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingService.java
@@ -16,29 +16,14 @@
  */
 package org.apache.isis.applib.services.urlencoding;
 
-import java.nio.charset.Charset;
-
-import com.google.common.io.BaseEncoding;
-
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 
-@DomainService(
-        nature = NatureOfService.DOMAIN
-)
-public class UrlEncodingService {
+public interface UrlEncodingService {
 
     @Programmatic
-    public String decode(String str) {
-        final byte[] bytes = BaseEncoding.base64Url().decode(str);
-        return new String(bytes, Charset.forName("UTF-8"));
-    }
+    public String encode(final String str);
 
     @Programmatic
-    public String encode(final String xmlStr) {
-        byte[] bytes = xmlStr.getBytes(Charset.forName("UTF-8"));
-        return BaseEncoding.base64Url().encode(bytes);
-    }
+    public String decode(String str);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java
new file mode 100644
index 0000000..fdab8c3
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/urlencoding/UrlEncodingServiceUsingBaseEncoding.java
@@ -0,0 +1,57 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.applib.services.urlencoding;
+
+import java.nio.charset.Charset;
+
+import com.google.common.io.BaseEncoding;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+
+@DomainService(
+        nature = NatureOfService.DOMAIN
+)
+public class UrlEncodingServiceUsingBaseEncoding implements UrlEncodingService {
+
+    private final BaseEncoding baseEncoding;
+    private final Charset charset;
+
+    public UrlEncodingServiceUsingBaseEncoding(final BaseEncoding baseEncoding, final Charset charset) {
+        this.baseEncoding = baseEncoding;
+        this.charset = charset;
+    }
+
+    public UrlEncodingServiceUsingBaseEncoding() {
+        this(BaseEncoding.base64Url(), Charset.forName("UTF-8"));
+    }
+
+
+    @Programmatic
+    public String encode(final String str) {
+        byte[] bytes = str.getBytes(charset);
+        return baseEncoding.encode(bytes);
+    }
+
+    @Programmatic
+    public String decode(String str) {
+        final byte[] bytes = baseEncoding.decode(str);
+        return new String(bytes, Charset.forName("UTF-8"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/JaxbServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/JaxbServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/JaxbServiceDefault.java
deleted file mode 100644
index caeb11e..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/JaxbServiceDefault.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.core.runtime.services.jaxb;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Iterables;
-
-import org.apache.isis.applib.ApplicationException;
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.NonRecoverableException;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.services.jaxb.JaxbService;
-import org.apache.isis.core.runtime.services.jaxb.util.CatalogingSchemaOutputResolver;
-import org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter;
-
-@DomainService(
-        nature = NatureOfService.DOMAIN
-)
-public class JaxbServiceDefault implements JaxbService {
-
-    /**
-     * This boolean flag controls whether, when generating {@link #toXsd(Object) XML schemas},
-     * any of the common Isis schemas (in the namespace <code>http://org.apache.isis.schema</code>) should be included or just ignored (and therefore don't appear in the ZIP file).
-     *
-     * <p>
-     *     The practical benefit of this is that for many DTOs there will only be one other
-     *     schema, that of the DTO itself.  Rather than generating a ZIP of two schemas (the Isis
-     *     schema and the one for the DTO), the {@link #toXsd(Object) toXsd} method will instead
-     *     return a single XSD file; far more convenient when debugging and so on.
-     *     The Isis schemas meanwhile can always be <a href="http://isis.apache.org/schema">downloaded from the website </a>.
-     * </p>
-     */
-    public static final String INCLUDE_ISIS_SCHEMA = "isis.services.jaxb.includeIsisSchema";
-
-    private boolean includeIsisSchema;
-
-    @PostConstruct
-    public void init(Map<String,String> props) {
-        final String prop = props.get(INCLUDE_ISIS_SCHEMA);
-        this.includeIsisSchema = prop != null && Boolean.parseBoolean(prop);
-
-    }
-
-    @Override
-    public <T> T fromXml(final Class<T> domainClass, final String xml) {
-        try {
-            final JAXBContext context = JAXBContext.newInstance(domainClass);
-
-            final PersistentEntityAdapter adapter = new PersistentEntityAdapter();
-            container.injectServicesInto(adapter);
-
-            final Unmarshaller unmarshaller = context.createUnmarshaller();
-            unmarshaller.setAdapter(PersistentEntityAdapter.class, adapter);
-
-            final Object unmarshal = unmarshaller.unmarshal(new StringReader(xml));
-            return (T) unmarshal;
-
-        } catch (final JAXBException ex) {
-            throw new NonRecoverableException("Error unmarshalling domain object from XML; domain object class is '" + domainClass.getName() + "'", ex);
-        }
-    }
-
-    @Override
-    public String toXml(final Object domainObject)  {
-
-        final Class<?> domainClass = domainObject.getClass();
-        try {
-            final JAXBContext context = JAXBContext.newInstance(domainClass);
-
-            final PersistentEntityAdapter adapter = new PersistentEntityAdapter();
-            container.injectServicesInto(adapter);
-
-            final Marshaller marshaller = context.createMarshaller();
-            marshaller.setAdapter(PersistentEntityAdapter.class, adapter);
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-
-            final StringWriter sw = new StringWriter();
-            marshaller.marshal(domainObject, sw);
-            final String xml = sw.toString();
-
-            return xml;
-
-        } catch (final JAXBException ex) {
-            final Class<? extends JAXBException> exClass = ex.getClass();
-
-            final String name = exClass.getName();
-            if(name.equals("com.sun.xml.bind.v2.runtime.IllegalAnnotationsException")) {
-                // report a better error if possible
-                // this is done reflectively so as to not have to bring in a new Maven dependency
-                List<? extends Exception> errors = null;
-                String annotationExceptionMessages = null;
-                try {
-                    final Method getErrorsMethod = exClass.getMethod("getErrors");
-                    errors = (List<? extends Exception>) getErrorsMethod.invoke(ex);
-                    annotationExceptionMessages = ": " + Joiner.on("; ").join(
-                            Iterables.transform(errors, new Function<Exception, String>() {
-                                @Override public String apply(final Exception e) {
-                                    return e.getMessage();
-                                }
-                            }));
-                } catch (Exception e) {
-                    // fall through if we hit any snags, and instead throw the more generic error message.
-                }
-                if(errors != null) {
-                    throw new NonRecoverableException(
-                            "Error marshalling domain object to XML, due to illegal annotations on domain object class '"
-                                    + domainClass.getName() + "'; " + errors.size() + " error"
-                                    + (errors.size() == 1? "": "s")
-                                    + " reported" + (!errors
-                                    .isEmpty() ? annotationExceptionMessages : ""), ex);
-                }
-            }
-
-            throw new NonRecoverableException("Error marshalling domain object to XML; domain object class is '" + domainClass.getName() + "'", ex);
-        }
-    }
-
-    public Map<String,String> toXsd(final Object domainObject) {
-
-        try {
-            final Class<?> domainClass = domainObject.getClass();
-            final JAXBContext context = JAXBContext.newInstance(domainClass);
-
-            final CatalogingSchemaOutputResolver outputResolver = new CatalogingSchemaOutputResolver(includeIsisSchema);
-            context.generateSchema(outputResolver);
-
-            return outputResolver.asMap();
-        } catch (final JAXBException | IOException ex) {
-            throw new ApplicationException(ex);
-        }
-    }
-
-
-    @Inject
-    DomainObjectContainer container;
-}
-

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/CatalogingSchemaOutputResolver.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/CatalogingSchemaOutputResolver.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/CatalogingSchemaOutputResolver.java
deleted file mode 100644
index b267284..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/CatalogingSchemaOutputResolver.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.core.runtime.services.jaxb.util;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.SchemaOutputResolver;
-import javax.xml.transform.Result;
-import javax.xml.transform.stream.StreamResult;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-/**
- * An implementation of {@link SchemaOutputResolver} that keeps track of all the schemas for which it has
- * {@link #createOutput(String, String) created} an output {@link StreamResult} containing the content of the schema.
- */
-public class CatalogingSchemaOutputResolver extends SchemaOutputResolver
-{
-    private final boolean includeIsisSchema;
-    private List<String> namespaceUris = Lists.newArrayList();
-
-    public CatalogingSchemaOutputResolver(final boolean includeIsisSchema) {
-        this.includeIsisSchema = includeIsisSchema;
-    }
-
-    public List<String> getNamespaceUris() {
-        return namespaceUris;
-    }
-
-    private Map<String, StreamResultWithWriter> schemaResultByNamespaceUri = Maps.newLinkedHashMap();
-
-    public String getSchemaTextFor(final String namespaceUri) {
-        final StreamResultWithWriter streamResult = schemaResultByNamespaceUri.get(namespaceUri);
-        return streamResult != null? streamResult.asString(): null;
-    }
-
-    @Override
-    public Result createOutput(
-            final String namespaceUri, final String suggestedFileName) throws IOException {
-
-        final StreamResultWithWriter result = new StreamResultWithWriter();
-
-        result.setSystemId(namespaceUri);
-
-        if (namespaceUri.matches(".*isis\\.apache\\.org.*") && !includeIsisSchema) {
-            // ignore
-        } else {
-            namespaceUris.add(namespaceUri);
-            schemaResultByNamespaceUri.put(namespaceUri, result);
-        }
-
-        return result;
-    }
-
-    public Map<String, String> asMap() {
-        final Map<String,String> map = Maps.newLinkedHashMap();
-        final List<String> namespaceUris = getNamespaceUris();
-
-        for (String namespaceUri : namespaceUris) {
-            map.put(namespaceUri, getSchemaTextFor(namespaceUri));
-        }
-
-        return Collections.unmodifiableMap(map);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/StreamResultWithWriter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/StreamResultWithWriter.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/StreamResultWithWriter.java
deleted file mode 100644
index 99884be..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/jaxb/util/StreamResultWithWriter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.core.runtime.services.jaxb.util;
-
-import java.io.StringWriter;
-
-import javax.xml.transform.stream.StreamResult;
-
-/**
- * A {@link StreamResult} that contains its own writer.
- *
- * <p>
- *     The point is that the writer is only ever queried lazily AFTER the result has been generated.
- * </p>
- */
-public class StreamResultWithWriter extends StreamResult {
-    private final StringWriter writer;
-
-    public StreamResultWithWriter() {
-        this(new StringWriter());
-    }
-
-    private StreamResultWithWriter(StringWriter writer) {
-        super(writer);
-        this.writer = writer;
-    }
-
-    public String asString() {
-        return writer.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/CatalogingSchemaOutputResolver.java
----------------------------------------------------------------------
diff --git a/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/CatalogingSchemaOutputResolver.java b/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/CatalogingSchemaOutputResolver.java
new file mode 100644
index 0000000..ca67ecf
--- /dev/null
+++ b/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/CatalogingSchemaOutputResolver.java
@@ -0,0 +1,83 @@
+/**
+ *  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.schema.services.jaxb;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.SchemaOutputResolver;
+import javax.xml.transform.Result;
+import javax.xml.transform.stream.StreamResult;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * An implementation of {@link SchemaOutputResolver} that keeps track of all the schemas for which it has
+ * {@link #createOutput(String, String) created} an output {@link StreamResult} containing the content of the schema.
+ */
+class CatalogingSchemaOutputResolver extends SchemaOutputResolver
+{
+    private final boolean includeIsisSchema;
+    private List<String> namespaceUris = Lists.newArrayList();
+
+    public CatalogingSchemaOutputResolver(final boolean includeIsisSchema) {
+        this.includeIsisSchema = includeIsisSchema;
+    }
+
+    public List<String> getNamespaceUris() {
+        return namespaceUris;
+    }
+
+    private Map<String, StreamResultWithWriter> schemaResultByNamespaceUri = Maps.newLinkedHashMap();
+
+    public String getSchemaTextFor(final String namespaceUri) {
+        final StreamResultWithWriter streamResult = schemaResultByNamespaceUri.get(namespaceUri);
+        return streamResult != null? streamResult.asString(): null;
+    }
+
+    @Override
+    public Result createOutput(
+            final String namespaceUri, final String suggestedFileName) throws IOException {
+
+        final StreamResultWithWriter result = new StreamResultWithWriter();
+
+        result.setSystemId(namespaceUri);
+
+        if (namespaceUri.matches(".*isis\\.apache\\.org.*") && !includeIsisSchema) {
+            // ignore
+        } else {
+            namespaceUris.add(namespaceUri);
+            schemaResultByNamespaceUri.put(namespaceUri, result);
+        }
+
+        return result;
+    }
+
+    public Map<String, String> asMap() {
+        final Map<String,String> map = Maps.newLinkedHashMap();
+        final List<String> namespaceUris = getNamespaceUris();
+
+        for (String namespaceUri : namespaceUris) {
+            map.put(namespaceUri, getSchemaTextFor(namespaceUri));
+        }
+
+        return Collections.unmodifiableMap(map);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/JaxbServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/JaxbServiceDefault.java b/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/JaxbServiceDefault.java
new file mode 100644
index 0000000..b281321
--- /dev/null
+++ b/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/JaxbServiceDefault.java
@@ -0,0 +1,166 @@
+/**
+ *  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.schema.services.jaxb;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Iterables;
+
+import org.apache.isis.applib.ApplicationException;
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.NonRecoverableException;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter;
+
+@DomainService(
+        nature = NatureOfService.DOMAIN
+)
+public class JaxbServiceDefault implements JaxbService {
+
+    /**
+     * This boolean flag controls whether, when generating {@link #toXsd(Object) XML schemas},
+     * any of the common Isis schemas (in the namespace <code>http://org.apache.isis.schema</code>) should be included or just ignored (and therefore don't appear in the ZIP file).
+     *
+     * <p>
+     *     The practical benefit of this is that for many DTOs there will only be one other
+     *     schema, that of the DTO itself.  Rather than generating a ZIP of two schemas (the Isis
+     *     schema and the one for the DTO), the {@link #toXsd(Object) toXsd} method will instead
+     *     return a single XSD file; far more convenient when debugging and so on.
+     *     The Isis schemas meanwhile can always be <a href="http://isis.apache.org/schema">downloaded from the website </a>.
+     * </p>
+     */
+    public static final String INCLUDE_ISIS_SCHEMA = "isis.services.jaxb.includeIsisSchema";
+
+    private boolean includeIsisSchema;
+
+    @PostConstruct
+    public void init(Map<String,String> props) {
+        final String prop = props.get(INCLUDE_ISIS_SCHEMA);
+        this.includeIsisSchema = prop != null && Boolean.parseBoolean(prop);
+
+    }
+
+    @Override
+    public <T> T fromXml(final Class<T> domainClass, final String xml) {
+        try {
+            final JAXBContext context = JAXBContext.newInstance(domainClass);
+
+            final PersistentEntityAdapter adapter = new PersistentEntityAdapter();
+            container.injectServicesInto(adapter);
+
+            final Unmarshaller unmarshaller = context.createUnmarshaller();
+            unmarshaller.setAdapter(PersistentEntityAdapter.class, adapter);
+
+            final Object unmarshal = unmarshaller.unmarshal(new StringReader(xml));
+            return (T) unmarshal;
+
+        } catch (final JAXBException ex) {
+            throw new NonRecoverableException("Error unmarshalling domain object from XML; domain object class is '" + domainClass.getName() + "'", ex);
+        }
+    }
+
+    @Override
+    public String toXml(final Object domainObject)  {
+
+        final Class<?> domainClass = domainObject.getClass();
+        try {
+            final JAXBContext context = JAXBContext.newInstance(domainClass);
+
+            final PersistentEntityAdapter adapter = new PersistentEntityAdapter();
+            container.injectServicesInto(adapter);
+
+            final Marshaller marshaller = context.createMarshaller();
+            marshaller.setAdapter(PersistentEntityAdapter.class, adapter);
+            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+
+            final StringWriter sw = new StringWriter();
+            marshaller.marshal(domainObject, sw);
+            final String xml = sw.toString();
+
+            return xml;
+
+        } catch (final JAXBException ex) {
+            final Class<? extends JAXBException> exClass = ex.getClass();
+
+            final String name = exClass.getName();
+            if(name.equals("com.sun.xml.bind.v2.runtime.IllegalAnnotationsException")) {
+                // report a better error if possible
+                // this is done reflectively so as to not have to bring in a new Maven dependency
+                List<? extends Exception> errors = null;
+                String annotationExceptionMessages = null;
+                try {
+                    final Method getErrorsMethod = exClass.getMethod("getErrors");
+                    errors = (List<? extends Exception>) getErrorsMethod.invoke(ex);
+                    annotationExceptionMessages = ": " + Joiner.on("; ").join(
+                            Iterables.transform(errors, new Function<Exception, String>() {
+                                @Override public String apply(final Exception e) {
+                                    return e.getMessage();
+                                }
+                            }));
+                } catch (Exception e) {
+                    // fall through if we hit any snags, and instead throw the more generic error message.
+                }
+                if(errors != null) {
+                    throw new NonRecoverableException(
+                            "Error marshalling domain object to XML, due to illegal annotations on domain object class '"
+                                    + domainClass.getName() + "'; " + errors.size() + " error"
+                                    + (errors.size() == 1? "": "s")
+                                    + " reported" + (!errors
+                                    .isEmpty() ? annotationExceptionMessages : ""), ex);
+                }
+            }
+
+            throw new NonRecoverableException("Error marshalling domain object to XML; domain object class is '" + domainClass.getName() + "'", ex);
+        }
+    }
+
+    public Map<String,String> toXsd(final Object domainObject) {
+
+        try {
+            final Class<?> domainClass = domainObject.getClass();
+            final JAXBContext context = JAXBContext.newInstance(domainClass);
+
+            final CatalogingSchemaOutputResolver outputResolver = new CatalogingSchemaOutputResolver(includeIsisSchema);
+            context.generateSchema(outputResolver);
+
+            return outputResolver.asMap();
+        } catch (final JAXBException | IOException ex) {
+            throw new ApplicationException(ex);
+        }
+    }
+
+
+    @Inject
+    DomainObjectContainer container;
+}
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/StreamResultWithWriter.java
----------------------------------------------------------------------
diff --git a/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/StreamResultWithWriter.java b/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/StreamResultWithWriter.java
new file mode 100644
index 0000000..c07b49b
--- /dev/null
+++ b/core/schema/src/main/java/org/apache/isis/schema/services/jaxb/StreamResultWithWriter.java
@@ -0,0 +1,45 @@
+/**
+ *  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.schema.services.jaxb;
+
+import java.io.StringWriter;
+
+import javax.xml.transform.stream.StreamResult;
+
+/**
+ * A {@link StreamResult} that contains its own writer.
+ *
+ * <p>
+ *     The point is that the writer is only ever queried lazily AFTER the result has been generated.
+ * </p>
+ */
+class StreamResultWithWriter extends StreamResult {
+    private final StringWriter writer;
+
+    public StreamResultWithWriter() {
+        this(new StringWriter());
+    }
+
+    private StreamResultWithWriter(StringWriter writer) {
+        super(writer);
+        this.writer = writer;
+    }
+
+    public String asString() {
+        return writer.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/core/schema/src/main/java/org/apache/isis/schema/utils/ActionInvocationMementoDtoUtils.java
----------------------------------------------------------------------
diff --git a/core/schema/src/main/java/org/apache/isis/schema/utils/ActionInvocationMementoDtoUtils.java b/core/schema/src/main/java/org/apache/isis/schema/utils/ActionInvocationMementoDtoUtils.java
index 37ac6a1..1314b75 100644
--- a/core/schema/src/main/java/org/apache/isis/schema/utils/ActionInvocationMementoDtoUtils.java
+++ b/core/schema/src/main/java/org/apache/isis/schema/utils/ActionInvocationMementoDtoUtils.java
@@ -133,7 +133,11 @@ public class ActionInvocationMementoDtoUtils {
     //endregion
 
     //region > addArgValue, addArgReference
-    public static boolean addArgValue(final ActionInvocationMementoDto aim, final String parameterName, final Class<?> parameterType, final Object arg) {
+    public static boolean addArgValue(
+            final ActionInvocationMementoDto aim,
+            final String parameterName,
+            final Class<?> parameterType,
+            final Object arg) {
 
         ParamDto paramDto = null;
         if(parameterType == String.class) {
@@ -265,7 +269,9 @@ public class ActionInvocationMementoDtoUtils {
         return setValue(valueDto, returnType, returnVal);
     }
 
-    public static void addReturnReference(final ActionInvocationMementoDto aim, final Bookmark bookmark) {
+    public static void addReturnReference(
+            final ActionInvocationMementoDto aim,
+            final Bookmark bookmark) {
         final ValueDto valueDto = returnValueDtoFor(aim);
         OidDto argValue = asOidDto(bookmark);
         valueDto.setReference(argValue);


[2/2] isis git commit: ISIS-1249: updating docs

Posted by da...@apache.org.
ISIS-1249: updating docs


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/f0cb5cbf
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/f0cb5cbf
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/f0cb5cbf

Branch: refs/heads/ISIS-1249
Commit: f0cb5cbf447f6531c1ff6854c2388d9fccc408d5
Parents: a8c48a2
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun Nov 15 21:37:23 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun Nov 15 21:37:23 2015 +0000

----------------------------------------------------------------------
 .../_migration-notes_1.10.0-to-1.11.0.adoc      |  31 ++++
 .../main/asciidoc/guides/_rg_schema-aim.adoc    |   8 +
 .../main/asciidoc/guides/_rg_schema-common.adoc |   8 +
 ...ilities-ActionInvocationMementoDtoUtils.adoc |  47 ++++++
 .../asciidoc/guides/_rg_schema-utilities.adoc   |  14 ++
 .../src/main/asciidoc/guides/_rg_schema.adoc    |  12 ++
 .../main/asciidoc/guides/_rg_services-api.adoc  |  10 ++
 ...ces-api_manpage-ActionInvocationContext.adoc |  13 +-
 ..._services-api_manpage-BackgroundService.adoc |  13 +-
 ...rg_services-api_manpage-BookmarkService.adoc |  14 +-
 .../_rg_services-api_manpage-ClockService.adoc  |  14 +-
 ..._rg_services-api_manpage-CommandContext.adoc |  14 +-
 ...rg_services-api_manpage-DeepLinkService.adoc |  14 +-
 ...vices-api_manpage-DomainObjectContainer.adoc |  10 +-
 .../_rg_services-api_manpage-EmailService.adoc  |  16 +-
 ...rg_services-api_manpage-EventBusService.adoc |  14 +-
 ..._services-api_manpage-GuiceBeanProvider.adoc |  12 +-
 ..._rg_services-api_manpage-IsisJdoSupport.adoc |  13 +-
 .../_rg_services-api_manpage-JaxbService.adoc   |  66 ++++++++
 ..._rg_services-api_manpage-MementoService.adoc |  13 +-
 ...g_services-api_manpage-MetamodelService.adoc |  13 +-
 ..._services-api_manpage-QueryResultsCache.adoc |  14 +-
 .../_rg_services-api_manpage-Scratchpad.adoc    |  14 +-
 .../_rg_services-api_manpage-SudoService.adoc   |  18 +-
 ..._rg_services-api_manpage-WrapperFactory.adoc |  13 +-
 ...services-api_manpage-XmlSnapshotService.adoc |  17 +-
 ...rg_services-spi_manpage-AuditingService.adoc |  14 +-
 ...es-spi_manpage-BackgroundCommandService.adoc |  17 +-
 ...vices-spi_manpage-ClassDiscoveryService.adoc |  14 +-
 ..._rg_services-spi_manpage-CommandService.adoc |  18 +-
 ...vices-spi_manpage-ContentMappingService.adoc |   5 +-
 ...s-spi_manpage-ContentNegotiationService.adoc |  14 +-
 ...es-spi_manpage-EmailNotificationService.adoc |  16 +-
 ...vices-spi_manpage-ErrorReportingService.adoc |   7 +-
 ...rg_services-spi_manpage-EventSerializer.adoc |  19 ++-
 ...ervices-spi_manpage-ExceptionRecognizer.adoc |  13 +-
 ...age-FixtureScriptsSpecificationProvider.adoc |  12 +-
 ..._rg_services-spi_manpage-LocaleProvider.adoc |  14 +-
 ..._services-spi_manpage-PublishingService.adoc |  46 ++++-
 ...vices-spi_manpage-RepresentationService.adoc |  12 +-
 ...services-spi_manpage-TranslationService.adoc |  12 +-
 ...rvices-spi_manpage-TranslationsResolver.adoc |  11 +-
 ...services-spi_manpage-UrlEncodingService.adoc |  37 ++++
 ...services-spi_manpage-UserProfileService.adoc |   5 +-
 ...ces-spi_manpage-UserRegistrationService.adoc |  30 +++-
 .../src/main/asciidoc/guides/rg.adoc            |   1 +
 .../src/main/asciidoc/migration-notes.adoc      |   1 +
 .../org/apache/isis/applib/AppManifest.java     |   1 +
 .../urlencoding/UrlEncodingService.java         |  21 +--
 .../UrlEncodingServiceUsingBaseEncoding.java    |  57 +++++++
 .../services/jaxb/JaxbServiceDefault.java       | 167 -------------------
 .../util/CatalogingSchemaOutputResolver.java    |  83 ---------
 .../jaxb/util/StreamResultWithWriter.java       |  45 -----
 .../jaxb/CatalogingSchemaOutputResolver.java    |  83 +++++++++
 .../services/jaxb/JaxbServiceDefault.java       | 166 ++++++++++++++++++
 .../services/jaxb/StreamResultWithWriter.java   |  45 +++++
 .../utils/ActionInvocationMementoDtoUtils.java  |  10 +-
 57 files changed, 869 insertions(+), 572 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/_migration-notes_1.10.0-to-1.11.0.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/_migration-notes_1.10.0-to-1.11.0.adoc b/adocs/documentation/src/main/asciidoc/_migration-notes_1.10.0-to-1.11.0.adoc
new file mode 100644
index 0000000..1df35a8
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/_migration-notes_1.10.0-to-1.11.0.adoc
@@ -0,0 +1,31 @@
+[[_migration-notes_1.10.0-to-1.11.0]]
+= From v1.10.0 to 1.11.0
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+Existing projects written against v1.10.0 should run against v1.11.0 with few if any changes.  If you *do* encounter
+any difficulties then let us know via the link:support.html[users mailing list], so we can support you and document
+issues here.
+
+
+[NOTE]
+====
+At the time of writing `1.11.0` has not been released; these notes relate to `1.11.0-SNAPSHOT`.
+====
+
+
+== JAXB view models
+
+This version recognizes classes annotated with xref:rg.adoc#_rg_annotations_manpage-XmlRootElement[`@XmlRootElement`]
+as view models.  These are serialized out into XML and converted into URL.
+
+The xref:rg.adoc#_rg_services-api_manpage-JaxbService[`JaxbService`] is responsible for performing the XML conversion.
+The default implementation is located in the `org.apache.isis.core:isis-core-schema` module, specifically under the
+`org.apache.isis.core.schema.services` package.
+
+If your application is bootstrapped using an `AppManifest` (recommended; ee
+xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[here]) then the `JaxbService` will automatically be discovered and
+ registered.  However, if you are still using the older `isis.properties` configuration file to explicitly register
+ services then you will need to add in this service.

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_schema-aim.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_schema-aim.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-aim.adoc
new file mode 100644
index 0000000..d898b7e
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-aim.adoc
@@ -0,0 +1,8 @@
+[[_rg_schema-aim]]
+= Action Invocation Memento
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+NOTE: TODO
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_schema-common.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_schema-common.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-common.adoc
new file mode 100644
index 0000000..4e6d6cd
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-common.adoc
@@ -0,0 +1,8 @@
+[[_rg_schema-common]]
+= Common Schema
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+NOTE: TODO
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities-ActionInvocationMementoDtoUtils.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities-ActionInvocationMementoDtoUtils.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities-ActionInvocationMementoDtoUtils.adoc
new file mode 100644
index 0000000..a9d2609
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities-ActionInvocationMementoDtoUtils.adoc
@@ -0,0 +1,47 @@
+[[_rg_schema-utilities-ActionInvocationMementoDtoUtils]]
+= `ActionInvocationMementoDtoUtils`
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+NOTE: TODO
+
+`ActionInvocationMementoDtoUtils`
+
+
+[source,java]
+----
+public class ActionInvocationMementoDtoUtils {
+    public static ActionInvocationMementoDto newDto() { ... }                                                   // <1>
+    public static void setMetadata( ... ) { ... }
+    public static boolean addArgValue( ... ) { ... }
+    public static void addArgReference( ... ) { ... }
+    public static boolean addReturnValue( ... ) { ... }
+    public static void addReturnReference( ... ) { ... }
+
+    public static int getNumberOfParameters(final ActionInvocationMementoDto aim) { ... }                       // <2>
+    public static List<ParamDto> getParameters(final ActionInvocationMementoDto aim) { ... }
+    public static List<String> getParameterNames(final ActionInvocationMementoDto aim) { ... }
+    public static List<ValueType> getParameterTypes(final ActionInvocationMementoDto aim) { ... }
+    public static ParamDto getParameter(final ActionInvocationMementoDto aim, final int paramNum) { ... }       // <3>
+    public static ValueDto getParameterValue(final ActionInvocationMementoDto aim, final int paramNum) { ... }
+    public static String getParameterName(final ActionInvocationMementoDto aim, final int paramNum) { ... }
+    public static ValueType getParameterType(final ActionInvocationMementoDto aim, final int paramNum) { ... }
+    public static boolean isNull(final ActionInvocationMementoDto aim, int paramNum) { ... }
+
+    public static <T> T getArg(final ActionInvocationMementoDto aim, int paramNum, Class<T> cls) { ... }        // <3>
+
+    public static ActionInvocationMementoDto fromXml(Reader reader) { ... }                                     // <4>
+    public static ActionInvocationMementoDto fromXml(
+            final Class<?> contextClass,
+            final String resourceName,
+            final Charset charset) throws IOException { ... }
+    public static String toXml(final ActionInvocationMementoDto aim) { ... }
+    public static void toXml(final ActionInvocationMementoDto aim, final Writer writer) { ... }
+}
+----
+<1> not API; for the Apache Isis framework itself to create and initialize DTOs representing action invocations
+<2> API, obtaining metadata about the action invocation
+<3> API, obtaining the argument value for a particular parameter of the action invocation
+<4> marshall the DTO to/from XML

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities.adoc
new file mode 100644
index 0000000..a696fbf
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_schema-utilities.adoc
@@ -0,0 +1,14 @@
+[[_rg_schema-utilities]]
+= Utilities
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+NOTE: TODO
+
+In addition to defining the schemas themselves, Apache Isis also provides some simple helper classes, under the
+`org.apache.isis.schema.utils` package.
+
+
+include::_rg_schema-utilities-ActionInvocationMementoDtoUtils.adoc[leveloffset=+1]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_schema.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_schema.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_schema.adoc
new file mode 100644
index 0000000..e8ce6c2
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_schema.adoc
@@ -0,0 +1,12 @@
+[[_rg_schema]]
+= Schema
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+NOTE: TODO
+
+include::_rg_schema-common.adoc[leveloffset=+1]
+include::_rg_schema-aim.adoc[leveloffset=+1]
+include::_rg_schema-utilities.adoc[leveloffset=+1]

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api.adoc
index ae95d98..f496223 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api.adoc
@@ -160,6 +160,16 @@ SpecificationProvider`].
 |
 
 
+|xref:rg.adoc#_rg_services-api_manpage-JaxbService[`o.a.i.applib.` +
+`services.jaxb` +
+`JaxbService`]
+|Marshal and unmarshal JAXB-annotated view models to/from XML.
+|`JaxbServiceDefault` +
+``o.a.i.core`` +
+``isis-core-schema``
+|`1.11.0-SNAPSHOT`.
+
+
 |xref:rg.adoc#_rg_services-api_manpage-MementoService[`o.a.i.applib.` +
 `services.memento` +
 `MementoService`]

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ActionInvocationContext.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ActionInvocationContext.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ActionInvocationContext.adoc
index 55fab20..c52348d 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ActionInvocationContext.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ActionInvocationContext.adoc
@@ -65,14 +65,13 @@ public class ToDoItem ... {
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' default
+implementation of `ActionInvocationContext` class is automatically registered (it is annotated with `@DomainService`)
+so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Isis' default implementation of `ActionInvocationContext` class is automatically registered (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BackgroundService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BackgroundService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BackgroundService.adoc
index ddcbea6..c59ef95 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BackgroundService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BackgroundService.adoc
@@ -94,14 +94,13 @@ The user would be returned a domain object representing their action invocation.
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `BackgroundService` is automatically registered (it is annotated with `@DomainService`) so no
+further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `BackgroundService` is automatically registered (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BookmarkService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BookmarkService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BookmarkService.adoc
index 0db6e9d..87305af 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BookmarkService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-BookmarkService.adoc
@@ -105,14 +105,12 @@ Bookmarks are also used by the (non-ASF) http://github.com/isisaddons/isis-modul
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `BookmarkService` is automatically registered (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `BookmarkService` is automatically registered (it is annotated with `@DomainService`) so no further
+configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ClockService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ClockService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ClockService.adoc
index 8582730..5bd309d 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ClockService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-ClockService.adoc
@@ -93,13 +93,9 @@ public class NntpClockServiceInitializer  {
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `ClockService` is automatically registered (it is annotated with `@DomainService`) so no further
+configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `ClockService` is automatically registered (it is annotated with `@DomainService`) so no further configuration is required.
-
-If you want to use a different implementation of `Clock`, eg delegating to NNTP, then do _not_ register directly, but instead subclass from `o.a.i.applib.clock.Clock` singleton (as described in the section above).
+If you want to use a different implementation of `Clock`, eg delegating to NNTP, then do _not_ register directly, but
+instead subclass from `o.a.i.applib.clock.Clock` singleton (as described in the section above).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-CommandContext.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-CommandContext.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-CommandContext.adoc
index cc770e1..c9008f0 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-CommandContext.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-CommandContext.adoc
@@ -197,15 +197,13 @@ String user = commandContext.getCommand().getUser();
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `CommandContext` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `CommandContext` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DeepLinkService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DeepLinkService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DeepLinkService.adoc
index 651b89e..1dd9f89 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DeepLinkService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DeepLinkService.adoc
@@ -47,12 +47,10 @@ The Wicket viewer core framework provides a default implementation of this API:
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-and that the xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used then an implementation of `DeepLinkService` is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]), _and_ that the
+xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used, then an implementation of `DeepLinkService` is
+automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DomainObjectContainer.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DomainObjectContainer.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DomainObjectContainer.adoc
index c0820de..f75f72e 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DomainObjectContainer.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-DomainObjectContainer.adoc
@@ -34,11 +34,7 @@ include::_rg_services-api_manpage-DomainObjectContainer_services-api.adoc[levelo
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `DomainObjectContainer` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `DomainObjectContainer` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EmailService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EmailService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EmailService.adoc
index d714628..cd1b9ea 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EmailService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EmailService.adoc
@@ -81,17 +81,13 @@ To ensure that your alternative implementation takes the place of the default im
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `EmailService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
-
-If you have written an alternative implementation, then register your implementation in `isis.properties` under the "isis.services" key and it will be used instead.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `EmailService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 == Related Services

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EventBusService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EventBusService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EventBusService.adoc
index 3639e9b..e62aa1d 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EventBusService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-EventBusService.adoc
@@ -387,15 +387,13 @@ Late registration refers to the idea that a domain service can register itself w
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `EventBusService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `EventBusService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-GuiceBeanProvider.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-GuiceBeanProvider.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-GuiceBeanProvider.adoc
index 1cf5e47..729588c 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-GuiceBeanProvider.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-GuiceBeanProvider.adoc
@@ -80,12 +80,12 @@ should return "ToDo App".
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]), _and_ that the
+xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used, then an implementation of `GuiceBeanProvider` is
+automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
-and that the xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used then an implementation of `GuiceBeanProvider` is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-IsisJdoSupport.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-IsisJdoSupport.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-IsisJdoSupport.adoc
index d2ef76c..74056d4 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-IsisJdoSupport.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-IsisJdoSupport.adoc
@@ -267,11 +267,10 @@ public List<Order> findOrders(...) {
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `IsisJdoSupport` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `IsisJdoSupport` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-JaxbService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-JaxbService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-JaxbService.adoc
new file mode 100644
index 0000000..289e595
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-JaxbService.adoc
@@ -0,0 +1,66 @@
+[[_rg_services-api_manpage-JaxbService]]
+= `JaxbService` (`1.11.0-SNAPSHOT`)
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+
+The `JaxbService` (`1.11.0-SNAPSHOT`) allows instances of JAXB-annotated classes to be marshalled to XML and
+unmarshalled from XML back into domain objects.
+
+
+
+
+
+[[_rg_services-api_manpage-JaxbService_api-and-implementation]]
+== API & Implementation
+
+The API defined by `JaxbService` is:
+
+[source,java]
+----
+public interface JaxbService {
+    @Programmatic
+    <T> T fromXml(Class<T> domainClass, String xml);                // <1>
+    @Programmatic
+    public String toXml(final Object domainObject);                 // <2>
+    @Programmatic
+    public Map<String, String> toXsd(final Object domainObject);}   // <3>
+----
+<1> unmarshalls the XML into an instance of the class.
+<2> marshalls the domain object into XML
+<3> generates a map of each of the schemas referenced; the key is the schema namespace, the value is the XML of the
+schema itself.
+
+Isis provides a default implementation of the service, `o.a.i.schema.services.jaxb.JaxbServiceDefault`.
+
+
+
+== Configuration
+
+When generating the XSDs for a domain object, by default any Isis schemas
+
+    public static final String INCLUDE_ISIS_SCHEMA = "isis.services.jaxb.includeIsisSchema";
+
+
+== Usage within the framework
+
+This service is provided as a convenience for applications, but is also used internally by the framework to
+xref:rg.adoc#_rg_annotations_manpage-XmlRootElement[`@XmlRootElement`]-annotated
+xref:ug.adoc#_ug_more-advanced_view-models[view models].
+
+
+
+
+== Registering the Service
+
+Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `JaxbService` service is automatically registered and injected (it is annotated with `@DomainService`)
+so no further configuration is required.
+
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MementoService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MementoService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MementoService.adoc
index 21c35ed..ab06525 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MementoService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MementoService.adoc
@@ -122,11 +122,10 @@ The memento service is used by the xref:rg.adoc#_rg_services-api_manpage-Command
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `MementoService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `MementoService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MetamodelService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MetamodelService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MetamodelService.adoc
index 82984ac..b65e42e 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MetamodelService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-MetamodelService.adoc
@@ -33,11 +33,10 @@ public interface MetaModelService {
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `MetamodelService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `MetamodelService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-QueryResultsCache.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-QueryResultsCache.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-QueryResultsCache.adoc
index d4ab535..0e698da 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-QueryResultsCache.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-QueryResultsCache.adoc
@@ -111,15 +111,13 @@ This refactoring will be worthwhile provided that enough of the orders being pro
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `QueryResultsCache` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `QueryResultsCache` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-Scratchpad.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-Scratchpad.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-Scratchpad.adoc
index d108fe1..5906cd0 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-Scratchpad.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-Scratchpad.adoc
@@ -109,15 +109,13 @@ If using the xref:ug.adoc#_ug_wicket-viewer[Wicket viewer], the `ToDoItemBulkUpd
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `Scratchpad` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `Scratchpad` service is automatically registered and injected (it is annotated with `@DomainService`)
+so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-SudoService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-SudoService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-SudoService.adoc
index 31ef7b4..79c39c9 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-SudoService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-SudoService.adoc
@@ -28,9 +28,10 @@ public interface SudoService {
 }
 ----
 
-which will run the provided block of code (a `Runnable` or a `Callable`) in a way such that calls to `DomainObjectContainer#getUser()` will return the specified user (and roles, if specified)
+which will run the provided block of code (a `Runnable` or a `Callable`) in a way such that calls to
+`DomainObjectContainer#getUser()` will return the specified user (and roles, if specified)
 
-The core framework provides a default implementation of this service (`o.a.i.core.runtime.services.sudo.SudoServiceDefault`)
+The core framework provides a default implementation of this service (`o.a.i.core.runtime.services.sudo.SudoServiceDefault`).
 
 
 
@@ -59,11 +60,10 @@ protected void execute(final ExecutionContext ec) {
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `SudoService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `SudoService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-WrapperFactory.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-WrapperFactory.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-WrapperFactory.adoc
index be30257..bd1cf7c 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-WrapperFactory.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-WrapperFactory.adoc
@@ -153,11 +153,10 @@ The original intent of this API was to enable test transcripts to be captured (i
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `WrapperFactory` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `WrapperFactory` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-XmlSnapshotService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-XmlSnapshotService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-XmlSnapshotService.adoc
index 79fe2f8..a8e0da1 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-XmlSnapshotService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-api_manpage-XmlSnapshotService.adoc
@@ -194,14 +194,14 @@ public interface XmlSnapshotService {
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `XmlSnapshotService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
-then Apache Isis' core implementation of `XmlSnapshotService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
 
 == Related Services
@@ -210,6 +210,11 @@ The xref:rg.adoc#_rg_services-api_manpage-BookmarkService[`BookmarkService`] pro
 
 The xref:rg.adoc#_rg_services-api_manpage-MementoService[`MementoService`] also provides a mechanism for generating string representations of domain objects.
 
+The xref:rg.adoc#_rg_services-api_manpage-JaxbService[`JaxbService`] (`1.11.0-SNAPSHOT`) is a simple wrapper around
+standard JAXB functionality for generating both XMLs and XSDs from JAXB-annotated classes.  Note that (as of
+`1.11.0-SNAPSHOT`) there is built-in support for JAXB classes (ie annotated with
+xref:rg.adoc#_rg_annotations_manpage-XmlRootElement[`@XmlRootElement`]) to be used as view models.
+
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-AuditingService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-AuditingService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-AuditingService.adoc
index 5956bc0..464c25b 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-AuditingService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-AuditingService.adoc
@@ -63,15 +63,15 @@ The typical way to indicate that an object should be audited is to annotate it w
 
 == Registering the Services
 
-Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+The (non-ASF) http://github.com/isisaddons/isis-module-audit[Isis addons' audit] module provides an implementation of
+this service (`AuditingService`), and also provides a number of related domain services (`AuditingServiceMenu`,
+`AuditingServiceRepository` and `AuditingServiceContributions`).
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+Assuming that an `AppManifest` is being used to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app])
+then this can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
 
-then adding the (non-ASF) http://github.com/isisaddons/isis-module-audit[Isis addons' audit] module to the classpath will automatically register the `AuditingService`, `AuditingServiceMenu`, `AuditingServiceRepository` and `AuditingServiceContributions` services.  If menu items or contributions are not required in the UI, these can be suppressed either using security or by implementing a xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
+If menu items or contributions are not required in the UI, these can be suppressed either using security or by
+implementing a xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-BackgroundCommandService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-BackgroundCommandService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-BackgroundCommandService.adoc
index a69b540..b759fc9 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-BackgroundCommandService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-BackgroundCommandService.adoc
@@ -103,17 +103,18 @@ The imperative approach involves explicitly calling the xref:rg.adoc#_rg_service
 
 == Registering the Services
 
-Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+The (non-ASF) http://github.com/isisaddons/isis-module-command[Isis addons' command] module provides an implementation
+of this service (`BackgroundCommandService`), and also provides a number of related domain services
+(`BackgroundCommandServiceJdo`, `BackgroundCommandJdoRepository` and `BackgroundCommandServiceJdoContributions`).  This
+module also provides service implementations of the
+xref:rg.adoc#_rg_services-spi_manpage-CommandService[`CommandService`].
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+Assuming that an `AppManifest` is being used to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app])
+then this can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
 
-then adding the (non-ASF) http://github.com/isisaddons/isis-module-command[Isis addons' command] module to the classpath will automatically register the `BackgroundCommandServiceJdo`, `BackgroundCommandJdoRepository` and `BackgroundCommandServiceJdoContributions` services.  If contributions are not required in the UI, these can be suppressed either using security or by implementing a xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
+If contributions are not required in the UI, these can be suppressed either using security or by implementing a
+xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
 
-Note that this module also provides service implementations of the xref:rg.adoc#_rg_services-spi_manpage-CommandService[`CommandService`].
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ClassDiscoveryService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ClassDiscoveryService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ClassDiscoveryService.adoc
index b7330ba..2aea1ea 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ClassDiscoveryService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ClassDiscoveryService.adoc
@@ -71,14 +71,12 @@ Other usages of the `ClassDiscoveryService` are likely to work in a similar way,
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Apache Isis' core implementation of `ClassDiscoveryService2` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' core
+implementation of `ClassDiscoveryService2` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-CommandService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-CommandService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-CommandService.adoc
index 4551a2e..fd07d4d 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-CommandService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-CommandService.adoc
@@ -70,18 +70,18 @@ The typical way to indicate that an action should be reified into a `Command` is
 
 == Registering the Services
 
-Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+The (non-ASF) http://github.com/isisaddons/isis-module-command[Isis addons' command] module provides an implementation
+of this service (`CommandService`), and also provides a number of related domain services
+(`CommandJdoRepository` and `CommandServiceJdoContributions`).  This
+module also provides service implementations of the
+xref:rg.adoc#_rg_services-spi_manpage-CommandService[`BackgroundCommandService`].
 
+Assuming that an `AppManifest` is being used to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app])
+then this can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
 
-then adding the (non-ASF) http://github.com/isisaddons/isis-module-command[Isis addons' command] module to the classpath will automatically register the `CommandServiceJdo`, `CommandJdoRepository` and `CommandServiceJdoContributions` services.  If contributions are not required in the UI, these can be suppressed either using security or by implementing a xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
+If contributions are not required in the UI, these can be suppressed either using security or by implementing a
+xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
 
-Note that this module also provides service implementations of the xref:rg.adoc#_rg_services-spi_manpage-BackgroundCommandService[`BackgroundCommandService`].
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentMappingService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentMappingService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentMappingService.adoc
index 86d3229..ad38b2f 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentMappingService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentMappingService.adoc
@@ -41,7 +41,9 @@ This is an "internal" SPI, meaning that it uses types that are not part of the I
 
 == Implementations
 
-No default implementations are provided by Apache Isis framework itself.  However, the (non-ASF) http://github.com/isisaddons/isis-app-todoapp[Isis addons' todoapp] includes a sample implementation to convert its `ToDoItem` entity into a `ToDoItemDto` (JAXB annotated and derived from an XSD).  This uses the link:http://orika-mapper.github.io/orika-docs/intro.html[Orika] mapping library.
+No default implementations are provided by Apache Isis framework itself.  However, the (non-ASF) http://github.com/isisaddons/isis-app-todoapp[Isis addons' todoapp] includes a sample implementation to convert its `ToDoItem`
+entity into (two different versions of) a `ToDoItemDto`  (JAXB annotated).  This uses the
+link:http://orika-mapper.github.io/orika-docs/intro.html[Orika] mapping library.
 
 The source code is:
 
@@ -81,7 +83,6 @@ public class CustomContentMappingService implements ContentMappingService {
         }
         return null;
     }
-
     @javax.inject.Inject
     private BookmarkService bookmarkService;
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentNegotiationService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentNegotiationService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentNegotiationService.adoc
index 7d6dd49..17972e8 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentNegotiationService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ContentNegotiationService.adoc
@@ -187,15 +187,13 @@ If the property is not set, then the default depends on the xref:rg.adoc#_rg_run
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Isis' default implementation of `ContentNegotiationService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' default
+implementation of `ContentNegotiationService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EmailNotificationService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EmailNotificationService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EmailNotificationService.adoc
index 7de4c70..ba199b0 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EmailNotificationService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EmailNotificationService.adoc
@@ -39,7 +39,8 @@ If `isConfigured()` returns false then it is _not_ valid to call `send(...)` (an
 
 == Implementation
 
-The framework provides a default implementation, `o.a.i.core.runtime.services.userreg.EmailNotificationServiceDefault` that constructs the emails to send.
+The framework provides a default implementation, `o.a.i.core.runtime.services.userreg.EmailNotificationServiceDefault`
+that constructs the emails to send.
 
 
 
@@ -63,14 +64,13 @@ To ensure that your alternative implementation takes the place of the default im
 == Registering the Service
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' default
+implementation of `EmailNotificationService` service is automatically registered and injected (it is annotated with
+`@DomainService`) so no further configuration is required.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Isis' default implementation of `EmailNotificationService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 == Related Services

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ErrorReportingService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ErrorReportingService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ErrorReportingService.adoc
index a4c81d5..525e1d9 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ErrorReportingService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ErrorReportingService.adoc
@@ -99,7 +99,8 @@ image::{_imagesdir}reference-services-spi/ErrorReportingService/kitchensink-exam
 
 == Registering the Services
 
-Assuming that the `AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app], then just
- ensure that the implementation is on the classpath and the module containing the implementation is returned in
- `AppManifest#getModules()`.
+There is no default implementation of this service.  To register your own implementation (and assuming that an
+`AppManifest` is being used to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]), then just
+ensure that the implementation is on the classpath and the module containing the implementation is returned in
+`AppManifest#getModules()`.
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EventSerializer.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EventSerializer.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EventSerializer.adoc
index 3253323..4a02273 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EventSerializer.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-EventSerializer.adoc
@@ -53,21 +53,22 @@ You could if you wish change the representation by registering your own implemen
 
 
 
-
 == Registering the Services
 
-Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+There is no default implementation of this service provided by the core Apache Isis framework.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+The (non-ASF) http://github.com/isisaddons/isis-module-publishing[Isis addons' publishing] module provides an
+implementation of this service (`RestfulObjectsSpecEventSerializer`) that serializes action invocations and published
+objects into a format based on the Restful Objects specification.  It also (as you might imagine) provides an
+implementation of the xref:rg.adoc#_rg_services-spi_manpage-PublishingService[`PublishingService`].
 
-then adding the (non-ASF) http://github.com/isisaddons/isis-module-publishing[Isis addons' publishing] module to the classpath will automatically register the `RestfulObjectsSpecEventSerializer` implementation (and also the module's `PublishingService` implementation).
+Assuming that an `AppManifest` is being used to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app])
+then this can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
 
 
 
 == Related Services
 
-This service is intended (though not mandated) to be used by implementations of xref:rg.adoc#_rg_services-spi_manpage-PublishingService[`PublishingService`].
\ No newline at end of file
+This service is intended (though not mandated) to be used by implementations of xref:rg.adoc#_rg_services-spi_manpage-PublishingService[`PublishingService`].  The (non-ASF) http://github.com/isisaddons/isis-module-publishing[Isis addons' publishing] module does use it (though the (non-ASF)
+http://github.com/isisaddons/isis-module-publishmq[Isis addons' publishmq] module does not).
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ExceptionRecognizer.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ExceptionRecognizer.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ExceptionRecognizer.adoc
index dba9775..c0227eb 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ExceptionRecognizer.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-ExceptionRecognizer.adoc
@@ -96,16 +96,10 @@ If you want to recognize and handle additional exceptions (for example to captur
 
 == Registering the Services
 
-
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then the default implementations provided by the framework (`DomainObjectContainerDefault` and `ExceptionRecognizerCompositeForJdoObjectStore`) will be registered.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then the default
+implementations provided by the framework (`DomainObjectContainerDefault` and
+`ExceptionRecognizerCompositeForJdoObjectStore`) will be registered.
 
 In addition, you can register any further exception recognizers in `isis.properties`:
 
@@ -121,6 +115,5 @@ isis.services=...,\
 Prior to 1.9.0, the `ExceptionRecognizerCompositeForJdoObjectStore` also required manual registration.
 ====
 
-
 If the JDO exception recognizers are not required (rather unlikely), then they can be disabled en-masse using the xref:rg.adoc#_rg_runtime_configuring-core[configuration property] `isis.services.ExceptionRecognizerCompositeForJdoObjectStore.disable`.
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-FixtureScriptsSpecificationProvider.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-FixtureScriptsSpecificationProvider.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-FixtureScriptsSpecificationProvider.adoc
index 38c07f4..3e3dc2a 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-FixtureScriptsSpecificationProvider.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-FixtureScriptsSpecificationProvider.adoc
@@ -6,13 +6,19 @@
 
 
 
-The `FixtureScriptsSpecificationProvider` configures the xref:rg.adoc#_rg_services-api_manpage-FixtureScriptsDefault[`FixtureScriptsDefault`] domain service, providing the location to search for fixture scripts and other settings.
+The `FixtureScriptsSpecificationProvider` configures the
+xref:rg.adoc#_rg_services-api_manpage-FixtureScriptsDefault[`FixtureScriptsDefault`] domain service, providing the
+location to search for fixture scripts and other settings.
 
-The service is only used if the `FixtureScriptsDefault` service is instantiated as a fallback by the framework.  If the application provides its own subclass of xref:rg.adoc#_rg_classes_super_manpage-FixtureScripts[`FixtureScripts`] superclass, then this provider service is not used.
+The service is only used if the `FixtureScriptsDefault` service is instantiated as a fallback by the framework.  If
+the application provides its own subclass of xref:rg.adoc#_rg_classes_super_manpage-FixtureScripts[`FixtureScripts`]
+superclass, then this provider service is not used.
 
 [TIP]
 ====
-Of the two designs, we encourage you to implement this "provider" SPI rather than subclass `FixtureScripts`.  The primary benefit (apart from decoupling responsibilities) is that it ensures that there is always an instance of `FixtureScripts` available for use.
+Of the two designs, we encourage you to implement this "provider" SPI rather than subclass `FixtureScripts`.  The
+primary benefit (apart from decoupling responsibilities) is that it ensures that there is always an instance of
+`FixtureScripts` available for use.
 ====
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-LocaleProvider.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-LocaleProvider.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-LocaleProvider.adoc
index 81f8ecf..686e654 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-LocaleProvider.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-LocaleProvider.adoc
@@ -50,15 +50,13 @@ Currently there is no equivalent implementation for the xref:ug.adoc#_ug_restful
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-and that the xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used then an implementation of `LocaleProvider` is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]), _and_ that the
+xref:ug.adoc#_ug_wicket-viewer[Wicket viewer] is being used, then an implementation of `LocaleProvider` is
+automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-PublishingService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-PublishingService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-PublishingService.adoc
index 9a197a6..2af475b 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-PublishingService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-PublishingService.adoc
@@ -45,10 +45,36 @@ The serialized form returned by `EventSerializer` must be in a form that the `Pu
 
 == Implementation
 
-The (non-ASF) http://github.com/isisaddons/isis-module-publishing[Isis addons' publishing] module provides an implementation (`org.isisaddons.module.publishing.dom.org.apache.isis.applib.services.publish`) that persists each event as a `PublishedEvent` entity.  This holds the serialized form of the event metadata and payload as translated into a string by the injected `EventSerializer`.  The module also provides its own implementation of `EventSerializer`, namely `RestfulObjectsSpecEventSerializer`, which represents the event payload using the representation defined by the link:http://restfulobjects.org[Restful Objects spec] of (transient) objects, grafting on the metadata as additional JSON nodes.
+The framework provides no default implementations of this service.  There are however two implementations available in
+the (non-ASF) link:http://isisaddons.org[Isis Addons].
 
-The `PublishedEvent` entity also has a `state` field taking the values either "QUEUED" or "PROCESSED".  The intention here is that an event bus can poll this table to grab pending events and dispatch them to downstream systems.  When ``PublishedEvent``s are persisted initially they always take the value "QUEUED".
+=== isis-module-publishing
 
+The (non-ASF) http://github.com/isisaddons/isis-module-publishing[Isis addons' publishing] module provides an
+implementation (`org.isisaddons.module.publishing.dom.PublishingService`) that persists each
+event as a `PublishedEvent` entity.  This holds the serialized form of the event metadata and payload as translated
+into a string by the injected `EventSerializer`.  The module also provides its own implementation of `EventSerializer`,
+namely `RestfulObjectsSpecEventSerializer`, which represents the event payload using the representation defined by the link:http://restfulobjects.org[Restful Objects spec] of (transient) objects, grafting on the metadata as additional
+JSON nodes.
+
+The `PublishedEvent` entity also has a `state` field taking the values either "QUEUED" or "PROCESSED".  The intention
+here is that an event bus can poll this table to grab pending events and dispatch them to downstream systems.  When
+``PublishedEvent``s are persisted initially they always take the value "QUEUED".
+
+=== isis-module-publishmq
+
+The (non-ASF) http://github.com/isisaddons/isis-module-publishmq[Isis addons' publishmq] module provides an
+implementation (`org.isisaddons.module.publismq.dom.servicespi.PublishingServiceUsingActiveMq`) that publishes each 
+action invocation as an event on an link:http://activemq.apache.org[ActiveMQ] message queue.  These are converted into
+a canonical XML form (the xref:rg.adoc#_rg_schema-aim[ActionInvocationMemento] schema) using the
+xref:rg.adoc#_rg_schema-utilities-ActionInvocationMementoDtoUtils[`ActionInvocationMementoDtoUtils`] class; the idea
+being that subscribers on the ActiveMQ message queue can then query back for further information, for example using
+the xref:ug.adoc#_ug_restfulobjects-viewer[RestfulObjects viewer].
+
+[NOTE]
+====
+At the time of writing this implementation does not publish changed object events.
+====
 
 
 
@@ -131,15 +157,17 @@ public class ToDoItemChangedPayloadFactory implements PublishingPayloadFactoryFo
 
 == Registering the Services
 
-Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
+There is no default implementation of this service provided by the core Apache Isis framework.
 
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
+Both the (non-ASF) Isis addons' http://github.com/isisaddons/isis-module-publishing[publishing] module and the
+http://github.com/isisaddons/isis-module-publishmq[publishmq] module provide implementations of this service.
+Assuming that an `AppManifest` is being used to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app])
+then this can be activated by updating the `pom.xml` and updating the `AppManifest#getModules()` method.
+
+The modules also provide services that contribute to the UI.  If contributions are not required in the UI, these can be
+suppressed either using security or by implementing a
+xref:ug.adoc#_ug_more-advanced_decoupling_vetoing-visibility[vetoing subscriber].
 
-then adding the (non-ASF) http://github.com/isisaddons/isis-module-publishing[Isis addons' publishing] module to the classpath will automatically register the `PublishingService` implementation (and also the module's `RestfulObjectsSpecEventSerializer` implementation).
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f0cb5cbf/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-RepresentationService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-RepresentationService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-RepresentationService.adoc
index 7480586..889f7e7 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-RepresentationService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rg_services-spi_manpage-RepresentationService.adoc
@@ -85,19 +85,15 @@ This is an "internal" SPI, meaning that it uses types that are not part of the I
 
 As discussed in the introduction, the framework provides a default implementation, `o.a.i.v.ro.rendering.service.RepresentationServiceForRestfulObjects`.   This delegates to xref:rg.adoc#_rg_services-spi_manpage-ContentNegotiationService[`ContentNegotiationService`] to generate an alternative representation; but if none is provided then it falls back on generating the representations as defined in the link:http://restfulobjects.org[Restful Objects spec] v1.0.
 
+To use an alternative implementation, use
+xref:rg.adoc#_rg_annotations_manpage-DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`] (as explained
+further in this xref:ug.adoc#_ug_how-tos_replacing-default-service-implementations["how to"] tip).
 
 
 == Registering the Services
 
 Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
-`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]):
-
-[source,ini]
-----
-isis.services-installer=configuration-and-annotation
-----
-
-then Isis' default implementation of `RepresentationService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.
+`AppManifest` to xref:rg.adoc#_rg_classes_AppManifest-bootstrapping[bootstrap the app]) then Apache Isis' default implementation of `RepresentationService` service is automatically registered and injected (it is annotated with `@DomainService`) so no further configuration is required.