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 2021/06/08 07:51:47 UTC

[isis] 03/19: ISIS-2717: adds config properties and autoconfig

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

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

commit c8d12ac680c719b8ab27051e92fedb9f9581ebbc
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Jun 4 09:38:04 2021 +0100

    ISIS-2717: adds config properties and autoconfig
    
    to replace explicit creation of FixtureScriptsSpecificationProvider
---
 .../apache/isis/core/config/IsisConfiguration.java | 140 ++++++++++++++++++++
 .../additional-spring-configuration-metadata.json  |  18 +++
 .../DemoFixtureScriptSpecificationProvider.java    |  40 ------
 .../src/main/java/demoapp/dom/menubars.layout.xml  | 141 ++++++---------------
 .../demo/domain/src/main/resources/application.yml |  12 +-
 ...IsisExtSecmanRegularUserRoleAndPermissions.java |   4 +
 security/adoc/modules/ROOT/pages/about.adoc        |   2 +-
 .../modules/ROOT/pages/usage-by-isis-viewers.adoc  |   3 -
 .../src/main/adoc/modules/shiro/pages/about.adoc   |   2 +-
 .../adoc/modules/starters/pages/simpleapp.adoc     |   5 -
 .../pages/fixture-scripts/api-and-usage.adoc       |  34 +++--
 .../pages/services/ExecutionParametersService.adoc |   1 +
 .../fixtures/pages/services/FixtureScripts.adoc    |   7 +-
 .../FixtureScriptsSpecificationProvider.adoc       |   2 +
 .../IsisIntegrationTestAbstractWithFixtures.java   |   3 +
 .../applib/IsisModuleTestingFixturesApplib.java    |   2 +-
 .../fixturescripts/BuilderScriptAbstract.java      |   3 +
 .../fixturescripts/BuilderScriptWithResult.java    |   3 +-
 .../fixturescripts/BuilderScriptWithoutResult.java |   3 +-
 .../applib/fixturescripts/ExecutionParameters.java |   3 +
 .../fixturescripts/ExecutionParametersService.java |   2 +
 .../applib/fixturescripts/FixtureResult.java       |   3 +
 .../applib/fixturescripts/FixtureResultList.java   |   4 +-
 .../applib/fixturescripts/FixtureScript.java       |   6 +
 .../applib/fixturescripts/FixtureScripts.java      |   3 +
 .../fixturespec/FixtureScriptsSpecification.java   |   7 +-
 .../FixtureScriptsSpecificationProvider.java       |   7 +
 ...iptsSpecificationProviderAutoConfiguration.java |  39 ++++--
 .../applib/modules/ModuleWithFixtures.java         |   2 +
 .../applib/modules/ModuleWithFixturesService.java  |   3 +
 .../applib/setup/PersonaEnumPersistAll.java        |   3 +
 .../teardown/jdo/TeardownFixtureJdoAbstract.java   |   3 +
 32 files changed, 319 insertions(+), 191 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index 7650a18..01a06e5 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -2837,6 +2837,146 @@ public class IsisConfiguration {
              */
             @AssignableFrom("org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript")
             private Class<?> initialScript = null;
+
+            private final FixtureScriptsSpecification fixtureScriptsSpecification = new FixtureScriptsSpecification();
+            @Data
+            public static class FixtureScriptsSpecification {
+                /**
+                 * Specifies the base package from which to search for fixture scripts.
+                 *
+                 * <p>
+                 *     Either this or {@link #getPackagePrefix() packagePrefix} must be specified.  This property is
+                 *     used by preference.
+                 * </p>
+                 *
+                 * @see #getPackagePrefix()
+                 */
+                private Class<?> contextClass = null;
+                /**
+                 * Specifies the base package from which to search for fixture scripts.
+                 *
+                 * <p>
+                 *     Either this or {@link #getContextClass()} must be specified; {@link #getContextClass()} is
+                 *     used by preference.
+                 * </p>
+                 *
+                 * @see #getContextClass()
+                 */
+                private String packagePrefix = null;
+
+
+                /**
+                 * How to handle objects that are to be
+                 * {@link FixtureScripts#newFixtureResult(FixtureScript, String, Object, boolean) added}
+                 * into a {@link FixtureResult} but which are not yet persisted.
+                 */
+                public enum NonPersistedObjectsStrategy {
+                    PERSIST,
+                    IGNORE
+                }
+
+                /**
+                 * How to handle fixture scripts that are submitted to be executed more than once.
+                 *
+                 * <p>
+                 *     Note that this is a {@link FixtureScripts#getMultipleExecutionStrategy() global setting} of the
+                 *     {@link FixtureScripts} service; there isn't (currently) any way to mix-and-match fixture scripts that are
+                 *     written with differing semantics in mind.  Ideally it should be the responsibility of the fixture script
+                 *     itself to determine whether it should be run.  As a partial solution to this, the
+                 *
+                 * </p>
+                 */
+                public enum MultipleExecutionStrategy {
+                    /**
+                     * Any given fixture script (or more precisely, any fixture script instance for a particular fixture script
+                     * class) can only be run once.
+                     *
+                     * <p>
+                     *     This strategy represents the original design of fixture scripts service.  Specifically, it allows an
+                     *     arbitrary graph of fixture scripts (eg A -> B -> C, A -> B -> D, A -> C -> D) to be created each
+                     *     specifying its dependencies, and without having to worry or co-ordinate whether those prerequisite
+                     *     fixture scripts have already been run.
+                     * </p>
+                     * <p>
+                     *     The most obvious example is a global teardown script; every fixture script can require this to be
+                     *     called, but it will only be run once.
+                     * </p>
+                     * <p>
+                     *     Note that this strategy treats fixture scripts as combining both the 'how' (which business action(s) to
+                     *     call) and the also the 'what' (what the arguments are to those actions).
+                     * </p>
+                     */
+                    EXECUTE_ONCE_BY_CLASS,
+                    /**
+                     * Any given fixture script can only be run once, where the check to determine if a fixture script has already
+                     * been run is performed using value semantics.
+                     *
+                     * <p>
+                     *     This strategy is a half-way house between the {@link #EXECUTE_ONCE_BY_VALUE} and {@link #EXECUTE}
+                     *     strategies, where we want to prevent a fixture from running more than once, where by "fixture" we mean
+                     *     the 'what' - the data to be loaded up; the 'how' is unimportant.
+                     * </p>
+                     *
+                     * <p>
+                     *     This strategy was introduced in order to better support the <tt>ExcelFixture</tt> fixture script
+                     *     (provided by the (non-ASF) Isis Addons'
+                     *     <a href="https://github.com/isisaddons/isis-module-excel">Excel module</a>.  The <tt>ExcelFixture</tt>
+                     *     takes an Excel spreadsheet as the 'what' and loads up each row.  So the 'how' is re-usable (therefore
+                     *     the {@link #EXECUTE_ONCE_BY_CLASS} doesn't apply) on the other hand we don't want the 'what' to be
+                     *     loaded more than once (so the {@link #EXECUTE} strategy doesn't apply either).  The solution is for
+                     *     <tt>ExcelFixture</tt> to have value semantics (a digest of the spreadsheet argument).
+                     * </p>
+                     */
+                    EXECUTE_ONCE_BY_VALUE,
+                    /**
+                     * Allow fixture scripts to run as requested.
+                     *
+                     * <p>
+                     *     This strategy is conceptually the simplest; all fixtures are run as requested.  However, it is then
+                     *     the responsibility of the programmer to ensure that fixtures do not interfere with each other.  For
+                     *     example, if fixture A calls fixture B which calls teardown, and fixture A also calls fixture C that
+                     *     itself calls teardown, then fixture B's setup will get removed.
+                     * </p>
+                     * <p>
+                     *     The workaround to the teardown issue is of course to call the teardown fixture only once in the test
+                     *     itself; however even then this strategy cannot cope with arbitrary graphs of fixtures.  The solution
+                     *     is for the fixture list to be flat, one level high.
+                     * </p>
+                     */
+                    EXECUTE;
+                }
+
+
+                /**
+                 * Indicates whether, if a fixture script (or more precisely any other fixture scripts of the same
+                 * class) is encountered more than once in a graph of dependencies, it should be executed again or
+                 * skipped.
+                 *
+                 * <p>
+                 *     The default is to fixture scripts are executed only once per class.
+                 * </p>
+                 *
+                 * <p>
+                 * Note that this policy can be overridden on a fixture-by-fixture basis if the fixture implements
+                 * {@link FixtureScriptWithExecutionStrategy}.
+                 * </p>
+                 */
+                private MultipleExecutionStrategy multipleExecutionStrategy = MultipleExecutionStrategy.EXECUTE_ONCE_BY_CLASS;
+
+                /**
+                 * Indicates whether objects that are returned as a fixture result should be automatically persisted
+                 * if required (the default) or not.
+                 */
+                private NonPersistedObjectsStrategy nonPersistedObjectsStrategy = NonPersistedObjectsStrategy.PERSIST;
+
+                @AssignableFrom("org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript")
+                private Class<?> recreate = null;
+
+                @AssignableFrom("org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript")
+                private Class<?> runScriptDefault = null;
+
+            }
+
         }
     }
 
diff --git a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 58ba3ae..b95e515 100644
--- a/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/core/config/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -17,6 +17,24 @@
       }]
     },
     {
+      "name": "isis.testing.fixtures.fixture-scripts-specification.recreate",
+      "providers": [{
+        "name": "class-reference",
+        "parameters": {
+          "target": "org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript"
+        }
+      }]
+    },
+    {
+      "name": "isis.testing.fixtures.fixture-scripts-specification.run-script-default",
+      "providers": [{
+        "name": "class-reference",
+        "parameters": {
+          "target": "org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript"
+        }
+      }]
+    },
+    {
       "name": "isis.viewer.wicket.themes.provider",
       "providers": [{
         "name": "class-reference",
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/fixtures/DemoFixtureScriptSpecificationProvider.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/fixtures/DemoFixtureScriptSpecificationProvider.java
deleted file mode 100644
index de3673e..0000000
--- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/fixtures/DemoFixtureScriptSpecificationProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package demoapp.dom._infra.fixtures;
-
-import org.springframework.stereotype.Component;
-
-import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
-import org.apache.isis.testing.fixtures.applib.fixturespec.FixtureScriptsSpecification;
-import org.apache.isis.testing.fixtures.applib.fixturespec.FixtureScriptsSpecificationProvider;
-
-@Component
-public class DemoFixtureScriptSpecificationProvider implements FixtureScriptsSpecificationProvider {
-
-    @Override
-    public FixtureScriptsSpecification getSpecification() {
-        return new FixtureScriptsSpecification(
-                getClass().getPackage().getName()
-                , FixtureScripts.NonPersistedObjectsStrategy.IGNORE
-                , FixtureScripts.MultipleExecutionStrategy.EXECUTE_ONCE_BY_VALUE
-                , DemoFixtureScript.class
-                , DemoFixtureScript.class
-        );
-    }
-}
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index b6760a3..04061a8 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -270,64 +270,47 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
         <mb3:menu unreferencedActions="true">
             <mb3:named>Other</mb3:named>
         </mb3:menu>
-
     </mb3:primary>
 	<mb3:secondary>
         <mb3:menu>
             <mb3:named>Prototyping</mb3:named>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.ext.fixtures.FixtureScripts" id="runFixtureScript">
-                    <cpt:named>Run Fixture Script</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.fixtures.FixtureScripts" id="recreateObjectsAndReturnFirst">
-                    <cpt:named>Recreate Objects And Return First</cpt:named>
-                </mb3:serviceAction>
+                <mb3:named>Fixtures</mb3:named>
+                <mb3:serviceAction objectType="isis.testing.fixtures.FixtureScripts" id="runFixtureScript"/>
+                <mb3:serviceAction objectType="isis.testing.fixtures.FixtureScripts" id="recreateObjectsAndReturnFirst"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.applib.LayoutServiceMenu" id="downloadLayouts">
-                    <cpt:named>Download Object Layouts (ZIP)</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.LayoutServiceMenu" id="downloadMenuBarsLayout">
-                    <cpt:named>Download Menu Bars Layout (XML)</cpt:named>
-                </mb3:serviceAction>
+                <mb3:named>Layouts</mb3:named>
+                <mb3:serviceAction objectType="isis.applib.LayoutServiceMenu" id="downloadLayouts"/>
+                <mb3:serviceAction objectType="isis.applib.LayoutServiceMenu" id="downloadMenuBarsLayout"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.applib.MetaModelServiceMenu" id="downloadMetaModelXml">
-                    <cpt:named>Download Meta Model (XML)</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.MetaModelServiceMenu" id="downloadMetaModelCsv">
-                    <cpt:named>Download Meta Model (CSV)</cpt:named>
-                </mb3:serviceAction>
+                <mb3:named>Meta Model and Features</mb3:named>
+                <mb3:serviceAction objectType="isis.applib.MetaModelServiceMenu" id="downloadMetaModelXml"/>
+                <mb3:serviceAction objectType="isis.applib.MetaModelServiceMenu" id="downloadMetaModelCsv"/>
+                <mb3:serviceAction objectType="isis.feat.ApplicationFeatureMenu" id="allNamespaces"/>
+                <mb3:serviceAction objectType="isis.feat.ApplicationFeatureMenu" id="allTypes"/>
+                <mb3:serviceAction objectType="isis.feat.ApplicationFeatureMenu" id="allActions"/>
+                <mb3:serviceAction objectType="isis.feat.ApplicationFeatureMenu" id="allProperties"/>
+                <mb3:serviceAction objectType="isis.feat.ApplicationFeatureMenu" id="allCollections"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.persistence.jdo.JdoMetamodelMenu" id="downloadMetamodels">
-                    <cpt:named>Download JDO Metamodels (ZIP)</cpt:named>
-                </mb3:serviceAction>
+                <mb3:named>Persistence</mb3:named>
+                <mb3:serviceAction objectType="isis.persistence.jdo.JdoMetamodelMenu" id="downloadMetamodels"/>
+                <mb3:serviceAction objectType="isis.ext.h2Console.H2ManagerMenu" id="openH2Console"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.applib.SwaggerServiceMenu" id="openSwaggerUi">
-                    <cpt:named>Open Swagger Ui</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.SwaggerServiceMenu" id="openRestApi">
-                    <cpt:named>Open Rest Api</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.SwaggerServiceMenu" id="downloadSwaggerSchemaDefinition">
-                    <cpt:named>Download Swagger Schema Definition</cpt:named>
-                </mb3:serviceAction>
+                <mb3:named>REST API</mb3:named>
+                <mb3:serviceAction objectType="isis.viewer.restfulobjects.SwaggerServiceMenu" id="openSwaggerUi"/>
+                <mb3:serviceAction objectType="isis.viewer.restfulobjects.SwaggerServiceMenu" id="openRestApi"/>
+                <mb3:serviceAction objectType="isis.viewer.restfulobjects.SwaggerServiceMenu" id="downloadSwaggerSchemaDefinition"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="downloadTranslations">
-                    <cpt:named>Download Translations</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="resetTranslationCache">
-                    <cpt:named>Clear translation cache</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="switchToReadingTranslations">
-                    <cpt:named>Switch To Reading Translations</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="switchToWritingTranslations">
-                    <cpt:named>Switch To Writing Translations</cpt:named>
-                </mb3:serviceAction>
+                <mb3:named>i18n</mb3:named>
+                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="downloadTranslations"/>
+                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="resetTranslationCache"/>
+                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="switchToReadingTranslations"/>
+                <mb3:serviceAction objectType="isis.applib.TranslationServicePoMenu" id="switchToWritingTranslations"/>
             </mb3:section>
 			<mb3:section>
                 <mb3:named>Prototype Actions (on Object)</mb3:named>
@@ -338,11 +321,6 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
                     <cpt:named>Do not Show for Object</cpt:named>
                 </mb3:serviceAction>
             </mb3:section>
-			<mb3:section>
-                <mb3:serviceAction objectType="isis.ext.h2Console.H2ManagerMenu" id="openH2Console">
-                    <cpt:named>H2 Console</cpt:named>
-                </mb3:serviceAction>
-            </mb3:section>
         </mb3:menu>
 
         <mb3:menu>
@@ -375,59 +353,22 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
         <mb3:menu>
             <mb3:named>Security</mb3:named>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="allRoles">
-                    <cpt:named>All Roles</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="newRole">
-                    <cpt:named>New Role</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="findRoles">
-                    <cpt:named>Find Roles</cpt:named>
-                </mb3:serviceAction>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="allRoles"/>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="newRole"/>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="findRoles"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="newTenancy">
-                    <cpt:named>New Tenancy</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="findTenancies">
-                    <cpt:named>Find Tenancies</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="allTenancies">
-                    <cpt:named>All Tenancies</cpt:named>
-                </mb3:serviceAction>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="newTenancy"/>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="findTenancies"/>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="allTenancies"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationPermissionMenu" id="findOrphanedPermissions">
-                    <cpt:named>Find Orphaned Permissions</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationPermissionMenu" id="allPermissions">
-                    <cpt:named>All Permissions</cpt:named>
-                </mb3:serviceAction>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationPermissionMenu" id="findOrphanedPermissions"/>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationPermissionMenu" id="allPermissions"/>
             </mb3:section>
             <mb3:section>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationFeatureViewModels" id="allNamespaces">
-                    <cpt:named>All Namespaces</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationFeatureViewModels" id="allTypes">
-                    <cpt:named>All Types</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationFeatureViewModels" id="allActions">
-                    <cpt:named>All Actions</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationFeatureViewModels" id="allProperties">
-                    <cpt:named>All Properties</cpt:named>
-                </mb3:serviceAction>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationFeatureViewModels" id="allCollections">
-                    <cpt:named>All Collections</cpt:named>
-                </mb3:serviceAction>
-            </mb3:section>
-            <mb3:section>
-            	<mb3:serviceAction objectType="isis.ext.secman.ApplicationUserMenu" id="findUsers">
-                    <cpt:named>Find Users</cpt:named>
-                </mb3:serviceAction>
-            	<mb3:serviceAction objectType="isis.ext.secman.ApplicationUserMenu" id="userManager">
-                    <cpt:named>User Manager</cpt:named>
-                </mb3:serviceAction>
+            	<mb3:serviceAction objectType="isis.ext.secman.ApplicationUserMenu" id="findUsers"/>
+            	<mb3:serviceAction objectType="isis.ext.secman.ApplicationUserMenu" id="userManager"/>
             </mb3:section>
         </mb3:menu>
     </mb3:secondary>
@@ -436,11 +377,13 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
             <mb3:named/>
             <mb3:section>
                 <mb3:serviceAction objectType="isis.ext.secman.MeService" id="me"/>
+	        </mb3:section>
+            <mb3:section>
+                <mb3:named>Configuration</mb3:named>
                 <mb3:serviceAction objectType="isis.conf.ConfigurationMenu" id="configuration"/>
-            </mb3:section><mb3:section>
-	            <mb3:serviceAction objectType="isis.security.LogoutMenu" id="logout">
-	                <cpt:named>Logout</cpt:named>
-	            </mb3:serviceAction>
+	        </mb3:section>
+            <mb3:section>
+	            <mb3:serviceAction objectType="isis.security.LogoutMenu" id="logout"/>
 	        </mb3:section>
         </mb3:menu>
     </mb3:tertiary>
diff --git a/examples/demo/domain/src/main/resources/application.yml b/examples/demo/domain/src/main/resources/application.yml
index 561695f..973e065 100644
--- a/examples/demo/domain/src/main/resources/application.yml
+++ b/examples/demo/domain/src/main/resources/application.yml
@@ -74,7 +74,7 @@ isis:
         brand-logo-signin: images/gift_256.png
         name: Apache Isis Demo App
         # https://stackoverflow.com/a/38983935/56880
-        # in addition using special config with the project's maven-resources-plugin 
+        # in addition using special config with the project's maven-resources-plugin
         version: ${project.version}
         css: css/application.css
         js: scripts/application.js
@@ -106,7 +106,15 @@ isis:
     schema:
        autoCreateSchemas: isisExtensionsSecman,demo
 
-    
+  testing:
+    fixtures:
+      fixture-scripts-specification:
+        context-class: demoapp.dom._infra.fixtures.DemoFixtureScript
+        multiple-execution-strategy: execute_once_by_value
+        non-persisted-objects-strategy: ignore
+        recreate: demoapp.dom._infra.fixtures.DemoFixtureScript
+        run-script-default: demoapp.dom._infra.fixtures.DemoFixtureScript
+
 # note that properties under 'datanucleus' must use camelCase rather than kebab-case
 datanucleus:
   schema:
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/seed/IsisExtSecmanRegularUserRoleAndPermissions.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/seed/IsisExtSecmanRegularUserRoleAndPermissions.java
index e1c5d2f..2581b57 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/seed/IsisExtSecmanRegularUserRoleAndPermissions.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/seed/IsisExtSecmanRegularUserRoleAndPermissions.java
@@ -21,6 +21,7 @@ package org.apache.isis.extensions.secman.applib.role.seed;
 import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.core.security.IsisModuleCoreSecurity;
 import org.apache.isis.core.security.authentication.logout.LogoutMenu;
 import org.apache.isis.extensions.secman.applib.SecmanConfiguration;
 import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionMode;
@@ -80,6 +81,9 @@ public class IsisExtSecmanRegularUserRoleAndPermissions extends AbstractRoleAndP
                 // we also provide default access to run fixtures (prototype action only)
                 ApplicationFeatureId.newNamespace(IsisModuleTestingFixturesApplib.NAMESPACE),
 
+                // we also provide default access to logout action (!)
+                ApplicationFeatureId.newNamespace(IsisModuleCoreSecurity.NAMESPACE),
+
                 // also the ability to logout (!)
                 ApplicationFeatureId.newType(LogoutMenu.LOGICAL_TYPE_NAME),
 
diff --git a/security/adoc/modules/ROOT/pages/about.adoc b/security/adoc/modules/ROOT/pages/about.adoc
index f54c9bf..37fed93 100644
--- a/security/adoc/modules/ROOT/pages/about.adoc
+++ b/security/adoc/modules/ROOT/pages/about.adoc
@@ -4,7 +4,7 @@
 :page-partial:
 
 
-This guide describes how to secure your Apache Isis application by configuring an appropriate implementation of its authentication and authorization SPIIs.
+This guide describes how to secure your Apache Isis application by configuring an appropriate implementation of its authentication and authorization SPIs.
 
 
 == Security Architecture
diff --git a/security/adoc/modules/ROOT/pages/usage-by-isis-viewers.adoc b/security/adoc/modules/ROOT/pages/usage-by-isis-viewers.adoc
index 09d78f5..c7deba3 100644
--- a/security/adoc/modules/ROOT/pages/usage-by-isis-viewers.adoc
+++ b/security/adoc/modules/ROOT/pages/usage-by-isis-viewers.adoc
@@ -2,9 +2,6 @@
 = Usage by Apache Isis' Viewers
 
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
-:page-partial:
-
-WARNING: TODO: this content has not yet been reviewed/updated for v2.0
 
 
 By and large the security mechanisms within Isis are transparent to the rest of the framework.
diff --git a/security/shiro/src/main/adoc/modules/shiro/pages/about.adoc b/security/shiro/src/main/adoc/modules/shiro/pages/about.adoc
index d548f9e..00be605 100644
--- a/security/shiro/src/main/adoc/modules/shiro/pages/about.adoc
+++ b/security/shiro/src/main/adoc/modules/shiro/pages/about.adoc
@@ -230,7 +230,7 @@ The snippet below defines a role for each framework feature:
 [roles]
 default_role   = isis.applib,\
                  isis.security
-fixtures_role  = isis.ext.fixtures
+fixtures_role  = isis.testing.fixtures
 features_role  = isis.feat
 metamodel_role = isis.metamodel
 h2_role        = isis.ext.h2Console
diff --git a/starters/adoc/modules/starters/pages/simpleapp.adoc b/starters/adoc/modules/starters/pages/simpleapp.adoc
index 6f15582..597abfc 100644
--- a/starters/adoc/modules/starters/pages/simpleapp.adoc
+++ b/starters/adoc/modules/starters/pages/simpleapp.adoc
@@ -627,7 +627,6 @@ src/main/java/
         fixture/
           scenarios/                                            <.>
             DomainAppDemo.java                                  <.>
-            DomainAppFixtureScriptsSpecificationProvider.java   <.>
         services/
           health/
             HealthCheckServiceImpl.java                         <.>
@@ -653,10 +652,6 @@ Used for prototyping and also integration testing.
 
 <.> The `DomainAppDemo` is the fixture that was run xref:#fixtures[earlier on].
 
-<.> The `DomainAppFixtureScriptsSpecificationProvider` is used to configure the run fixture script menu item shown on the "Prototyping" menu.
-+
-NOTE: Fixture scenarios also need to be link:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Import.html[@Import]ed, typically in the top-level `AppManifest`.
-
 <.> An implementation of the xref:refguide:applib:index/services/health/HealthCheckService.adoc[HealtCheckService].
 This integrates with Spring Boot's link:https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/actuate/health/HealthIndicator.html[HealthIndicator] SPI, surfaced through the link:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html[Spring Boot Actuator].
 
diff --git a/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc b/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc
index 0398749..0e849f6 100644
--- a/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc
+++ b/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc
@@ -17,31 +17,27 @@ Let's look at `FixtureScripts` domain service in more detail first.
 The framework provides a default implementation of `FixtureScripts` domain service, namely the xref:testing:fixtures:services/FixtureScripts.adoc[FixtureScriptsDefault] domain service.
 This is annotated to be rendered on the secondary "Prototyping" menu.
 
-The behaviour of this domain menu service can be refined by providing an implementation of the optional xref:testing:fixtures:services/FixtureScriptsSpecificationProvider.adoc[FixtureScriptsSpecificationProvider] SPI.
-
-For example, here's the `FixtureScriptsSpecificationProvider` service that's generated by the xref:docs:starters:simpleapp.adoc[SimpleApp] starter apps:
+The behaviour of this domain menu service can be configured using the `isis.testing.fixtures.fixture-script-specification` configuration properties.
+For example, here's the configuration used by the xref:docs:starters:simpleapp.adoc[SimpleApp] starter apps:
 
 [source,java]
+.application.yml
 ----
-@DomainService( nature = NatureOfService.DOMAIN )
-public class DomainAppFixtureScriptsSpecificationProvider
-                    implements FixtureScriptsSpecificationProvider {
-    public FixtureScriptsSpecification getSpecification() {
-        return FixtureScriptsSpecification
-            .builder(DomainAppFixtureScriptsSpecificationProvider.class)               // <1>
-            .with(FixtureScripts.MultipleExecutionStrategy.EXECUTE)                    // <2>
-            .withRunScriptDefault(DomainAppDemo.class)                                 // <3>
-            .withRunScriptDropDown(FixtureScriptsSpecification.DropDownPolicy.CHOICES) // <4>
-            .withRecreate(DomainAppDemo.class)                                         // <5>
-            .build();
+isis:
+  testing:
+    fixtures:
+      fixture-scripts-specification:
+        context-class: domainapp.webapp.application.fixture.scenarios.DomainAppDemo # <.>
+        multiple-execution-strategy: execute # <.>
+        run-script-default: domainapp.webapp.application.fixture.scenarios.DomainAppDemo # <.>
+        recreate: domainapp.webapp.application.fixture.scenarios.DomainAppDemo # <.>
     }
 }
 ----
-<1> search for all fixture scripts under the package containing this class
-<2> if the same fixture script (class) is encountered more than once, then run anyway; more on this in xref:testing:fixtures:about/api-and-usage.adoc#organizing[Organizing Fixture scripts], below.
-<3> specify the fixture script class to provide as the default for the service's "run fixture script" action
-<4> whether the service's "run fixture script" action should display other fixture scripts using a choices drop down or (if there are very many of them) using an auto-complete
-<5> if present, enables a "recreate objects and return first" action to be displayed in the UI
+<.> search for all fixture scripts under the package containing this class
+<.> if the same fixture script (class) is encountered more than once, then run anyway.
+<.> specify the fixture script class to provide as the default for the service's "run fixture script" action
+<.> if present, enables a "recreate objects and return first" action to be displayed in the UI
 
 
 Here's how the domain service looks like in the UI:
diff --git a/testing/fixtures/adoc/modules/fixtures/pages/services/ExecutionParametersService.adoc b/testing/fixtures/adoc/modules/fixtures/pages/services/ExecutionParametersService.adoc
index b012a50..afcb411 100644
--- a/testing/fixtures/adoc/modules/fixtures/pages/services/ExecutionParametersService.adoc
+++ b/testing/fixtures/adoc/modules/fixtures/pages/services/ExecutionParametersService.adoc
@@ -3,6 +3,7 @@
 :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
 :page-partial:
 
+CAUTION: TODO: this needs to be converted into a hook for refguide-index
 
 
 The `ExecutionParametersService` is used by the framework simply to instantiate the `ExecutionParameters` object.
diff --git a/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScripts.adoc b/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScripts.adoc
index 2b40620..c82ca75 100644
--- a/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScripts.adoc
+++ b/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScripts.adoc
@@ -5,11 +5,11 @@
 :page-partial:
 
 
+CAUTION: TODO: this needs to be converted into a hook for refguide-index
 
 The `FixtureScripts` service provides the ability to execute xref:fixtures:ROOT:about.adoc#api-and-usage[fixture scripts].
 
-The default implementation of this service, `FixtureScriptsDefault`, uses the associated xref:testing:fixtures:services/FixtureScriptsSpecificationProvider.adoc[FixtureScriptsSpecificationProvider] to obtain a `FixtureScriptsSpecification`.
-This configures this service, for example telling it which package to search for `FixtureScript` classes, how to execute those classes, and hints that influence the UI.
+The service is typically configured using the `isis.testing.fixtures.fixture-scripts-specification` configuration properties, for example telling it which package to search for xref:refguide:testing:index/ classes, how to execute those classes, and hints that influence the UI.
 
 
 
@@ -57,6 +57,3 @@ This are listened to by the xref:refguide:applib:index/services/queryresultscach
 |===
 
 
-=== Related Services
-
-The default implementation of this domain service interacts with xref:testing:fixtures:services/FixtureScriptsSpecificationProvider.adoc[FixtureScriptsSpecificationProvider].
diff --git a/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScriptsSpecificationProvider.adoc b/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScriptsSpecificationProvider.adoc
index 3effdd1..944257a 100644
--- a/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScriptsSpecificationProvider.adoc
+++ b/testing/fixtures/adoc/modules/fixtures/pages/services/FixtureScriptsSpecificationProvider.adoc
@@ -4,6 +4,8 @@
 :page-partial:
 
 
+CAUTION: TODO: this needs to be converted into a hook for refguide-index, and x-ref config properties as the preferred approach.
+
 
 The `FixtureScriptsSpecificationProvider` configures the xref:testing:fixtures:services/FixtureScripts.adoc[FixtureScripts] domain service, providing the location to search for fixture scripts and other settings.
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java
index 8afd474..9a6bbfd 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java
@@ -35,6 +35,9 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixturesService;
 import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract;
 
+/**
+ * @since 2.x {@index}
+ */
 public abstract class IsisIntegrationTestAbstractWithFixtures extends IsisIntegrationTestAbstract {
 
     protected void run(final FixtureScript... fixtureScriptList) {
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisModuleTestingFixturesApplib.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisModuleTestingFixturesApplib.java
index 6ecf637..7fec8a1 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisModuleTestingFixturesApplib.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisModuleTestingFixturesApplib.java
@@ -44,5 +44,5 @@ import org.apache.isis.testing.fixtures.applib.services.FixturesLifecycleService
 })
 public class IsisModuleTestingFixturesApplib {
 
-    public static final String NAMESPACE = "isis.ext.fixtures";
+    public static final String NAMESPACE = "isis.testing.fixtures";
 }
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java
index 3138d4e..19519d3 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java
@@ -29,6 +29,9 @@ import org.apache.isis.testing.fixtures.applib.api.WithPrereqs;
 
 import lombok.Getter;
 
+/**
+ * @since 2.x {@index}
+ */
 public abstract class BuilderScriptAbstract<T>
 extends FixtureScript implements WithPrereqs<T>, FixtureScriptWithExecutionStrategy {
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java
index 214bda1..67c3733 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java
@@ -23,8 +23,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 import lombok.Getter;
 
 /**
- *
- * @since 2.0
+ * @since 2.x {@index}
  *
  * @param <T>
  */
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java
index 7a2addc..3d42804 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java
@@ -19,8 +19,7 @@
 package org.apache.isis.testing.fixtures.applib.fixturescripts;
 
 /**
- *
- * @since 2.0
+ * @since 2.x {@index}
  */
 public abstract class BuilderScriptWithoutResult extends BuilderScriptAbstract<Object> {
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParameters.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParameters.java
index 1218400..1f51483 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParameters.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParameters.java
@@ -34,6 +34,9 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Maps;
 
+/**
+ * @since 1.x {@index}
+ */
 public class ExecutionParameters {
 
     private static final Pattern keyEqualsValuePattern = Pattern.compile("([^=]*)=(.*)");
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParametersService.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParametersService.java
index 49a7221..266a06c 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParametersService.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/ExecutionParametersService.java
@@ -37,6 +37,8 @@ import org.apache.isis.applib.annotation.OrderPrecedence;
  * insurance policy to allow this part of the testing framework to be patched if the chosen parsing algorithms
  * need refinement in the future).
  * </p>
+ *
+ * @since 1.x {@index}
  */
 @Service
 @Named("isis.test.FixtureExecutionParametersService")
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java
index 186682b..78b0471 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java
@@ -40,6 +40,9 @@ import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
 import lombok.Getter;
 import lombok.Setter;
 
+/**
+ * @since 1.x {@index}
+ */
 @DomainObject(
         nature = Nature.VIEW_MODEL,
         logicalTypeName = FixtureResult.LOGICAL_TYPE_NAME
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResultList.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResultList.java
index f0d70e1..8048b9e 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResultList.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResultList.java
@@ -32,6 +32,8 @@ import org.apache.isis.commons.internal.collections._Maps;
  *
  * <p>
  * Instantiate using {@link FixtureScripts#newExecutionContext(String)}
+ *
+ * @since 1.x {@index}
  */
 public class FixtureResultList {
 
@@ -138,4 +140,4 @@ public class FixtureResultList {
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java
index 01a00e5..90db06a 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java
@@ -58,6 +58,9 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
 
+/**
+ * @since 1.x {@index}
+ */
 @Log4j2
 public abstract class FixtureScript {
 
@@ -136,6 +139,9 @@ public abstract class FixtureScript {
 
     // -- ExecutionContext
 
+    /**
+     * @since 1.x {@index}
+     */
     public static class ExecutionContext {
 
         /**
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
index b87a79c..befa3a5 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
@@ -64,6 +64,9 @@ import lombok.Setter;
 import lombok.val;
 
 
+/**
+ * @since 1.x {@index}
+ */
 @DomainService(
         nature = NatureOfService.VIEW,
         logicalTypeName = FixtureScripts.LOGICAL_TYPE_NAME
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java
index 5a320c9..a3b74c4 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java
@@ -25,7 +25,12 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
 /**
- * Pulls together the various state that influences the behaviour of {@link FixtureScripts} service.
+ * Specifies the behaviour of the
+ * {@link org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts#runFixtureScript(String, String) runFixtureScript}
+ * menu action and the execution characteristics of (graphs of)
+ * {@link org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript fixture script}s.
+ *
+ * @since 1.x {@index}
  */
 public class FixtureScriptsSpecification {
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProvider.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProvider.java
index bc6db38..b919b59 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProvider.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProvider.java
@@ -20,7 +20,14 @@ package org.apache.isis.testing.fixtures.applib.fixturespec;
 
 import org.apache.isis.applib.annotation.Programmatic;
 
+/**
+ * SPI to provide an implementation of
+ * {@link org.apache.isis.core.config.IsisConfiguration.Testing.Fixtures.FixtureScriptsSpecification}.
+ *
+ * @deprecated - use <code>isis.testing.fixture.fixture-scripts-specification</code> configuration properties instead.
+ */
 @FunctionalInterface
+@Deprecated
 public interface FixtureScriptsSpecificationProvider {
 
     @Programmatic
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProviderAutoConfiguration.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProviderAutoConfiguration.java
index 85020f4..cbd48e2 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProviderAutoConfiguration.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecificationProviderAutoConfiguration.java
@@ -23,27 +23,48 @@ import org.springframework.boot.autoconfigure.AutoConfigureOrder;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.security.authentication.Authenticator;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
+
+import lombok.val;
 
 @AutoConfigureOrder(OrderPrecedence.LATE)
 @Configuration
 public class FixtureScriptsSpecificationProviderAutoConfiguration  {
 
-    @Bean("isis.ext.fixtures.FixtureScriptsSpecificationProviderDefault")
+    @Bean("isis.testing.fixtures.FixtureScriptsSpecificationProviderDefault")
     @ConditionalOnMissingBean(FixtureScriptsSpecificationProvider.class)
     @Qualifier("Default")
-    FixtureScriptsSpecificationProvider fixtureScriptsSpecificationProvider(final IsisConfiguration isisConfiguration) {
-        return new FixtureScriptsSpecificationProvider() {
-
-            @Override
-            public FixtureScriptsSpecification getSpecification() {
-                return new FixtureScriptsSpecification();
-            }
-        };
+    @Nullable FixtureScriptsSpecificationProvider fixtureScriptsSpecificationProvider(final IsisConfiguration isisConfiguration) {
+        val fixturesConfig = isisConfiguration.getTesting().getFixtures().getFixtureScriptsSpecification();
+        val builder = builder(fixturesConfig);
+        if(builder == null) {
+            return null;
+        }
+        builder.with(FixtureScripts.NonPersistedObjectsStrategy.valueOf(fixturesConfig.getNonPersistedObjectsStrategy().name()));
+        builder.with(FixtureScripts.MultipleExecutionStrategy.valueOf(fixturesConfig.getMultipleExecutionStrategy().name()));
+        builder.withRecreate((Class) fixturesConfig.getRecreate());
+        builder.withRunScriptDefault((Class) fixturesConfig.getRunScriptDefault());
+
+        return () -> builder.build();
+    }
+
+    private FixtureScriptsSpecification.Builder builder(IsisConfiguration.Testing.Fixtures.FixtureScriptsSpecification fixturesConfig) {
+        val contextClass = fixturesConfig.getContextClass();
+        if(contextClass != null) {
+            return FixtureScriptsSpecification.builder(contextClass);
+        }
+        val packagePrefix = fixturesConfig.getPackagePrefix();
+        if(packagePrefix != null) {
+            return FixtureScriptsSpecification.builder(packagePrefix);
+        }
+        return null;
     }
 
 }
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixtures.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixtures.java
index fbd68ff..0aa4e62 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixtures.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixtures.java
@@ -45,6 +45,8 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
  *     These setup/teardown fixtures will be called in the correct order as per the transitive dependency graph
  *     inferred from the <code>@Configuration</code> imports.
  * </p>
+ *
+ * @since 2.x {@index}
  */
 public interface ModuleWithFixtures {
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixturesService.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixturesService.java
index 3e84028..7a2485a 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixturesService.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/modules/ModuleWithFixturesService.java
@@ -50,6 +50,9 @@ import lombok.Data;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
+/**
+ * @since 2.x {@index}
+ */
 @Service
 @Named("isis.test.ModuleWithFixturesService")
 @Order(OrderPrecedence.MIDPOINT)
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java
index e8ff8cd..5ae75a0 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java
@@ -28,6 +28,9 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptAbstr
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
+/**
+ * @since 2.x {@index}
+ */
 @Programmatic
 public class PersonaEnumPersistAll<
 E extends Enum<E> & PersonaWithBuilderScript<? extends BuilderScriptAbstract<T>>,
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/teardown/jdo/TeardownFixtureJdoAbstract.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/teardown/jdo/TeardownFixtureJdoAbstract.java
index 61e8944..28bb923 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/teardown/jdo/TeardownFixtureJdoAbstract.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/teardown/jdo/TeardownFixtureJdoAbstract.java
@@ -31,6 +31,9 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.persistence.jdo.applib.services.JdoSupportService;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 
+/**
+ * @since 2.x {@index}
+ */
 @Programmatic
 public abstract class TeardownFixtureJdoAbstract extends FixtureScript {