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 2019/12/12 11:34:41 UTC

[isis] 01/10: ISIS-2222: restructures bootstrapping for demo app

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

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

commit 009c09047c0f4da05b76720f3cdbd070f56b3a09
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Dec 12 07:01:24 2019 +0000

    ISIS-2222: restructures bootstrapping for demo app
    
    Also debugging inability to run datanucleus:enhance for secman/persistence-jdo
---
 .../pages/hints-and-tips/datanucleus-enhancer.adoc |   2 +-
 examples/demo/pom.xml                              |   4 +-
 .../src/main/java/demoapp/application/DemoApp.java |  50 ---------
 .../java/demoapp/application/DemoAppManifest.java  |  99 -----------------
 .../demo/src/main/java/demoapp/webapp/DemoApp.java | 121 +++++++++++++++++++++
 .../{ => webapp}/application/menubars.layout.xml   |   7 +-
 .../demo/src/main/resources/application.properties |  86 ---------------
 examples/demo/src/main/resources/application.yml   | 108 ++++++++++++++++++
 examples/demo/src/main/resources/banner.txt        |   6 +
 examples/demo/src/main/resources/static/index.html |  27 +++--
 extensions/pom.xml                                 |  74 +++++++++++++
 11 files changed, 331 insertions(+), 253 deletions(-)

diff --git a/antora/components/toc/modules/devguide/pages/hints-and-tips/datanucleus-enhancer.adoc b/antora/components/toc/modules/devguide/pages/hints-and-tips/datanucleus-enhancer.adoc
index 2741f79..2d2377c 100644
--- a/antora/components/toc/modules/devguide/pages/hints-and-tips/datanucleus-enhancer.adoc
+++ b/antora/components/toc/modules/devguide/pages/hints-and-tips/datanucleus-enhancer.adoc
@@ -18,7 +18,7 @@ Bytecode enhancement is actually a requirement of the JDO spec; the process is d
 
 What this means is that the enhancer -- available as both a Maven plugin and as an Eclipse plugin -- must, one way or another, be integrated into your development environment.
 
-If working from the Maven command line, JDO enhancement is done using the `maven-datanucleus-plugin`.
+If working from the Maven command line, JDO enhancement is done using the `datanucleus-maven-plugin`.
 
 Both the xref:starters:helloworld:about.adoc[HelloWorld] and xref:starters:simpleapp:about.adoc[SimpleApp] Maven archetypes generate applications that have this plugin pre-configured.
 
diff --git a/examples/demo/pom.xml b/examples/demo/pom.xml
index d28908a..b22e602 100644
--- a/examples/demo/pom.xml
+++ b/examples/demo/pom.xml
@@ -190,7 +190,7 @@
 								<jvmFlags>
 									<jvmFlag>-Xmx512m</jvmFlag>
 								</jvmFlags>
-								<mainClass>demoapp.application.DemoApp</mainClass>
+								<mainClass>demoapp.webapp.DemoApp</mainClass>
 								<ports>
 									<port>8080</port>
 								</ports>
@@ -240,7 +240,7 @@
 								<jvmFlags>
 									<jvmFlag>-Xmx512m</jvmFlag>
 								</jvmFlags>
-								<mainClass>demoapp.application.DemoApp</mainClass>
+								<mainClass>demoapp.webapp.DemoApp</mainClass>
 								<ports>
 									<port>8080</port>
 								</ports>
diff --git a/examples/demo/src/main/java/demoapp/application/DemoApp.java b/examples/demo/src/main/java/demoapp/application/DemoApp.java
deleted file mode 100644
index db9ac79..0000000
--- a/examples/demo/src/main/java/demoapp/application/DemoApp.java
+++ /dev/null
@@ -1,50 +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 demoapp.application;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.annotation.Import;
-
-/**
- * Bootstrap the application.
- */
-@SpringBootApplication
-@Import({
-    DemoAppManifest.class,
-})
-public class DemoApp extends SpringBootServletInitializer {
-
-    /**
-     * 
-     * @param args
-     * @implNote this is to support the <em>Spring Boot Maven Plugin</em>, which auto-detects an 
-     * entry point by searching for classes having a {@code main(...)}
-     */
-    public static void main(String[] args) {
-        //IsisPresets.prototyping();
-        //IsisPresets.logging(IsisBeanScanInterceptorForSpring.class, "DEBUG");
-        //IsisPresets.logging(IsisBeanTypeRegistry.class, "DEBUG");
-        //IsisPresets.logging(org.apache.shiro.realm.AuthorizingRealm.class, "TRACE");
-        //IsisPresets.logging(org.apache.isis.metamodel.authorization.standard.AuthorizationFacetAbstract.class, "DEBUG");
-        //IsisPresets.logging(org.apache.isis.webapp.modules.templresources.TemplateResourceServlet.class, "DEBUG");
-        SpringApplication.run(new Class[] { DemoApp.class }, args);
-    }
-}
diff --git a/examples/demo/src/main/java/demoapp/application/DemoAppManifest.java b/examples/demo/src/main/java/demoapp/application/DemoAppManifest.java
deleted file mode 100644
index 12b89c1..0000000
--- a/examples/demo/src/main/java/demoapp/application/DemoAppManifest.java
+++ /dev/null
@@ -1,99 +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 demoapp.application;
-
-import javax.inject.Singleton;
-
-import org.apache.isis.viewer.restfulobjects.viewer.IsisModuleRestfulObjectsViewer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.annotation.PropertySources;
-
-import org.apache.isis.config.presets.IsisPresets;
-import org.apache.isis.extensions.fixtures.IsisModuleExtFixtures;
-import org.apache.isis.extensions.secman.api.SecurityModuleConfig;
-import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
-import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationServiceAllowBeatsVeto;
-import org.apache.isis.extensions.secman.encryption.jbcrypt.IsisModuleSecmanEncryptionJbcrypt;
-import org.apache.isis.extensions.secman.jdo.IsisModuleSecmanPersistenceJdo;
-import org.apache.isis.extensions.secman.model.IsisModuleSecmanModel;
-import org.apache.isis.extensions.secman.shiro.IsisModuleSecmanRealmShiro;
-import org.apache.isis.extensions.sse.IsisModuleExtSse;
-import org.apache.isis.persistence.jdo.datanucleus5.IsisModuleJdoDataNucleus5;
-import org.apache.isis.webboot.springboot.IsisModuleSpringBoot;
-import org.apache.isis.security.shiro.IsisModuleSecurityShiro;
-import org.apache.isis.viewer.wicket.viewer.IsisModuleWicketViewer;
-
-import demoapp.dom.DemoModule;
-import demoapp.utils.LibraryPreloadingService;
-
-/**
- * Makes the integral parts of the 'demo' web application.
- */
-@Configuration
-@PropertySources({
-    @PropertySource(IsisPresets.HsqlDbInMemory),
-    @PropertySource(IsisPresets.NoTranslations),
-    @PropertySource(IsisPresets.SilenceWicket),
-})
-@Import({
-    IsisModuleSpringBoot.class,
-    IsisModuleSecurityShiro.class,
-    IsisModuleJdoDataNucleus5.class,
-    IsisModuleWicketViewer.class,
-    IsisModuleExtSse.class, // server sent events
-    IsisModuleRestfulObjectsViewer.class,
-
-    // Security Manager Extension (secman)
-    IsisModuleSecmanModel.class,
-    IsisModuleSecmanRealmShiro.class,
-    IsisModuleSecmanPersistenceJdo.class,
-    IsisModuleSecmanEncryptionJbcrypt.class,
-
-    IsisModuleExtFixtures.class,
-    
-    LibraryPreloadingService.class // just a performance enhancement
-
-})
-@ComponentScan(
-        basePackageClasses= {
-                DemoModule.class
-        }
-)
-public class DemoAppManifest {
-
-    @Bean @Singleton
-    public SecurityModuleConfig securityModuleConfigBean() {
-        return SecurityModuleConfig.builder()
-                .adminUserName("sven")
-                .adminAdditionalPackagePermission("demoapp.dom")
-                .adminAdditionalPackagePermission("org.apache.isis")
-                .build();
-    }
-
-    @Bean @Singleton
-    public PermissionsEvaluationService permissionsEvaluationService() {
-        return new PermissionsEvaluationServiceAllowBeatsVeto();
-    }
-
-
-}
diff --git a/examples/demo/src/main/java/demoapp/webapp/DemoApp.java b/examples/demo/src/main/java/demoapp/webapp/DemoApp.java
new file mode 100644
index 0000000..61fe273
--- /dev/null
+++ b/examples/demo/src/main/java/demoapp/webapp/DemoApp.java
@@ -0,0 +1,121 @@
+/*
+ *  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 demoapp.webapp;
+
+import demoapp.dom.DemoModule;
+import demoapp.utils.LibraryPreloadingService;
+
+import javax.inject.Singleton;
+
+import org.apache.isis.config.presets.IsisPresets;
+import org.apache.isis.extensions.fixtures.IsisModuleExtFixtures;
+import org.apache.isis.extensions.secman.api.SecurityModuleConfig;
+import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
+import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationServiceAllowBeatsVeto;
+import org.apache.isis.extensions.secman.encryption.jbcrypt.IsisModuleSecmanEncryptionJbcrypt;
+import org.apache.isis.extensions.secman.jdo.IsisModuleSecmanPersistenceJdo;
+import org.apache.isis.extensions.secman.model.IsisModuleSecmanModel;
+import org.apache.isis.extensions.secman.shiro.IsisModuleSecmanRealmShiro;
+import org.apache.isis.extensions.sse.IsisModuleExtSse;
+import org.apache.isis.persistence.jdo.datanucleus5.IsisModuleJdoDataNucleus5;
+import org.apache.isis.security.shiro.IsisModuleSecurityShiro;
+import org.apache.isis.viewer.restfulobjects.viewer.IsisModuleRestfulObjectsViewer;
+import org.apache.isis.viewer.wicket.viewer.IsisModuleWicketViewer;
+import org.apache.isis.webboot.springboot.IsisModuleSpringBoot;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.*;
+
+/**
+ * Bootstrap the application.
+ */
+@SpringBootApplication
+@Import({
+    DemoApp.AppManifest.class,
+})
+public class DemoApp extends SpringBootServletInitializer {
+
+    /**
+     * 
+     * @param args
+     * @implNote this is to support the <em>Spring Boot Maven Plugin</em>, which auto-detects an 
+     * entry point by searching for classes having a {@code main(...)}
+     */
+    public static void main(String[] args) {
+        //IsisPresets.prototyping();
+        //IsisPresets.logging(IsisBeanScanInterceptorForSpring.class, "DEBUG");
+        //IsisPresets.logging(IsisBeanTypeRegistry.class, "DEBUG");
+        //IsisPresets.logging(org.apache.shiro.realm.AuthorizingRealm.class, "TRACE");
+        //IsisPresets.logging(org.apache.isis.metamodel.authorization.standard.AuthorizationFacetAbstract.class, "DEBUG");
+        //IsisPresets.logging(org.apache.isis.webapp.modules.templresources.TemplateResourceServlet.class, "DEBUG");
+        SpringApplication.run(new Class[] { DemoApp.class }, args);
+    }
+
+    /**
+     * Makes the integral parts of the 'demo' web application.
+     */
+    @Configuration
+    @PropertySources({
+        @PropertySource(IsisPresets.HsqlDbInMemory),
+        @PropertySource(IsisPresets.NoTranslations),
+        @PropertySource(IsisPresets.SilenceWicket),
+    })
+    @Import({
+        IsisModuleSpringBoot.class,
+        IsisModuleSecurityShiro.class,
+        IsisModuleJdoDataNucleus5.class,
+        IsisModuleWicketViewer.class,
+        IsisModuleExtSse.class, // server sent events
+        IsisModuleRestfulObjectsViewer.class,
+
+        // Security Manager Extension (secman)
+        IsisModuleSecmanModel.class,
+        IsisModuleSecmanRealmShiro.class,
+        IsisModuleSecmanPersistenceJdo.class,
+        IsisModuleSecmanEncryptionJbcrypt.class,
+
+        IsisModuleExtFixtures.class,
+
+        LibraryPreloadingService.class // just a performance enhancement
+
+    })
+    @ComponentScan(
+            basePackageClasses= {
+                    DemoModule.class
+            }
+    )
+    public static class AppManifest {
+
+        @Bean @Singleton
+        public SecurityModuleConfig securityModuleConfigBean() {
+            return SecurityModuleConfig.builder()
+                    .adminUserName("sven")
+                    .adminAdditionalPackagePermission("demoapp.dom")
+                    .adminAdditionalPackagePermission("org.apache.isis")
+                    .build();
+        }
+
+        @Bean @Singleton
+        public PermissionsEvaluationService permissionsEvaluationService() {
+            return new PermissionsEvaluationServiceAllowBeatsVeto();
+        }
+    }
+
+}
diff --git a/examples/demo/src/main/java/demoapp/application/menubars.layout.xml b/examples/demo/src/main/java/demoapp/webapp/application/menubars.layout.xml
similarity index 96%
rename from examples/demo/src/main/java/demoapp/application/menubars.layout.xml
rename to examples/demo/src/main/java/demoapp/webapp/application/menubars.layout.xml
index f59a878..8634516 100644
--- a/examples/demo/src/main/java/demoapp/application/menubars.layout.xml
+++ b/examples/demo/src/main/java/demoapp/webapp/application/menubars.layout.xml
@@ -86,13 +86,10 @@
         <mb3:menu>
             <mb3:named>Prototyping</mb3:named>
             <mb3:section>
-                <mb3:serviceAction objectType="isisApplib.FixtureScriptsDefault" id="runFixtureScript">
+                <mb3:serviceAction objectType="isisExtFixtures.FixtureScripts" id="runFixtureScript">
                     <cpt:named>Run Fixture Script</cpt:named>
                 </mb3:serviceAction>
-                <mb3:serviceAction objectType="isisApplib.FixtureScriptsDefault" id="runFixtureScriptWithAutoComplete">
-                    <cpt:named>Run Fixture Script</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isisApplib.FixtureScriptsDefault" id="recreateObjectsAndReturnFirst">
+                <mb3:serviceAction objectType="isisExtFixtures.FixtureScripts" id="recreateObjectsAndReturnFirst">
                     <cpt:named>Recreate Objects And Return First</cpt:named>
                 </mb3:serviceAction>
             </mb3:section>
diff --git a/examples/demo/src/main/resources/application.properties b/examples/demo/src/main/resources/application.properties
deleted file mode 100644
index eef7bf1..0000000
--- a/examples/demo/src/main/resources/application.properties
+++ /dev/null
@@ -1,86 +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.
-
-isis.reflector.validator.allowDeprecated=false
-isis.reflector.validator.noParamsOnly=true
-isis.reflector.validator.explicitObjectType=false
-isis.reflector.validator.serviceActionsOnly=true
-isis.reflector.validator.mixinsOnly=true
-
-
-isis.reflector.facet.cssClassFa.patterns=\
-                        new.*:fa-plus,\
-                        add.*:fa-plus-square,\
-                        create.*:fa-plus,\
-                        update.*:fa-edit,\
-                        delete.*:fa-trash,\
-                        find.*:fa-search,\
-                        list.*:fa-list
-
-isis.reflector.facet.cssClass.patterns=\
-                        delete.*:btn-danger
-
-isis.objects.editing=false
-
-isis.viewer.wicket.bookmarkedPages.showChooser=false
-isis.viewer.wicket.breadcrumbs.showChooser=false
-
-isis.viewer.wicket.application.menubarsLayoutXml=demoapp/application/menubars.layout.xml
-isis.viewer.wicket.application.faviconUrl=/images/favicon.png
-
-isis.viewer.wicket.application.brandLogoHeader=/images/gift_48.png
-isis.viewer.wicket.application.brandLogoSignin=/images/gift_256.png
-
-isis.viewer.wicket.application.name=Isis Demo App
-isis.viewer.wicket.application.css=/css/application.css
-isis.viewer.wicket.application.js=/scripts/application.js
-isis.viewer.wicket.application.about=Isis Demo App
-isis.viewer.wicket.welcome.file=welcome.html
-
-isis.viewer.wicket.credit[0].image=/images/apache-isis/logo-48x48.png
-isis.viewer.wicket.credit[0].name=Apache Isis
-isis.viewer.wicket.credit[0].url=http://isis.apache.org
-
-isis.viewer.wicket.themes.initial=bootstrap-theme
-isis.viewer.wicket.themes.showChooser=yes
-isis.viewer.wicket.themes.enabled=bootstrap-theme,Cosmo,Flatly,Darkly,Sandstone,United
-
-isis.viewer.wicket.maxTitleLengthInStandaloneTables=0
-isis.viewer.wicket.maxTitleLengthInParentedTables=0
-
-
-isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll=true
-isis.persistor.datanucleus.impl.datanucleus.schema.validateTables=true
-isis.persistor.datanucleus.impl.datanucleus.schema.validateConstraints=true
-
-
-isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false
-isis.persistor.datanucleus.impl.datanucleus.identifier.case=MixedCase
-isis.persistor.datanucleus.impl.datanucleus.cache.level2.type=none
-isis.persistor.datanucleus.impl.datanucleus.cache.level2.mode=ENABLE_SELECTIVE
-
-#disable wicket debug-bar
-isis.viewer.wicket.developmentUtilities.enable=false
-#disable cache verification ...
-isis.persistor.datanucleus.impl.datanucleus.findObject.validateWhenCached=false
-#disable translation ...
-isis.services.translation.po.mode=disable
-#modal action rendering is considered to work for all use-cases 
-isis.viewer.wicket.dialogMode=modal
-
-
-
diff --git a/examples/demo/src/main/resources/application.yml b/examples/demo/src/main/resources/application.yml
new file mode 100644
index 0000000..7a422a7
--- /dev/null
+++ b/examples/demo/src/main/resources/application.yml
@@ -0,0 +1,108 @@
+#  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.
+#
+# See also config/application.properties
+#
+isis:
+  reflector:
+    explicit-annotations:
+      action: true
+    validator:
+      allow-deprecated: false
+      no-params-only: true
+      explicit-object-type: true
+      service-actions-only: true
+      mixins-only: true
+
+    facet:
+      css-class-fa:
+        patterns:
+          new.*:fa-plus,
+          add.*:fa-plus-square,
+          create.*:fa-plus,
+          update.*:fa-edit,
+          delete.*:fa-trash,
+          find.*:fa-search,
+          list.*:fa-list
+
+      css-class:
+        patterns:
+          delete.*:btn-danger
+
+  objects:
+    editing: false
+
+  viewer:
+    wicket:
+      application:
+        menubars-layout-xml: domainapp/webapp/application/menubars.layout.xml
+        favicon-url: /images/favicon.png
+        brand-logo-header: /images/gift_48.png
+        brand-logo-signin: /images/gift_256.png
+        name: Apache Isis Demo App
+        css: css/application.css
+        js: scripts/application.js
+        about: Apache Isis Hello World
+
+
+      credit[0]:
+        image: /images/apache-isis/logo-48x48.png
+        name: Apache Isis
+        url: http://isis.apache.org
+
+      themes:
+        initial: bootstrap-theme
+        showChooser: true
+        enabled: bootstrap-theme,Cosmo,Flatly,Darkly,Sandstone,United
+
+      max-title-length-in-standalone-tables: 0
+      max-title-length-in-parented-tables: 0
+
+      development-utilities:
+        enable: false
+      bookmarked-pages:
+        show-chooser: false
+      breadcrumbs:
+        show-chooser: false
+      dialog-mode: sidebar
+      dialog-mode-for-menu: modal
+
+  persistor:
+    datanucleus:
+      impl:
+        # note that properties under 'isis.persistor.datanucleus.impl' are passed through directly
+        # to DataNucleus, and must use camelCase rather than kebab-case
+        datanucleus:
+          schema:
+            validateTables: true
+            validateConstraints: true
+
+          persistenceByReachabilityAtCommit: false
+          identifier:
+            case: MixedCase
+
+          cache:
+            level2:
+              type: none
+              mode: ENABLE_SELECTIVE
+  services:
+    translation:
+      po:
+        mode: disable
+spring:
+  banner:
+    location: banner.txt
diff --git a/examples/demo/src/main/resources/banner.txt b/examples/demo/src/main/resources/banner.txt
new file mode 100644
index 0000000..1348a76
--- /dev/null
+++ b/examples/demo/src/main/resources/banner.txt
@@ -0,0 +1,6 @@
+     _                     _            ___     _
+    / \   _ __   __ _  ___| |__   ___  |_ _|___(_)___
+   / _ \ | '_ \ / _` |/ __| '_ \ / _ \  | |/ __| / __|
+  / ___ \| |_) | (_| | (__| | | |  __/  | |\__ \ \__ \
+ /_/   \_\ .__/ \__,_|\___|_| |_|\___| |___|___/_|___/
+         |_|
\ No newline at end of file
diff --git a/examples/demo/src/main/resources/static/index.html b/examples/demo/src/main/resources/static/index.html
index 17ea0a8..e0a7d9f 100644
--- a/examples/demo/src/main/resources/static/index.html
+++ b/examples/demo/src/main/resources/static/index.html
@@ -20,7 +20,7 @@
 <html>
     <head>
         <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-        <title>Apache Isis&trade; Demo 2</title>
+        <title>Apache Isis&trade; v2 Demo</title>
         
         <style type="text/css">
 body {
@@ -57,7 +57,7 @@ th, td {
             <img alt="Isis Logo" src="images/apache-isis/logo.png" />
              
             <p>
-                This demo app illustrustrates some features of the Apache Isis' programming model.
+                This demo app illustrates some features of the Apache Isis' programming model.
                 <br/>
             </p>
 
@@ -65,24 +65,31 @@ th, td {
             <ul>
                 <li>
                     <p>
-                        <b><a href="wicket/">wicket/</a></b>
+                        <b><a href="wicket/">Generic UI (Wicket)</a></b>
                     </p>
                     <p>
-                        provides access to a generic UI for end-users,
-                        Apache Isis' <a href="http://isis.apache.org/guides/ugvw/ugvw.html" target="_blank">Wicket Viewer</a>.
-                        As its name suggests, this viewer is built on top of <a href="http://wicket.apache.org" target="_blank">Apache Wicket</a>&trade;.
+                        provides access to a generic UI for end-users, Apache Isis'
+                        <a href="http://isis.apache.org/guides/ugvw/ugvw.html" target="_blank">Wicket Viewer</a>.
+                        As its name suggests, this viewer is built on top of
+                        <a href="http://wicket.apache.org" target="_blank">Apache Wicket</a>&trade;.
                     </p>
                 </li>
                 <li>
                     <p>
                         <b>
-                            <a href="swagger-ui/index.html">swagger-ui/</a>
+                            <a href="swagger-ui/index.thtml">RESTful API (Swagger)</a>
                         </b>
                     </p>
                     <p>
-                        provides access to a Swagger UI which uses a subset of the framework's automatically
-                        generated <a href="restful/">RESTful API</a> (provided by the
-                        <a href="http://isis.apache.org/guides/ugvro/ugvro.html"  target="_blank">Restful Objects viewer</a>, conformant with the <a href="http://restfulobjects.org"  target="_blank">Restful Objects</a> spec).
+                        provides access to a Swagger UI for convenient access to a subset of the framework's RESTful
+                        API, automatically generated by the
+                        <a href="http://isis.apache.org/guides/ugvro/ugvro.html"
+                           target="_blank">Restful Objects viewer</a>.
+                    </p>
+                    <p>
+                        The full backend API (at <a href="restful/">restful/</a>) renders both simple and also richer
+                        hypermedia representations of domain objects, the latter conformant with the
+                        <a href="http://restfulobjects.org"  target="_blank">Restful Objects</a> spec.
                     </p>
                 </li>
             </ul>
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 1640d56..b9fe027 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -227,6 +227,80 @@
 		<module>lib/unittestsupport/impl</module>
 	</modules>
 
+	<profiles>
+		<profile>
+			<id>isis-app-starter-datanucleusenhance</id>
+			<activation>
+				<file>
+					<exists>${basedir}/logging-dn-enhance.properties</exists>
+				</file>
+			</activation>
+			<properties>
+
+				<!-- keep in sync with versions used in Apache Isis -->
+				<datanucleus-api-jdo.version>5.2.2</datanucleus-api-jdo.version>
+				<datanucleus-core.version>5.2.2</datanucleus-core.version>
+				<datanucleus-jodatime.version>5.2.0-release</datanucleus-jodatime.version>
+				<datanucleus-maven-plugin.version>5.2.1</datanucleus-maven-plugin.version>
+
+				<datanucleus-maven-plugin.log4jConfiguration>${basedir}/logging-dn-enhance.properties</datanucleus-maven-plugin.log4jConfiguration>
+				<datanucleus-maven-plugin.verbose>true</datanucleus-maven-plugin.verbose>
+				<datanucleus-maven-plugin.fork>false</datanucleus-maven-plugin.fork>
+
+			</properties>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.datanucleus</groupId>
+						<artifactId>datanucleus-maven-plugin</artifactId>
+						<version>${datanucleus-maven-plugin.version}</version>
+						<configuration>
+							<fork>${datanucleus-maven-plugin.fork}</fork>
+							<log4jConfiguration>${datanucleus-maven-plugin.log4jConfiguration}</log4jConfiguration>
+							<verbose>${datanucleus-maven-plugin.verbose}</verbose>
+						</configuration>
+						<executions>
+							<execution>
+								<id>process-classes</id>
+								<phase>process-classes</phase>
+								<goals>
+									<goal>enhance</goal>
+								</goals>
+							</execution>
+							<execution>
+								<id>process-test-classes</id>
+								<phase>process-test-classes</phase>
+								<goals>
+									<goal>test-enhance</goal>
+								</goals>
+								<configuration>
+									<metadataDirectory>${project.build.testOutputDirectory}</metadataDirectory>
+								</configuration>
+							</execution>
+						</executions>
+						<dependencies>
+							<dependency>
+								<groupId>org.datanucleus</groupId>
+								<artifactId>datanucleus-core</artifactId>
+								<version>${datanucleus-core.version}</version>
+							</dependency>
+							<dependency>
+								<groupId>org.datanucleus</groupId>
+								<artifactId>datanucleus-api-jdo</artifactId>
+								<version>${datanucleus-api-jdo.version}</version>
+							</dependency>
+							<dependency>
+								<groupId>org.datanucleus</groupId>
+								<artifactId>datanucleus-jodatime</artifactId>
+								<version>${datanucleus-jodatime.version}</version>
+							</dependency>
+						</dependencies>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+
+	</profiles>
 </project>