Repository: isis Updated Branches: refs/heads/master 11c6dcd37 -> 8b7267e60
ISIS-939: simplified PersistenceMechanismInstallerAbstract and its subclasses, also PersistenceSessionFactoryDelegating, PersistenceSessionFactoryDelegate. * Replaced PersistenceSessionFactoryDelegate#createPersistenceSession with #createObjectStore (other common functionality moved to PersistenceSessionFactoryDelegating). * Don't pass ObjectAdapterFactory, AdapaterManagerSpi, OidGenerator into PersistenceSession; instead it can new these up (there is no variation in implementation nor state held in these components) * Removed IsisObjectStoreLogger, IsisObjectStoreDelegating. Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/46dc3a48 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/46dc3a48 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/46dc3a48 Branch: refs/heads/master Commit: 46dc3a48c1ef8bb9e02c1f4c971b6040a83fc5fa Parents: 11c6dcd Author: Dan Haywood <[email protected]> Authored: Sat Nov 1 12:05:53 2014 +0000 Committer: Dan Haywood <[email protected]> Committed: Thu Nov 6 16:18:54 2014 +0000 ---------------------------------------------------------------------- .../InMemoryPersistenceMechanismInstaller.java | 6 +- .../PersistenceMechanismInstallerAbstract.java | 167 +----------- .../PersistenceSessionFactoryDelegate.java | 33 +-- .../PersistenceSessionFactoryDelegating.java | 69 +++-- .../persistence/adapter/PojoAdapterFactory.java | 4 +- .../objectstore/IsisObjectStoreDelegating.java | 194 -------------- .../objectstore/IsisObjectStoreLogger.java | 205 -------------- .../system/persistence/PersistenceSession.java | 38 +-- .../persistence/PersistenceSessionFactory.java | 5 +- .../jdo/datanucleus/DataNucleusObjectStore.java | 7 +- ...ataNucleusPersistenceMechanismInstaller.java | 61 ++--- .../PersistenceSessionObjectStoreTest.java | 268 ------------------- .../persistence/PersistenceSessionTest.java | 268 +++++++++++++++++++ 13 files changed, 377 insertions(+), 948 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java index 2f0acc2..293d557 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java +++ b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryPersistenceMechanismInstaller.java @@ -20,12 +20,9 @@ package org.apache.isis.core.objectstore; import org.apache.isis.core.commons.config.IsisConfiguration; -import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; import org.apache.isis.core.runtime.installerregistry.installerapi.PersistenceMechanismInstallerAbstract; import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.system.DeploymentType; -import org.apache.isis.core.runtime.system.persistence.AdapterManagerSpi; -import org.apache.isis.core.runtime.system.persistence.ObjectFactory; import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory; /** @@ -56,7 +53,8 @@ public class InMemoryPersistenceMechanismInstaller extends PersistenceMechanismI * Hook method to return {@link ObjectStoreSpi}. */ @Override - protected ObjectStoreSpi createObjectStore(final IsisConfiguration configuration, final ObjectAdapterFactory adapterFactory, final AdapterManagerSpi adapterManager) { + public ObjectStoreSpi createObjectStore( + final IsisConfiguration configuration) { return new InMemoryObjectStore(); } http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java index e702e36..75e6fc4 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java @@ -20,128 +20,42 @@ package org.apache.isis.core.runtime.installerregistry.installerapi; import java.util.List; -import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.isis.core.commons.config.InstallerAbstract; import org.apache.isis.core.commons.config.IsisConfiguration; import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; import org.apache.isis.core.metamodel.progmodel.ProgrammingModel; -import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext; -import org.apache.isis.core.metamodel.services.ServicesInjectorDefault; -import org.apache.isis.core.metamodel.services.ServicesInjectorSpi; import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator; import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite; -import org.apache.isis.core.runtime.installerregistry.InstallerLookup; -import org.apache.isis.core.runtime.installerregistry.InstallerLookupAware; import org.apache.isis.core.runtime.persistence.PersistenceSessionFactoryDelegating; -import org.apache.isis.core.runtime.persistence.adapter.PojoAdapterFactory; -import org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault; -import org.apache.isis.core.runtime.persistence.adaptermanager.PojoRecreator; -import org.apache.isis.core.runtime.persistence.adaptermanager.PojoRecreatorUnified; -import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession; -import org.apache.isis.core.runtime.persistence.objectstore.IsisObjectStoreLogger; -import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.system.DeploymentType; import org.apache.isis.core.runtime.system.context.IsisContext; -import org.apache.isis.core.runtime.system.persistence.*; -import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager; -import org.apache.isis.core.runtime.systemdependencyinjector.SystemDependencyInjector; - -import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg; -import static org.hamcrest.CoreMatchers.*; +import org.apache.isis.core.runtime.system.persistence.ObjectFactory; +import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory; /** * An abstract implementation of {@link PersistenceMechanismInstaller} that will * lookup the {@link ObjectAdapterFactory} and {@link ObjectFactory} from the * supplied {@link IsisConfiguration}. */ -public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbstract implements PersistenceMechanismInstaller, InstallerLookupAware { - - - private static final String LOGGING_PROPERTY = org.apache.isis.core.runtime.logging.Log4jLogger.PROPERTY_ROOT + "persistenceSession"; - private static final Logger LOG = LoggerFactory.getLogger(PersistenceMechanismInstallerAbstract.class); - - private SystemDependencyInjector installerLookup; +public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbstract implements PersistenceMechanismInstaller { public PersistenceMechanismInstallerAbstract(final String name) { super(PersistenceMechanismInstaller.TYPE, name); } - /** - * For subclasses that need to specify a different type. - */ - public PersistenceMechanismInstallerAbstract(final String type, final String name) { - super(type, name); - } - - ////////////////////////////////////////////////////////////////////// // createPersistenceSessionFactory ////////////////////////////////////////////////////////////////////// + //region > createPersistenceSessionFactory + @Override public PersistenceSessionFactory createPersistenceSessionFactory(final DeploymentType deploymentType) { return new PersistenceSessionFactoryDelegating(deploymentType, getConfiguration(), this); } - - ////////////////////////////////////////////////////////////////////// - // createPersistenceSession - ////////////////////////////////////////////////////////////////////// - - - /** - * Creates a {@link PersistenceSession} with internal (thread-safe) components obtained from the provided {@link PersistenceSessionFactory}. - * - * <p> - * Typically should not be overridden. - */ - @Override - public PersistenceSession createPersistenceSession(final PersistenceSessionFactory persistenceSessionFactory) { - - if (LOG.isDebugEnabled()) { - LOG.debug("installing " + this.getClass().getName()); - } - - ObjectAdapterFactory adapterFactory = persistenceSessionFactory.getAdapterFactory(); - PojoRecreator pojoRecreator = new PojoRecreatorUnified(getConfiguration()); - ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector(); - - final AdapterManagerDefault adapterManager = new AdapterManagerDefault(pojoRecreator); - - ObjectStoreSpi objectStore = createObjectStore(getConfiguration(), adapterFactory, adapterManager); - - ensureThatArg(objectStore, is(not(nullValue()))); - - if (getConfiguration().getBoolean(LOGGING_PROPERTY, false)) { - final String level = getConfiguration().getString(LOGGING_PROPERTY + ".level", "debug"); - objectStore = new IsisObjectStoreLogger(objectStore, level); - } - - final PersistenceSession persistenceSession = - new PersistenceSession(persistenceSessionFactory, adapterFactory, servicesInjector, adapterManager, objectStore, getConfiguration()); - - final IsisTransactionManager transactionManager = new IsisTransactionManager(persistenceSession, objectStore, servicesInjector); - - persistenceSession.setDirtiableSupport(true); - persistenceSession.setTransactionManager(transactionManager); - - return persistenceSession; - } - - - - // /////////////////////////////////////////// - // Mandatory hook methods - // /////////////////////////////////////////// - - /** - * Hook method to return {@link ObjectStoreSpi}. - */ - protected abstract ObjectStoreSpi createObjectStore(IsisConfiguration configuration, ObjectAdapterFactory adapterFactory, AdapterManagerSpi adapterManager); - + //endregion // /////////////////////////////////////////// // Optional hook methods @@ -173,75 +87,6 @@ public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbs // no-op } - /** - * Hook method to allow subclasses to specify a different implementation of - * {@link ObjectAdapterFactory}. - * - * <p> - * By default, returns {@link PojoAdapterFactory}; - */ - public ObjectAdapterFactory createAdapterFactory(final IsisConfiguration configuration) { - return new PojoAdapterFactory(); - } - - - /** - * Hook method to allow subclasses to specify a different implementation of - * {@link ServicesInjectorSpi} - * - * <p> - * By default, returns {@link ServicesInjectorDefault}; - */ - public ServicesInjectorSpi createServicesInjector(final IsisConfiguration configuration) { - return new ServicesInjectorDefault(); - } - - - // /////////////////////////////////////////// - // Non overridable. - // /////////////////////////////////////////// - - /** - * Returns a {@link RuntimeContext}, with all application-specific properties - * from the provided {@link IsisConfiguration} copied over. - */ - public final RuntimeContext createRuntimeContext(final IsisConfiguration configuration) { - final RuntimeContextFromSession runtimeContext = new RuntimeContextFromSession(); - final Properties properties = applicationPropertiesFrom(configuration); - runtimeContext.setProperties(properties); - return runtimeContext; - } - - private static Properties applicationPropertiesFrom(final IsisConfiguration configuration) { - final Properties properties = new Properties(); - final IsisConfiguration applicationConfiguration = configuration.getProperties("application"); - for (final String key : applicationConfiguration) { - final String value = applicationConfiguration.getString(key); - final String newKey = key.substring("application.".length()); - properties.setProperty(newKey, value); - } - return properties; - } - - - // ///////////////////////////////////////////////////// - // Dependencies (from setters) - // ///////////////////////////////////////////////////// - - /** - * By virtue of being {@link InstallerLookupAware}. - */ - @Override - public void setInstallerLookup(final InstallerLookup installerLookup) { - this.installerLookup = installerLookup; - } - - /** - * @see #setInstallerLookup(InstallerLookup) - */ - protected SystemDependencyInjector getInstallerLookup() { - return installerLookup; - } // ///////////////////////////////////////////////////// // Dependencies (from context) http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java index 9da2585..59a6010 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java @@ -21,43 +21,16 @@ package org.apache.isis.core.runtime.persistence; import org.apache.isis.core.commons.config.IsisConfiguration; import org.apache.isis.core.commons.config.IsisConfigurationBuilderAware; -import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner; -import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext; -import org.apache.isis.core.metamodel.services.ServicesInjectorSpi; -import org.apache.isis.core.runtime.system.persistence.PersistenceSession; +import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory; /** - * Creates a {@link PersistenceSession} on behalf of a + * Creates an {@link org.apache.isis.core.runtime.system.persistence.ObjectStore} on behalf of a * {@link PersistenceSessionFactory}. */ public interface PersistenceSessionFactoryDelegate extends IsisConfigurationBuilderAware, MetaModelRefiner { + ObjectStoreSpi createObjectStore(final IsisConfiguration configuration); - /////////////////////////////////////////////////////////////////////////// - // singleton threadsafe components created during init - /////////////////////////////////////////////////////////////////////////// - - ObjectAdapterFactory createAdapterFactory(IsisConfiguration configuration); - - ServicesInjectorSpi createServicesInjector(IsisConfiguration configuration); - - RuntimeContext createRuntimeContext(IsisConfiguration configuration); - - - /////////////////////////////////////////////////////////////////////////// - // created for each session - /////////////////////////////////////////////////////////////////////////// - - /** - * As per {@link PersistenceSessionFactory#createPersistenceSession()}, but - * passing a {@link PersistenceSessionFactory} to act as the - * {@link PersistenceSession}'s - * {@link PersistenceSession#getPersistenceSessionFactory() owning factory}. - */ - PersistenceSession createPersistenceSession(PersistenceSessionFactory persistenceSessionFactory); - - - } http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java index c0902f7..69153f2 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java @@ -20,29 +20,38 @@ package org.apache.isis.core.runtime.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.config.IsisConfiguration; -import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; import org.apache.isis.core.metamodel.progmodel.ProgrammingModel; import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext; +import org.apache.isis.core.metamodel.services.ServicesInjectorDefault; import org.apache.isis.core.metamodel.services.ServicesInjectorSpi; import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite; +import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession; +import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.system.DeploymentType; import org.apache.isis.core.runtime.system.context.IsisContext; import org.apache.isis.core.runtime.system.persistence.PersistenceSession; import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory; +import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager; +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.*; /** * Implementation that just delegates to a supplied - * {@link PersistenceSessionFactory}. + * {@link PersistenceSessionFactoryDelegate}. */ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFactory, FixturesInstalledFlag { + private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactoryDelegating.class); + private final DeploymentType deploymentType; private final IsisConfiguration configuration; private final PersistenceSessionFactoryDelegate persistenceSessionFactoryDelegate; @@ -54,8 +63,7 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa private Boolean fixturesInstalled; - private ObjectAdapterFactory adapterFactory; - private ServicesInjectorSpi servicesInjector; + private final ServicesInjectorSpi servicesInjector = new ServicesInjectorDefault(); private RuntimeContext runtimeContext; public PersistenceSessionFactoryDelegating( @@ -78,7 +86,25 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa @Override public PersistenceSession createPersistenceSession() { - return persistenceSessionFactoryDelegate.createPersistenceSession(this); + + if (LOG.isDebugEnabled()) { + LOG.debug("installing " + this.getClass().getName()); + } + + ServicesInjectorSpi servicesInjector = getServicesInjector(); + + final ObjectStoreSpi objectStore = persistenceSessionFactoryDelegate.createObjectStore(getConfiguration()); + + ensureThatArg(objectStore, is(not(nullValue()))); + + final PersistenceSession persistenceSession =new PersistenceSession(this, servicesInjector, objectStore, getConfiguration()); + + final IsisTransactionManager transactionManager = new IsisTransactionManager(persistenceSession, objectStore, servicesInjector); + + persistenceSession.setDirtiableSupport(true); + persistenceSession.setTransactionManager(transactionManager); + + return persistenceSession; } @Override @@ -98,15 +124,7 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa FixtureClock.initialize(); } - adapterFactory = persistenceSessionFactoryDelegate.createAdapterFactory(getConfiguration()); - - ensureThatState(adapterFactory, is(not(nullValue()))); - - servicesInjector = persistenceSessionFactoryDelegate.createServicesInjector(getConfiguration()); - - ensureThatState(servicesInjector, is(not(nullValue()))); - - runtimeContext = persistenceSessionFactoryDelegate.createRuntimeContext(getConfiguration()); + runtimeContext = createRuntimeContext(getConfiguration()); ensureThatState(runtimeContext, is(not(nullValue()))); // inject the specification loader etc. @@ -123,6 +141,25 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa servicesInjector.init(); } + private RuntimeContext createRuntimeContext(final IsisConfiguration configuration) { + final RuntimeContextFromSession runtimeContext = new RuntimeContextFromSession(); + final Properties properties = applicationPropertiesFrom(configuration); + runtimeContext.setProperties(properties); + return runtimeContext; + } + + private static Properties applicationPropertiesFrom(final IsisConfiguration configuration) { + final Properties properties = new Properties(); + final IsisConfiguration applicationConfiguration = configuration.getProperties("application"); + for (final String key : applicationConfiguration) { + final String value = applicationConfiguration.getString(key); + final String newKey = key.substring("application.".length()); + properties.setProperty(newKey, value); + } + return properties; + } + + @Override public final void shutdown() { @@ -140,10 +177,6 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa // Components (setup during init...) // ////////////////////////////////////////////////////// - public ObjectAdapterFactory getAdapterFactory() { - return adapterFactory; - } - public ServicesInjectorSpi getServicesInjector() { return servicesInjector; } http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapterFactory.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapterFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapterFactory.java index 97ada74..319942d 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapterFactory.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapterFactory.java @@ -30,12 +30,10 @@ import org.apache.isis.core.runtime.system.context.IsisContext; public class PojoAdapterFactory implements ObjectAdapterFactory { @Override - public PojoAdapter createAdapter(final Object pojo, final Oid oid, AdapterManager adapterManager) { + public PojoAdapter createAdapter(final Object pojo, final Oid oid, final AdapterManager adapterManager) { return new PojoAdapter(pojo, oid, getSpecificationLoader(), adapterManager, getLocalization(), getAuthenticationSession()); } - - protected AuthenticationSession getAuthenticationSession() { return IsisContext.getAuthenticationSession(); } http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreDelegating.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreDelegating.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreDelegating.java deleted file mode 100644 index 02eb98d..0000000 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreDelegating.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.isis.core.runtime.persistence.objectstore; - -import java.util.List; - -import org.apache.isis.core.commons.debug.DebugBuilder; -import org.apache.isis.core.metamodel.adapter.ObjectAdapter; -import org.apache.isis.core.metamodel.adapter.oid.RootOid; -import org.apache.isis.core.metamodel.adapter.oid.TypedOid; -import org.apache.isis.core.metamodel.spec.ObjectSpecification; -import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.SaveObjectCommand; -import org.apache.isis.core.runtime.system.persistence.PersistenceQuery; - -/** - * Implementation that simply delegates to underlying {@link ObjectStoreSpi}. - * - * <p> - * Useful for quickly writing decorating implementations. - */ -public class IsisObjectStoreDelegating implements ObjectStoreSpi { - - private final ObjectStoreSpi underlying; - private final String name; - - public IsisObjectStoreDelegating(final ObjectStoreSpi underlying, final String name) { - this.underlying = underlying; - this.name = name; - } - - // //////////////////////////////////////////////// - // name - // //////////////////////////////////////////////// - - @Override - public String name() { - return name + "(" + underlying.name() + ")"; - } - - // //////////////////////////////////////////////// - // init, shutdown, reset, isInitialized - // //////////////////////////////////////////////// - - @Override - public void open() { - underlying.open(); - } - - @Override - public void close() { - underlying.close(); - } - - @Override - public void reset() { - underlying.reset(); - } - - @Override - public boolean isFixturesInstalled() { - return underlying.isFixturesInstalled(); - } - - // //////////////////////////////////////////////// - // createXxxCommands - // //////////////////////////////////////////////// - - @Override - public CreateObjectCommand createCreateObjectCommand(final ObjectAdapter object) { - return underlying.createCreateObjectCommand(object); - } - - @Override - public DestroyObjectCommand createDestroyObjectCommand(final ObjectAdapter object) { - return underlying.createDestroyObjectCommand(object); - } - - @Override - public SaveObjectCommand createSaveObjectCommand(final ObjectAdapter object) { - return underlying.createSaveObjectCommand(object); - } - - // //////////////////////////////////////////////// - // execute - // //////////////////////////////////////////////// - - @Override - public void execute(final List<PersistenceCommand> commands) { - underlying.execute(commands); - } - - // //////////////////////////////////////////////// - // TransactionManagement - // //////////////////////////////////////////////// - - @Override - public void startTransaction() { - underlying.startTransaction(); - } - - @Override - public void endTransaction() { - underlying.endTransaction(); - } - - @Override - public void abortTransaction() { - underlying.abortTransaction(); - } - - // //////////////////////////////////////////////// - // getObject, resolveImmediately, resolveField - // //////////////////////////////////////////////// - - @Override - public ObjectAdapter loadInstanceAndAdapt(final TypedOid oid) { - return underlying.loadInstanceAndAdapt(oid); - } - - @Override - public void resolveField(final ObjectAdapter object, final ObjectAssociation field) { - underlying.resolveField(object, field); - } - - @Override - public void resolveImmediately(final ObjectAdapter object) { - underlying.resolveImmediately(object); - } - - // //////////////////////////////////////////////// - // getInstances, hasInstances - // //////////////////////////////////////////////// - - @Override - public List<ObjectAdapter> loadInstancesAndAdapt(final PersistenceQuery persistenceQuery) { - return underlying.loadInstancesAndAdapt(persistenceQuery); - } - - @Override - public boolean hasInstances(final ObjectSpecification specification) { - return underlying.hasInstances(specification); - } - - // //////////////////////////////////////////////// - // services - // //////////////////////////////////////////////// - - @Override - public RootOid getOidForService(ObjectSpecification serviceSpecification) { - return underlying.getOidForService(serviceSpecification); - } - - @Override - public void registerService(final RootOid rootOid) { - underlying.registerService(rootOid); - } - - // //////////////////////////////////////////////// - // debug - // //////////////////////////////////////////////// - - @Override - public void debugData(final DebugBuilder debug) { - underlying.debugData(debug); - } - - @Override - public String debugTitle() { - return underlying.debugTitle(); - } - - -} http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreLogger.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreLogger.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreLogger.java deleted file mode 100644 index c619708..0000000 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/IsisObjectStoreLogger.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.isis.core.runtime.persistence.objectstore; - -import java.util.List; - -import org.apache.isis.core.commons.config.IsisConfigurationException; -import org.apache.isis.core.commons.debug.DebugBuilder; -import org.apache.isis.core.commons.factory.InstanceCreationException; -import org.apache.isis.core.metamodel.adapter.ObjectAdapter; -import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller; -import org.apache.isis.core.metamodel.adapter.oid.RootOid; -import org.apache.isis.core.metamodel.adapter.oid.TypedOid; -import org.apache.isis.core.metamodel.spec.ObjectSpecification; -import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; -import org.apache.isis.core.runtime.persistence.ObjectNotFoundException; -import org.apache.isis.core.runtime.persistence.ObjectPersistenceException; -import org.apache.isis.core.runtime.persistence.UnsupportedFindException; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.SaveObjectCommand; -import org.apache.isis.core.runtime.system.context.IsisContext; -import org.apache.isis.core.runtime.system.persistence.PersistenceQuery; - -public class IsisObjectStoreLogger extends Slf4jLogger implements ObjectStoreSpi { - - - private final ObjectStoreSpi underlying; - - public IsisObjectStoreLogger(final ObjectStoreSpi decorated, final String level) { - super(level); - this.underlying = decorated; - } - - public IsisObjectStoreLogger(final ObjectStoreSpi decorated) { - this.underlying = decorated; - } - - @Override - public CreateObjectCommand createCreateObjectCommand(final ObjectAdapter object) { - log("create object " + object); - return underlying.createCreateObjectCommand(object); - } - - @Override - public void registerService(final RootOid rootOid) { - log("registering service: " + rootOid.enString(getOidMarshaller())); - underlying.registerService(rootOid); - } - - @Override - public DestroyObjectCommand createDestroyObjectCommand(final ObjectAdapter object) { - log("destroy object " + object); - return underlying.createDestroyObjectCommand(object); - } - - @Override - public SaveObjectCommand createSaveObjectCommand(final ObjectAdapter object) { - log("save object " + object); - return underlying.createSaveObjectCommand(object); - } - - @Override - public void debugData(final DebugBuilder debug) { - underlying.debugData(debug); - } - - @Override - public String debugTitle() { - return underlying.debugTitle(); - } - - @Override - protected Class<?> getDecoratedClass() { - return underlying.getClass(); - } - - @Override - public List<ObjectAdapter> loadInstancesAndAdapt(final PersistenceQuery criteria) throws ObjectPersistenceException, UnsupportedFindException { - log("get instances matching " + criteria); - return underlying.loadInstancesAndAdapt(criteria); - } - - - @Override - public ObjectAdapter loadInstanceAndAdapt(final TypedOid oid) throws ObjectNotFoundException, ObjectPersistenceException { - final ObjectAdapter adapter = underlying.loadInstanceAndAdapt(oid); - log("get object for " + oid + " (of type '" + oid.getObjectSpecId() + "')", adapter.getObject()); - return adapter; - } - - @Override - public RootOid getOidForService(ObjectSpecification serviceSpec) { - final RootOid serviceOid = underlying.getOidForService(serviceSpec); - if(serviceOid != null) { - log("get OID for service: " + serviceOid.enString(getOidMarshaller())); - } else { - log("get OID for service: null (presumably in the process of being registered for '" + serviceSpec.getSpecId() + "')"); - } - return serviceOid; - } - - @Override - public boolean hasInstances(final ObjectSpecification specification) throws ObjectPersistenceException { - final boolean hasInstances = underlying.hasInstances(specification); - log("has instances of " + specification.getShortIdentifier(), "" + hasInstances); - return hasInstances; - } - - @Override - public boolean isFixturesInstalled() { - final boolean isInitialized = underlying.isFixturesInstalled(); - log("is initialized: " + isInitialized); - return isInitialized; - } - - @Override - public void open() throws IsisConfigurationException, InstanceCreationException, ObjectPersistenceException { - log("opening " + name()); - underlying.open(); - } - - @Override - public String name() { - return underlying.name(); - } - - @Override - public void reset() { - log("reset"); - underlying.reset(); - } - - @Override - public void resolveField(final ObjectAdapter object, final ObjectAssociation field) throws ObjectPersistenceException { - log("resolve eagerly object in field " + field + " of " + object); - underlying.resolveField(object, field); - } - - @Override - public void resolveImmediately(final ObjectAdapter object) throws ObjectPersistenceException { - log("resolve immediately: " + object); - underlying.resolveImmediately(object); - } - - @Override - public void execute(final List<PersistenceCommand> commands) throws ObjectPersistenceException { - log("execute commands"); - int i = 0; - for (final PersistenceCommand command : commands) { - log(" " + (i++) + " " + command); - } - underlying.execute(commands); - } - - @Override - public void close() throws ObjectPersistenceException { - log("closing " + underlying); - underlying.close(); - } - - @Override - public void startTransaction() { - underlying.startTransaction(); - } - - @Override - public void endTransaction() { - underlying.endTransaction(); - } - - @Override - public void abortTransaction() { - underlying.abortTransaction(); - } - - - ///////////////////////////////////////////// - // Dependencies (from context) - ///////////////////////////////////////////// - - protected OidMarshaller getOidMarshaller() { - return IsisContext.getOidMarshaller(); - } - - -} http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/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 ffd13b6..cdd3a10 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 @@ -54,6 +54,9 @@ import org.apache.isis.core.metamodel.spec.*; import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag; import org.apache.isis.core.runtime.persistence.NotPersistableException; +import org.apache.isis.core.runtime.persistence.adapter.PojoAdapterFactory; +import org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault; +import org.apache.isis.core.runtime.persistence.adaptermanager.PojoRecreatorUnified; import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.persistence.objectstore.algorithm.PersistAlgorithm; import org.apache.isis.core.runtime.persistence.objectstore.algorithm.PersistAlgorithmUnified; @@ -104,43 +107,24 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To */ public PersistenceSession( final PersistenceSessionFactory persistenceSessionFactory, - final ObjectAdapterFactory adapterFactory, final ServicesInjectorSpi servicesInjector, - final AdapterManagerSpi adapterManager, - final ObjectStore objectStore, - final IsisConfiguration configuration) { - - this(persistenceSessionFactory, adapterFactory, servicesInjector, new OidGenerator(new IdentifierGeneratorUnified(configuration)), adapterManager, objectStore, configuration); - } - - /** - * Initialize the object store so that calls to this object store access - * persisted objects and persist changes to the object that are saved. - */ - public PersistenceSession( - final PersistenceSessionFactory persistenceSessionFactory, - final ObjectAdapterFactory adapterFactory, - final ServicesInjectorSpi servicesInjector, - final OidGenerator oidGenerator, - final AdapterManagerSpi adapterManager, final ObjectStore objectStore, final IsisConfiguration configuration) { ensureThatArg(persistenceSessionFactory, is(not(nullValue())), "persistence session factory required"); - - ensureThatArg(adapterFactory, is(not(nullValue())), "adapter factory required"); ensureThatArg(servicesInjector, is(not(nullValue())), "services injector required"); - ensureThatArg(oidGenerator, is(not(nullValue())), "OID generator required"); - ensureThatArg(adapterManager, is(not(nullValue())), "adapter manager required"); + ensureThatArg(objectStore, is(not(nullValue())), "object store required"); // owning, application scope this.persistenceSessionFactory = persistenceSessionFactory; // session scope - this.objectAdapterFactory = adapterFactory; this.servicesInjector = servicesInjector; - this.oidGenerator = oidGenerator; - this.adapterManager = adapterManager; + + this.objectAdapterFactory = new PojoAdapterFactory(); + this.oidGenerator = new OidGenerator(new IdentifierGeneratorUnified(configuration)); + this.adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(configuration)); + this.persistAlgorithm = new PersistAlgorithmUnified(configuration); setState(State.NOT_INITIALIZED); @@ -148,10 +132,6 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To LOG.debug("creating " + this); } - this.persistAlgorithm = new PersistAlgorithmUnified(configuration); - - ensureThatArg(objectStore, is(not(nullValue())), "object store required"); - this.objectStore = objectStore; } http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/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 7c3e2bf..9ab3529 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,14 +21,12 @@ package org.apache.isis.core.runtime.system.persistence; import java.util.List; import org.apache.isis.core.commons.components.ApplicationScopedComponent; -import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner; import org.apache.isis.core.metamodel.services.ServicesInjectorSpi; -import org.apache.isis.core.runtime.persistence.PersistenceSessionFactoryDelegate; import org.apache.isis.core.runtime.system.DeploymentType; /** - * @see PersistenceSessionFactoryDelegate + * @see org.apache.isis.core.runtime.persistence.PersistenceSessionFactoryDelegate */ public interface PersistenceSessionFactory extends MetaModelRefiner, ApplicationScopedComponent { @@ -39,7 +37,6 @@ public interface PersistenceSessionFactory extends MetaModelRefiner, Application // Singleton threadsafe components // ////////////////////////////////////////////////////// - ObjectAdapterFactory getAdapterFactory(); ServicesInjectorSpi getServicesInjector(); http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java index 3c6d792..edccfa1 100644 --- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java +++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusObjectStore.java @@ -31,7 +31,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.isis.applib.services.bookmark.Bookmark; import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer; import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer2; import org.apache.isis.core.commons.config.ConfigurationConstants; @@ -49,6 +48,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; import org.apache.isis.core.runtime.persistence.ObjectNotFoundException; import org.apache.isis.core.runtime.persistence.PojoRefreshException; import org.apache.isis.core.runtime.persistence.UnsupportedFindException; +import org.apache.isis.core.runtime.persistence.adapter.PojoAdapterFactory; import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand; import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand; @@ -122,7 +122,10 @@ public class DataNucleusObjectStore implements ObjectStoreSpi { private TransactionMode transactionMode; - public DataNucleusObjectStore(ObjectAdapterFactory adapterFactory, DataNucleusApplicationComponents applicationComponents) { + public DataNucleusObjectStore( + final DataNucleusApplicationComponents applicationComponents) { + + final ObjectAdapterFactory adapterFactory = new PojoAdapterFactory(); ensureThatArg(adapterFactory, is(notNullValue())); ensureThatArg(applicationComponents, is(notNullValue())); http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/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 9961265..adffadc 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 @@ -27,7 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.isis.core.commons.components.Installer; import org.apache.isis.core.commons.config.IsisConfiguration; -import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; import org.apache.isis.core.metamodel.progmodel.ProgrammingModel; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; @@ -35,7 +34,6 @@ import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorCom import org.apache.isis.core.runtime.installerregistry.installerapi.PersistenceMechanismInstallerAbstract; import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; import org.apache.isis.core.runtime.system.context.IsisContext; -import org.apache.isis.core.runtime.system.persistence.AdapterManagerSpi; import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableAnnotationInJdoApplibFacetFactory; import org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable.AuditableMarkerInterfaceInJdoApplibFacetFactory; import org.apache.isis.objectstore.jdo.metamodel.facets.object.datastoreidentity.JdoDatastoreIdentityAnnotationFacetFactory; @@ -79,37 +77,42 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani private static final String ISIS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; - private DataNucleusApplicationComponents applicationComponents = null; - public DataNucleusPersistenceMechanismInstaller() { super(NAME); } - //////////////////////////////////////////////////////////////////////// - // createObjectStore - //////////////////////////////////////////////////////////////////////// - + //region > createObjectStore + @Override - protected ObjectStoreSpi createObjectStore(IsisConfiguration configuration, ObjectAdapterFactory adapterFactory, AdapterManagerSpi adapterManager) { - createDataNucleusApplicationComponentsIfRequired(configuration); - return new DataNucleusObjectStore(adapterFactory, applicationComponents); + public ObjectStoreSpi createObjectStore(final IsisConfiguration configuration) { + final DataNucleusApplicationComponents applicationComponents = createDataNucleusApplicationComponentsIfRequired(configuration); + return new DataNucleusObjectStore(applicationComponents); } - private void createDataNucleusApplicationComponentsIfRequired(IsisConfiguration configuration) { - // this is, perhaps doing more work than necessary... - // maybe retain the applicationComponents and just tell it to discard its PMF? - // (doubt will make much different in terms of the amount of time to process, though) - if(applicationComponents != null && !applicationComponents.isStale()) { - return; + //endregion + + //region > createDataNucleusApplicationComponentsIfRequired + + private DataNucleusApplicationComponents applicationComponents = null; + + private DataNucleusApplicationComponents createDataNucleusApplicationComponentsIfRequired(IsisConfiguration configuration) { + + if (applicationComponents == null || applicationComponents.isStale()) { + + // this is, perhaps doing more work than necessary... + // maybe retain the applicationComponents and just tell it to discard its PMF? + // (doubt will make much different in terms of the amount of time to process, though) + + final IsisConfiguration dataNucleusConfig = configuration.createSubset(ISIS_CONFIG_PREFIX); + final Map<String, String> props = dataNucleusConfig.asMap(); + addDataNucleusPropertiesIfRequired(props); + + final Set<String> classesToBePersisted = catalogClassesToBePersisted(configuration, getSpecificationLoader().allSpecifications()); + applicationComponents = new DataNucleusApplicationComponents(props, classesToBePersisted); } - - final IsisConfiguration dataNucleusConfig = configuration.createSubset(ISIS_CONFIG_PREFIX); - final Map<String, String> props = dataNucleusConfig.asMap(); - addDataNucleusPropertiesIfRequired(props); - final Set<String> classesToBePersisted = catalogClassesToBePersisted(configuration, getSpecificationLoader().allSpecifications()); - applicationComponents = new DataNucleusApplicationComponents(props, classesToBePersisted); + return applicationComponents; } private static Set<String> catalogClassesToBePersisted(final IsisConfiguration configuration, Collection<ObjectSpecification> objectSpecs) { @@ -178,10 +181,9 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani props.put(key, value); } } + //endregion - //////////////////////////////////////////////////////////////////////// - // PersistenceSessionFactoryDelegate impl - //////////////////////////////////////////////////////////////////////// + //region > PersistenceSessionFactoryDelegate impl @Override @@ -211,14 +213,13 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani metaModelValidator.add(new JdoMetaModelValidator()); } + //endregion + //region > dependencies - //////////////////////////////////////////////////////////////////////// - // Dependencies - //////////////////////////////////////////////////////////////////////// - protected SpecificationLoaderSpi getSpecificationLoader() { return IsisContext.getSpecificationLoader(); } + //endregion } http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java deleted file mode 100644 index 7b6ac68..0000000 --- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.isis.core.runtime.persistence.objectstore; - -import java.util.Collections; -import org.jmock.Expectations; -import org.jmock.Sequence; -import org.jmock.auto.Mock; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.apache.isis.applib.services.audit.AuditingService3; -import org.apache.isis.core.commons.authentication.AuthenticationSession; -import org.apache.isis.core.commons.authentication.MessageBroker; -import org.apache.isis.core.commons.config.IsisConfiguration; -import org.apache.isis.core.commons.matchers.IsisMatchers; -import org.apache.isis.core.metamodel.adapter.ObjectAdapter; -import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; -import org.apache.isis.core.metamodel.adapter.version.Version; -import org.apache.isis.core.metamodel.app.IsisMetaModel; -import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext; -import org.apache.isis.core.metamodel.services.ServicesInjectorDefault; -import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault; -import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; -import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault; -import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter; -import org.apache.isis.core.runtime.persistence.adapter.PojoAdapterFactory; -import org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault; -import org.apache.isis.core.runtime.persistence.adaptermanager.PojoRecreatorUnified; -import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.*; -import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder.Persistence; -import org.apache.isis.core.runtime.system.persistence.*; -import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager; -import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; -import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode; -import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5; - -import static org.hamcrest.CoreMatchers.equalTo; - -public class PersistenceSessionObjectStoreTest { - - @Rule - public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES); - - private ServicesInjectorDefault servicesInjector; - private AdapterManagerSpi adapterManager; - private ObjectAdapterFactory adapterFactory; - - - private PersistenceSession persistenceSession; - private IsisTransactionManager transactionManager; - - private ObjectAdapter persistentAdapter; - private PojoAdapter transientAdapter; - - @Mock - private PersistenceSessionFactory mockPersistenceSessionFactory; - - @Mock - private AuthenticationSession mockAuthenticationSession; - - @Mock - private ObjectStoreSpi mockObjectStore; - @Mock - private AuditingService3 mockAuditingService3; - @Mock - private PublishingServiceWithDefaultPayloadFactories mockPublishingService; - - @Mock - private CreateObjectCommand createObjectCommand; - @Mock - private SaveObjectCommand saveObjectCommand; - @Mock - private DestroyObjectCommand destroyObjectCommand; - - @Mock - private Version mockVersion; - - @Mock - private RuntimeContext mockRuntimeContext; - - @Mock - private IsisConfiguration mockConfiguration; - - @Mock - private MessageBroker mockMessageBroker; - - - private IsisMetaModel isisMetaModel; - - - - public static class Customer { - } - - public static class CustomerRepository { - public Customer x() {return null;} - } - - @Before - public void setUp() throws Exception { - org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF); - - context.ignoring(mockRuntimeContext); - context.ignoring(mockConfiguration); - context.ignoring(mockAuditingService3); - - isisMetaModel = new IsisMetaModel(mockRuntimeContext, new ProgrammingModelFacetsJava5(), new CustomerRepository()); - isisMetaModel.init(); - - context.checking(new Expectations() { - { - ignoring(mockObjectStore).open(); - ignoring(mockObjectStore).close(); - ignoring(mockObjectStore).name(); - ignoring(mockConfiguration); - - ignoring(createObjectCommand); - ignoring(saveObjectCommand); - ignoring(destroyObjectCommand); - ignoring(mockVersion); - - allowing(mockAuthenticationSession).getMessageBroker(); - will(returnValue(mockMessageBroker)); - } - }); - - final RuntimeContextFromSession runtimeContext = new RuntimeContextFromSession(); - final DomainObjectContainerDefault container = new DomainObjectContainerDefault(); - - runtimeContext.injectInto(container); - - servicesInjector = new ServicesInjectorDefault(new InjectorMethodEvaluatorDefault()); - - adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(mockConfiguration)); - adapterFactory = new PojoAdapterFactory(); - persistenceSession = new PersistenceSession(mockPersistenceSessionFactory, adapterFactory, servicesInjector, new OidGenerator(new IdentifierGeneratorDefault()), adapterManager, mockObjectStore, mockConfiguration) { - @Override - protected SpecificationLoaderSpi getSpecificationLoader() { - return isisMetaModel.getSpecificationLoader(); - } - - }; - - servicesInjector.setServices(Collections.<Object>singletonList(container)); - - context.checking(new Expectations(){{ - allowing(mockAuthenticationSession).getUserName(); - will(returnValue("sven")); - }}); - - - transactionManager = new IsisTransactionManager(persistenceSession, mockObjectStore, servicesInjector) { - @Override - public AuthenticationSession getAuthenticationSession() { - return mockAuthenticationSession; - } - }; - persistenceSession.setTransactionManager(transactionManager); - - persistentAdapter = PojoAdapterBuilder.create().withOid("CUS|1").withPojo(new Customer()).with(Persistence.PERSISTENT).with(mockVersion).with(isisMetaModel.getSpecificationLoader()).build(); - transientAdapter = PojoAdapterBuilder.create().withOid("CUS|2").withPojo(new Customer()).with(Persistence.TRANSIENT).with(isisMetaModel.getSpecificationLoader()).build(); - } - - - @Test - public void destroyObjectThenAbort() { - - final Sequence tran = context.sequence("tran"); - context.checking(new Expectations() { - { - one(mockObjectStore).startTransaction(); - inSequence(tran); - - one(mockObjectStore).createDestroyObjectCommand(persistentAdapter); - inSequence(tran); - - one(mockObjectStore).abortTransaction(); - inSequence(tran); - } - }); - - transactionManager.startTransaction(); - persistenceSession.destroyObject(persistentAdapter); - transactionManager.abortTransaction(); - } - - @Test - public void destroyObject_thenCommit() { - - final Sequence tran = context.sequence("tran"); - context.checking(new Expectations() { - { - oneOf(mockObjectStore).startTransaction(); - inSequence(tran); - - oneOf(mockObjectStore).createDestroyObjectCommand(persistentAdapter); - inSequence(tran); - will(returnValue(destroyObjectCommand)); - - oneOf(mockObjectStore).execute(with(IsisMatchers.listContaining((PersistenceCommand)destroyObjectCommand))); - inSequence(tran); - - // second flush after publish - oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); - inSequence(tran); - - // third flush after commands - oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); - inSequence(tran); - - oneOf(mockObjectStore).endTransaction(); - inSequence(tran); - } - - }); - - transactionManager.startTransaction(); - persistenceSession.destroyObject(persistentAdapter); - transactionManager.endTransaction(); - } - - @Test - public void makePersistent_happyCase() { - - final Sequence tran = context.sequence("tran"); - context.checking(new Expectations() { - { - oneOf(mockObjectStore).startTransaction(); - inSequence(tran); - - oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); - inSequence(tran); - // second flush after publish - oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); - inSequence(tran); - // third flush after commands - oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); - inSequence(tran); - - oneOf(mockObjectStore).endTransaction(); - inSequence(tran); - } - }); - - transactionManager.startTransaction(); - persistenceSession.makePersistent(transientAdapter); - transactionManager.endTransaction(); - } -} http://git-wip-us.apache.org/repos/asf/isis/blob/46dc3a48/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 new file mode 100644 index 0000000..2d67115 --- /dev/null +++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java @@ -0,0 +1,268 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.isis.core.runtime.system.persistence; + +import java.util.Collections; +import org.jmock.Expectations; +import org.jmock.Sequence; +import org.jmock.auto.Mock; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.apache.isis.applib.services.audit.AuditingService3; +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.commons.authentication.MessageBroker; +import org.apache.isis.core.commons.config.IsisConfiguration; +import org.apache.isis.core.commons.matchers.IsisMatchers; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory; +import org.apache.isis.core.metamodel.adapter.version.Version; +import org.apache.isis.core.metamodel.app.IsisMetaModel; +import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext; +import org.apache.isis.core.metamodel.services.ServicesInjectorDefault; +import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault; +import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi; +import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault; +import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter; +import org.apache.isis.core.runtime.persistence.adapter.PojoAdapterFactory; +import org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault; +import org.apache.isis.core.runtime.persistence.adaptermanager.PojoRecreatorUnified; +import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession; +import org.apache.isis.core.runtime.persistence.objectstore.ObjectStoreSpi; +import org.apache.isis.core.runtime.persistence.objectstore.transaction.*; +import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder.Persistence; +import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode; +import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5; + +import static org.hamcrest.CoreMatchers.equalTo; + +public class PersistenceSessionTest { + + @Rule + public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES); + + private ServicesInjectorDefault servicesInjector; + private AdapterManagerSpi adapterManager; + private ObjectAdapterFactory adapterFactory; + + + private PersistenceSession persistenceSession; + private IsisTransactionManager transactionManager; + + private ObjectAdapter persistentAdapter; + private PojoAdapter transientAdapter; + + @Mock + private PersistenceSessionFactory mockPersistenceSessionFactory; + + @Mock + private AuthenticationSession mockAuthenticationSession; + + @Mock + private ObjectStoreSpi mockObjectStore; + @Mock + private AuditingService3 mockAuditingService3; + @Mock + private PublishingServiceWithDefaultPayloadFactories mockPublishingService; + + @Mock + private CreateObjectCommand createObjectCommand; + @Mock + private SaveObjectCommand saveObjectCommand; + @Mock + private DestroyObjectCommand destroyObjectCommand; + + @Mock + private Version mockVersion; + + @Mock + private RuntimeContext mockRuntimeContext; + + @Mock + private IsisConfiguration mockConfiguration; + + @Mock + private MessageBroker mockMessageBroker; + + + private IsisMetaModel isisMetaModel; + + + + public static class Customer { + } + + public static class CustomerRepository { + public Customer x() {return null;} + } + + @Before + public void setUp() throws Exception { + org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF); + + context.ignoring(mockRuntimeContext); + context.ignoring(mockConfiguration); + context.ignoring(mockAuditingService3); + + isisMetaModel = new IsisMetaModel(mockRuntimeContext, new ProgrammingModelFacetsJava5(), new CustomerRepository()); + isisMetaModel.init(); + + context.checking(new Expectations() { + { + ignoring(mockObjectStore).open(); + ignoring(mockObjectStore).close(); + ignoring(mockObjectStore).name(); + ignoring(mockConfiguration); + + ignoring(createObjectCommand); + ignoring(saveObjectCommand); + ignoring(destroyObjectCommand); + ignoring(mockVersion); + + allowing(mockAuthenticationSession).getMessageBroker(); + will(returnValue(mockMessageBroker)); + } + }); + + final RuntimeContextFromSession runtimeContext = new RuntimeContextFromSession(); + final DomainObjectContainerDefault container = new DomainObjectContainerDefault(); + + runtimeContext.injectInto(container); + + servicesInjector = new ServicesInjectorDefault(new InjectorMethodEvaluatorDefault()); + + adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(mockConfiguration)); + adapterFactory = new PojoAdapterFactory(); + persistenceSession = new PersistenceSession(mockPersistenceSessionFactory, servicesInjector, mockObjectStore, mockConfiguration) { + @Override + protected SpecificationLoaderSpi getSpecificationLoader() { + return isisMetaModel.getSpecificationLoader(); + } + + }; + + servicesInjector.setServices(Collections.<Object>singletonList(container)); + + context.checking(new Expectations(){{ + allowing(mockAuthenticationSession).getUserName(); + will(returnValue("sven")); + }}); + + + transactionManager = new IsisTransactionManager(persistenceSession, mockObjectStore, servicesInjector) { + @Override + public AuthenticationSession getAuthenticationSession() { + return mockAuthenticationSession; + } + }; + persistenceSession.setTransactionManager(transactionManager); + + persistentAdapter = PojoAdapterBuilder.create().withOid("CUS|1").withPojo(new Customer()).with(Persistence.PERSISTENT).with(mockVersion).with(isisMetaModel.getSpecificationLoader()).build(); + transientAdapter = PojoAdapterBuilder.create().withOid("CUS|2").withPojo(new Customer()).with(Persistence.TRANSIENT).with(isisMetaModel.getSpecificationLoader()).build(); + } + + + @Test + public void destroyObjectThenAbort() { + + final Sequence tran = context.sequence("tran"); + context.checking(new Expectations() { + { + one(mockObjectStore).startTransaction(); + inSequence(tran); + + one(mockObjectStore).createDestroyObjectCommand(persistentAdapter); + inSequence(tran); + + one(mockObjectStore).abortTransaction(); + inSequence(tran); + } + }); + + transactionManager.startTransaction(); + persistenceSession.destroyObject(persistentAdapter); + transactionManager.abortTransaction(); + } + + @Test + public void destroyObject_thenCommit() { + + final Sequence tran = context.sequence("tran"); + context.checking(new Expectations() { + { + oneOf(mockObjectStore).startTransaction(); + inSequence(tran); + + oneOf(mockObjectStore).createDestroyObjectCommand(persistentAdapter); + inSequence(tran); + will(returnValue(destroyObjectCommand)); + + oneOf(mockObjectStore).execute(with(IsisMatchers.listContaining((PersistenceCommand)destroyObjectCommand))); + inSequence(tran); + + // second flush after publish + oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); + inSequence(tran); + + // third flush after commands + oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); + inSequence(tran); + + oneOf(mockObjectStore).endTransaction(); + inSequence(tran); + } + + }); + + transactionManager.startTransaction(); + persistenceSession.destroyObject(persistentAdapter); + transactionManager.endTransaction(); + } + + @Test + public void makePersistent_happyCase() { + + final Sequence tran = context.sequence("tran"); + context.checking(new Expectations() { + { + oneOf(mockObjectStore).startTransaction(); + inSequence(tran); + + oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); + inSequence(tran); + // second flush after publish + oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); + inSequence(tran); + // third flush after commands + oneOf(mockObjectStore).execute(with(equalTo(Collections.<PersistenceCommand>emptyList()))); + inSequence(tran); + + oneOf(mockObjectStore).endTransaction(); + inSequence(tran); + } + }); + + transactionManager.startTransaction(); + persistenceSession.makePersistent(transientAdapter); + transactionManager.endTransaction(); + } +}
