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/07 18:12:25 UTC

[isis] 02/02: ISIS-2717: allows for FixtureScriptsSpecificationProvider to be null.

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 048f251a456ce6ec7079b28fd70d209f42790c21
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jun 7 19:10:41 2021 +0100

    ISIS-2717: allows for FixtureScriptsSpecificationProvider to be null.
    
    If so, then the UI for FixtureScripts is hidden, but it can still be used programmatically
---
 .../resources/application-config-test.properties   |   1 -
 .../applib/fixturescripts/FixtureScripts.java      | 111 +++++++++++++++------
 2 files changed, 81 insertions(+), 31 deletions(-)

diff --git a/regressiontests/stable-persistence-jpa/src/test/resources/application-config-test.properties b/regressiontests/stable-persistence-jpa/src/test/resources/application-config-test.properties
index a272767..3eabbbe 100644
--- a/regressiontests/stable-persistence-jpa/src/test/resources/application-config-test.properties
+++ b/regressiontests/stable-persistence-jpa/src/test/resources/application-config-test.properties
@@ -22,4 +22,3 @@
 #
 
 isis.core.meta-model.annotation.action.explicit=true
-
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 a49a50c..40ce680 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
@@ -30,6 +30,8 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
@@ -49,6 +51,7 @@ 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.internal.base._Casts;
+import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
@@ -200,43 +203,87 @@ public class FixtureScripts {
     public static final String PACKAGE_PREFIX = FixtureScripts.class.getPackage().getName();
 
 
+    /**
+     * Used to configure the UI menu actions, namely {@link #runFixtureScript(String, String)} and
+     * {@link #recreateObjectsAndReturnFirst()}.
+     *
+     * <p>
+     *     May be <code>null</code> if no {@link FixtureScriptsSpecificationProvider} was provided either explicitly
+     *     or implicitly by way of configuring the <code>isis.testing.fixtures.fixture-scripts-specification</code>
+     *     configuration properties.
+     * </p>
+     *
+     * @see #getFixtureScriptByFriendlyName()
+     * @see #getMultipleExecutionStrategy()
+     * @see #getNonPersistedObjectsStrategy()
+     */
     @Getter
     private final FixtureScriptsSpecification specification;
 
+    /**
+     * Global setting as to how to handle returned entities from fixture scripts that
+     * are still transient (not yet persisted).
+     *
+     * <p>
+     *     Will be <code>null</code> if there is no {@link #getSpecification()}.
+     * </p>
+     *
+     * @see #getSpecification()
+     */
+    @Getter(onMethod_ = {@Programmatic})
+    private final NonPersistedObjectsStrategy nonPersistedObjectsStrategy;
+
+    /**
+     * Global setting as to how to handle fixture scripts that are executed more than once.  See
+     * {@link MultipleExecutionStrategy} for more details.
+     *
+     * <p>
+     *     Will be <code>null</code> if there is no {@link #getSpecification()}.
+     * </p>
+     *
+     * @see #getSpecification()
+     */
+    @Getter(onMethod_ = {@Programmatic})
+    private final MultipleExecutionStrategy multipleExecutionStrategy;
+
+    /**
+     * Maps all discovered {@link FixtureScript}s to a friendly name for display in the UI (that is, for the
+     * {@link #runFixtureScript(String, String)} menu action parameters).
+     *
+     * <p>
+     *     Will be <code>null</code> if there is no {@link #getSpecification()}.
+     * </p>
+     *
+     * @see #getSpecification()
+     */
     @Getter
     private final SortedMap<String,FixtureScript> fixtureScriptByFriendlyName;
 
+
     public FixtureScripts(
-            final FixtureScriptsSpecificationProvider fixtureScriptsSpecificationProvider,
+            @Nullable final FixtureScriptsSpecificationProvider fixtureScriptsSpecificationProvider,
             final ServiceRegistry serviceRegistry) {
 
-        this.specification = fixtureScriptsSpecificationProvider.getSpecification();
-
-        val packagePrefix = specification.getPackagePrefix();
-        fixtureScriptByFriendlyName =
-                serviceRegistry.select(FixtureScript.class).stream()
-                .filter(Objects::nonNull)
-                .filter(fixtureScript -> fixtureScript.getClass().getPackage().getName().startsWith(packagePrefix))
-                .collect(Collectors.toMap(FixtureScript::getFriendlyName, Function.identity(),
-                        (v1,v2) ->{ throw new RuntimeException(String.format("Two FixtureScript's have the same friendly name '%s", v1));},
-                        TreeMap::new));
-    }
-
-
+        if(fixtureScriptsSpecificationProvider != null) {
+            this.specification = fixtureScriptsSpecificationProvider.getSpecification();
+            this.nonPersistedObjectsStrategy = specification.getNonPersistedObjectsStrategy();
+            this.multipleExecutionStrategy = specification.getMultipleExecutionStrategy();
 
-    // -- packagePrefix, nonPersistedObjectsStrategy, multipleExecutionStrategy
+            val packagePrefix = specification.getPackagePrefix();
+            this.fixtureScriptByFriendlyName =
+                    serviceRegistry.select(FixtureScript.class).stream()
+                    .filter(Objects::nonNull)
+                    .filter(fixtureScript -> fixtureScript.getClass().getPackage().getName().startsWith(packagePrefix))
+                    .collect(Collectors.toMap(FixtureScript::getFriendlyName, Function.identity(),
+                            (v1,v2) ->{ throw new RuntimeException(String.format("Two FixtureScript's have the same friendly name '%s", v1));},
+                            TreeMap::new));
 
-    public NonPersistedObjectsStrategy getNonPersistedObjectsStrategy() {
-        return specification.getNonPersistedObjectsStrategy();
-    }
-
-    /**
-     * Global setting as to how to handle fixture scripts that are executed more than once.  See
-     * {@link MultipleExecutionStrategy} for more details.
-     */
-    @Programmatic
-    public MultipleExecutionStrategy getMultipleExecutionStrategy() {
-        return specification.getMultipleExecutionStrategy();
+        } else {
+            this.specification = null;
+            this.nonPersistedObjectsStrategy = null;
+            this.multipleExecutionStrategy = null;
+            fixtureScriptByFriendlyName = _Maps.newTreeMap();
+        }
     }
 
 
@@ -293,10 +340,14 @@ public class FixtureScripts {
         }
     }
 
+    public boolean hideRunFixtureScript() {
+        return specification == null;
+    }
 
     public String disableRunFixtureScript() {
-        return getFixtureScriptByFriendlyName().isEmpty()? "No fixture scripts found under package '" + specification
-                .getPackagePrefix() + "'": null;
+        return getFixtureScriptByFriendlyName().isEmpty()
+                ? String.format("No fixture scripts found under package '%s'", specification.getPackagePrefix())
+                : null;
     }
 
     public String default0RunFixtureScript() {
@@ -311,7 +362,7 @@ public class FixtureScripts {
     }
 
     private String defaultFromFixtureScriptsSpecification() {
-        Class<? extends FixtureScript> defaultScript = getSpecification().getRunScriptDefaultScriptClass();
+        Class<? extends FixtureScript> defaultScript = specification.getRunScriptDefaultScriptClass();
         return defaultScript != null
                 ? findFixtureScriptNameFor(defaultScript)
                 : null;
@@ -368,7 +419,7 @@ public class FixtureScripts {
     }
 
     public boolean hideRecreateObjectsAndReturnFirst() {
-        return getSpecification().getRecreateScriptClass() == null;
+        return specification == null || specification.getRecreateScriptClass() == null;
     }