You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/05/12 15:28:50 UTC

[isis] branch v1-lab updated: runs helloworld v1 on Spring

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

ahuber pushed a commit to branch v1-lab
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v1-lab by this push:
     new fd20e69ced runs helloworld v1 on Spring
fd20e69ced is described below

commit fd20e69ced6cdea969681ddecd7803210d0acb39
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 12 17:28:42 2022 +0200

    runs helloworld v1 on Spring
---
 .../apache/isis/applib/util/ObjectContracts.java   |   5 +-
 .../apache/isis/applib/util/ObjectContracts2.java  |   5 +-
 .../configbuilder/IsisConfigurationBuilder.java    |  13 +-
 .../facets/all/i18n/NamedFacetTranslated.java      |   7 +-
 .../services/appfeat/ApplicationFeatureId.java     |  17 +-
 .../metamodel/specloader/SpecificationLoader.java  |  33 ++-
 .../core/runtime/threadpool/ThreadPoolSupport.java | 273 ---------------------
 core/pom.xml                                       |  42 ++--
 .../isis/core/runtime/runner/IsisInjectModule.java |  12 +-
 .../system/session/IsisSessionFactoryBuilder.java  | 114 +++------
 .../service/support/TimestampService.java          |   8 +-
 core/viewer-restfulobjects-applib/pom.xml          |  32 +--
 .../wicket/viewer/IsisWicketApplication.java       | 157 +++++-------
 .../viewer/wicket/viewer/IsisWicketModule.java     |  17 +-
 .../isis/DeploymentTypeWicketAbstract.java         |   9 +-
 .../viewer/wicket/viewer/IsisWicket_providers.java |  19 +-
 .../WicketObjectModule_bindingsStandard.java       |  27 +-
 examples/helloworld/pom.xml                        |  38 +++
 .../java/domainapp/application/HelloWorldApp.java  |  46 ++++
 .../application/HelloWorldAppConfiguration.java    |  74 ++++++
 examples/pom.xml                                   |   2 +
 21 files changed, 379 insertions(+), 571 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
index e53696c7af..382e568b2b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
@@ -21,8 +21,9 @@ import java.util.Comparator;
 import java.util.List;
 
 import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.Iterables;
@@ -266,7 +267,7 @@ public class ObjectContracts {
     }
 
     private String toStringOf(final Object p, final Iterable<String> propertyNamesIter) {
-        final ToStringHelper stringHelper = Objects.toStringHelper(p);
+        final ToStringHelper stringHelper = MoreObjects.toStringHelper(p);
         for (final Clause clause : clausesFor(propertyNamesIter)) {
             stringHelper.add(clause.getPropertyName(), asString(clause, p));
         }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts2.java b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts2.java
index 0c5455cab4..eb8ba71801 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts2.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts2.java
@@ -21,8 +21,9 @@ import java.util.Comparator;
 import java.util.List;
 
 import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.Iterables;
@@ -275,7 +276,7 @@ public class ObjectContracts2 {
     }
 
     private String toStringOf(final Object p, final Iterable<String> propertyNamesIter) {
-        final ToStringHelper stringHelper = Objects.toStringHelper(p);
+        final ToStringHelper stringHelper = MoreObjects.toStringHelper(p);
         for (final Clause clause : clausesFor(propertyNamesIter)) {
             stringHelper.add(clause.getPropertyName(), asString(clause, p));
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
index 725b64640a..ad7c92db68 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/configbuilder/IsisConfigurationBuilder.java
@@ -25,17 +25,11 @@ import java.util.List;
 import java.util.Properties;
 import java.util.Set;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.Sets;
-
 import org.apache.commons.cli.BasicParser;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
@@ -47,6 +41,11 @@ import org.apache.isis.core.commons.resource.ResourceStreamSourceChainOfResponsi
 import org.apache.isis.core.commons.resource.ResourceStreamSourceFileSystem;
 import org.apache.isis.core.runtime.optionhandler.BootPrinter;
 import org.apache.isis.core.runtime.optionhandler.OptionHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Sets;
 
 /**
  * Holds a mutable set of properties representing the configuration.
@@ -389,7 +388,7 @@ public final class IsisConfigurationBuilder {
 
     @Override
     public String toString() {
-        return Objects.toStringHelper(this)
+        return MoreObjects.toStringHelper(this)
                 .add("resourceStream", resourceStreamSourceChain)
                 .add("configResources", configurationResourcesFound)
                 .toString();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java
index a7d12b37e5..36a1486027 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java
@@ -41,7 +41,8 @@ public class NamedFacetTranslated extends FacetAbstract implements NamedFacet {
         this.originalText = originalText;
         this.translationService = translationService;
 
-        if(translationService.getMode().isWrite()) {
+        if(translationService!=null
+        		&& translationService.getMode().isWrite()) {
             // force PoWriter to be called to capture this text that needs translating
             translateText();
         }
@@ -53,7 +54,9 @@ public class NamedFacetTranslated extends FacetAbstract implements NamedFacet {
     }
 
     private String translateText() {
-        return translationService.translate(context, originalText);
+        return translationService!=null
+        		? translationService.translate(context, originalText)
+				: originalText;
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
index 76a81fc8eb..c8f9f9c480 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
@@ -27,9 +27,16 @@ import java.util.List;
 
 import javax.annotation.Nullable;
 
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+import org.apache.isis.applib.util.TitleBuffer;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
@@ -37,12 +44,6 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 import com.google.common.io.BaseEncoding;
 
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.Value;
-import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
-import org.apache.isis.applib.util.TitleBuffer;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-
 /**
  * Value type representing a package, class or member.
  *
@@ -522,7 +523,7 @@ public class ApplicationFeatureId implements Comparable<ApplicationFeatureId>, S
         // https://issues.apache.org/jira/browse/ISIS-1590
         // not using our ObjectContracts helper for efficiency.
 
-        final Objects.ToStringHelper stringHelper = Objects.toStringHelper(this);
+        final ToStringHelper stringHelper = MoreObjects.toStringHelper(this);
         switch (type) {
             case PACKAGE:
                 stringHelper.add("type", getType());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index 67a5906d35..d5620e22b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -20,16 +20,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.DomainService;
@@ -62,9 +52,16 @@ import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificati
 import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
 import org.apache.isis.schema.utils.CommonDtoUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 /**
  * Builds the meta-model.
@@ -299,13 +296,13 @@ public class SpecificationLoader implements ApplicationScopedComponent {
     }
 
     private void invokeAndWait(final List<Callable<Object>> callables) {
-        final ThreadPoolSupport threadPoolSupport = ThreadPoolSupport.getInstance();
-        final boolean parallelize = CONFIG_PROPERTY_PARALLELIZE.from(configuration);
-
-        final List<Future<Object>> futures = parallelize
-                ? threadPoolSupport.invokeAll(callables)
-                : threadPoolSupport.invokeAllSequential(callables);
-        threadPoolSupport.joinGatherFailures(futures);
+    	callables.forEach(c->{
+    		try {
+				c.call();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+    	});
     }
 
     private List<ObjectSpecification> loadSpecificationsFor(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
deleted file mode 100644
index 87f162fa0d..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
+++ /dev/null
@@ -1,273 +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.threadpool;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.Nullable;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class ThreadPoolSupport {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ThreadPoolSupport.class);
-
-    private final static int KEEP_ALIVE_TIME_SECS = 5;
-    private final static int QUEUE_CAPACITY = 5000;
-
-    private static final int MIN_CORE_POOL_SIZE = 4;
-    private static final int MIN_MAX_POOL_SIZE = 4;
-
-    private final ThreadGroup group;
-    private final ThreadPoolExecutor concurrentExecutor;
-    private final ThreadPoolExecutor sequentialExecutor;
-
-    private static ThreadPoolSupport threadPoolSupport;
-
-    public static synchronized ThreadPoolSupport getInstance() {
-        if (threadPoolSupport == null) {
-            threadPoolSupport = new ThreadPoolSupport();
-        }
-        return threadPoolSupport;
-    }
-
-    private ThreadPoolSupport() {
-        group = new ThreadGroup(ThreadPoolSupport.class.getName());
-
-        final int corePoolSize = Math.max(Runtime.getRuntime().availableProcessors(), MIN_CORE_POOL_SIZE);
-        final int maximumPoolSize = Math.max(Runtime.getRuntime().availableProcessors(), MIN_MAX_POOL_SIZE);
-
-        ThreadFactory threadFactory = new ThreadFactory() {
-            @Override
-            public Thread newThread(final Runnable r) {
-                return new Thread(group, r);
-            }
-        };
-
-        Supplier<BlockingQueue<Runnable>> workQueueFactory = new Supplier<BlockingQueue<Runnable>>() {
-            @Override
-            public BlockingQueue<Runnable> get() {
-                return new LinkedBlockingQueue<>(QUEUE_CAPACITY);
-            }
-        };
-
-        concurrentExecutor = new ThreadPoolExecutor(
-                corePoolSize,
-                maximumPoolSize,
-                KEEP_ALIVE_TIME_SECS,
-                TimeUnit.SECONDS,
-                workQueueFactory.get(),
-                threadFactory);
-
-        sequentialExecutor = new ThreadPoolExecutor(
-                1,
-                1,
-                KEEP_ALIVE_TIME_SECS,
-                TimeUnit.SECONDS,
-                workQueueFactory.get(),
-                threadFactory);
-
-    }
-
-    public void close() throws Exception {
-        try {
-            concurrentExecutor.shutdown();
-        } finally {
-            // in case the previous throws, continue execution here
-            sequentialExecutor.shutdown();
-        }
-    }
-
-    /**
-     * Executes specified {@code callables} on the default executor.
-     * See {@link ThreadPoolExecutor#invokeAll(java.util.Collection)}
-     * @param callables nullable
-     * @return non-null
-     */
-    public List<Future<Object>> invokeAll(@Nullable final List<Callable<Object>> callables) {
-        return invokeAll(concurrentExecutor, callables);
-    }
-
-    /**
-     * Executes specified {@code callables} on the default executor.
-     * See {@link ThreadPoolExecutor#invokeAll(java.util.Collection)}
-     * @param callables nullable
-     * @return non-null
-     */
-    public List<Future<Object>> invokeAll(final Callable<Object>... callables) {
-        return invokeAll(Arrays.asList(callables));
-    }
-
-    /**
-     * Executes specified {@code callables} on the sequential executor in sequence, one by one.
-     * @param callables nullable
-     * @return non-null
-     */
-    public List<Future<Object>> invokeAllSequential(@Nullable final List<Callable<Object>> callables) {
-        return invokeAll(sequentialExecutor, callables);
-    }
-
-    /**
-     * Executes specified {@code callables} on the sequential executor in sequence, one by one.
-     * @param callables nullable
-     * @return non-null
-     */
-    public List<Future<Object>> invokeAllSequential(final Callable<Object>... callables) {
-        return invokeAllSequential(Arrays.asList(callables));
-    }
-
-
-    public List<Object> join(final List<Future<Object>> futures) {
-        if (futures == null) {
-            return null;
-        }
-
-        final long t0 = System.currentTimeMillis();
-        try{
-            final List<Object> returnValues = Lists.newArrayList();
-            for (Future<Object> future : futures) {
-                Object result;
-                try {
-                    result = future.get();
-                } catch (InterruptedException | ExecutionException e) {
-                    // ignore
-                    result = null;
-                }
-                returnValues.add(result);
-            }
-            return returnValues;
-        } finally {
-            final long t1 = System.currentTimeMillis();
-            if(LOG.isInfoEnabled()) {
-                LOG.info("join'ing {} tasks: waited {} milliseconds ", futures.size(), (t1-t0));
-            }
-        }
-    }
-
-    public List<Object> joinGatherFailures(final List<Future<Object>> futures) {
-        if (futures == null) {
-            return null;
-        }
-
-        final long t0 = System.currentTimeMillis();
-        try{
-            final List<Object> returnValues = Lists.newArrayList();
-            for (Future<Object> future : futures) {
-                final Object result;
-                try {
-                    result = future.get();
-                } catch (InterruptedException | ExecutionException e) {
-                    throw new RuntimeException(e);
-                }
-                returnValues.add(result);
-            }
-            return returnValues;
-        } finally {
-            final long t1 = System.currentTimeMillis();
-            LOG.info("join'ing {} tasks: waited {} milliseconds ", futures.size(), (t1-t0));
-        }
-    }
-
-    public Object join(final Future<Object> future) {
-        try {
-            return future.get();
-        } catch (InterruptedException | ExecutionException e) {
-            // ignore
-            return null;
-        }
-    }
-
-    // -- HELPER
-
-    private List<Future<Object>> invokeAll(ThreadPoolExecutor executor, @Nullable final List<Callable<Object>> callables) {
-        if(isEmpty(callables)) {
-            return Collections.emptyList();
-        }
-        try {
-            return executor.invokeAll(timed(executor, callables));
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static List<Callable<Object>> timed(
-            final ThreadPoolExecutor executor,
-            final List<Callable<Object>> callables) {
-        final long queuedAt = System.currentTimeMillis();
-        return FluentIterable.from(callables).transform(
-                new Function<Callable<Object>, Callable<Object>>() {
-                    @Override
-                    public Callable<Object> apply(final Callable<Object> callable) {
-                        final int queueSize = executor.getQueue().size();
-                        return timed(callable, queueSize, queuedAt);
-                    }
-                }).toList();
-    }
-
-    private static Callable<Object> timed(
-            final Callable<Object> callable,
-            final int queueSize,
-            final long queuedAt) {
-        return new Callable<Object>() {
-            @Override
-            public Object call() throws Exception {
-
-                final long startedAt = System.currentTimeMillis();
-                if(LOG.isDebugEnabled()) {
-                    LOG.debug("START: workQueue.size: {}, waited for: {}ms, {}",
-                            queueSize,
-                            startedAt - queuedAt,
-                            callable.toString());
-                }
-                try {
-                    return callable.call();
-                } finally {
-                    final long completedAt = System.currentTimeMillis();
-                    if(LOG.isDebugEnabled()) {
-                        LOG.debug("END: completed in: {}ms, {}",
-                                completedAt - startedAt,
-                                callable.toString());
-                    }
-                }
-            }
-        };
-    }
-
-    private static boolean isEmpty(Collection<?> x) { return x==null || x.size() == 0; }
-
-
-}
diff --git a/core/pom.xml b/core/pom.xml
index d8ab5be6c9..e70ab63f87 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -81,7 +81,7 @@
         <log4j.version>1.2.17</log4j.version>
 
         <joda-time.version>2.9.4</joda-time.version>
-        <guava.version>19.0</guava.version>
+        <guava.version>30.1-jre</guava.version>
 
         <hamcrest.version>1.3</hamcrest.version>
         <assertj.version>3.6.2</assertj.version>
@@ -100,7 +100,6 @@
 
         <axon-core.version>2.4.4</axon-core.version>
 
-        <jackson.version>2.9.8</jackson.version>
         <gson.version>2.9.0</gson.version>
         <swagger-core.version>1.5.9</swagger-core.version>
 
@@ -329,6 +328,14 @@
 	            <type>pom</type>
 	            <version>${project.version}</version>
 	        </dependency>
+	        
+	        <dependency>
+				<groupId>com.fasterxml.jackson</groupId>
+				<artifactId>jackson-bom</artifactId>
+				<version>2.13.2.1</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
         
             <!-- unittestsupport -->
             <dependency>
@@ -681,28 +688,6 @@
                 <version>${xstream.version}</version>
             </dependency>
 
-
-            <!-- JSON libraries -->
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-core</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-databind</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-annotations</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.module</groupId>
-                <artifactId>jackson-module-jaxb-annotations</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
             <dependency>
                 <groupId>com.google.code.gson</groupId>
                 <artifactId>gson</artifactId>
@@ -1286,6 +1271,15 @@
 			<version>1.18.24</version>
 		</dependency>
 	    
+	    <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+			<groupId>com.fasterxml.jackson.module</groupId>
+			<artifactId>jackson-module-jaxb-annotations</artifactId>
+        </dependency>
+	    
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
index 1d9f3cdafe..f0d460def9 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
@@ -22,20 +22,20 @@ package org.apache.isis.core.runtime.runner;
 import java.util.List;
 import java.util.Map;
 
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderUsingInstallers;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+
 public class IsisInjectModule extends AbstractModule {
 
     /**
@@ -86,7 +86,7 @@ public class IsisInjectModule extends AbstractModule {
      */
     @Override
     protected void configure() {
-        bind(AppManifest.class).toInstance(APP_MANIFEST_NOOP);
+        //bind(AppManifest.class).toInstance(APP_MANIFEST_NOOP);
     }
 
     @Provides
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
index 28e9e3bbd3..61e2dae2ba 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
@@ -22,12 +22,6 @@ package org.apache.isis.core.runtime.system.session;
 import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.clock.Clock;
@@ -54,10 +48,11 @@ import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactoryMetamodelRefiner;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
-import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.schema.utils.ChangesDtoUtils;
 import org.apache.isis.schema.utils.CommandDtoUtils;
 import org.apache.isis.schema.utils.InteractionDtoUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class IsisSessionFactoryBuilder {
 
@@ -185,82 +180,35 @@ public class IsisSessionFactoryBuilder {
             IsisContext.setSessionFactory(isisSessionFactory);
 
 
-            final List<Future<Object>> futures = ThreadPoolSupport.getInstance().invokeAll(
-                    new Callable<Object>() {
-                        @Override
-                        public Object call() {
-
-                            // time to initialize...
-                            specificationLoader.init();
-
-                            // we need to do this before checking if the metamodel is valid.
-                            //
-                            // eg ActionChoicesForCollectionParameterFacetFactory metamodel validator requires a runtime...
-                            // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.getServiceAdapter(ObjectActionContributee.java:287)
-                            // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.determineParameters(ObjectActionContributee.java:138)
-                            // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionDefault.getParameters(ObjectActionDefault.java:182)
-                            // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.validate(ActionChoicesForCollectionParameterFacetFactory.java:85)
-                            // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.visit(ActionChoicesForCollectionParameterFacetFactory.java:76)
-                            // at o.a.i.core.metamodel.specloader.validator.MetaModelValidatorVisiting.validate(MetaModelValidatorVisiting.java:47)
-                            //
-                            // also, required so that can still call isisSessionFactory#doInSession
-                            //
-                            // eg todoapp has a custom UserSettingsThemeProvider that is called when rendering any page
-                            // (including the metamodel invalid page)
-                            // at o.a.i.core.runtime.system.session.IsisSessionFactory.doInSession(IsisSessionFactory.java:327)
-                            // at todoapp.webapp.UserSettingsThemeProvider.getActiveTheme(UserSettingsThemeProvider.java:36)
-
-                            authenticationManager.init(deploymentCategory);
-                            authorizationManager.init(deploymentCategory);
-
-                            return null;
-                        }
-                        public String toString() {
-                            return "SpecificationLoader#init()";
-                        }
-
-                    },
-                    new Callable<Object>() {
-                        @Override public Object call() {
-                            persistenceSessionFactory.init(configuration);
-                            return null;
-                        }
-                        public String toString() {
-                            return "persistenceSessionFactory#init(...)";
-                        }
-                    },
-                    new Callable<Object>() {
-                        @Override public Object call() throws Exception {
-                            ChangesDtoUtils.init();
-                            return null;
-                        }
-                        public String toString() {
-                            return "ChangesDtoUtils.init()";
-                        }
-                    },
-                    new Callable<Object>() {
-                        @Override public Object call() throws Exception {
-                            InteractionDtoUtils.init();
-                            return null;
-                        }
-                        public String toString() {
-                            return "InteractionDtoUtils.init()";
-                        }
-                    },
-                    new Callable<Object>() {
-                        @Override public Object call() throws Exception {
-                            CommandDtoUtils.init();
-                            return null;
-                        }
-                        public String toString() {
-                            return "CommandDtoUtils.init()";
-                        }
-                    }
-
-            );
-
-            ThreadPoolSupport.getInstance().joinGatherFailures(futures);
-
+        	{
+
+                // time to initialize...
+                specificationLoader.init();
+
+                // we need to do this before checking if the metamodel is valid.
+                //
+                // eg ActionChoicesForCollectionParameterFacetFactory metamodel validator requires a runtime...
+                // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.getServiceAdapter(ObjectActionContributee.java:287)
+                // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.determineParameters(ObjectActionContributee.java:138)
+                // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionDefault.getParameters(ObjectActionDefault.java:182)
+                // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.validate(ActionChoicesForCollectionParameterFacetFactory.java:85)
+                // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.visit(ActionChoicesForCollectionParameterFacetFactory.java:76)
+                // at o.a.i.core.metamodel.specloader.validator.MetaModelValidatorVisiting.validate(MetaModelValidatorVisiting.java:47)
+                //
+                // also, required so that can still call isisSessionFactory#doInSession
+                //
+                // eg todoapp has a custom UserSettingsThemeProvider that is called when rendering any page
+                // (including the metamodel invalid page)
+                // at o.a.i.core.runtime.system.session.IsisSessionFactory.doInSession(IsisSessionFactory.java:327)
+                // at todoapp.webapp.UserSettingsThemeProvider.getActiveTheme(UserSettingsThemeProvider.java:36)
+
+                authenticationManager.init(deploymentCategory);
+                authorizationManager.init(deploymentCategory);
+                persistenceSessionFactory.init(configuration);
+                ChangesDtoUtils.init();
+                InteractionDtoUtils.init();
+                CommandDtoUtils.init();
+        	}
 
             persistenceSessionFactory.catalogNamedQueries(specificationLoader);
 
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java
index 6f2b63734a..54b03f0d9e 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/service/support/TimestampService.java
@@ -40,12 +40,16 @@ public class TimestampService implements
 
     @PostConstruct
     public void open() {
-        isisJdoSupport.getJdoPersistenceManager().addInstanceLifecycleListener(this, null);
+    	if(isisJdoSupport!=null) {
+    		isisJdoSupport.getJdoPersistenceManager().addInstanceLifecycleListener(this);
+    	}
     }
 
     @PreDestroy
     public void close() {
-        isisJdoSupport.getJdoPersistenceManager().removeInstanceLifecycleListener(this);
+    	if(isisJdoSupport!=null) {
+    		isisJdoSupport.getJdoPersistenceManager().removeInstanceLifecycleListener(this);
+    	}
     }
 
     @Programmatic
diff --git a/core/viewer-restfulobjects-applib/pom.xml b/core/viewer-restfulobjects-applib/pom.xml
index cbc701a111..2866f82ee8 100644
--- a/core/viewer-restfulobjects-applib/pom.xml
+++ b/core/viewer-restfulobjects-applib/pom.xml
@@ -70,22 +70,22 @@
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
         </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.module</groupId>
-            <artifactId>jackson-module-jaxb-annotations</artifactId>
-        </dependency>
+<!--         <dependency> -->
+<!--             <groupId>com.fasterxml.jackson.core</groupId> -->
+<!--             <artifactId>jackson-core</artifactId> -->
+<!--         </dependency> -->
+<!--         <dependency> -->
+<!--             <groupId>com.fasterxml.jackson.core</groupId> -->
+<!--             <artifactId>jackson-annotations</artifactId> -->
+<!--         </dependency> -->
+<!--         <dependency> -->
+<!--             <groupId>com.fasterxml.jackson.core</groupId> -->
+<!--             <artifactId>jackson-databind</artifactId> -->
+<!--         </dependency> -->
+<!--         <dependency> -->
+<!--             <groupId>com.fasterxml.jackson.module</groupId> -->
+<!--             <artifactId>jackson-module-jaxb-annotations</artifactId> -->
+<!--         </dependency> -->
 
         <!-- TEST DEPENDENCIES -->
         <dependency>
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 5ec7809b4c..d19dbbfac7 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -26,56 +26,9 @@ import java.util.Map;
 import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-
-import com.google.common.base.Charsets;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.io.Resources;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.Component;
-import org.apache.wicket.ConverterLocator;
-import org.apache.wicket.IConverterLocator;
-import org.apache.wicket.Page;
-import org.apache.wicket.RuntimeConfigurationType;
-import org.apache.wicket.SharedResources;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.authentication.IAuthenticationStrategy;
-import org.apache.wicket.authentication.strategy.DefaultAuthenticationStrategy;
-import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
-import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
-import org.apache.wicket.core.request.mapper.MountedMapper;
-import org.apache.wicket.devutils.debugbar.DebugBar;
-import org.apache.wicket.devutils.debugbar.InspectorDebugPanel;
-import org.apache.wicket.devutils.debugbar.PageSizeDebugPanel;
-import org.apache.wicket.devutils.debugbar.SessionSizeDebugPanel;
-import org.apache.wicket.devutils.debugbar.VersionDebugContributor;
-import org.apache.wicket.devutils.diskstore.DebugDiskDataStore;
-import org.apache.wicket.guice.GuiceComponentInjector;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.filter.JavaScriptFilteredIntoFooterHeaderResponse;
-import org.apache.wicket.markup.html.IHeaderContributor;
-import org.apache.wicket.markup.html.IHeaderResponseDecorator;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.request.cycle.IRequestCycleListener;
-import org.apache.wicket.request.cycle.PageRequestHandlerTracker;
-import org.apache.wicket.request.cycle.RequestCycleListenerCollection;
-import org.apache.wicket.request.resource.CssResourceReference;
-import org.apache.wicket.settings.DebugSettings;
-import org.apache.wicket.settings.RequestCycleSettings;
-import org.apache.wicket.util.IContextProvider;
-import org.apache.wicket.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.wicketstuff.select2.ApplicationSettings;
+import java.util.function.Supplier;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
@@ -88,7 +41,6 @@ import org.apache.isis.core.runtime.runner.IsisInjectModule;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 import org.apache.isis.core.webapp.IsisWebAppBootstrapper;
 import org.apache.isis.core.webapp.WebAppConstants;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
@@ -116,6 +68,52 @@ import org.apache.isis.viewer.wicket.viewer.integration.wicket.ConverterForObjec
 import org.apache.isis.viewer.wicket.viewer.integration.wicket.ConverterForObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.viewer.integration.wicket.WebRequestCycleForIsis;
 import org.apache.isis.viewer.wicket.viewer.settings.IsisResourceSettings;
+import org.apache.wicket.Application;
+import org.apache.wicket.Component;
+import org.apache.wicket.ConverterLocator;
+import org.apache.wicket.IConverterLocator;
+import org.apache.wicket.Page;
+import org.apache.wicket.RuntimeConfigurationType;
+import org.apache.wicket.SharedResources;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authentication.IAuthenticationStrategy;
+import org.apache.wicket.authentication.strategy.DefaultAuthenticationStrategy;
+import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
+import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
+import org.apache.wicket.core.request.mapper.MountedMapper;
+import org.apache.wicket.devutils.debugbar.DebugBar;
+import org.apache.wicket.devutils.debugbar.InspectorDebugPanel;
+import org.apache.wicket.devutils.debugbar.PageSizeDebugPanel;
+import org.apache.wicket.devutils.debugbar.SessionSizeDebugPanel;
+import org.apache.wicket.devutils.debugbar.VersionDebugContributor;
+import org.apache.wicket.devutils.diskstore.DebugDiskDataStore;
+import org.apache.wicket.guice.GuiceComponentInjector;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.filter.JavaScriptFilteredIntoFooterHeaderResponse;
+import org.apache.wicket.markup.html.IHeaderContributor;
+import org.apache.wicket.markup.html.IHeaderResponseDecorator;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.request.cycle.IRequestCycleListener;
+import org.apache.wicket.request.cycle.PageRequestHandlerTracker;
+import org.apache.wicket.request.cycle.RequestCycleListenerCollection;
+import org.apache.wicket.request.resource.CssResourceReference;
+import org.apache.wicket.settings.DebugSettings;
+import org.apache.wicket.settings.RequestCycleSettings;
+import org.apache.wicket.util.IContextProvider;
+import org.apache.wicket.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.wicketstuff.select2.ApplicationSettings;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.io.Resources;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
 
 import de.agilecoders.wicket.core.Bootstrap;
 import de.agilecoders.wicket.core.markup.html.bootstrap.behavior.BootstrapBaseBehavior;
@@ -183,7 +181,7 @@ public class IsisWicketApplication
 
     public static final BootswatchTheme BOOTSWATCH_THEME_DEFAULT = BootswatchTheme.Flatly;
 
-
+    public static Supplier<AppManifest> appManifestProvider;
 
     private final IsisLoggingConfigurer loggingConfigurer = new IsisLoggingConfigurer();
 
@@ -332,11 +330,13 @@ public class IsisWicketApplication
      */
     @Override
     protected void init() {
-        List<Future<Object>> futures = null;
+        
         try {
             super.init();
 
-            futures = startBackgroundInitializationThreads();
+            configureWebJars();
+            configureWicketBootstrap();
+            configureWicketSelect2();
 
             String isisConfigDir = getServletContext().getInitParameter("isis.config.dir");
 
@@ -368,7 +368,8 @@ public class IsisWicketApplication
             //
             final DeploymentCategory deploymentCategory = deploymentType.getDeploymentCategory();
             final IsisInjectModule isisModule = newIsisModule(deploymentCategory, configuration);
-            final Injector injector = Guice.createInjector(isisModule, newIsisWicketModule(configuration));
+            final Injector injector = Guice.createInjector(isisModule, 
+            		newIsisWicketModule(appManifestProvider.get(), configuration));
 
             initWicketComponentInjection(injector);
 
@@ -442,9 +443,7 @@ public class IsisWicketApplication
             // because Wicket's handling in its WicketFilter (that calls this method) does not log the exception.
             LOG.error("Failed to initialize", ex);
             throw ex;
-        } finally {
-            ThreadPoolSupport.getInstance().join(futures);
-        }
+        } 
 
         final String themeName = configuration.getString(
                 "isis.viewer.wicket.themes.initial", BOOTSWATCH_THEME_DEFAULT.name());
@@ -461,40 +460,9 @@ public class IsisWicketApplication
 
     }
 
-    protected List<Future<Object>> startBackgroundInitializationThreads() {
-        return ThreadPoolSupport.getInstance().invokeAll(
-                new Callable<Object>() {
-                    @Override
-                    public Object call() throws Exception {
-                        configureWebJars();
-                        return null;
-                    }
-                    public String toString() {
-                        return "configureWebJars()";
-                    }
-                },
-                new Callable<Object>() {
-                    @Override
-                    public Object call() throws Exception {
-                        configureWicketBootstrap();
-                        return null;
-                    }
-                    public String toString() {
-                        return "configureWicketBootstrap()";
-                    }
-                },
-                new Callable<Object>() {
-                    @Override
-                    public Object call() throws Exception {
-                        configureWicketSelect2();
-                        return null;
-                    }
-                    public String toString() {
-                        return "configureWicketSelect2()";
-                    }
-                }
-        );
-    }
+    
+    
+    
 
     /**
      * protected visibility to allow ad-hoc overriding of some other authentication strategy.
@@ -688,12 +656,13 @@ public class IsisWicketApplication
     /**
      * Override if required
      * @param isisConfiguration
+     * @param appManifest 
      */
-    protected Module newIsisWicketModule(final IsisConfiguration isisConfiguration) {
-        return new IsisWicketModule(getServletContext(), isisConfiguration);
+    protected Module newIsisWicketModule(final AppManifest appManifest, final IsisConfiguration isisConfiguration) {
+        return new IsisWicketModule(appManifest, getServletContext(), isisConfiguration);
     }
     protected Module newIsisWicketModule() {
-        return newIsisWicketModule(null);
+        return newIsisWicketModule(null, null);
     }
 
     // //////////////////////////////////////
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
index a06414e51c..e394bed3c2 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
@@ -19,21 +19,20 @@
 
 package org.apache.isis.viewer.wicket.viewer;
 
+import static org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.readLines;
+
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 
 import javax.servlet.ServletContext;
 
-import com.google.inject.AbstractModule;
-import com.google.inject.Provider;
-import com.google.inject.name.Names;
-
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.runtime.services.email.EmailServiceDefault;
 import org.apache.isis.core.runtime.services.userreg.EmailNotificationServiceDefault;
-import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistrar;
@@ -51,7 +50,9 @@ import org.apache.isis.viewer.wicket.viewer.registries.pages.PageClassRegistryDe
 import org.apache.isis.viewer.wicket.viewer.registries.pages.PageNavigationServiceDefault;
 import org.apache.isis.viewer.wicket.viewer.settings.WicketViewerSettingsDefault;
 
-import static org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.readLines;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
 
 /**
  * To override
@@ -72,18 +73,22 @@ import static org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.readLin
  */
 public class IsisWicketModule extends AbstractModule {
 
+	private AppManifest appManifest;
     private ServletContext servletContext;
     private IsisConfiguration isisConfigIfAny;
 
     public IsisWicketModule(
+    		final AppManifest appManifest,  
             final ServletContext servletContext,
             final IsisConfiguration isisConfigurationIfAny) {
+    	this.appManifest = appManifest; 
         this.servletContext = servletContext;
         this.isisConfigIfAny = isisConfigurationIfAny;
     }
 
     @Override
     protected void configure() {
+    	bind(AppManifest.class).to(appManifest.getClass());
         bind(ComponentFactoryRegistry.class).to(ComponentFactoryRegistryDefault.class);
         bind(PageClassRegistry.class).to(PageClassRegistryDefault.class);
         bind(EmailVerificationUrlService.class).to(EmailVerificationUrlServiceDefault.class);
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/DeploymentTypeWicketAbstract.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/DeploymentTypeWicketAbstract.java
index dcefd4c619..d4afcbbeae 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/DeploymentTypeWicketAbstract.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/isis/DeploymentTypeWicketAbstract.java
@@ -19,12 +19,11 @@
 
 package org.apache.isis.viewer.wicket.viewer.integration.isis;
 
-import org.apache.wicket.Application;
-import org.apache.wicket.RuntimeConfigurationType;
-
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
+import org.apache.wicket.Application;
+import org.apache.wicket.RuntimeConfigurationType;
 
 /**
  * {@link DeploymentType} for production usage.
@@ -42,7 +41,9 @@ public class DeploymentTypeWicketAbstract extends DeploymentTypeAbstract {
     }
 
     public RuntimeConfigurationType getConfigurationType() {
-        return getDeploymentCategory().isProduction()? RuntimeConfigurationType.DEPLOYMENT: RuntimeConfigurationType.DEVELOPMENT;
+        return getDeploymentCategory().isProduction()
+        		? RuntimeConfigurationType.DEPLOYMENT: 
+    			RuntimeConfigurationType.DEVELOPMENT;
     }
 
 
diff --git a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/IsisWicket_providers.java b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/IsisWicket_providers.java
index 6bd752ddb5..db042ccf6e 100644
--- a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/IsisWicket_providers.java
+++ b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/IsisWicket_providers.java
@@ -19,20 +19,19 @@
 
 package org.apache.isis.viewer.wicket.viewer;
 
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
 
 import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
 
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 
 public class IsisWicket_providers {
 
@@ -41,7 +40,7 @@ public class IsisWicket_providers {
 
     @Before
     public void setUp() throws Exception {
-        isisWicketModule = new IsisWicketModule(null, null);
+        isisWicketModule = new IsisWicketModule(null, null, null);
         injector = Guice.createInjector(isisWicketModule);
     }
 
diff --git a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java
index c59e9e49b2..1049111492 100644
--- a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java
+++ b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java
@@ -19,19 +19,13 @@
 
 package org.apache.isis.viewer.wicket.viewer;
 
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
 import java.util.Arrays;
 import java.util.Collection;
 
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistrar;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassList;
@@ -40,10 +34,15 @@ import org.apache.isis.viewer.wicket.viewer.registries.components.ComponentFacto
 import org.apache.isis.viewer.wicket.viewer.registries.components.ComponentFactoryRegistryDefault;
 import org.apache.isis.viewer.wicket.viewer.registries.pages.PageClassListDefault;
 import org.apache.isis.viewer.wicket.viewer.registries.pages.PageClassRegistryDefault;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 
 @RunWith(Parameterized.class)
 public class WicketObjectModule_bindingsStandard {
@@ -66,7 +65,7 @@ public class WicketObjectModule_bindingsStandard {
 
     @Before
     public void setUp() throws Exception {
-        wicketObjectsModule = new IsisWicketModule(null,null);
+        wicketObjectsModule = new IsisWicketModule(null,null, null);
         injector = Guice.createInjector(wicketObjectsModule);
     }
 
diff --git a/examples/helloworld/pom.xml b/examples/helloworld/pom.xml
index 6f68bdb809..4ebd804e51 100644
--- a/examples/helloworld/pom.xml
+++ b/examples/helloworld/pom.xml
@@ -25,9 +25,47 @@
 	<name>Apache Isis App - HelloWorld</name>
 
 	<properties>
+		<spring-boot.version>2.6.7</spring-boot.version>
+		<wicket-spring-boot-starter.version>3.1.6</wicket-spring-boot-starter.version>
 	</properties>
 
 	<dependencies>
+	
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-parent</artifactId>
+			<version>${spring-boot.version}</version>
+			<type>pom</type>
+			<scope>import</scope>
+		</dependency>
+		
+		<dependency>
+		  	<groupId>org.springframework.boot</groupId>
+  			<artifactId>spring-boot-starter</artifactId>
+  			<version>${spring-boot.version}</version>
+ 		</dependency>
+ 		
+		<dependency>
+		  	<groupId>org.springframework.boot</groupId>
+  			<artifactId>spring-boot-starter-web</artifactId>
+  			<version>${spring-boot.version}</version>
+ 		</dependency>
+ 		
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-jdk-supplemental</artifactId>
+			<type>pom</type>
+		</dependency>
+		
+		<dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+		
+		<dependency>
+        	<groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+        </dependency>
 
 		<!-- ISIS API -->
 		<dependency>
diff --git a/examples/helloworld/src/main/java/domainapp/application/HelloWorldApp.java b/examples/helloworld/src/main/java/domainapp/application/HelloWorldApp.java
new file mode 100644
index 0000000000..deee94be0e
--- /dev/null
+++ b/examples/helloworld/src/main/java/domainapp/application/HelloWorldApp.java
@@ -0,0 +1,46 @@
+/*
+ *  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 domainapp.application;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Import;
+
+@SpringBootApplication
+@Import({
+	HelloWorldAppConfiguration.class
+})
+public class HelloWorldApp extends SpringBootServletInitializer {
+
+    public static void main(final String[] args) throws Exception {
+
+        //_OsUtil.thereCanBeOnlyOne(new File("pid.log"));
+    	
+    	com.google.common.base.Preconditions p;
+
+        new SpringApplicationBuilder()
+	        .sources(HelloWorldApp.class)
+	        .run(args);
+    }
+    
+    
+
+}
+
diff --git a/examples/helloworld/src/main/java/domainapp/application/HelloWorldAppConfiguration.java b/examples/helloworld/src/main/java/domainapp/application/HelloWorldAppConfiguration.java
new file mode 100644
index 0000000000..ba5c38eff2
--- /dev/null
+++ b/examples/helloworld/src/main/java/domainapp/application/HelloWorldAppConfiguration.java
@@ -0,0 +1,74 @@
+/*
+ *  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 domainapp.application;
+
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.viewer.wicket.viewer.IsisWicketApplication;
+import org.apache.wicket.protocol.http.WicketFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.val;
+
+@Configuration
+public class HelloWorldAppConfiguration  {
+
+	@Bean
+	public FilterRegistrationBean<WicketFilter> wicketFilterRegistration() {
+	    val registration = new FilterRegistrationBean<WicketFilter>();
+	    registration.setFilter(wicketFilter());
+	    registration.setName("wicketFilter");
+	    registration.setOrder(1);
+	    setupWicket(registration);
+	    return registration;
+	}
+	
+	public WicketFilter wicketFilter() {
+	    return new WicketFilter();
+	}
+	
+	private AppManifest appManifest() {
+		return new HelloWorldAppManifest();
+	}
+	
+	private DeploymentCategory deploymentCategory() {
+		return DeploymentCategory.PROTOTYPING;	
+	}
+	
+	private void setupWicket(FilterRegistrationBean<WicketFilter> filterReg) {
+		
+		String deploymentMode = deploymentCategory().isPrototyping() ? "development" : "deployment";
+	    String wicketApp = IsisWicketApplication.class.getName();
+	    String urlPattern = "/wicket/*";
+	
+        filterReg.addInitParameter("applicationClassName", wicketApp);
+        filterReg.addInitParameter("filterMappingUrlPattern", urlPattern);
+        filterReg.addInitParameter("configuration", deploymentMode);
+        filterReg.addUrlPatterns(urlPattern);
+        
+        IsisWicketApplication.appManifestProvider = this::appManifest;
+        
+    }
+
+	
+
+}
+
diff --git a/examples/pom.xml b/examples/pom.xml
index 89e71a1893..fd03514720 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -77,7 +77,9 @@
 
 	<modules>
 		<module>helloworld</module>
+		<!-- 
 		<module>simpleapp</module>
+		 -->
 	</modules>
 
 </project>