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 2015/07/31 12:59:53 UTC
[4/9] isis git commit: ISIS-1182: refactoring ownership of list of
services [ABORTIVE: the simpleapp runs up, but todoapp seems to hang?]
ISIS-1182: refactoring ownership of list of services [ABORTIVE: the simpleapp runs up, but todoapp seems to hang?]
- make ServicesInjectorDefault hold the list of services, passed into PersistenceSessionFactory via
- IsisSystemUsingInstallers#obtainPersistenceSessionFactory
- PersistenceMechanismInstaller#createPersistenceSessionFactory
- IsisSystemAbstract#doCreateSessionFactory
- should call obtainServices and pass them to #createSessionFactory
move call to validate the services (@PostConstruct and @PreDestroy stuff):
- relocate to ServicesInjectorSpi
- moved from IsisSessionFactoryDefault (the validateServices method, can be made static quite easily), and don't call at end of its constructor
- call from IsisSystemAbstract (after adding the fallback FixtureScriptsDefault service)
- in IsisSystemAbstract, inline newIsisSessionFactory, no need to be separate
- ObjectReflectorDefault, split out initAndValidate so that validation is called not in the ObjectReflector's init, but instead by:
- IsisSystemFixturesHookAbstract, after calling sessionFactory#init()
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/97013cb3
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/97013cb3
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/97013cb3
Branch: refs/heads/master
Commit: 97013cb3e23e1173260c1aed61164ab40c807766
Parents: f6244c1
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jul 31 07:06:09 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jul 31 07:06:09 2015 +0100
----------------------------------------------------------------------
.../integtestsupport/IsisSystemDefault.java | 4 +-
.../isis/core/metamodel/app/IsisMetaModel.java | 7 +-
.../services/ServicesInjectorDefault.java | 129 ++++++++++++++++---
.../metamodel/services/ServicesInjectorSpi.java | 12 +-
.../metamodel/MetaModelServiceDefault.java | 26 +++-
.../metamodel/spec/SpecificationLoaderSpi.java | 3 +-
.../specloader/ObjectReflectorDefault.java | 28 ++--
.../metamodel/facets/ProgrammableReflector.java | 5 +
.../services/ServicesInjectorDefaultTest.java | 6 +-
...ServicesInjectorDefaultTest_usingFields.java | 3 +-
.../ObjectReflectorDefaultTestAbstract.java | 2 +-
.../PersistenceMechanismInstaller.java | 4 +-
.../system/IsisSystemFixturesHookAbstract.java | 7 +-
.../system/persistence/PersistenceSession.java | 29 ++---
.../persistence/PersistenceSessionFactory.java | 37 +++---
.../session/IsisSessionFactoryDefault.java | 78 +----------
.../IsisSystemAbstract.java | 56 +++-----
.../IsisSystemUsingInstallers.java | 4 +-
...ataNucleusPersistenceMechanismInstaller.java | 17 +--
.../jdo/service/RegisterEntities.java | 70 +++++-----
.../core/runtime/context/IsisContextTest.java | 2 +-
...reTransactionManager_EndTransactionTest.java | 2 +-
...oreTransactionManager_InstantiationTest.java | 4 +-
...TransactionManager_StartTransactionTest.java | 4 +-
.../persistence/PersistenceSessionTest.java | 7 +-
...onFactoryAbstractTest_init_and_shutdown.java | 2 +-
26 files changed, 279 insertions(+), 269 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
index 1e05f65..7a1bae9 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
@@ -195,14 +195,14 @@ public class IsisSystemDefault extends IsisSystemAbstract {
* The in-memory object store (unless overridden by {@link #obtainPersistenceMechanismInstaller(IsisConfiguration)}).
*/
@Override
- protected PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType) throws IsisSystemException {
+ protected PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType, final List<Object> services) throws IsisSystemException {
PersistenceMechanismInstaller installer = obtainPersistenceMechanismInstaller(getConfiguration());
if(installer == null) {
final DataNucleusPersistenceMechanismInstaller persistenceMechanismInstaller = new DataNucleusPersistenceMechanismInstaller();
persistenceMechanismInstaller.setConfiguration(getConfiguration());
installer = persistenceMechanismInstaller;
}
- return installer.createPersistenceSessionFactory(deploymentType);
+ return installer.createPersistenceSessionFactory(deploymentType, services);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
index 6c881e8..9a19e72 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
@@ -117,14 +117,15 @@ public class IsisMetaModel implements ApplicationScopedComponent {
reflector = new ObjectReflectorDefault(configuration, programmingModel, facetDecorators, metaModelValidator, layoutMetadataReaders);
- final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault();
- servicesInjector.setServices(services);
+ final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault(services);
reflector.setServiceInjector(servicesInjector);
runtimeContext.injectInto(reflector);
reflector.injectInto(runtimeContext);
- validationFailures = reflector.initAndValidate();
+ reflector.initialize();
+
+ validationFailures = reflector.validate();
runtimeContext.init();
for (final Object service : services) {
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
index 1fa3dcf..c7b84b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
@@ -23,14 +23,19 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
import javax.inject.Inject;
import com.google.common.base.Predicate;
+import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -46,6 +51,7 @@ import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
import org.apache.isis.core.metamodel.spec.SpecificationLoader;
import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
+import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
/**
* Must be a thread-safe.
@@ -54,6 +60,9 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
private static final Logger LOG = LoggerFactory.getLogger(ServicesInjectorDefault.class);
+ /**
+ * This is mutable internally, but only ever exposed (in {@link #getRegisteredServices()}) as immutable.
+ */
private final List<Object> services = Lists.newArrayList();
/**
@@ -64,8 +73,8 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
private final Map<Class<?>, Object> serviceByConcreteType = Maps.newHashMap();
- public ServicesInjectorDefault() {
- this(null);
+ public ServicesInjectorDefault(final List<Object> services) {
+ this(services, null);
}
/**
@@ -77,8 +86,11 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
* </p>
* @param injectorMethodEvaluator
*/
- public ServicesInjectorDefault(final InjectorMethodEvaluator injectorMethodEvaluator) {
+ public ServicesInjectorDefault(final List<Object> services, final InjectorMethodEvaluator injectorMethodEvaluator) {
+ this.services.addAll(services);
this.injectorMethodEvaluator = injectorMethodEvaluator != null ? injectorMethodEvaluator : new InjectorMethodEvaluatorDefault();
+
+ autowireServicesAndContainer();
}
//region > init, shutdown
@@ -94,19 +106,7 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
//endregion
- //region > setServices, replaceServices
-
- @Override
- public void setServices(final List<Object> services) {
- this.services.clear();
- addServices(services);
- autowireServicesAndContainer();
- }
-
- public ServicesInjectorDefault withServices(final List<Object> services) {
- setServices(services);
- return this;
- }
+ //region > replaceServices
@Override
public <T> void replaceService(final T existingService, final T replacementService) {
@@ -137,6 +137,103 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
}
@Override
+ public <T> void addFallbackIfRequired(final Class<T> serviceClass, final T serviceInstance) {
+ if(!contains(services, serviceClass)) {
+ // add to beginning;
+ // (when first introduced, this feature has been used for the
+ // FixtureScriptsDefault so that appears it top of prototyping menu; not
+ // more flexible than this currently just because of YAGNI).
+ services.add(0, serviceInstance);
+ }
+ }
+
+ /**
+ * Validate domain service Ids are unique, and that the {@link PostConstruct} method, if present, must either
+ * take no arguments or take a {@link Map} object), and that the {@link PreDestroy} method, if present, must take
+ * no arguments.
+ *
+ * <p>
+ * TODO: there seems to be some duplication/overlap with {@link ServiceInitializer}.
+ */
+ @Override
+ public void validateServices() {
+ validate(getRegisteredServices());
+ }
+
+ private static void validate(List<Object> serviceList) {
+ for (Object service : serviceList) {
+ final Method[] methods = service.getClass().getMethods();
+ for (Method method : methods) {
+ validatePostConstructMethods(service, method);
+ validatePreDestroyMethods(service, method);
+ }
+ }
+ ListMultimap<String, Object> servicesById = ArrayListMultimap.create();
+ for (Object service : serviceList) {
+ String id = ServiceUtil.id(service);
+ servicesById.put(id, service);
+ }
+ for (Map.Entry<String, Collection<Object>> servicesForId : servicesById.asMap().entrySet()) {
+ String serviceId = servicesForId.getKey();
+ Collection<Object> services = servicesForId.getValue();
+ if(services.size() > 1) {
+ throw new IllegalStateException(
+ String.format("Service ids must be unique; serviceId '%s' is declared by domain services %s",
+ serviceId, classNamesFor(services)));
+ }
+ }
+ }
+
+ private static String classNamesFor(Collection<Object> services) {
+ StringBuilder buf = new StringBuilder();
+ for (Object service : services) {
+ if(buf.length() > 0) {
+ buf.append(", ");
+ }
+ buf.append(service.getClass().getName());
+ }
+ return buf.toString();
+ }
+
+ private static void validatePostConstructMethods(Object service, Method method) {
+ final PostConstruct postConstruct = method.getAnnotation(PostConstruct.class);
+ if(postConstruct == null) {
+ return;
+ }
+ final int numParams = method.getParameterTypes().length;
+ if(numParams == 0) {
+ return;
+ }
+ if(numParams == 1 && method.getParameterTypes()[0].isAssignableFrom(Map.class)) {
+ return;
+ }
+ throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PostConstruct method " + method.getName() + "; such methods must take either no argument or 1 argument of type Map<String,String>");
+ }
+
+ private static void validatePreDestroyMethods(Object service, Method method) {
+ final PreDestroy preDestroy = method.getAnnotation(PreDestroy.class);
+ if(preDestroy == null) {
+ return;
+ }
+ final int numParams = method.getParameterTypes().length;
+ if(numParams == 0) {
+ return;
+ }
+ throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PreDestroy method " + method.getName() + "; such methods must take no arguments");
+ }
+
+
+ static boolean contains(final List<Object> services, final Class<?> serviceClass) {
+ for (Object service : services) {
+ if(serviceClass.isAssignableFrom(service.getClass())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ @Override
public List<Object> getRegisteredServices() {
return Collections.unmodifiableList(services);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
index dd351cd..a029d1f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
@@ -19,8 +19,6 @@
package org.apache.isis.core.metamodel.services;
-import java.util.List;
-
import org.apache.isis.core.commons.components.ApplicationScopedComponent;
import org.apache.isis.core.commons.components.Injectable;
import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
@@ -35,12 +33,6 @@ public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injecta
/**
- * Services to be injected.
- */
- void setServices(List<Object> services);
-
-
- /**
* Update an individual service.
*
* <p>
@@ -53,4 +45,8 @@ public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injecta
<T> void replaceService(T originalService, T replacementService);
boolean isRegisteredService(Class<?> cls);
+
+ <T> void addFallbackIfRequired(Class<T> serviceClass, T serviceInstance);
+
+ void validateServices();
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 7952d9e..c1118b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -18,6 +18,17 @@
*/
package org.apache.isis.core.metamodel.services.metamodel;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
+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.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
@@ -33,8 +44,12 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
)
public class MetaModelServiceDefault implements MetaModelService, SpecificationLoaderAware {
- private SpecificationLoader specificationLookup;
+ @SuppressWarnings("unused")
+ private final static Logger LOG = LoggerFactory.getLogger(MetaModelServiceDefault.class);
+
+
+ //region > fromObjectType, toObjectType
@Programmatic
public Class<?> fromObjectType(final String objectType) {
if(objectType == null) {
@@ -45,7 +60,8 @@ public class MetaModelServiceDefault implements MetaModelService, SpecificationL
return objectSpecification != null? objectSpecification.getCorrespondingClass(): null;
}
- @Override public String toObjectType(final Class<?> domainType) {
+ @Override
+ public String toObjectType(final Class<?> domainType) {
if(domainType == null) {
return null;
}
@@ -54,9 +70,15 @@ public class MetaModelServiceDefault implements MetaModelService, SpecificationL
final ObjectSpecId objectSpecId = objectSpecIdFacet.value();
return objectSpecId.asString();
}
+ //endregion
+
+ //region > injected dependencies
+ private SpecificationLoader specificationLookup;
@Override
public void setSpecificationLookup(final SpecificationLoader specificationLookup) {
this.specificationLookup = specificationLookup;
}
+ //endregion
+
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
index 0b53830..af0aabc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.spec;
import org.apache.isis.core.commons.components.ApplicationScopedComponent;
import org.apache.isis.core.commons.debug.DebuggableWithTitle;
import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
public interface SpecificationLoaderSpi extends ApplicationScopedComponent, DebuggableWithTitle, SpecificationLoader {
@@ -37,4 +36,6 @@ public interface SpecificationLoaderSpi extends ApplicationScopedComponent, Debu
void invalidateCache(Class<?> domainClass);
boolean isInitialized();
+
+ void validateAndAssert();
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/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 9cb6f24..22ffd82 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
@@ -202,19 +202,27 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
@Override
public void init() {
- ValidationFailures validationFailures = initAndValidate();
-
- validationFailures.assertNone();
-
+ initialize();
+
cacheBySpecId();
initialized = true;
}
- /**
- * not API; <code>public</code> visibility for benefit of <tt>IsisMetaModel</tt>.
- */
- public ValidationFailures initAndValidate() {
+ public void validateAndAssert() {
+ ValidationFailures validationFailures = validate();
+ validationFailures.assertNone();
+
+ cacheBySpecId();
+ }
+
+ public ValidationFailures validate() {
+ ValidationFailures validationFailures = new ValidationFailures();
+ metaModelValidator.validate(validationFailures);
+ return validationFailures;
+ }
+
+ public void initialize() {
if (LOG.isDebugEnabled()) {
LOG.debug("initialising " + this);
}
@@ -237,10 +245,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
metaModelValidator.init();
loadSpecificationsForServices();
-
- ValidationFailures validationFailures = new ValidationFailures();
- metaModelValidator.validate(validationFailures);
- return validationFailures;
}
private void loadSpecificationsForServices() {
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
index e638f14..da01275 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
@@ -152,4 +152,9 @@ public class ProgrammableReflector extends SpecificationLoaderAbstract implement
return false;
}
+ @Override
+ public void validateAndAssert() {
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
index 361474b..2958892 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
@@ -68,7 +68,9 @@ public class ServicesInjectorDefaultTest {
@Before
public void setUp() throws Exception {
- injector = new ServicesInjectorDefault(new InjectorMethodEvaluatorDefault());
+ final Object[] services = { mockContainer, mockService1, mockService2 };
+
+ injector = new ServicesInjectorDefault(Arrays.asList(services), new InjectorMethodEvaluatorDefault());
}
@After
@@ -77,8 +79,6 @@ public class ServicesInjectorDefaultTest {
@Test
public void shouldInjectContainer() {
- final Object[] services = { mockContainer, mockService1, mockService2 };
- injector.setServices(Arrays.asList(services));
context.checking(new Expectations() {
{
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
index af6ca86..754bf32 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
@@ -81,12 +81,11 @@ public class ServicesInjectorDefaultTest_usingFields {
service1 = new SomeDomainService1();
service3 = new SomeDomainService3();
service2 = new SomeDomainService2();
- injector = new ServicesInjectorDefault();
+ injector = new ServicesInjectorDefault(Arrays.asList(container, service1, service3, service2));
}
@Test
public void shouldInjectContainer() {
- injector.setServices(Arrays.asList(container, service1, service3, service2));
injector.injectServicesInto(service1);
injector.injectServicesInto(service2);
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
index 8f0c611..e7edc32 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
@@ -88,7 +88,7 @@ public abstract class ObjectReflectorDefaultTestAbstract {
new MetaModelValidatorDefault(),
Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson()));
reflector.setRuntimeContext(runtimeContext);
- reflector.setServiceInjector(new ServicesInjectorDefault().withServices(Collections.<Object>singletonList(new DomainObjectContainerDefault())));
+ reflector.setServiceInjector(new ServicesInjectorDefault(Collections.<Object>singletonList(new DomainObjectContainerDefault())));
reflector.init();
specification = loadSpecification(reflector);
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
index f7594cc..d18f351 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
@@ -19,6 +19,8 @@
package org.apache.isis.core.runtime.installerregistry.installerapi;
+import java.util.List;
+
import org.apache.isis.core.commons.components.Installer;
import org.apache.isis.core.runtime.persistence.ObjectStoreFactory;
import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
@@ -32,6 +34,6 @@ public interface PersistenceMechanismInstaller extends Installer, ObjectStoreFac
static String TYPE = "persistor";
- PersistenceSessionFactory createPersistenceSessionFactory(DeploymentType deploymentType);
+ PersistenceSessionFactory createPersistenceSessionFactory(DeploymentType deploymentType, final List<Object> services);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/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 14b32a2..799bc96 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
@@ -123,6 +123,10 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
initContext(sessionFactory);
sessionFactory.init();
+ // validate here after all entities have been registered in the persistence session factory
+ final SpecificationLoaderSpi specificationLoader = sessionFactory.getSpecificationLoader();
+ specificationLoader.validateAndAssert();
+
serviceInitializer = initializeServices();
installFixturesIfRequired();
@@ -260,6 +264,7 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
*/
protected abstract IsisSessionFactory doCreateSessionFactory(final DeploymentType deploymentType) throws IsisSystemException;
+
// ///////////////////////////////////////////
// Configuration
// ///////////////////////////////////////////
@@ -302,7 +307,7 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
// PersistenceSessionFactory
// ///////////////////////////////////////////
- protected abstract PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType) throws IsisSystemException;
+ protected abstract PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType, final List<Object> services) throws IsisSystemException;
// ///////////////////////////////////////////
// Fixtures (hooks)
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index d5e01ec..0403b44 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -73,7 +73,6 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
private final PersistenceSessionFactory persistenceSessionFactory;
private final ObjectAdapterFactory objectAdapterFactory;
- private final ServicesInjectorSpi servicesInjector;
private final OidGenerator oidGenerator;
private final AdapterManagerDefault adapterManager;
@@ -87,8 +86,6 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
private boolean dirtiableSupport = true;
-
-
private static enum State {
NOT_INITIALIZED, OPEN, CLOSED
}
@@ -101,20 +98,15 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
*/
public PersistenceSession(
final PersistenceSessionFactory persistenceSessionFactory,
- final ServicesInjectorSpi servicesInjector,
final ObjectStore objectStore,
final IsisConfiguration configuration) {
+
ensureThatArg(persistenceSessionFactory, is(not(nullValue())), "persistence session factory required");
- ensureThatArg(servicesInjector, is(not(nullValue())), "services injector required");
ensureThatArg(objectStore, is(not(nullValue())), "object store required");
- // owning, application scope
this.persistenceSessionFactory = persistenceSessionFactory;
- // session scope
- this.servicesInjector = servicesInjector;
-
this.objectAdapterFactory = new PojoAdapterFactory();
this.oidGenerator = new OidGenerator(new IdentifierGeneratorUnified(configuration));
this.adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(configuration));
@@ -122,7 +114,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
this.objectStore = objectStore;
this.persistenceQueryFactory = new PersistenceQueryFactory(getSpecificationLoader(), adapterManager);
- this.transactionManager = new IsisTransactionManager(this, objectStore, servicesInjector);
+ this.transactionManager = new IsisTransactionManager(this, objectStore, persistenceSessionFactory.getServicesInjector());
setState(State.NOT_INITIALIZED);
@@ -164,9 +156,8 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
ensureThatState(transactionManager, is(not(nullValue())), "TransactionManager missing");
// inject any required dependencies into object factory
+ final ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
servicesInjector.injectInto(objectFactory);
-
- // wire dependencies into adapterManager
servicesInjector.injectInto(adapterManager);
adapterManager.open();
@@ -188,9 +179,8 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
private void initServices() {
-
- final List<Object> registeredServices = servicesInjector.getRegisteredServices();
-
+ final List<Object> registeredServices =
+ persistenceSessionFactory.getServicesInjector().getRegisteredServices();
createServiceAdapters(registeredServices);
}
@@ -224,7 +214,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
* @return - the service, or <tt>null</tt> if no service registered of specified type.
*/
public <T> T getServiceOrNull(final Class<T> serviceType) {
- return servicesInjector.lookupService(serviceType);
+ return persistenceSessionFactory.getServicesInjector().lookupService(serviceType);
}
// ///////////////////////////////////////////////////////////////////////////
@@ -516,7 +506,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
// REVIEW why does this get called multiple times when starting up
public List<ObjectAdapter> getServices() {
- final List<Object> services = servicesInjector.getRegisteredServices();
+ final List<Object> services = persistenceSessionFactory.getServicesInjector().getRegisteredServices();
final List<ObjectAdapter> serviceAdapters = Lists.newArrayList();
for (final Object servicePojo : services) {
serviceAdapters.add(getService(servicePojo));
@@ -913,7 +903,6 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
@Override
public void debugData(final DebugBuilder debug) {
debug.appendTitle(getClass().getName());
- debug.appendln("container", servicesInjector);
debug.appendln();
adapterManager.debugData(debug);
@@ -926,7 +915,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
debug.appendln();
debug.appendTitle("Services");
- for (final Object servicePojo : servicesInjector.getRegisteredServices()) {
+ for (final Object servicePojo : persistenceSessionFactory.getServicesInjector().getRegisteredServices()) {
final String id = ServiceUtil.id(servicePojo);
final Class<? extends Object> serviceClass = servicePojo.getClass();
final ObjectSpecification serviceSpecification = getSpecificationLoader().loadSpecification(serviceClass);
@@ -1030,7 +1019,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
* The configured {@link ServicesInjectorSpi}.
*/
public ServicesInjectorSpi getServicesInjector() {
- return servicesInjector;
+ return persistenceSessionFactory.getServicesInjector();
}
/**
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
index 2b203a2..fe989cb 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
@@ -21,8 +21,10 @@ package org.apache.isis.core.runtime.system.persistence;
import java.util.List;
import java.util.Properties;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.apache.isis.applib.clock.Clock;
import org.apache.isis.applib.fixtures.FixtureClock;
import org.apache.isis.core.commons.components.ApplicationScopedComponent;
@@ -42,7 +44,10 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
/**
* Implementation that just delegates to a supplied
@@ -56,23 +61,23 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
private final IsisConfiguration configuration;
private final ObjectStoreFactory objectStoreFactory;
- /**
- * @see #setServices(List)
- */
- private List<Object> serviceList;
-
private Boolean fixturesInstalled;
- private final ServicesInjectorSpi servicesInjector = new ServicesInjectorDefault();
+ private final ServicesInjectorSpi servicesInjector;
private RuntimeContext runtimeContext;
public PersistenceSessionFactory(
final DeploymentType deploymentType,
+ final List<Object> serviceList,
final IsisConfiguration isisConfiguration,
final ObjectStoreFactory objectStoreFactory) {
+
+ ensureThatState(serviceList, is(notNullValue()));
+
this.deploymentType = deploymentType;
this.configuration = isisConfiguration;
this.objectStoreFactory = objectStoreFactory;
+ servicesInjector = new ServicesInjectorDefault(serviceList);
}
public DeploymentType getDeploymentType() {
@@ -92,20 +97,13 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
ServicesInjectorSpi servicesInjector = getServicesInjector();
final ObjectStore objectStore = objectStoreFactory.createObjectStore(getConfiguration());
-
ensureThatArg(objectStore, is(not(nullValue())));
- final PersistenceSession persistenceSession = new PersistenceSession(this, servicesInjector, objectStore, getConfiguration());
-
-
- return persistenceSession;
+ return new PersistenceSession(this, objectStore, getConfiguration());
}
public final void init() {
- // check prereq dependencies injected
- ensureThatState(serviceList, is(notNullValue()));
-
// a bit of a workaround, but required if anything in the metamodel (for
// example, a
// ValueSemanticsProvider for a date value type) needs to use the Clock
@@ -124,13 +122,12 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
runtimeContext.injectInto(servicesInjector);
// wire up components
-
getSpecificationLoader().injectInto(runtimeContext);
- for (Object service : serviceList) {
+
+ for (Object service : servicesInjector.getRegisteredServices()) {
runtimeContext.injectInto(service);
}
- servicesInjector.setServices(serviceList);
servicesInjector.init();
}
@@ -211,10 +208,6 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
// Dependencies (injected via setters)
// //////////////////////////////////////////////////////
- public void setServices(final List<Object> serviceList) {
- this.serviceList = serviceList;
- }
-
// //////////////////////////////////////////////////////
// Dependencies (from context)
// //////////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/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 d575c6f..1d38172 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
@@ -72,7 +72,6 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
private final AuthenticationManager authenticationManager;
private final AuthorizationManager authorizationManager;
private final PersistenceSessionFactory persistenceSessionFactory;
- private final List<Object> serviceList;
private final OidMarshaller oidMarshaller;
public IsisSessionFactoryDefault(
@@ -82,7 +81,6 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
final AuthenticationManager authenticationManager,
final AuthorizationManager authorizationManager,
final PersistenceSessionFactory persistenceSessionFactory,
- final List<Object> serviceList,
final OidMarshaller oidMarshaller) {
ensureThatArg(deploymentType, is(not(nullValue())));
@@ -91,7 +89,6 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
ensureThatArg(authenticationManager, is(not(nullValue())));
ensureThatArg(authorizationManager, is(not(nullValue())));
ensureThatArg(persistenceSessionFactory, is(not(nullValue())));
- ensureThatArg(serviceList, is(not(nullValue())));
this.deploymentType = deploymentType;
this.configuration = configuration;
@@ -99,80 +96,9 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
this.authenticationManager = authenticationManager;
this.authorizationManager = authorizationManager;
this.persistenceSessionFactory = persistenceSessionFactory;
- this.serviceList = serviceList;
this.oidMarshaller = oidMarshaller;
-
- validateServices(serviceList);
- }
-
- /**
- * Validate domain service Ids are unique, and that the {@link PostConstruct} method, if present, must either
- * take no arguments or take a {@link Map} object), and that the {@link PreDestroy} method, if present, must take
- * no arguments.
- *
- * <p>
- * TODO: there seems to be some duplication/overlap with {@link ServiceInitializer}.
- */
- private void validateServices(List<Object> serviceList) {
- for (Object service : serviceList) {
- final Method[] methods = service.getClass().getMethods();
- for (Method method : methods) {
- validatePostConstructMethods(service, method);
- validatePreDestroyMethods(service, method);
- }
- }
-
- ListMultimap<String, Object> servicesById = ArrayListMultimap.create();
- for (Object service : serviceList) {
- String id = ServiceUtil.id(service);
- servicesById.put(id, service);
- }
- for (Entry<String, Collection<Object>> servicesForId : servicesById.asMap().entrySet()) {
- String serviceId = servicesForId.getKey();
- Collection<Object> services = servicesForId.getValue();
- if(services.size() > 1) {
- throw new IllegalStateException("Service ids must be unique; serviceId '" + serviceId + "' is declared by domain services " + classNamesFor(services));
- }
- }
}
- private static String classNamesFor(Collection<Object> services) {
- StringBuilder buf = new StringBuilder();
- for (Object service : services) {
- if(buf.length() > 0) {
- buf.append(", ");
- }
- buf.append(service.getClass().getName());
- }
- return buf.toString();
- }
-
- private void validatePostConstructMethods(Object service, Method method) {
- final PostConstruct postConstruct = method.getAnnotation(PostConstruct.class);
- if(postConstruct == null) {
- return;
- }
- final int numParams = method.getParameterTypes().length;
- if(numParams == 0) {
- return;
- }
- if(numParams == 1 && method.getParameterTypes()[0].isAssignableFrom(Map.class)) {
- return;
- }
- throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PostConstruct method " + method.getName() + "; such methods must take either no argument or 1 argument of type Map<String,String>");
- }
-
- private void validatePreDestroyMethods(Object service, Method method) {
- final PreDestroy preDestroy = method.getAnnotation(PreDestroy.class);
- if(preDestroy == null) {
- return;
- }
- final int numParams = method.getParameterTypes().length;
- if(numParams == 0) {
- return;
- }
- throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PreDestroy method " + method.getName() + "; such methods must take no arguments");
- }
// ///////////////////////////////////////////
@@ -186,14 +112,12 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
@Override
public void init() {
final ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
- servicesInjector.setServices(serviceList);
specificationLoaderSpi.setServiceInjector(servicesInjector);
specificationLoaderSpi.init();
// must come after init of spec loader.
specificationLoaderSpi.injectInto(persistenceSessionFactory);
- persistenceSessionFactory.setServices(serviceList);
authenticationManager.init();
authorizationManager.init();
@@ -263,7 +187,7 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
@Override
public List<Object> getServices() {
- return serviceList;
+ return getPersistenceSessionFactory().getServicesInjector().getRegisteredServices();
}
@Override
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
index 53981a7..9341c50 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
@@ -22,8 +22,10 @@ package org.apache.isis.core.runtime.systemusinginstallers;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.apache.isis.applib.fixtures.LogonFixture;
import org.apache.isis.applib.fixturescripts.FixtureScripts;
import org.apache.isis.applib.services.fixturespec.FixtureScriptsDefault;
@@ -34,13 +36,13 @@ import org.apache.isis.core.commons.debug.DebugBuilder;
import org.apache.isis.core.commons.lang.ListExtensions;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
import org.apache.isis.core.runtime.authentication.AuthenticationManager;
import org.apache.isis.core.runtime.authentication.exploration.ExplorationSession;
import org.apache.isis.core.runtime.authorization.AuthorizationManager;
import org.apache.isis.core.runtime.fixtures.FixturesInstaller;
import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession;
import org.apache.isis.core.runtime.system.DeploymentType;
import org.apache.isis.core.runtime.system.IsisSystemException;
@@ -49,6 +51,7 @@ 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.persistence.PersistenceSessionFactory;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.core.runtime.system.session.IsisSessionFactoryDefault;
@@ -152,14 +155,15 @@ public abstract class IsisSystemAbstract extends IsisSystemFixturesHookAbstract
@Override
public IsisSessionFactory doCreateSessionFactory(final DeploymentType deploymentType) throws IsisSystemException {
- final PersistenceSessionFactory persistenceSessionFactory = obtainPersistenceSessionFactory(deploymentType);
+ final List<Object> services = obtainServices();
+ final PersistenceSessionFactory persistenceSessionFactory = obtainPersistenceSessionFactory(deploymentType, services);
return createSessionFactory(deploymentType, persistenceSessionFactory);
}
/**
* Overloaded version designed to be called by subclasses that need to
* explicitly specify different persistence mechanisms.
- *
+ *
* <p>
* This is <i>not</i> a hook method, rather it is designed to be called
* <i>from</i> the {@link #doCreateSessionFactory(DeploymentType) hook
@@ -167,61 +171,35 @@ public abstract class IsisSystemAbstract extends IsisSystemFixturesHookAbstract
*/
protected final IsisSessionFactory createSessionFactory(
final DeploymentType deploymentType,
- final PersistenceSessionFactory persistenceSessionFactory) throws IsisSystemException {
+ final PersistenceSessionFactory persistenceSessionFactory) throws IsisSystemException {
final IsisConfiguration configuration = getConfiguration();
final AuthenticationManager authenticationManager = obtainAuthenticationManager(deploymentType);
final AuthorizationManager authorizationManager = obtainAuthorizationManager(deploymentType);
final OidMarshaller oidMarshaller = obtainOidMarshaller();
-
- final Collection<MetaModelRefiner> metaModelRefiners = refiners(authenticationManager, authorizationManager, persistenceSessionFactory);
+
+ final Collection<MetaModelRefiner> metaModelRefiners =
+ refiners(authenticationManager, authorizationManager, persistenceSessionFactory);
final SpecificationLoaderSpi reflector = obtainSpecificationLoaderSpi(deploymentType, metaModelRefiners);
- final List<Object> services = obtainServices();
- if(!contains(services, FixtureScripts.class)) {
- // add to beginning so that appears at top of prototyping menu.
- services.add(0, new FixtureScriptsDefault());
- }
+ ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
+ servicesInjector.addFallbackIfRequired(FixtureScripts.class, new FixtureScriptsDefault());
+ servicesInjector.validateServices();
// bind metamodel to the (runtime) framework
final RuntimeContextFromSession runtimeContext = obtainRuntimeContextFromSession();
runtimeContext.injectInto(reflector);
- return newIsisSessionFactory(
- deploymentType,
- persistenceSessionFactory,
- configuration,
+ return new IsisSessionFactoryDefault(
+ deploymentType, configuration, reflector,
authenticationManager, authorizationManager,
- oidMarshaller,
- reflector,
- services);
+ persistenceSessionFactory, oidMarshaller);
}
- static boolean contains(final List<Object> services, final Class<?> serviceClass) {
- for (Object service : services) {
- if(serviceClass.isAssignableFrom(service.getClass())) {
- return true;
- }
- }
- return false;
- }
-
-
protected RuntimeContextFromSession obtainRuntimeContextFromSession() {
return new RuntimeContextFromSession();
}
- protected IsisSessionFactoryDefault newIsisSessionFactory(
- final DeploymentType deploymentType,
- final PersistenceSessionFactory persistenceSessionFactory,
- final IsisConfiguration configuration,
- final AuthenticationManager authenticationManager, final AuthorizationManager authorizationManager,
- final OidMarshaller oidMarshaller,
- final SpecificationLoaderSpi reflector,
- final List<Object> services) {
- return new IsisSessionFactoryDefault(deploymentType, configuration, reflector, authenticationManager, authorizationManager, persistenceSessionFactory, services, oidMarshaller);
- }
-
private static Collection<MetaModelRefiner> refiners(Object... possibleRefiners ) {
return ListExtensions.filtered(Arrays.asList(possibleRefiners), MetaModelRefiner.class);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
index a14f917..46a046e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
@@ -216,7 +216,7 @@ public class IsisSystemUsingInstallers extends IsisSystemAbstract {
}
@Override
- protected PersistenceSessionFactory obtainPersistenceSessionFactory(final DeploymentType deploymentType) throws IsisSystemException {
+ protected PersistenceSessionFactory obtainPersistenceSessionFactory(final DeploymentType deploymentType, final List<Object> services) throws IsisSystemException {
// look for a object store persistor
if (persistenceMechanismInstaller == null) {
@@ -225,6 +225,6 @@ public class IsisSystemUsingInstallers extends IsisSystemAbstract {
}
ensureThatState(persistenceMechanismInstaller, is(not(nullValue())), "persistor installer has not been injected and could not be looked up");
- return persistenceMechanismInstaller.createPersistenceSessionFactory(deploymentType);
+ return persistenceMechanismInstaller.createPersistenceSessionFactory(deploymentType, services);
}
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 50ce240..7aeb633 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -89,8 +89,9 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
//region > createPersistenceSessionFactory
@Override
- public PersistenceSessionFactory createPersistenceSessionFactory(final DeploymentType deploymentType) {
- return new PersistenceSessionFactory(deploymentType, getConfiguration(), this);
+ public PersistenceSessionFactory createPersistenceSessionFactory(
+ final DeploymentType deploymentType, final List<Object> services) {
+ return new PersistenceSessionFactory(deploymentType, services, getConfiguration(), this);
}
//endregion
@@ -108,7 +109,8 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
private DataNucleusApplicationComponents applicationComponents = null;
- private DataNucleusApplicationComponents createDataNucleusApplicationComponentsIfRequired(IsisConfiguration configuration) {
+ private DataNucleusApplicationComponents createDataNucleusApplicationComponentsIfRequired(
+ final IsisConfiguration configuration) {
if (applicationComponents == null || applicationComponents.isStale()) {
@@ -118,7 +120,8 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
final Map<String, String> datanucleusProps = dataNucleusConfig.asMap();
addDataNucleusPropertiesIfRequired(datanucleusProps);
- final Set<String> classesToBePersisted = catalogClassesToBePersisted(configuration);
+ final RegisterEntities registerEntities = new RegisterEntities(configuration.asMap());
+ final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
applicationComponents = new DataNucleusApplicationComponents(jdoObjectstoreConfig, datanucleusProps, classesToBePersisted);
}
@@ -126,12 +129,6 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
return applicationComponents;
}
- private static Set<String> catalogClassesToBePersisted(
- final IsisConfiguration configuration) {
- return new RegisterEntities(configuration.asMap()).getEntityTypes();
- }
-
-
private static void addDataNucleusPropertiesIfRequired(
final Map<String, String> props) {
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
index 1e02568..1892594 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
@@ -18,6 +18,7 @@
*/
package org.apache.isis.objectstore.jdo.service;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -25,80 +26,73 @@ import java.util.Set;
import javax.jdo.annotations.PersistenceCapable;
import com.google.common.base.Function;
-import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.util.ScanUtils;
public class RegisterEntities {
- @SuppressWarnings("unused")
- private final static Logger LOG = LoggerFactory.getLogger(RegisterEntities.class);
-
public final static String PACKAGE_PREFIX_KEY = "isis.persistor.datanucleus.RegisterEntities.packagePrefix";
- private String packagePrefixes;
+ //region > init
public RegisterEntities(final Map<String, String> configuration) {
- packagePrefixes = configuration.get(PACKAGE_PREFIX_KEY);
+ String packagePrefixes = configuration.get(PACKAGE_PREFIX_KEY);
if(Strings.isNullOrEmpty(packagePrefixes)) {
throw new IllegalStateException("Could not locate '" + PACKAGE_PREFIX_KEY + "' key in property files - aborting");
}
-
- discoverAllPersistenceCapables();
+
+ domPackages = parseDomPackages(packagePrefixes);
+ this.entityTypes = scanForEntityTypesIn(this.domPackages);
}
- private void discoverAllPersistenceCapables() {
+ //endregion
- final List<String> packagePrefixList = Lists.newArrayList(Iterables.transform(Splitter.on(",").split(packagePrefixes), trim()));
- for (final String packagePrefix : packagePrefixList) {
+ //region > domPackages
+ private List<String> domPackages;
- final Iterable<String> entityTypes = ScanUtils.scanForNamesOfClassesWithAnnotation(packagePrefixList, PersistenceCapable.class);
- if(notEmpty(entityTypes)) {
- throw new IllegalStateException("Could not locate any @PersistenceCapable entities in package " + packagePrefix);
- }
- this.entityTypes = Sets.newLinkedHashSet(entityTypes);
- }
+ public List<String> getDomPackages() {
+ return domPackages;
}
+ //endregion
+ //region > entityTypes
private Set<String> entityTypes;
- @Programmatic
public Set<String> getEntityTypes() {
return entityTypes;
}
-
- private static Function<String,String> trim() {
- return new Function<String,String>(){
- @Override
- public String apply(String input) {
- return input.trim();
+ //endregion
+
+ //region > helpers
+ private static Set<String> scanForEntityTypesIn(final List<String> domPackages) {
+ Set<String> entityTypes = Sets.newLinkedHashSet();
+ for (final String packagePrefix : domPackages) {
+ final Iterable<String> entityTypes1 = ScanUtils.scanForNamesOfClassesWithAnnotation(domPackages, PersistenceCapable.class);
+ if(Iterables.isEmpty(entityTypes1)) {
+ throw new IllegalStateException("Could not locate any @PersistenceCapable entities in package " + packagePrefix);
}
- };
+ Iterables.addAll(entityTypes, entityTypes1);
+ }
+ return entityTypes;
}
- /**
- * legacy from using <tt>org.reflections.Reflections</tt> that seems to return a set with 1 null element if none can be found.
- */
- private static <T> boolean notEmpty(Iterable<T> set) {
- return Iterables.filter(set, isNull()).iterator().hasNext();
+ private static List<String> parseDomPackages(String packagePrefixes) {
+ return Collections.unmodifiableList(Lists.newArrayList(Iterables.transform(Splitter.on(",").split(packagePrefixes), trim())));
}
- private static <T> Predicate<T> isNull() {
- return new Predicate<T>() {
+ private static Function<String,String> trim() {
+ return new Function<String,String>(){
@Override
- public boolean apply(T input) {
- return input == null;
+ public String apply(String input) {
+ return input.trim();
}
};
}
+ //endregion
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
index 73cf1be..5838ace 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
@@ -102,7 +102,7 @@ public class IsisContextTest {
}
});
- sessionFactory = new IsisSessionFactoryDefault(DeploymentType.UNIT_TESTING, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, servicesList, oidMarshaller);
+ sessionFactory = new IsisSessionFactoryDefault(DeploymentType.UNIT_TESTING, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, oidMarshaller);
authSession = new SimpleSession("tester", Collections.<String>emptyList());
IsisContext.setConfiguration(configuration);
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
index f9cc749..ef9d3b7 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
@@ -68,7 +68,7 @@ public class ObjectStoreTransactionManager_EndTransactionTest {
will(returnValue(mockMessageBroker));
}});
- transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault()) {
+ transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault(Collections.emptyList())) {
@Override
public AuthenticationSession getAuthenticationSession() {
return mockAuthenticationSession;
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
index d064e5d..e917802 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
@@ -19,6 +19,8 @@
package org.apache.isis.core.runtime.persistence.objectstore.transaction;
+import java.util.Collections;
+
import org.jmock.auto.Mock;
import org.junit.Rule;
import org.junit.Test;
@@ -44,7 +46,7 @@ public class ObjectStoreTransactionManager_InstantiationTest {
@Test
public void canInstantiate() throws Exception {
- transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault());
+ transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault(Collections.emptyList()));
}
}
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
index 14f67e9..cb8fe52 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
@@ -19,6 +19,8 @@
package org.apache.isis.core.runtime.persistence.objectstore.transaction;
+import java.util.Collections;
+
import org.jmock.Expectations;
import org.jmock.auto.Mock;
import org.junit.Before;
@@ -56,7 +58,7 @@ public class ObjectStoreTransactionManager_StartTransactionTest {
@Before
public void setUpTransactionManager() throws Exception {
- transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault()) {
+ transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault(Collections.emptyList())) {
@Override
protected AuthenticationSession getAuthenticationSession() {
return mockAuthenticationSession;
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
index 3cf5d3a..87408d4 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
@@ -147,11 +147,12 @@ public class PersistenceSessionTest {
runtimeContext.injectInto(container);
- servicesInjector = new ServicesInjectorDefault(new InjectorMethodEvaluatorDefault());
+ servicesInjector = new ServicesInjectorDefault(
+ Collections.<Object>singletonList(container),new InjectorMethodEvaluatorDefault());
adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(mockConfiguration));
adapterFactory = new PojoAdapterFactory();
- persistenceSession = new PersistenceSession(mockPersistenceSessionFactory, servicesInjector, mockObjectStore, mockConfiguration) {
+ persistenceSession = new PersistenceSession(mockPersistenceSessionFactory, mockObjectStore, mockConfiguration) {
@Override
protected SpecificationLoaderSpi getSpecificationLoader() {
return isisMetaModel.getSpecificationLoader();
@@ -159,8 +160,6 @@ public class PersistenceSessionTest {
};
- servicesInjector.setServices(Collections.<Object>singletonList(container));
-
context.checking(new Expectations(){{
allowing(mockAuthenticationSession).getUserName();
will(returnValue("sven"));
http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
index 2ba697e..77af285 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
@@ -84,7 +84,7 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
public void validate_DomainServicesWithDuplicateIds() {
serviceList.add(new DomainServiceWithSomeId());
serviceList.add(new DomainServiceWithDuplicateId());
- isf = new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, serviceList, mockOidMarshaller) {
+ isf = new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, mockOidMarshaller) {
};
}
}