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 2020/01/26 18:14:01 UTC

[isis-app-helloworld] branch master updated: updates in line with docs

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-app-helloworld.git


The following commit(s) were added to refs/heads/master by this push:
     new 10c275a  updates in line with docs
10c275a is described below

commit 10c275a1b2735cb2ddbc6f1666e99822b54843f5
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Jan 26 18:13:44 2020 +0000

    updates in line with docs
---
 README.adoc                                        |   5 +-
 pom.xml                                            |   2 +-
 .../domainapp/modules/hello/HelloWorldModule.java  |   2 +
 .../hello/dom/{impl => hwo}/HelloWorldObject.java  |  11 ++-
 .../dom/{impl => hwo}/HelloWorldObject.layout.xml  |   0
 .../hello/dom/{impl => hwo}/HelloWorldObject.png   | Bin
 .../hello/dom/{impl => hwo}/HelloWorldObjects.java |  20 ++++--
 .../modules/hello/{dom => }/types/Name.java        |   2 +-
 .../modules/hello/{dom => }/types/Notes.java       |   2 +-
 src/main/java/domainapp/webapp/AppManifest.java    |  31 ++++++++
 src/main/java/domainapp/webapp/HelloWorldApp.java  |  37 +---------
 src/main/resources/application.yml                 |  42 ++++-------
 src/main/resources/config/application.properties   |   2 +
 src/main/resources/log4j2-spring.xml               |  80 +++++++++++----------
 .../application => resources}/menubars.layout.xml  |  17 +----
 src/main/webapp/META-INF/context.xml               |   2 -
 .../hello/dom/hwo/HellWorldObjects_Test.java       |  79 ++++++++++++++++++++
 .../hello/dom/hwo/HelloWorldObject_Test.java       |  71 ++++++++++++++++++
 .../dom/impl/HelloWorldObject_delete_Test.java     |  53 --------------
 .../dom/impl/HelloWorldObject_updateName_Test.java |  24 -------
 20 files changed, 270 insertions(+), 212 deletions(-)

diff --git a/README.adoc b/README.adoc
index e68a9d0..9bab573 100644
--- a/README.adoc
+++ b/README.adoc
@@ -21,9 +21,10 @@ It provides more structure and includes examples of fixtures, unit tests, integr
 +
 [source,bash]
 ----
-REPO=isis-app-helloworld
+APP=simpleapp
 BRANCH=master
 
+REPO=isis-app-$APP
 curl "https://codeload.github.com/apache/$REPO/zip/$BRANCH" | jar xv
 mv $REPO-$BRANCH $REPO
 cd $REPO
@@ -43,6 +44,8 @@ mvn clean install
 mvn spring-boot:run
 ----
 
+* Browse to http://localhost:8080.
+
 * Login using:
 
 ** username: `sven`
diff --git a/pom.xml b/pom.xml
index a5e0ba8..8e80408 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
 	<parent>
 		<groupId>org.apache.isis.app</groupId>
 		<artifactId>isis-app-starter-parent</artifactId>
-		<version>2.0.0-M2.20200116-1350-2dd6b3a2</version>
+		<version>2.0.0-M2.20200126-1742-e89bdf6c</version>
 <!--
 		<version>2.0.0-M3-SNAPSHOT</version>
 -->
diff --git a/src/main/java/domainapp/modules/hello/HelloWorldModule.java b/src/main/java/domainapp/modules/hello/HelloWorldModule.java
index 814a53f..df8f52f 100644
--- a/src/main/java/domainapp/modules/hello/HelloWorldModule.java
+++ b/src/main/java/domainapp/modules/hello/HelloWorldModule.java
@@ -2,8 +2,10 @@ package domainapp.modules.hello;
 
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
 
 @Configuration
+@Import({})
 @ComponentScan
 public class HelloWorldModule {
 
diff --git a/src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.java b/src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.java
similarity index 90%
rename from src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.java
rename to src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.java
index a47d089..a1178d0 100644
--- a/src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.java
+++ b/src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.java
@@ -1,4 +1,4 @@
-package domainapp.modules.hello.dom.impl;
+package domainapp.modules.hello.dom.hwo;
 
 import java.util.Comparator;
 
@@ -10,7 +10,6 @@ import javax.jdo.annotations.VersionStrategy;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Auditing;
-import org.apache.isis.applib.annotation.CommandReification;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -20,10 +19,10 @@ import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.title.TitleService;
 
-import domainapp.modules.hello.dom.types.Name;
-import domainapp.modules.hello.dom.types.Notes;
+import domainapp.modules.hello.types.Name;
+import domainapp.modules.hello.types.Notes;
 
-@javax.jdo.annotations.PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "helloworld" )
+@javax.jdo.annotations.PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "hello" )
 @javax.jdo.annotations.DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id")
 @javax.jdo.annotations.Version(strategy= VersionStrategy.DATE_TIME, column ="version")
 @javax.jdo.annotations.Unique(name="HelloWorldObject_name_UNQ", members = {"name"})
@@ -63,7 +62,7 @@ public class HelloWorldObject implements Comparable<HelloWorldObject> {
 
     @Action(
             semantics = SemanticsOf.IDEMPOTENT,
-            command = CommandReification.ENABLED, publishing = Publishing.ENABLED,
+            publishing = Publishing.ENABLED,
             associateWith = "name"
     )
     public HelloWorldObject updateName(
diff --git a/src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.layout.xml b/src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.layout.xml
similarity index 100%
rename from src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.layout.xml
rename to src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.layout.xml
diff --git a/src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.png b/src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.png
similarity index 100%
rename from src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObject.png
rename to src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObject.png
diff --git a/src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObjects.java b/src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObjects.java
similarity index 76%
rename from src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObjects.java
rename to src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObjects.java
index e4663a7..8d84435 100644
--- a/src/main/java/domainapp/modules/hello/dom/impl/HelloWorldObjects.java
+++ b/src/main/java/domainapp/modules/hello/dom/hwo/HelloWorldObjects.java
@@ -1,8 +1,7 @@
-package domainapp.modules.hello.dom.impl;
+package domainapp.modules.hello.dom.hwo;
 
 import java.util.List;
 
-import javax.inject.Inject;
 import javax.jdo.JDOQLTypedQuery;
 
 import org.apache.isis.applib.annotation.Action;
@@ -15,14 +14,25 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
 
-import domainapp.modules.hello.dom.types.Name;
+import domainapp.modules.hello.dom.hwo.QHelloWorldObject;
+import domainapp.modules.hello.types.Name;
 
 @DomainService(
         nature = NatureOfService.VIEW,
-        objectType = "helloworld.HelloWorldObjects"
+        objectType = "hello.HelloWorldObjects"
         )
 public class HelloWorldObjects {
 
+    private final RepositoryService repositoryService;
+    private final IsisJdoSupport_v3_2 isisJdoSupport;
+
+    public HelloWorldObjects(
+            final RepositoryService repositoryService,
+            final IsisJdoSupport_v3_2 isisJdoSupport) {
+        this.repositoryService = repositoryService;
+        this.isisJdoSupport = isisJdoSupport;
+    }
+
     @Action(semantics = SemanticsOf.NON_IDEMPOTENT)
     @ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL)
     public HelloWorldObject create(
@@ -52,7 +62,5 @@ public class HelloWorldObjects {
         return repositoryService.allInstances(HelloWorldObject.class);
     }
 
-    @Inject RepositoryService repositoryService;
-    @Inject IsisJdoSupport_v3_2 isisJdoSupport;
 
 }
diff --git a/src/main/java/domainapp/modules/hello/dom/types/Name.java b/src/main/java/domainapp/modules/hello/types/Name.java
similarity index 94%
rename from src/main/java/domainapp/modules/hello/dom/types/Name.java
rename to src/main/java/domainapp/modules/hello/types/Name.java
index 1d0056e..5eeb825 100644
--- a/src/main/java/domainapp/modules/hello/dom/types/Name.java
+++ b/src/main/java/domainapp/modules/hello/types/Name.java
@@ -1,4 +1,4 @@
-package domainapp.modules.hello.dom.types;
+package domainapp.modules.hello.types;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/src/main/java/domainapp/modules/hello/dom/types/Notes.java b/src/main/java/domainapp/modules/hello/types/Notes.java
similarity index 95%
rename from src/main/java/domainapp/modules/hello/dom/types/Notes.java
rename to src/main/java/domainapp/modules/hello/types/Notes.java
index 9d6b5a8..0effb61 100644
--- a/src/main/java/domainapp/modules/hello/dom/types/Notes.java
+++ b/src/main/java/domainapp/modules/hello/types/Notes.java
@@ -1,4 +1,4 @@
-package domainapp.modules.hello.dom.types;
+package domainapp.modules.hello.types;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/src/main/java/domainapp/webapp/AppManifest.java b/src/main/java/domainapp/webapp/AppManifest.java
new file mode 100644
index 0000000..6f86bbb
--- /dev/null
+++ b/src/main/java/domainapp/webapp/AppManifest.java
@@ -0,0 +1,31 @@
+package domainapp.webapp;
+
+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.core.config.presets.IsisPresets;
+import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
+import org.apache.isis.persistence.jdo.datanucleus5.IsisModuleJdoDataNucleus5;
+import org.apache.isis.security.shiro.IsisModuleSecurityShiro;
+import org.apache.isis.testing.h2console.ui.IsisModuleTestingH2ConsoleUi;
+import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4;
+import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
+
+import domainapp.modules.hello.HelloWorldModule;
+
+@Configuration
+@Import({
+        IsisModuleCoreRuntimeServices.class,
+        IsisModuleSecurityShiro.class,
+        IsisModuleJdoDataNucleus5.class,
+        IsisModuleViewerRestfulObjectsJaxrsResteasy4.class,
+        IsisModuleViewerWicketViewer.class,
+
+        IsisModuleTestingH2ConsoleUi.class,
+        HelloWorldModule.class
+})
+@PropertySource(IsisPresets.NoTranslations)
+public class AppManifest {
+}
diff --git a/src/main/java/domainapp/webapp/HelloWorldApp.java b/src/main/java/domainapp/webapp/HelloWorldApp.java
index ece283c..0b9aafa 100644
--- a/src/main/java/domainapp/webapp/HelloWorldApp.java
+++ b/src/main/java/domainapp/webapp/HelloWorldApp.java
@@ -3,51 +3,18 @@ package domainapp.webapp;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-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.core.config.presets.IsisPresets;
-import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
-import org.apache.isis.persistence.jdo.datanucleus5.IsisModuleJdoDataNucleus5;
-import org.apache.isis.security.shiro.IsisModuleSecurityShiro;
-import org.apache.isis.testing.h2console.ui.IsisModuleTestingH2ConsoleUi;
-import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4;
-import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer;
-
-import domainapp.modules.hello.HelloWorldModule;
 
 @SpringBootApplication
 @Import({
-    HelloWorldApp.AppManifest.class,
+    AppManifest.class,
 })
 public class HelloWorldApp extends SpringBootServletInitializer {
 
-    @Configuration
-    @PropertySources({
-            @PropertySource(IsisPresets.NoTranslations),
-            @PropertySource(IsisPresets.DataNucleusAutoCreate),
-    })
-    @Import({
-            IsisModuleCoreRuntimeServices.class,
-            IsisModuleSecurityShiro.class,
-            IsisModuleJdoDataNucleus5.class,
-            IsisModuleViewerRestfulObjectsJaxrsResteasy4.class,
-            IsisModuleViewerWicketViewer.class,
-
-            IsisModuleTestingH2ConsoleUi.class,
-            HelloWorldModule.class
-    })
-    public static class AppManifest {
-    }
-
-    /**
-     * @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(); // or run with use -DPROTOTYPING=true
         SpringApplication.run(new Class[] { HelloWorldApp.class }, args);
     }
-
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 5e87e85..559ff05 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -9,19 +9,6 @@ isis:
     annotation:
       action:
         explicit: true
-      action-layout:
-        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
       domain-object:
         editing: false
 
@@ -31,41 +18,38 @@ isis:
         allow-deprecated: false
         no-params-only: true
         explicit-object-type: true
-        service-actions-only: true
-        mixins-only: true
 
   viewer:
     wicket:
       application:
-        menubars-layout-xml: domainapp/webapp/application/menubars.layout.xml
-        brand-logo-header: /images/apache-isis/logo-48x48.png
-        favicon-url: /images/favicon.png
-        name: Hello World App
+        about: Hello World
+        brand-logo-header: images/apache-isis/logo-48x48.png
         css: css/application.css
+        favicon-url: images/favicon.png
         js: scripts/application.js
-        about: Hello World
+        menubars-layout-xml: menubars.layout.xml
+        name: Hello World App
 
       credit:
         - url:  http://isis.apache.org
-          image: /images/apache-isis/logo-48x48.png
+          image: images/apache-isis/logo-48x48.png
           name: Apache Isis
 
       themes:
-        initial: Flatly
-        showChooser: true
-        enabled: Cosmo,Flatly,Darkly,Sandstone,United
+        show-chooser: true
+
+      bookmarked-pages:
+        show-chooser: true
+        show-drop-down-on-footer: true
 
       max-title-length-in-standalone-tables: 0
       max-title-length-in-parented-tables: 0
 
-      development-utilities:
-        enable: true
-
   persistence:
     jdo-datanucleus:
       impl:
-        # note that properties under 'isis.persistor.datanucleus.impl' are passed through directly
-        # to DataNucleus, and must use camelCase rather than kebab-case
+        # note that properties under 'isis.persistence.jdo-datanucleus.impl' are passed through directly
+        # to DataNucleus, and use variously camelCase or PascalCase rather than kebab-case
         datanucleus:
           schema:
             validateTables: true
diff --git a/src/main/resources/config/application.properties b/src/main/resources/config/application.properties
index 93135ec..c0b1891 100644
--- a/src/main/resources/config/application.properties
+++ b/src/main/resources/config/application.properties
@@ -15,3 +15,5 @@ isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionURL = jdbc:h2:m
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionDriverName = org.h2.Driver
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName = sa
 isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword =
+
+isis.persistence.jdo-datanucleus.impl.datanucleus.schema.autoCreateAll=true
\ No newline at end of file
diff --git a/src/main/resources/log4j2-spring.xml b/src/main/resources/log4j2-spring.xml
index 08a5edb..62d6ae5 100644
--- a/src/main/resources/log4j2-spring.xml
+++ b/src/main/resources/log4j2-spring.xml
@@ -1,42 +1,44 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Configuration status="WARN">
-	<Properties>
-		<Property name="PID">????</Property>
-		<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
-		<Property name="LOG_LEVEL_PATTERN">%5p</Property>
-		<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
-		<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
-		<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
-	</Properties>
-	<Appenders>
-		<Console name="Console" target="SYSTEM_OUT" follow="true">
-			<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
-		</Console>
-	</Appenders>
-	<Loggers>
-	
-		<!-- silence Wicket -->
-		<Logger name="org.apache.wicket.page.PartialPageUpdate" level="error" />
-	
-		<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
-		<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
-		<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
-		<logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
-		<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
-		<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
-		<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
-		<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
-		
-		<logger name="org.apache.directory" level="warn"/>
-		<logger name="org.apache.directory.api.ldap.model.entry.Value" level="off"/>
-		
-		<logger name="DataNucleus.Persistence" level="info"/>
-		<logger name="DataNucleus.Transaction" level="info"/>
-		<logger name="DataNucleus.Datastore.Schema" level="info"/>
-		<logger name="DataNucleus.Datastore.Native" level="info"/>
-		
-		<Root level="info">
-			<AppenderRef ref="Console" />
-		</Root>
-	</Loggers>
+    <Properties>
+        <Property name="PID">????</Property>
+        <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
+        <Property name="LOG_LEVEL_PATTERN">%5p</Property>
+        <Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
+        <Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
+        <Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
+    </Properties>
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
+        </Console>
+    </Appenders>
+    <Loggers>
+
+        <!-- silence Wicket -->
+        <Logger name="org.apache.wicket.page.PartialPageUpdate" level="error" />
+
+        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
+        <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
+        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
+        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
+        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
+        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
+        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
+        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
+
+        <logger name="org.apache.directory" level="warn"/>
+        <logger name="org.apache.directory.api.ldap.model.entry.Value" level="off"/>
+
+        <logger name="DataNucleus.Persistence" level="info"/>
+        <logger name="DataNucleus.Transaction" level="info"/>
+        <logger name="DataNucleus.Datastore.Schema" level="info"/>
+        <logger name="DataNucleus.Datastore.Native" level="info"/>
+
+        <logger name="org.apache.isis.applib.services.publish.PublisherServiceLogging" level="debug"/>
+
+        <Root level="info">
+            <AppenderRef ref="Console" />
+        </Root>
+    </Loggers>
 </Configuration>
diff --git a/src/main/java/domainapp/webapp/application/menubars.layout.xml b/src/main/resources/menubars.layout.xml
similarity index 82%
rename from src/main/java/domainapp/webapp/application/menubars.layout.xml
rename to src/main/resources/menubars.layout.xml
index 0c02509..98c69b4 100644
--- a/src/main/java/domainapp/webapp/application/menubars.layout.xml
+++ b/src/main/resources/menubars.layout.xml
@@ -4,13 +4,13 @@
         <mb3:menu>
             <mb3:named>Hello World Objects</mb3:named>
             <mb3:section>
-                <mb3:serviceAction objectType="helloworld.HelloWorldObjects" id="create">
+                <mb3:serviceAction objectType="hello.HelloWorldObjects" id="create">
                     <cpt:named>Create</cpt:named>
                 </mb3:serviceAction>
-                <mb3:serviceAction objectType="helloworld.HelloWorldObjects" id="findByName">
+                <mb3:serviceAction objectType="hello.HelloWorldObjects" id="findByName">
                     <cpt:named>Find By Name</cpt:named>
                 </mb3:serviceAction>
-                <mb3:serviceAction objectType="helloworld.HelloWorldObjects" id="listAll">
+                <mb3:serviceAction objectType="hello.HelloWorldObjects" id="listAll">
                     <cpt:named>List All</cpt:named>
                 </mb3:serviceAction>
             </mb3:section>
@@ -23,17 +23,6 @@
         <mb3:menu>
             <mb3:named>Prototyping</mb3:named>
             <mb3:section>
-                <mb3:serviceAction objectType="isisApplib.FixtureScriptsDefault" 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">
-                    <cpt:named>Recreate Objects And Return First</cpt:named>
-                </mb3:serviceAction>
-            </mb3:section>
-            <mb3:section>
                 <mb3:serviceAction objectType="isisApplib.LayoutServiceMenu" id="downloadLayouts">
                     <cpt:named>Download Object Layouts (ZIP)</cpt:named>
                 </mb3:serviceAction>
diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml
deleted file mode 100644
index fd2fac1..0000000
--- a/src/main/webapp/META-INF/context.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Context path=""/>
diff --git a/src/test/java/domainapp/modules/hello/dom/hwo/HellWorldObjects_Test.java b/src/test/java/domainapp/modules/hello/dom/hwo/HellWorldObjects_Test.java
new file mode 100644
index 0000000..82e2b6e
--- /dev/null
+++ b/src/test/java/domainapp/modules/hello/dom/hwo/HellWorldObjects_Test.java
@@ -0,0 +1,79 @@
+package domainapp.modules.hello.dom.hwo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.stubbing.Answer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.when;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
+
+@ExtendWith(MockitoExtension.class)
+class HellWorldObjects_Test {
+
+    @Mock RepositoryService mockRepositoryService;
+    @Mock IsisJdoSupport_v3_2 mockIsisJdoSupport_v3_2;
+
+    HelloWorldObjects objects;
+
+    @BeforeEach
+    public void setUp() {
+        objects = new HelloWorldObjects(mockRepositoryService, mockIsisJdoSupport_v3_2);
+    }
+
+    @Nested
+    class create {
+
+        @Test
+        void happyCase() {
+
+            // given
+            final String someName = "Foobar";
+
+            // expect
+            when(mockRepositoryService.persist(
+                    argThat((ArgumentMatcher<HelloWorldObject>) simpleObject -> Objects.equals(simpleObject.getName(), someName)))
+            ).then((Answer<HelloWorldObject>) invocation -> invocation.getArgument(0));
+
+            // when
+            final HelloWorldObject obj = objects.create(someName);
+
+            // then
+            assertThat(obj).isNotNull();
+            assertThat(obj.getName()).isEqualTo(someName);
+        }
+    }
+
+    @Nested
+    class ListAll {
+
+        @Test
+        void happyCase() {
+
+            // given
+            final List<HelloWorldObject> all = new ArrayList<>();
+
+            // expecting
+            when(mockRepositoryService.allInstances(HelloWorldObject.class))
+                .thenReturn(all);
+
+            // when
+            final List<HelloWorldObject> list = objects.listAll();
+
+            // then
+            assertThat(list).isEqualTo(all);
+        }
+    }
+}
diff --git a/src/test/java/domainapp/modules/hello/dom/hwo/HelloWorldObject_Test.java b/src/test/java/domainapp/modules/hello/dom/hwo/HelloWorldObject_Test.java
new file mode 100644
index 0000000..fa236a5
--- /dev/null
+++ b/src/test/java/domainapp/modules/hello/dom/hwo/HelloWorldObject_Test.java
@@ -0,0 +1,71 @@
+package domainapp.modules.hello.dom.hwo;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.isis.applib.services.message.MessageService;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.title.TitleService;
+
+@ExtendWith(MockitoExtension.class)
+class HelloWorldObject_Test {
+
+    @Mock TitleService mockTitleService;
+    @Mock MessageService mockMessageService;
+    @Mock RepositoryService mockRepositoryService;
+
+    HelloWorldObject object;
+
+    @BeforeEach
+    void setup() {
+        object = new HelloWorldObject("Foo");
+        object.titleService = mockTitleService;
+        object.messageService = mockMessageService;
+        object.repositoryService = mockRepositoryService;
+    }
+
+    @Nested
+    public class updateName {
+
+        @Test
+        void happy_case() {
+            // given
+            assertThat(object.getName()).isEqualTo("Foo");
+
+            // when
+            object.updateName("Bar");
+
+            // then
+            assertThat(object.getName()).isEqualTo("Bar");
+        }
+
+    }
+    @Nested
+    class delete {
+
+        @Test
+        void happy_case() throws Exception {
+
+            // given
+            assertThat(object).isNotNull();
+
+            // expecting
+            when(mockTitleService.titleOf(object)).thenReturn("Foo");
+
+            // when
+            object.delete();
+
+            // then
+            verify(mockMessageService).informUser("'Foo' deleted");
+            verify(mockRepositoryService).removeAndFlush(object);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/domainapp/modules/hello/dom/impl/HelloWorldObject_delete_Test.java b/src/test/java/domainapp/modules/hello/dom/impl/HelloWorldObject_delete_Test.java
deleted file mode 100644
index bfdc6c9..0000000
--- a/src/test/java/domainapp/modules/hello/dom/impl/HelloWorldObject_delete_Test.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package domainapp.modules.hello.dom.impl;
-
-import domainapp.modules.hello.dom.impl.HelloWorldObject;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.services.message.MessageService;
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.applib.services.title.TitleService;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-
-import static org.hamcrest.CoreMatchers.containsString;
-
-public class HelloWorldObject_delete_Test {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    @Mock
-    TitleService mockTitleService;
-
-    @Mock
-    MessageService mockMessageService;
-
-    @Mock
-    RepositoryService mockRepositoryService;
-
-    @Test
-    public void happy_case() throws Exception {
-
-        // given
-        final HelloWorldObject object = new HelloWorldObject("Foo");
-        object.titleService = mockTitleService;
-        object.messageService = mockMessageService;
-        object.repositoryService = mockRepositoryService;
-
-        // expecting
-        context.checking(new Expectations() {{
-            allowing(mockTitleService).titleOf(object); will(returnValue("Foo"));
-
-            oneOf(mockMessageService).informUser(with(containsString("'Foo' deleted")));
-            oneOf(mockRepositoryService).removeAndFlush(object);
-        }});
-
-        // when
-        object.delete();
-    }
-
-
-}
\ No newline at end of file
diff --git a/src/test/java/domainapp/modules/hello/dom/impl/HelloWorldObject_updateName_Test.java b/src/test/java/domainapp/modules/hello/dom/impl/HelloWorldObject_updateName_Test.java
deleted file mode 100644
index 8090163..0000000
--- a/src/test/java/domainapp/modules/hello/dom/impl/HelloWorldObject_updateName_Test.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package domainapp.modules.hello.dom.impl;
-
-import domainapp.modules.hello.dom.impl.HelloWorldObject;
-
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class HelloWorldObject_updateName_Test {
-
-    @Test
-    public void happy_case() throws Exception {
-        // given
-        final HelloWorldObject object = new HelloWorldObject("Foo");
-        assertThat(object.getName()).isEqualTo("Foo");
-
-        // when
-        object.updateName("Bar");
-
-        // then
-        assertThat(object.getName()).isEqualTo("Bar");
-    }
-
-}
\ No newline at end of file