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 2014/05/14 09:02:07 UTC

git commit: ISIS-776: further improvements to fixture script API

Repository: isis
Updated Branches:
  refs/heads/master 75b1893be -> 992c01732


ISIS-776: further improvements to fixture script API

Only view models or already persisted objects can be added to a FixtureResultList.  FixtureScripts can now be configured with a NonPersistedObjectsStrategy whereby it will either ignore or auto-persist any objects added to a fixture result that are not yet persisted.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/992c0173
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/992c0173
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/992c0173

Branch: refs/heads/master
Commit: 992c01732f3f3402f481f512f049e196053e8056
Parents: 75b1893
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed May 14 08:01:36 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed May 14 08:01:36 2014 +0100

----------------------------------------------------------------------
 .../fixturescripts/CompositeFixtureScript.java  |  8 ++-
 .../fixturescripts/FixtureResultList.java       | 13 ++++-
 .../applib/fixturescripts/FixtureScripts.java   | 61 +++++++++++++++++---
 .../specimpl/ObjectSpecificationAbstract.java   | 48 ++++++---------
 .../fixtures/FixturesInstallerDelegate.java     |  7 +--
 5 files changed, 92 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/992c0173/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
index c60ac3f..9750b4b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/CompositeFixtureScript.java
@@ -19,11 +19,8 @@
 package org.apache.isis.applib.fixturescripts;
 
 import java.util.List;
-
 import com.google.common.collect.Lists;
-
 import org.apache.isis.applib.annotation.Named;
-import org.apache.isis.applib.fixturescripts.FixtureScript.Discoverability;
 
 @Named("Composite Script")
 public abstract class CompositeFixtureScript extends FixtureScript {
@@ -83,6 +80,11 @@ public abstract class CompositeFixtureScript extends FixtureScript {
 
     /**
      * Mandatory hook method.
+     *
+     * <p>
+     *     Subclasses should instantiate each child and then call {@link #add(FixtureScript)} (or the overloaded
+     *      {@link #add(String, FixtureScript)})
+     * </p>.
      */
     protected abstract void addChildren();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/992c0173/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
index 46ba53e..2a52ad3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureResultList.java
@@ -69,9 +69,20 @@ public class FixtureResultList {
         return add(script, nextItemFor(script), object);
     }
 
+    /**
+     * Wraps the object within a {@link org.apache.isis.applib.fixturescripts.FixtureResult} and add to this list.
+     *
+     * <P>
+     *     If the object is not yet persisted, then the {@link FixtureScripts#getNonPersistedObjectsStrategy() FixtureScripts}'
+     *     configuration will determine whether it is {@link org.apache.isis.applib.fixturescripts.FixtureScripts.NonPersistedObjectsStrategy#PERSIST eagerly persisted}
+     *     or simply {@link org.apache.isis.applib.fixturescripts.FixtureScripts.NonPersistedObjectsStrategy#IGNORE ignored}.
+     * </P>
+     */
     public <T> T add(final FixtureScript script, final String key, final T object) {
         final FixtureResult fr = fixtureScripts.newFixtureResult(script, key, object);
-        list.add(fr);
+        if(fr != null) {
+            list.add(fr);
+        }
         return object;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/992c0173/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index f535a7a..3bfa8ad 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -26,7 +26,7 @@ import java.util.Set;
 import javax.annotation.PostConstruct;
 import com.google.common.collect.Lists;
 import org.apache.isis.applib.AbstractService;
-import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.*;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -37,15 +37,43 @@ import org.apache.isis.applib.util.ObjectContracts;
 
 public abstract class FixtureScripts extends AbstractService {
 
+    /**
+     * How to handle objects that are to be
+     * {@link org.apache.isis.applib.fixturescripts.FixtureScripts#newFixtureResult(FixtureScript, String, Object) added}
+     * into a {@link org.apache.isis.applib.fixturescripts.FixtureResult} but which are not yet persisted.
+     */
+    public enum NonPersistedObjectsStrategy {
+        PERSIST,
+        IGNORE
+    }
+
     private final String packagePrefix;
-    
+    private final NonPersistedObjectsStrategy nonPersistedObjectsStrategy;
+
     /**
+     * Defaults to {@link org.apache.isis.applib.fixturescripts.FixtureScripts.NonPersistedObjectsStrategy#PERSIST persist}
+     * strategy if non-persisted objects are {@link #newFixtureResult(FixtureScript, String, Object) added} to a {@link org.apache.isis.applib.fixturescripts.FixtureResultList}.
+     *
      * @param packagePrefix - to search for fixture script implementations, eg "com.mycompany"
      */
     public FixtureScripts(String packagePrefix) {
+        this(packagePrefix, NonPersistedObjectsStrategy.PERSIST);
+    }
+
+    /**
+     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany"
+     * @param nonPersistedObjectsStrategy - how to handle any non-persisted objects that are {@link #newFixtureResult(FixtureScript, String, Object) added} to a {@link org.apache.isis.applib.fixturescripts.FixtureResultList}.
+     */
+    public FixtureScripts(String packagePrefix, NonPersistedObjectsStrategy nonPersistedObjectsStrategy) {
         this.packagePrefix = packagePrefix;
+        this.nonPersistedObjectsStrategy = nonPersistedObjectsStrategy;
     }
-    
+
+    @Programmatic
+    public NonPersistedObjectsStrategy getNonPersistedObjectsStrategy() {
+        return nonPersistedObjectsStrategy;
+    }
+
     // //////////////////////////////////////
 
     private final List<FixtureScript> fixtureScriptList = Lists.newArrayList();
@@ -82,7 +110,7 @@ public abstract class FixtureScripts extends AbstractService {
             if(!template.isDiscoverable()) {
                 return null;
             }
-            return container.newViewModelInstance(fixtureScriptCls, mementoFor(template));
+            return getContainer().newViewModelInstance(fixtureScriptCls, mementoFor(template));
         } catch(Exception ex) {
             // ignore if does not have a no-arg constructor or cannot be instantiated
             return null;
@@ -107,6 +135,12 @@ public abstract class FixtureScripts extends AbstractService {
             @MultiLine(numberOfLines=10)
             @Optional
             final String parameters) {
+
+        // 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.
+        getContainer().injectServicesInto(fixtureScript);
+
         return fixtureScript.run(parameters);
     }
     public List<FixtureScript> choices0RunFixtureScript() {
@@ -146,8 +180,22 @@ public abstract class FixtureScripts extends AbstractService {
     }
 
     FixtureResult newFixtureResult(FixtureScript script, String subkey, Object object) {
+        if(object == null) {
+            return null;
+        }
+        if (object instanceof ViewModel || getContainer().isPersistent(object)) {
+            // continue
+        } else {
+            switch(nonPersistedObjectsStrategy) {
+                case PERSIST:
+                    getContainer().flush();
+                    break;
+                case IGNORE:
+                    return null;
+            }
+        }
         String mementoFor = mementoFor(script, subkey, object);
-        return container.newViewModelInstance(FixtureResult.class, mementoFor);
+        return getContainer().newViewModelInstance(FixtureResult.class, mementoFor);
     }
 
     private String mementoFor(FixtureScript script, String subkey, Object object) {
@@ -166,9 +214,6 @@ public abstract class FixtureScripts extends AbstractService {
     private BookmarkService bookmarkService;
 
     @javax.inject.Inject
-    private DomainObjectContainer container;
-
-    @javax.inject.Inject
     private ClassDiscoveryService classDiscoveryService;
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/992c0173/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index ae5bc97..f05813d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -19,17 +19,17 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
-
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.NotPersistable;
 import org.apache.isis.applib.annotation.When;
@@ -52,7 +52,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.actions.homepage.HomePageFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.help.HelpFacet;
@@ -79,24 +78,8 @@ import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.layout.DeweyOrderSet;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.Instance;
-import org.apache.isis.core.metamodel.spec.ObjectInstantiator;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.ObjectSpecificationException;
-import org.apache.isis.core.metamodel.spec.Persistability;
-import org.apache.isis.core.metamodel.spec.SpecificationContext;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.spec.*;
+import org.apache.isis.core.metamodel.spec.feature.*;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.core.metamodel.specloader.specimpl.objectlist.ObjectSpecificationForFreeStandingList;
 import org.apache.isis.core.progmodel.facets.actions.notcontributed.NotContributedFacet;
@@ -776,13 +759,20 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         
         final List<ObjectAction> actions = Lists.newArrayList();
         for (final ActionType type : types) {
-            @SuppressWarnings("unchecked")
-            final List<ObjectAction> filterActions = 
-                    Lists.newArrayList(Iterables.filter(
-                            objectActions, 
-                            Filters.asPredicate(Filters.and(
-                                    ObjectAction.Filters.ofType(type), filter))));
-            actions.addAll(filterActions);
+            final Predicate<ObjectAction> predicate =
+                    Filters.asPredicate(Filters.and(
+                        ObjectAction.Filters.ofType(type),
+                        filter));
+            for (ObjectAction objectAction : objectActions) {
+                if(predicate.apply(objectAction)) {
+                    actions.add(objectAction);
+                }
+            }
+            // an NPE here somehow???
+//            @SuppressWarnings("unchecked")
+//            final Collection<ObjectAction> filterActions =
+//                    Collections2.filter(objectActions, predicate);
+//            actions.addAll(filterActions);
         }
         return Lists.newArrayList(Iterables.filter(
                 actions, ContributeeMember.Predicates.regularElse(contributed)));

http://git-wip-us.apache.org/repos/asf/isis/blob/992c0173/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
index 3eabffd..d208e26 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
@@ -45,7 +45,10 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
  * 
  * <p>
  * Does the mechanics of actually installing the fixtures.
+ *
+ * @deprecated - instead, use the replacement FixtureScript API ({@link org.apache.isis.applib.fixturescripts.FixtureScript} and {@link org.apache.isis.applib.fixturescripts.FixtureScripts})
  */
+@Deprecated
 public class FixturesInstallerDelegate {
 
     private static final Logger LOG = LoggerFactory.getLogger(FixturesInstallerDelegate.class);
@@ -54,10 +57,6 @@ public class FixturesInstallerDelegate {
     private final SwitchUserServiceImpl switchUserService = new SwitchUserServiceImpl();
     private final UserProfileService perspectivePersistenceService = new ProfileServiceImpl();
 
-    /**
-     * Optionally injected in {@link #FixtureBuilderImpl(PersistenceSession)
-     * constructor}.
-     */
     private final PersistenceSession persistenceSession;
 
     /**