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/18 18:51:51 UTC
[2/2] git commit: ISIS-783: further minor improvements to integtest
framework
ISIS-783: further minor improvements to integtest framework
* IntegrationTestAbstract#nextSession(), to supplement nextTransaction(); causes a new Isis/DataNucleus session (ie clear caches)
* IsisSystemForTest new openSession and closeSession
* ScenarioExecution new openSession and closeSesssion
* ScenarioExecution#injectServicesInto support @javax.inject.Inject for fields.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/27144fc3
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/27144fc3
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/27144fc3
Branch: refs/heads/master
Commit: 27144fc302e43f0cf06718eb796f980c06c975bb
Parents: d27a47d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun May 18 17:51:33 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 18 17:51:33 2014 +0100
----------------------------------------------------------------------
.../IntegrationTestAbstract.java | 9 ++-
.../integtestsupport/IsisSystemForTest.java | 15 +++-
.../ScenarioExecutionForIntegration.java | 28 +++++++
.../scenarios/ScenarioExecution.java | 82 +++++++++++++++++++-
4 files changed, 127 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
index df15345..54a3130 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
@@ -70,7 +70,14 @@ public abstract class IntegrationTestAbstract {
scenarioExecution().endTran(true);
scenarioExecution().beginTran();
}
-
+
+ protected void nextSession() {
+ scenarioExecution().endTran(true);
+ scenarioExecution().closeSession();
+ scenarioExecution().openSession();
+ scenarioExecution().beginTran();
+ }
+
// //////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index fb52ea6..5683b21 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -373,11 +373,22 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
public void bounceSystem() throws Exception {
firePreBounceSystem();
- tearDownSystem(FireListeners.DONT_FIRE);
- setUpSystem(FireListeners.DONT_FIRE);
+ closeSession();
+ openSession();
firePostBounceSystem();
}
+ public void openSession() throws Exception {
+ openSession(authenticationSession);
+ }
+
+ public void openSession(AuthenticationSession authenticationSession) throws Exception {
+ IsisContext.openSession(authenticationSession);
+ }
+
+ public void closeSession() throws Exception {
+ IsisContext.closeSession();
+ }
private IsisSystemDefault createIsisSystem(List<Object> services) {
final IsisSystemDefault system = new IsisSystemDefault(DeploymentType.UNIT_TESTING, services) {
http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
index 68476b5..1c36461 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.integtestsupport.scenarios;
import org.apache.isis.applib.fixtures.InstallableFixture;
import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.integtestsupport.IsisSystemForTest;
import org.apache.isis.core.specsupport.scenarios.ScenarioExecution;
import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope;
@@ -78,4 +79,31 @@ public class ScenarioExecutionForIntegration extends ScenarioExecution {
}
}
+ @Override
+ public void openSession() {
+ try {
+ isft.openSession();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void openSession(AuthenticationSession authenticationSession) {
+ try {
+ isft.openSession(authenticationSession);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void closeSession() {
+ try {
+ isft.closeSession();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
----------------------------------------------------------------------
diff --git a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
index 7a6179c..962c750 100644
--- a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
+++ b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
@@ -16,19 +16,24 @@
*/
package org.apache.isis.core.specsupport.scenarios;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
import java.util.Map;
-
+import javax.inject.Inject;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
-
import org.jmock.Mockery;
import org.jmock.Sequence;
import org.jmock.States;
import org.jmock.internal.ExpectationBuilder;
-
import org.apache.isis.applib.DomainObjectContainer;
import org.apache.isis.applib.fixtures.InstallableFixture;
import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
/**
@@ -133,6 +138,7 @@ public abstract class ScenarioExecution {
}
+
// //////////////////////////////////////
/**
@@ -372,6 +378,41 @@ public abstract class ScenarioExecution {
// //////////////////////////////////////
/**
+ * For Cucumber hooks to call.
+ *
+ * <p>
+ * This implementation is a no-op, but subclasses of this class tailored to
+ * supporting integration specs are expected to override.
+ */
+ public void openSession() {
+ // do nothing
+ }
+
+ /**
+ * For Cucumber hooks to call.
+ *
+ * <p>
+ * This implementation is a no-op, but subclasses of this class tailored to
+ * supporting integration specs are expected to override.
+ */
+ public void openSession(AuthenticationSession authenticationSession) {
+ // do nothing
+ }
+
+ /**
+ * For Cucumber hooks to call.
+ *
+ * <p>
+ * This implementation is a no-op, but subclasses of this class tailored to
+ * supporting integration specs are expected to override.
+ */
+ public void closeSession() {
+ // do nothing
+ }
+
+ // //////////////////////////////////////
+
+ /**
* For Cucumber hooks to call, performing transaction management around each step.
*
* <p>
@@ -408,20 +449,53 @@ public abstract class ScenarioExecution {
final Class<?> serviceClass = parameterTypes[0];
if(method.getName().startsWith("inject")) {
final Object service = service(serviceClass);
- method.invoke(obj, service);
+ method.invoke(obj, service);
}
if(method.getName().startsWith("set") && serviceClass == DomainObjectContainer.class) {
final Object container = container();
method.invoke(obj, container);
}
}
+ autowireViaFields(obj, obj.getClass());
+
return obj;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
+ private void autowireViaFields(final Object object, final Class<?> cls) {
+ final List<Field> fields = Arrays.asList(cls.getDeclaredFields());
+ final Iterable<Field> injectFields = Iterables.filter(fields, new Predicate<Field>() {
+ @Override
+ public boolean apply(Field input) {
+ final Inject annotation = input.getAnnotation(javax.inject.Inject.class);
+ return annotation != null;
+ }
+ });
+ for (final Field field : injectFields) {
+ final Object service = service(field.getType());
+ final Class<?> serviceClass = service.getClass();
+ field.setAccessible(true);
+ invokeInjectorField(field, object, service);
+ }
+ // recurse up the hierarchy
+ final Class<?> superclass = cls.getSuperclass();
+ if(superclass != null) {
+ autowireViaFields(object, superclass);
+ }
+ }
+
+ private static void invokeInjectorField(final Field field, final Object target, final Object parameter) {
+ try {
+ field.set(target, parameter);
+ } catch (IllegalArgumentException e) {
+ throw new MetaModelException(e);
+ } catch (IllegalAccessException e) {
+ throw new MetaModelException(String.format("Cannot access the %s field in %s", field.getName(), target.getClass().getName()));
+ }
+ }
}