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 2017/11/29 22:36:11 UTC

[isis] branch master updated: ISIS-1784: adds support for builder fixture scripts with prereqs ...

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


The following commit(s) were added to refs/heads/master by this push:
     new 7dfa505  ISIS-1784: adds support for builder fixture scripts with prereqs ...
7dfa505 is described below

commit 7dfa505f7bf07cf5041535343e5e86f48be593cf
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Nov 29 22:35:57 2017 +0000

    ISIS-1784: adds support for builder fixture scripts with prereqs ...
    
    ... where the running of those prereqs may be required to determine if the
    fixture script has previously been run and so should be skipped
---
 .../fixturescripts/BuilderScriptAbstract.java      | 24 ++++++++--------
 .../isis/applib/fixturescripts/FixtureScript.java  | 19 +++++++++++--
 .../isis/applib/fixturescripts/WithPrereqs.java    | 32 ++++++++++++++++++++++
 3 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java
index 3b7078e..715a636 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/BuilderScriptAbstract.java
@@ -25,7 +25,7 @@ import com.google.common.collect.Lists;
 import org.apache.isis.applib.annotation.Programmatic;
 
 public abstract class BuilderScriptAbstract<T,F extends BuilderScriptAbstract<T,F>>
-        extends FixtureScript implements FixtureScriptWithExecutionStrategy {
+        extends FixtureScript implements WithPrereqs<T,F>, FixtureScriptWithExecutionStrategy {
 
     private final FixtureScripts.MultipleExecutionStrategy executionStrategy;
 
@@ -50,23 +50,23 @@ public abstract class BuilderScriptAbstract<T,F extends BuilderScriptAbstract<T,
             final FixtureScript parentFixtureScript,
             ExecutionContext executionContext) {
 
+        execPrereqs(executionContext);
+
         // returns the fixture script that is run
         // (either this one, or possibly one previously executed).
         return (F)executionContext.executeChildT(parentFixtureScript, this);
     }
 
     @Override
-    protected final void execute(final ExecutionContext executionContext) {
-
+    public void execPrereqs(final ExecutionContext executionContext) {
         final F onFixture = (F) BuilderScriptAbstract.this;
-        for (final Block<T,F> prereq : prereqs) {
+        for (final WithPrereqs.Block<T,F> prereq : prereqs) {
             prereq.execute(onFixture, executionContext);
         }
-
-        doExecute(executionContext);
     }
 
-    protected abstract void doExecute(final ExecutionContext executionContext);
+    @Override
+    protected abstract void execute(final ExecutionContext executionContext);
 
     public abstract T getObject();
 
@@ -80,15 +80,13 @@ public abstract class BuilderScriptAbstract<T,F extends BuilderScriptAbstract<T,
         return ec.executeChildT(this, fixtureScript).getObject();
     }
 
-    private final List<Block> prereqs = Lists.newArrayList();
-    public  F set(Block<T,F> prereq) {
+    private final List<WithPrereqs.Block<T,F>> prereqs = Lists.newArrayList();
+
+    @Override
+    public F setPrereq(WithPrereqs.Block<T,F> prereq) {
         prereqs.add(prereq);
         return (F)this;
     }
 
-    public interface Block<T,F extends BuilderScriptAbstract<T,F>> {
-        void execute(final F onFixture, final ExecutionContext executionContext);
-    }
-
 }
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
index 86813f0..6cb5395 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -621,13 +621,21 @@ public abstract class FixtureScript
             final FixtureScripts.MultipleExecutionStrategy executionStrategy =
                     determineExecutionStrategy(childFixtureScript);
 
-            final FixtureScript previouslyExecutedScript;
+            FixtureScript previouslyExecutedScript;
             switch (executionStrategy) {
 
             case IGNORE:
             case EXECUTE_ONCE_BY_CLASS:
                 previouslyExecutedScript = fixtureScriptByClass.get(childFixtureScript.getClass());
                 if (previouslyExecutedScript == null) {
+                    if (childFixtureScript instanceof WithPrereqs) {
+                        final WithPrereqs withPrereqs = (WithPrereqs) childFixtureScript;
+                        withPrereqs.execPrereqs(this);
+                    }
+                }
+                // the prereqs might now result in a match, so we check again.
+                previouslyExecutedScript = fixtureScriptByClass.get(childFixtureScript.getClass());
+                if (previouslyExecutedScript == null) {
                     trace(childFixtureScript, As.EXEC);
                     childFixtureScript.execute(this);
                     this.previouslyExecuted.add(childFixtureScript);
@@ -666,7 +674,14 @@ public abstract class FixtureScript
         }
 
         private <T extends FixtureScript> T executeChildIfNotAlreadyWithValueSemantics(final T childFixtureScript) {
-            final FixtureScript previouslyExecutedScript;
+            FixtureScript previouslyExecutedScript = fixtureScriptByValue.get(childFixtureScript);
+            if (previouslyExecutedScript == null) {
+                if (childFixtureScript instanceof WithPrereqs) {
+                    final WithPrereqs withPrereqs = (WithPrereqs) childFixtureScript;
+                    withPrereqs.execPrereqs(this);
+                }
+            }
+            // the prereqs might now result in a match, so we check again.
             previouslyExecutedScript = fixtureScriptByValue.get(childFixtureScript);
             if (previouslyExecutedScript == null) {
                 trace(childFixtureScript, As.EXEC);
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/WithPrereqs.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/WithPrereqs.java
new file mode 100644
index 0000000..949a709
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/WithPrereqs.java
@@ -0,0 +1,32 @@
+/*
+ *
+ *  Copyright 2012-2014 Eurocommercial Properties NV
+ *
+ *
+ *  Licensed 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.applib.fixturescripts;
+
+public interface WithPrereqs<T,F extends BuilderScriptAbstract<T,F>> {
+
+    F setPrereq(Block<T,F> prereq);
+
+    void execPrereqs(final FixtureScript.ExecutionContext executionContext);
+
+    interface Block<T,F extends BuilderScriptAbstract<T,F>> {
+        void execute(final F onFixture, final FixtureScript.ExecutionContext executionContext);
+    }
+
+}
+

-- 
To stop receiving notification emails like this one, please contact
['"commits@isis.apache.org" <co...@isis.apache.org>'].