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;
/**