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 2013/11/23 23:36:31 UTC
git commit: ISIS-597: session now open during service initialization.
Updated Branches:
refs/heads/master acff08835 -> cd586fef6
ISIS-597: session now open during service initialization.
Also changes to example app isis.properties to ensure that RegisterEntities
is called first as a service (make sure that JDO metamodel is initialized)
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/cd586fef
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/cd586fef
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/cd586fef
Branch: refs/heads/master
Commit: cd586fef69722ac9143302a91683f84a1d7b8069
Parents: acff088
Author: Dan Haywood <da...@apache.org>
Authored: Sat Nov 23 22:36:15 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Sat Nov 23 22:36:15 2013 +0000
----------------------------------------------------------------------
.../specloader/ObjectReflectorDefault.java | 25 -------
.../specloader/ServiceInitializer.java | 21 +-----
.../specloader/ServiceInitializerTest.java | 14 ++--
.../system/IsisSystemFixturesHookAbstract.java | 73 ++++++++++++++++++++
.../system/session/IsisSessionFactory.java | 2 +
.../session/IsisSessionFactoryDefault.java | 3 +
.../src/main/webapp/WEB-INF/isis.properties | 3 +-
.../src/main/java/dom/simple/SimpleObjects.java | 9 +++
.../src/main/webapp/WEB-INF/isis.properties | 3 +-
9 files changed, 101 insertions(+), 52 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index 03d15db..8993f67 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -23,7 +23,6 @@ import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -31,9 +30,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -50,10 +46,8 @@ import org.apache.isis.core.commons.debug.DebuggableWithTitle;
import org.apache.isis.core.commons.ensure.Assert;
import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.commons.lang.ClassUtil;
-import org.apache.isis.core.commons.lang.MethodExtensions;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ServicesProvider;
-import org.apache.isis.core.metamodel.adapter.ServicesProviderAbstract;
import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -278,8 +272,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
facetProcessor.init();
metaModelValidator.init();
- initServices(configuration);
-
primeCache();
ValidationFailures validationFailures = new ValidationFailures();
@@ -343,8 +335,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
public void shutdown() {
LOG.info("shutting down " + this);
- shutdownServices();
-
getCache().clear();
facetDecoratorSet.shutdown();
}
@@ -369,21 +359,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
}
- // /////////////////////////////////////////////////////////////
- // init services, destroy services
- // /////////////////////////////////////////////////////////////
-
- protected void initServices(IsisConfiguration configuration) {
- final List<Object> services = getServices();
- serviceInitializer.init(configuration, container, services);
- serviceInitializer.postConstruct();
- }
-
-
- protected void shutdownServices() {
- serviceInitializer.preDestroy();
- }
-
// /////////////////////////////////////////////////////////////
// install, load, allSpecifications, lookup
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
index b65d490..281b870 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
@@ -33,9 +33,9 @@ import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.commons.lang.MethodExtensions;
import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
-class ServiceInitializer {
+public class ServiceInitializer {
- private final static Logger LOG = LoggerFactory.getLogger(ObjectReflectorDefault.class);
+ private final static Logger LOG = LoggerFactory.getLogger(ServiceInitializer.class);
private Map<String, String> props;
@@ -50,22 +50,7 @@ class ServiceInitializer {
// //////////////////////////////////////
- ServiceInitializer() {
- }
-
- public void init(final IsisConfiguration configuration, DomainObjectContainer container, final List<Object> services) {
-
- // all a bit hacky... :-(
- // (a) newing up a new ServicesInjector
- // (b) the guard, because of insufficient mock expectations in unit tests :-(
- if (container == null || services == null) {
- return;
- }
- final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault();
- servicesInjector.setContainer(container);
- servicesInjector.setServices(services);
- servicesInjector.init();
-
+ public void validate(final IsisConfiguration configuration, DomainObjectContainer container, final List<Object> services) {
this.props = configuration.asMap();
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
index df2b1a3..a1940a4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
@@ -102,7 +102,7 @@ public class ServiceInitializerTest {
public void postConstruct() {
final DomainServiceWithPostConstruct d1 = new DomainServiceWithPostConstruct();
final DomainServiceWithPostConstructWithProperties d2 = new DomainServiceWithPostConstructWithProperties();
- serviceInitializer.init(configuration, container, listOf(d1, d2));
+ serviceInitializer.validate(configuration, container, listOf(d1, d2));
serviceInitializer.postConstruct();
assertThat(d1.called, is(true));
assertThat(d2.called, is(true));
@@ -122,7 +122,7 @@ public class ServiceInitializerTest {
public void preDestroy() {
final DomainServiceWithPreDestroy d1 = new DomainServiceWithPreDestroy();
final DomainServiceWithPreDestroy d2 = new DomainServiceWithPreDestroy();
- serviceInitializer.init(configuration, container, listOf(d1, d2));
+ serviceInitializer.validate(configuration, container, listOf(d1, d2));
serviceInitializer.preDestroy();
assertThat(d1.called, is(true));
assertThat(d2.called, is(true));
@@ -146,7 +146,7 @@ public class ServiceInitializerTest {
expectedException.expectMessage(
containsString(
"Found more than one @PostConstruct method; service is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithMultiplePostConstruct, found"));
- serviceInitializer.init(configuration, container, listOf(d1));
+ serviceInitializer.validate(configuration, container, listOf(d1));
}
public static class DomainServiceWithMultiplePreDestroy {
@@ -167,7 +167,7 @@ public class ServiceInitializerTest {
expectedException.expectMessage(
containsString(
"Found more than one @PreDestroy method; service is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithMultiplePreDestroy, found"));
- serviceInitializer.init(configuration, container, listOf(d1));
+ serviceInitializer.validate(configuration, container, listOf(d1));
}
public static class DomainServiceWithPostConstructOneArgWrongType {
@@ -183,7 +183,7 @@ public class ServiceInitializerTest {
final DomainServiceWithPostConstructOneArgWrongType d1 = new DomainServiceWithPostConstructOneArgWrongType();
expectedException.expectMessage(
"@PostConstruct method must be no-arg or 1-arg accepting java.util.Map; method is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithPostConstructOneArgWrongType#y");
- serviceInitializer.init(configuration, container, listOf(d1));
+ serviceInitializer.validate(configuration, container, listOf(d1));
}
public static class DomainServiceWithPostConstructTwoArgs {
@@ -199,7 +199,7 @@ public class ServiceInitializerTest {
final DomainServiceWithPostConstructTwoArgs d1 = new DomainServiceWithPostConstructTwoArgs();
expectedException.expectMessage(
"@PostConstruct method must be no-arg or 1-arg accepting java.util.Map; method is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithPostConstructTwoArgs#y");
- serviceInitializer.init(configuration, container, listOf(d1));
+ serviceInitializer.validate(configuration, container, listOf(d1));
}
public static class DomainServiceWithPreDestroyOneArgs {
@@ -216,7 +216,7 @@ public class ServiceInitializerTest {
final DomainServiceWithPreDestroyOneArgs d1 = new DomainServiceWithPreDestroyOneArgs();
expectedException.expectMessage(
"@PreDestroy method must be no-arg; method is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithPreDestroyOneArgs#y");
- serviceInitializer.init(configuration, container, listOf(d1));
+ serviceInitializer.validate(configuration, container, listOf(d1));
}
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
index 4f0d687..a3aebc9 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
@@ -35,7 +35,9 @@ import org.apache.isis.core.commons.factory.InstanceUtil;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
+import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
+import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
import org.apache.isis.core.runtime.about.AboutIsis;
import org.apache.isis.core.runtime.authentication.AuthenticationManager;
import org.apache.isis.core.runtime.authentication.exploration.ExplorationSession;
@@ -45,12 +47,14 @@ import org.apache.isis.core.runtime.imageloader.awt.TemplateImageLoaderAwt;
import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
import org.apache.isis.core.runtime.persistence.PersistenceConstants;
import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.internal.InitialisationSession;
import org.apache.isis.core.runtime.system.internal.IsisLocaleInitializer;
import org.apache.isis.core.runtime.system.internal.IsisTimeZoneInitializer;
import org.apache.isis.core.runtime.system.internal.SplashWindow;
import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
import org.apache.isis.core.runtime.system.session.IsisSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManagerException;
import org.apache.isis.core.runtime.userprofile.UserProfileStore;
/**
@@ -73,6 +77,8 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
private IsisSessionFactory sessionFactory;
+ private ServiceInitializer serviceInitializer;
+
// ///////////////////////////////////////////
// Constructors
// ///////////////////////////////////////////
@@ -132,6 +138,8 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
initContext(sessionFactory);
sessionFactory.init();
+ serviceInitializer = initializeServices();
+
installFixturesIfRequired();
} catch (final IsisSystemException ex) {
@@ -147,12 +155,77 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
getDeploymentType().initContext(sessionFactory);
}
+ /**
+ * @see #shutdownServices(ServiceInitializer)
+ */
+ private ServiceInitializer initializeServices() {
+
+ final DomainObjectContainer container = sessionFactory.getContainer();
+ final List<Object> services = sessionFactory.getServices();
+
+ // autowire
+ final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault();
+ servicesInjector.setContainer(container);
+ servicesInjector.setServices(services);
+ servicesInjector.init();
+
+ // validate
+ final ServiceInitializer serviceInitializer = new ServiceInitializer();
+ serviceInitializer.validate(getConfiguration(), container, services);
+
+ // call @PostConstruct (in a session)
+ IsisContext.openSession(new InitialisationSession());
+ try {
+ IsisContext.getTransactionManager().startTransaction();
+ try {
+ serviceInitializer.postConstruct();
+
+ return serviceInitializer;
+ } catch(RuntimeException ex) {
+ IsisContext.getTransactionManager().getTransaction().setAbortCause(new IsisTransactionManagerException(ex));
+ return serviceInitializer;
+ } finally {
+ // will commit or abort
+ IsisContext.getTransactionManager().endTransaction();
+ }
+ } finally {
+ IsisContext.closeSession();
+ }
+ }
+
+
@Override
public void shutdown() {
LOG.info("shutting down system");
+
+ shutdownServices(this.serviceInitializer);
+
IsisContext.closeAllSessions();
}
+ /**
+ * @see #initializeServices()
+ */
+ private void shutdownServices(final ServiceInitializer serviceInitializer) {
+
+ // call @PostDestroy (in a session)
+ IsisContext.openSession(new InitialisationSession());
+ try {
+ IsisContext.getTransactionManager().startTransaction();
+ try {
+ serviceInitializer.preDestroy();
+
+ } catch(RuntimeException ex) {
+ IsisContext.getTransactionManager().getTransaction().setAbortCause(new IsisTransactionManagerException(ex));
+ } finally {
+ // will commit or abort
+ IsisContext.getTransactionManager().endTransaction();
+ }
+ } finally {
+ IsisContext.closeSession();
+ }
+ }
+
// ///////////////////////////////////////////
// Hook:
// ///////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
index 50f4ea8..3df53ac 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactory.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.runtime.system.session;
import java.util.List;
+import org.apache.isis.applib.DomainObjectContainer;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.components.ApplicationScopedComponent;
import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -94,6 +95,7 @@ public interface IsisSessionFactory extends ApplicationScopedComponent {
public UserProfileLoader getUserProfileLoader();
+ public DomainObjectContainer getContainer();
public List<Object> getServices();
/**
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
index 3eef909..8d6b321 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
@@ -299,6 +299,9 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
return userProfileLoader;
}
+ public DomainObjectContainer getContainer() {
+ return container;
+ }
@Override
public List<Object> getServices() {
return serviceList;
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
index b947bd2..98bddb4 100644
--- a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -158,6 +158,8 @@ isis.reflector.facet-decorators=org.apache.isis.core.progmodel.facetdecorators.i
#isis.services.prefix =
isis.services = \
+ 0:org.apache.isis.objectstore.jdo.service.RegisterEntities,\
+ \
10:dom.todo.ToDoItems,\
20:app.ToDoItemAnalysis,\
dom.todo.ToDoItemContributions,\
@@ -171,7 +173,6 @@ isis.services = \
org.apache.isis.core.metamodel.services.bookmarks.BookmarkServiceDefault,\
org.apache.isis.core.runtime.services.viewmodelsupport.ViewModelSupportDefault, \
org.apache.isis.core.runtime.services.xmlsnapshot.XmlSnapshotServiceDefault,\
- org.apache.isis.objectstore.jdo.service.RegisterEntities,\
org.apache.isis.objectstore.jdo.datanucleus.service.support.IsisJdoSupportImpl,\
org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
org.apache.isis.viewer.restfulobjects.rendering.eventserializer.RestfulObjectsSpecEventSerializer,\
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
index 13cd192..8270652 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -19,6 +19,9 @@
package dom.simple;
import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
import org.apache.isis.applib.DomainObjectContainer;
import org.apache.isis.applib.annotation.ActionSemantics;
@@ -29,6 +32,12 @@ import org.apache.isis.applib.annotation.Named;
public class SimpleObjects {
+ @PostConstruct
+ public void init(Map<String,String> props) {
+ List<SimpleObject> x = container.allInstances(SimpleObject.class);
+ System.out.println(x);
+ }
+
// //////////////////////////////////////
// Identification in the UI
// //////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/cd586fef/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
index cb633bf..3944f0f 100644
--- a/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/simple_wicket_restful_jdo/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -158,6 +158,8 @@ isis.reflector.facet-decorators=org.apache.isis.core.progmodel.facetdecorators.i
#isis.services.prefix =
isis.services = \
+ 0:org.apache.isis.objectstore.jdo.service.RegisterEntities,\
+ \
10:dom.simple.SimpleObjects,\
services.ClockService,\
\
@@ -167,7 +169,6 @@ isis.services = \
org.apache.isis.core.metamodel.services.bookmarks.BookmarkServiceDefault,\
org.apache.isis.core.runtime.services.viewmodelsupport.ViewModelSupportDefault, \
org.apache.isis.core.runtime.services.xmlsnapshot.XmlSnapshotServiceDefault,\
- org.apache.isis.objectstore.jdo.service.RegisterEntities,\
org.apache.isis.objectstore.jdo.datanucleus.service.support.IsisJdoSupportImpl,\
org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
org.apache.isis.viewer.restfulobjects.rendering.eventserializer.RestfulObjectsSpecEventSerializer,\