You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/12/01 19:27:52 UTC

[isis] 02/07: ISIS-2188: merges FixtureScriptsDefault up into FixtureScripts

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

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

commit 9b3c807a97c9c92892d2be3b2b03429246e87539
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Dec 1 18:23:54 2019 +0000

    ISIS-2188: merges FixtureScriptsDefault up into FixtureScripts
---
 .../testdomain/bootstrapping/builtin-IsisBoot.list |   2 +-
 .../bootstrapping/builtin-domain-services.list     |   2 +-
 .../bootstrapping/builtin-singleton.list           |   2 +-
 .../extensions/fixtures/IsisExtFixturesModule.java |   9 +-
 .../fixtures/fixturescripts/FixtureScripts.java    | 221 ++++++++++++++----
 .../fixturescripts/FixtureScriptsDefault.java      | 250 ---------------------
 .../fixturespec/FixtureScriptsSpecification.java   |   3 +-
 .../FixtureScriptsSpecificationProvider.java       |   9 -
 .../fixtures/fixturespec/package-info.java         |   5 +-
 9 files changed, 181 insertions(+), 322 deletions(-)

diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list
index e55743a..57ca13b 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-IsisBoot.list
@@ -20,7 +20,7 @@ org.apache.isis.config.beans.WebAppConfigBean
 org.apache.isis.extensions.fixtures.FixturesEventService
 org.apache.isis.extensions.fixtures.FixturesLifecyleService
 org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService
-org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault
+org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts
 org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal
 org.apache.isis.jdo.jdosupport.IsisJdoSupportDN5
 org.apache.isis.jdo.metrics.MetricsServiceDefault
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
index 334c855..7c922c1 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
@@ -10,7 +10,7 @@ org.apache.isis.applib.services.scratchpad.Scratchpad
 org.apache.isis.applib.services.swagger.SwaggerServiceMenu
 org.apache.isis.applib.services.tablecol.TableColumnOrderService$Default
 org.apache.isis.applib.services.urlencoding.UrlEncodingServiceWithCompression
-org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault
+org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts
 org.apache.isis.jdo.metrics.MetricsServiceDefault
 org.apache.isis.metamodel.services.registry.ServiceRegistryDefault
 org.apache.isis.metamodel.services.user.UserServiceDefault$SudoServiceSpi
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
index 625bf5e..a8ce24a 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
@@ -22,7 +22,7 @@ org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring
 #org.apache.isis.config.beans.WebAppConfigBean
 org.apache.isis.extensions.fixtures.FixturesLifecyleService
 org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService
-org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault
+org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts
 org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal
 org.apache.isis.jdo.datanucleus.DataNucleusSettings
 org.apache.isis.jdo.datanucleus.service.JdoPersistenceLifecycleService
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisExtFixturesModule.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisExtFixturesModule.java
index 10666b3..eb08800 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisExtFixturesModule.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/IsisExtFixturesModule.java
@@ -18,21 +18,20 @@
  */
 package org.apache.isis.extensions.fixtures;
 
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-
 import org.apache.isis.extensions.fixtures.fixturescripts.ExecutionParametersService;
-import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault;
+import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
 import org.apache.isis.extensions.fixtures.legacy.queryresultscache.QueryResultsCacheControlInternal;
 import org.apache.isis.extensions.fixtures.modules.ModuleFixtureService;
 import org.apache.isis.extensions.fixtures.modules.ModuleService;
 import org.apache.isis.extensions.spring.ExtSpringModule;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
 
 @Configuration
 @Import({
     ExtSpringModule.class,
     FixturesLifecycleService.class,
-    FixtureScriptsDefault.class,
+    FixtureScripts.class,
     ExecutionParametersService.class,
     QueryResultsCacheControlInternal.class,
     ModuleService.class,
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScripts.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScripts.java
index d877698..cd2ea85 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScripts.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScripts.java
@@ -32,14 +32,19 @@ import javax.xml.bind.annotation.XmlRootElement;
 import org.apache.isis.applib.AbstractService;
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.MinLength;
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.jaxb.JaxbService;
@@ -47,22 +52,30 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.extensions.fixtures.api.PersonaWithBuilderScript;
+import org.apache.isis.extensions.fixtures.events.FixturesInstalledEvent;
+import org.apache.isis.extensions.fixtures.events.FixturesInstallingEvent;
 import org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecification;
+import org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 
 
-/**
- * Rather than sub-classing, instead implement
- * {@link org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecificationProvider}.  
- * The framework will
- * automatically provide a default implementation configured using that provider service.
- */
-public abstract class FixtureScripts extends AbstractService {
+@DomainService(
+        nature = NatureOfService.VIEW,
+        objectType = "isisApplib.FixtureScripts"
+)
+@DomainServiceLayout(
+        named="Prototyping",
+        menuBar = DomainServiceLayout.MenuBar.SECONDARY
+)
+public class FixtureScripts extends AbstractService {
+
 
     // -- Specification, nonPersistedObjectsStrategy, multipleExecutionStrategy enums
 
@@ -159,6 +172,13 @@ public abstract class FixtureScripts extends AbstractService {
 
     // -- constructors
 
+    // -- constructor, init
+    /**
+     * The package prefix to search for fixture scripts.  This default value will result in
+     * no fixture scripts being found.  However, normally it will be overridden.
+     */
+    public static final String PACKAGE_PREFIX = FixtureScripts.class.getPackage().getName();
+
     /**
      * @param specification - specifies how the service will find instances and execute them.
      */
@@ -166,33 +186,20 @@ public abstract class FixtureScripts extends AbstractService {
         this.specification = specification;
     }
 
-    // -- packagePrefix, nonPersistedObjectsStrategy, multipleExecutionStrategy
+    public FixtureScripts() {
+        this(FixtureScriptsSpecification.builder(PACKAGE_PREFIX)
+                .build());
+    }
 
-    private FixtureScriptsSpecification specification;
 
-    @Programmatic
-    public FixtureScriptsSpecification getSpecification() {
-        return specification;
-    }
+    // -- packagePrefix, nonPersistedObjectsStrategy, multipleExecutionStrategy
 
-    /**
-     * Allows the specification to be overridden if required.
-     *
-     * <p>
-     *     This is used by {@link FixtureScriptsDefault}.
-     * </p>
-     *
-     * @param specification
-     */
-    protected void setSpecification(final FixtureScriptsSpecification specification) {
-        this.specification = specification;
-    }
+    @Getter
+    private FixtureScriptsSpecification specification;
 
-    @Programmatic
     public String getPackagePrefix() {
         return specification.getPackagePrefix();
     }
-    @Programmatic
     public NonPersistedObjectsStrategy getNonPersistedObjectsStrategy() {
         return specification.getNonPersistedObjectsStrategy();
     }
@@ -208,11 +215,20 @@ public abstract class FixtureScripts extends AbstractService {
 
     // -- init
 
-    @Programmatic
+    Can<FixtureScriptsSpecificationProvider> fixtureScriptsSpecificationProvider;
+
     @PostConstruct
     public void init() {
+        if(fixtureScriptsSpecificationProvider == null) {
+            fixtureScriptsSpecificationProvider =
+                    serviceRegistry.select(FixtureScriptsSpecificationProvider.class);
+        }
+        fixtureScriptsSpecificationProvider.getFirst().ifPresent(
+                provider -> this.specification = provider.getSpecification()
+        );
     }
 
+
     // -- fixtureScriptList (lazily built)
 
     private List<FixtureScript> fixtureScriptList;
@@ -255,37 +271,62 @@ public abstract class FixtureScripts extends AbstractService {
         this.fixtureTracing.set(fixtureTracing);
     }
 
-    // -- runFixtureScript (prototype action)
+    // -- runFixtureScript (using choices as the drop-down policy)
 
-    /**
-     * To make this action usable in the UI, override either {@link #choices0RunFixtureScript()} or
-     * {@link #autoComplete0RunFixtureScript(String)} with <tt>public</tt> visibility</tt>.
-     */
-    @Action(restrictTo = RestrictTo.PROTOTYPING)
+    @Action(
+            restrictTo = RestrictTo.PROTOTYPING
+    )
+    @ActionLayout(
+            cssClassFa="fa fa-chevron-right"
+    )
     @MemberOrder(sequence="10")
     public List<FixtureResult> runFixtureScript(
             final FixtureScript fixtureScript,
             @ParameterLayout(
-                    named="Parameters",
-                    describedAs="Script-specific parameters (if any).  The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
-                    multiLine = 10
-                    )
+                    named = "Parameters",
+                    describedAs =
+                            "Script-specific parameters (if any).  The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
+                    multiLine = 10)
             @Parameter(optionality = Optionality.OPTIONAL)
             final String parameters) {
+        try {
+            eventBusService.post(new FixturesInstallingEvent(this));
 
-        // if this method is called programmatically, the caller may have simply new'd up the fixture script
-        // (rather than use container.newTransientInstance(...).  To allow this use case, we need to ensure that
-        // domain services are injected into the fixture script.
-        serviceInjector.injectServicesInto(fixtureScript);
+            // if this method is called programmatically, the caller may have simply new'd up the fixture script
+            // (rather than use container.newTransientInstance(...).  To allow this use case, we need to ensure that
+            // domain services are injected into the fixture script.
+            serviceInjector.injectServicesInto(fixtureScript);
 
-        return fixtureScript.withTracing(fixtureTracing.get()).run(parameters);
+            return fixtureScript.withTracing(fixtureTracing.get()).run(parameters);
+        } finally {
+            eventBusService.post(new FixturesInstalledEvent(this));
+        }
+    }
+
+
+    /**
+     * Hide the actions of this service if no configuring {@link FixtureScriptsSpecificationProvider} was provided or is available.
+     */
+    public boolean hideRunFixtureScript() {
+        return hideIfPolicyNot(FixtureScriptsSpecification.DropDownPolicy.CHOICES);
     }
+    public String disableRunFixtureScript() {
+        return getFixtureScriptList().isEmpty()? "No fixture scripts found under package '" + getPackagePrefix() + "'": null;
+    }
+
+
     public FixtureScript default0RunFixtureScript() {
-        return getFixtureScriptList().isEmpty() ? null: getFixtureScriptList().get(0);
+        Class<? extends FixtureScript> defaultScript = getSpecification().getRunScriptDefaultScriptClass();
+        if(defaultScript == null) {
+            return null;
+        }
+        return findFixtureScriptFor(defaultScript);
     }
-    protected List<FixtureScript> choices0RunFixtureScript() {
+
+    public List<FixtureScript> choices0RunFixtureScript() {
         return getFixtureScriptList();
     }
+
     protected List<FixtureScript> autoComplete0RunFixtureScript(final @MinLength(1) String arg) {
 
         final Predicate<String> contains = str -> str != null && str.contains(arg);
@@ -294,9 +335,6 @@ public abstract class FixtureScripts extends AbstractService {
                 .filter(script-> contains.test(script.getFriendlyName()) || contains.test(script.getLocalName()))
                 .collect(Collectors.toList());
     }
-    public String disableRunFixtureScript() {
-        return getFixtureScriptList().isEmpty()? "No fixture scripts found under package '" + getPackagePrefix() + "'": null;
-    }
     public String validateRunFixtureScript(final FixtureScript fixtureScript, final String parameters) {
         return fixtureScript.validateRun(parameters);
     }
@@ -305,6 +343,85 @@ public abstract class FixtureScripts extends AbstractService {
         return fixtureScript.run(parameters);
     }
 
+
+
+
+    // -- runFixtureScript (using autoComplete as drop-down policy)
+    @Action(
+            restrictTo = RestrictTo.PROTOTYPING
+    )
+    @ActionLayout(
+            named = "Run Fixture Script"
+    )
+    @MemberOrder(sequence="10")
+    public List<FixtureResult> runFixtureScriptWithAutoComplete(
+            final FixtureScript fixtureScript,
+            @ParameterLayout(
+                    named = "Parameters",
+                    describedAs =
+                            "Script-specific parameters (if any).  The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
+                    multiLine = 10)
+            @Parameter(optionality = Optionality.OPTIONAL)
+            final String parameters) {
+        return this.runFixtureScript(fixtureScript, parameters);
+    }
+
+    public boolean hideRunFixtureScriptWithAutoComplete() {
+        return hideIfPolicyNot(FixtureScriptsSpecification.DropDownPolicy.AUTO_COMPLETE);
+    }
+
+    public String disableRunFixtureScriptWithAutoComplete() {
+        return disableRunFixtureScript();
+    }
+
+    public FixtureScript default0RunFixtureScriptWithAutoComplete() {
+        return default0RunFixtureScript();
+    }
+
+    public List<FixtureScript> autoComplete0RunFixtureScriptWithAutoComplete(final @MinLength(1) String arg) {
+        return autoComplete0RunFixtureScript(arg);
+    }
+
+    public String validateRunFixtureScriptWithAutoComplete(final FixtureScript fixtureScript, final String parameters) {
+        return validateRunFixtureScript(fixtureScript, parameters);
+    }
+
+
+    // -- recreateObjectsAndReturnFirst
+
+    @Action(
+            restrictTo = RestrictTo.PROTOTYPING
+    )
+    @ActionLayout(
+            cssClassFa="fa fa-refresh"
+    )
+    @MemberOrder(sequence="20")
+    public Object recreateObjectsAndReturnFirst() {
+        val recreateScriptClass =  getSpecification().getRecreateScriptClass();
+        val recreateScript = findFixtureScriptFor(recreateScriptClass);
+        if(recreateScript == null) {
+            return null;
+        }
+        final List<FixtureResult> results = runScript(recreateScript, null);
+        if(results.isEmpty()) {
+            return null;
+        }
+        return results.get(0).getObject();
+    }
+
+    public boolean hideRecreateObjectsAndReturnFirst() {
+        return getSpecification().getRecreateScriptClass() == null;
+    }
+
+
+
+
+    // -- HELPER
+
+    private boolean hideIfPolicyNot(final FixtureScriptsSpecification.DropDownPolicy requiredPolicy) {
+        return fixtureScriptsSpecificationProvider.isEmpty() || getSpecification().getRunScriptDropDownPolicy() != requiredPolicy;
+    }
+
     // -- programmatic API
 
     @Programmatic
@@ -487,7 +604,10 @@ public abstract class FixtureScripts extends AbstractService {
     @Inject RepositoryService repositoryService;
     @Inject TransactionService transactionService;
     @Inject ExecutionParametersService executionParametersService;
-    
+
+    @Inject EventBusService eventBusService;
+
+
     // -- DEPRECATIONS
  
     /**
@@ -514,4 +634,7 @@ public abstract class FixtureScripts extends AbstractService {
         return runBuilder(builderScript);
     }
 
+
+
+
 }
\ No newline at end of file
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScriptsDefault.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScriptsDefault.java
deleted file mode 100644
index 09877b1..0000000
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureScriptsDefault.java
+++ /dev/null
@@ -1,250 +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.extensions.fixtures.fixturescripts;
-
-import java.util.List;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.DomainServiceLayout;
-import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.MinLength;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Optionality;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.applib.annotation.RestrictTo;
-import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.extensions.fixtures.events.FixturesInstalledEvent;
-import org.apache.isis.extensions.fixtures.events.FixturesInstallingEvent;
-import org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecification;
-import org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecificationProvider;
-
-import lombok.val;
-
-/**
- * Default instance of {@link FixtureScripts}, instantiated automatically by the framework if no custom user-defined instance was
- * registered.
- *
- * <p>
- *     The original design (pre 1.9.0) was to subclass {@link FixtureScripts} and specify the package prefix (and optionally other
- *     settings) to search for {@link FixtureScript} subtypes.  The inherited functionality from the superclass then knew how to
- *     find and execute fixture scripts.
- * </p>
- * <p>
- *     The new (1.9.0+) design separates these responsibilities.  Rather than subclassing {@link FixtureScripts}, you can instead
- *     rely on the framework to instantiate <i>this</i> default, fallback, implementation of {@link FixtureScripts}.  You can then
- *     optionally (though typically) specify the package prefix and other settings by implementing the new {@link FixtureScriptsSpecificationProvider}
- *     service.
- * </p>
- *
- * <p>
- *     Note that this class is deliberately <i>not</i> annotated with {@link org.apache.isis.applib.annotation.DomainService}; rather it is
- *     automatically registered programmatically if no other instance of {@link FixtureScripts} is found.
- * </p>
- */
-@DomainService(
-        nature = NatureOfService.VIEW,
-        objectType = "isisApplib.FixtureScriptsDefault"
-        )
-@DomainServiceLayout(
-        named="Prototyping",
-        menuBar = DomainServiceLayout.MenuBar.SECONDARY
-        )
-public class FixtureScriptsDefault extends FixtureScripts {
-
-    // -- constructor, init
-    /**
-     * The package prefix to search for fixture scripts.  This default value will result in
-     * no fixture scripts being found.  However, normally it will be overridden.
-     */
-    public static final String PACKAGE_PREFIX = FixtureScriptsDefault.class.getPackage().getName();
-
-    public FixtureScriptsDefault() {
-        super(FixtureScriptsSpecification.builder(PACKAGE_PREFIX)
-                .build());
-    }
-
-
-    @Override
-    @PostConstruct
-    public void init() {
-        if(fixtureScriptsSpecificationProvider == null) {
-            fixtureScriptsSpecificationProvider = 
-                    serviceRegistry.select(FixtureScriptsSpecificationProvider.class);
-        }
-        if(fixtureScriptsSpecificationProvider.isEmpty()) {
-            return;
-        }
-        setSpecification(fixtureScriptsSpecificationProvider
-                .getFirst().get().getSpecification());
-    }
-
-
-
-    // -- runFixtureScript (using choices as the drop-down policy)
-    @Action(
-            restrictTo = RestrictTo.PROTOTYPING
-            )
-    @ActionLayout(
-            cssClassFa="fa fa-chevron-right"
-            )
-    @MemberOrder(sequence="10")
-    @Override
-    public List<FixtureResult> runFixtureScript(
-            final FixtureScript fixtureScript,
-            @ParameterLayout(
-                    named = "Parameters",
-                    describedAs =
-                    "Script-specific parameters (if any).  The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
-                    multiLine = 10)
-            @Parameter(optionality = Optionality.OPTIONAL)
-            final String parameters) {
-        try {
-            eventBusService.post(new FixturesInstallingEvent(this));
-            return super.runFixtureScript(fixtureScript, parameters);
-        } finally {
-            eventBusService.post(new FixturesInstalledEvent(this));
-        }
-    }
-
-    /**
-     * Hide the actions of this service if no configuring {@link FixtureScriptsSpecificationProvider} was provided or is available.
-     */
-    public boolean hideRunFixtureScript() {
-        return hideIfPolicyNot(FixtureScriptsSpecification.DropDownPolicy.CHOICES);
-    }
-
-    @Override
-    public String disableRunFixtureScript() {
-        return super.disableRunFixtureScript();
-    }
-
-    @Override
-    public FixtureScript default0RunFixtureScript() {
-        Class<? extends FixtureScript> defaultScript = getSpecification().getRunScriptDefaultScriptClass();
-        if(defaultScript == null) {
-            return null;
-        }
-        return findFixtureScriptFor(defaultScript);
-    }
-
-    /**
-     * Promote to public visibility.
-     */
-    @Override
-    public List<FixtureScript> choices0RunFixtureScript() {
-        return super.choices0RunFixtureScript();
-    }
-
-    @Override
-    public String validateRunFixtureScript(final FixtureScript fixtureScript, final String parameters) {
-        return super.validateRunFixtureScript(fixtureScript, parameters);
-    }
-
-
-
-    // -- runFixtureScript (using autoComplete as drop-down policy)
-    @Action(
-            restrictTo = RestrictTo.PROTOTYPING
-            )
-    @ActionLayout(
-            named = "Run Fixture Script"
-            )
-    @MemberOrder(sequence="10")
-    public List<FixtureResult> runFixtureScriptWithAutoComplete(
-            final FixtureScript fixtureScript,
-            @ParameterLayout(
-                    named = "Parameters",
-                    describedAs =
-                    "Script-specific parameters (if any).  The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)",
-                    multiLine = 10)
-            @Parameter(optionality = Optionality.OPTIONAL)
-            final String parameters) {
-        return this.runFixtureScript(fixtureScript, parameters);
-    }
-
-    public boolean hideRunFixtureScriptWithAutoComplete() {
-        return hideIfPolicyNot(FixtureScriptsSpecification.DropDownPolicy.AUTO_COMPLETE);
-    }
-
-    public String disableRunFixtureScriptWithAutoComplete() {
-        return disableRunFixtureScript();
-    }
-
-    public FixtureScript default0RunFixtureScriptWithAutoComplete() {
-        return default0RunFixtureScript();
-    }
-
-    public List<FixtureScript> autoComplete0RunFixtureScriptWithAutoComplete(final @MinLength(1) String arg) {
-        return autoComplete0RunFixtureScript(arg);
-    }
-
-    public String validateRunFixtureScriptWithAutoComplete(final FixtureScript fixtureScript, final String parameters) {
-        return super.validateRunFixtureScript(fixtureScript, parameters);
-    }
-
-
-    // -- recreateObjectsAndReturnFirst
-
-    @Action(
-            restrictTo = RestrictTo.PROTOTYPING
-            )
-    @ActionLayout(
-            cssClassFa="fa fa-refresh"
-            )
-    @MemberOrder(sequence="20")
-    public Object recreateObjectsAndReturnFirst() {
-        val recreateScriptClass =  getSpecification().getRecreateScriptClass();
-        val recreateScript = findFixtureScriptFor(recreateScriptClass);
-        if(recreateScript == null) {
-            return null;
-        }
-        final List<FixtureResult> results = runScript(recreateScript, null);
-        if(results.isEmpty()) {
-            return null;
-        }
-        return results.get(0).getObject();
-    }
-
-    public boolean hideRecreateObjectsAndReturnFirst() {
-        return getSpecification().getRecreateScriptClass() == null;
-    }
-
-    // -- HELPER
-
-    private boolean hideIfPolicyNot(final FixtureScriptsSpecification.DropDownPolicy requiredPolicy) {
-        return fixtureScriptsSpecificationProvider.isEmpty() || getSpecification().getRunScriptDropDownPolicy() != requiredPolicy;
-    }
-
-    private Can<FixtureScriptsSpecificationProvider> fixtureScriptsSpecificationProvider;
-
-    // -- DEPS
-
-    @Inject ServiceRegistry serviceRegistry;
-    @Inject EventBusService eventBusService;
-
-
-}
\ No newline at end of file
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecification.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecification.java
index 1a75ef8..30c25cb 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecification.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecification.java
@@ -23,7 +23,6 @@ import org.apache.isis.extensions.fixtures.api.FixtureScriptWithExecutionStrateg
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureResultList;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScript;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
-import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault;
 
 /**
  * Pulls together the various state that influences the behaviour of {@link FixtureScripts} service.
@@ -54,7 +53,7 @@ public class FixtureScriptsSpecification {
      * @param multipleExecutionStrategy - whether more than one instance of the same fixture script class can be run multiple times
      * @param runScriptDefaultScriptClass - the fixture script to provide as a default in {@link FixtureScripts#runFixtureScript(FixtureScript, String)} action.
      * @param runScriptDropDownPolicy - whether the {@link FixtureScripts#runFixtureScript(FixtureScript, String)} should use a choices or an autoComplete.
-     * @param recreateScriptClass - if specified, then make the {@link FixtureScriptsDefault#recreateObjectsAndReturnFirst()} action visible.
+     * @param recreateScriptClass - if specified, then make the {@link FixtureScripts#recreateObjectsAndReturnFirst()} action visible.
      */
     public FixtureScriptsSpecification(
             final String packagePrefix,
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecificationProvider.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecificationProvider.java
index a55c287..bb8fd18 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecificationProvider.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/FixtureScriptsSpecificationProvider.java
@@ -20,16 +20,7 @@ package org.apache.isis.extensions.fixtures.fixturespec;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts;
-import org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault;
 
-/**
- * Rather than subclassing {@link FixtureScripts} class, you can instead implement this interface as a service.
- *
- * <p>
- *     The framework will automatically instantiate {@link FixtureScriptsDefault} as a fallback, and use the
- *     {@link FixtureScriptsSpecification} obtained from <i>this</i> service to configure itself.
- * </p>
- */
 public interface FixtureScriptsSpecificationProvider {
 
     @Programmatic
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/package-info.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/package-info.java
index 727a143..5334d2b 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/package-info.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturespec/package-info.java
@@ -18,10 +18,7 @@
  */
 
 /**
- * The {@link org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecificationProvider} SPI service is an
- * alternative to subclassing the {@link org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts} domain service.
- * The logic that would normally be in the subclass moves to the provider service instead, and the framework
- * instantiates a fallback default instance, {@link org.apache.isis.extensions.fixtures.fixturescripts.FixtureScriptsDefault}.
+ * The {@link org.apache.isis.extensions.fixtures.fixturespec.FixtureScriptsSpecificationProvider} SPI service configures the {@link org.apache.isis.extensions.fixtures.fixturescripts.FixtureScripts} domain service.
  *
  * @see <a href="http://isis.apache.org/migration-notes/migration-notes.html#_migration-notes_1.8.0-to-1.9.0_fixture-scripts-specification-provider">Reference guide</a>
  */