You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/09/04 20:25:45 UTC
[isis] 03/24: ISIS-1976: make ObjectAdapter's Oid final
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git
commit d43ad073227e0911cb8f731ef032723b16a8ba46
Author: a.huber@corax.at <a....@luna>
AuthorDate: Sun Sep 2 18:46:45 2018 +0200
ISIS-1976: make ObjectAdapter's Oid final
---
.../isis/core/metamodel/adapter/ObjectAdapter.java | 19 +-
.../runtime/persistence/adapter/PojoAdapter.java | 26 +--
.../system/persistence/PersistenceSession4.java | 14 +-
.../runtime/persistence/adapter/PojoAdapter.java | 31 +--
.../system/persistence/PersistenceSession5.java | 28 +--
.../adaptermanager/ObjectAdapterContext.java | 227 +++++++++++++++++++++
.../adaptermanager/ObjectAdapterLegacy.java | 190 +----------------
7 files changed, 283 insertions(+), 252 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index ef7cd6a..dc30bb6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -33,6 +33,7 @@ import org.apache.isis.core.commons.lang.MethodUtil;
import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.adapter.version.Version;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -169,11 +170,11 @@ public interface ObjectAdapter extends Instance {
*/
Oid getOid();
- /**
- * Since {@link Oid}s are now immutable, it is the reference from the
- * {@link ObjectAdapter} to its {@link Oid} that must now be updated.
- */
- void replaceOid(Oid persistedOid);
+// /**
+// * Since {@link Oid}s are now immutable, it is the reference from the
+// * {@link ObjectAdapter} to its {@link Oid} that must now be updated.
+// */
+// void replaceOid(Oid persistedOid);
/**
* Returns either itself (if this is a root) or the parented collections, the
@@ -491,5 +492,13 @@ public interface ObjectAdapter extends Instance {
}
}
+ /**
+ *
+ * @param persistedRootOid
+ * @return a copy of this adapter, having a new RootOid
+ * @since 2.0.0-M2
+ */
+ ObjectAdapter withOid(RootOid newOid);
+
}
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index c38b67e..1ed2839 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -19,9 +19,8 @@
package org.apache.isis.core.runtime.persistence.adapter;
-import java.util.Objects;
-
import org.datanucleus.enhancement.Persistable;
+//import org.datanucleus.enhancement.Persistable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +42,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.Specification;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
@@ -53,16 +52,17 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
private final AuthenticationSession authenticationSession;
private final SpecificationLoader specificationLoader;
- private final PersistenceSession4 persistenceSession;
+ private final PersistenceSession persistenceSession;
/**
* can be {@link #replacePojo(Object) replace}d.
*/
private Object pojo;
+
/**
* can be {@link #replaceOid(Oid) replace}d.
*/
- private Oid oid;
+ private final Oid oid;
/**
* only for standalone or parented collections.
@@ -74,7 +74,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
final Oid oid,
final AuthenticationSession authenticationSession,
final SpecificationLoader specificationLoader,
- final PersistenceSession4 persistenceSession) {
+ final PersistenceSession persistenceSession) {
this.persistenceSession = persistenceSession;
this.specificationLoader = specificationLoader;
@@ -130,13 +130,6 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
return oid;
}
- @Override
- public void replaceOid(Oid persistedOid) {
- Objects.requireNonNull(oid); // values have no oid, so cannot be replaced
- this.oid = persistedOid;
- }
-
-
// -- isParentedCollection, isValue
@Override
@@ -149,8 +142,6 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
return oid == null;
}
-
-
// -- isTransient, representsPersistent, isDestroyed
@Override
@@ -438,6 +429,9 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
throw new UnsupportedOperationException();
}
-
+ @Override
+ public ObjectAdapter withOid(RootOid newOid) {
+ return new PojoAdapter(pojo, newOid, authenticationSession, specificationLoader, persistenceSession);
+ }
}
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index fe9d89f..8687011 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -110,8 +110,8 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.Persiste
import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
import org.apache.isis.core.runtime.services.RequestScopedService;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy.ObjectAdapterContext;
import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
@@ -1114,7 +1114,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
public ObjectAdapter getAdapterFor(final Object pojo) {
Objects.requireNonNull(pojo);
- return objectAdapterContext.lookupPojoAdapter(pojo);
+ return objectAdapterContext.lookupAdapterByPojo(pojo);
}
@Override
@@ -1122,7 +1122,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
Objects.requireNonNull(oid);
ensureMapsConsistent(oid);
- return objectAdapterContext.lookupOidAdapter(oid);
+ return objectAdapterContext.lookupAdapterById(oid);
}
@@ -1184,7 +1184,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
private void ensureMapsConsistent(final Oid oid) {
Objects.requireNonNull(oid);
- final ObjectAdapter adapter = objectAdapterContext.lookupOidAdapter(oid);
+ final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
if (adapter == null) {
return;
}
@@ -1194,7 +1194,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
final Object adapterPojo = adapter.getObject();
- final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupPojoAdapter(adapterPojo);
+ final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(adapterPojo);
if(adapterPojo == null) {
// nothing to check
@@ -1205,7 +1205,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
final Oid adapterOid = adapter.getOid();
- final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupOidAdapter(adapterOid);
+ final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterById(adapterOid);
if(adapterOid == null) {
// nothing to check
@@ -1688,7 +1688,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
Assert.assertNotNull(adapter);
final Object pojo = adapter.getObject();
- Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsPojoAdapter(pojo));
+ Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsAdapterForPojo(pojo));
if (LOG.isDebugEnabled()) {
// don't interact with the underlying object because may be a ghost
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index c845737..c2e6958 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -19,7 +19,9 @@
package org.apache.isis.core.runtime.persistence.adapter;
-import java.util.Objects;
+import org.datanucleus.enhancement.Persistable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.exceptions.IsisException;
@@ -39,20 +41,18 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.Specification;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
-import org.datanucleus.enhancement.Persistable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
private final static Logger LOG = LoggerFactory.getLogger(PojoAdapter.class);
- // -- Constructor, fields, finalizer
+ // -- Constructor, fields
private final AuthenticationSession authenticationSession;
private final SpecificationLoader specificationLoader;
- private final PersistenceSession5 persistenceSession;
+ private final PersistenceSession persistenceSession;
/**
* can be {@link #replacePojo(Object) replace}d.
@@ -61,7 +61,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
/**
* can be {@link #replaceOid(Oid) replace}d.
*/
- private Oid oid;
+ private final Oid oid;
/**
* only for standalone or parented collections.
@@ -73,7 +73,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
final Oid oid,
final AuthenticationSession authenticationSession,
final SpecificationLoader specificationLoader,
- final PersistenceSession5 persistenceSession) {
+ final PersistenceSession persistenceSession) {
this.persistenceSession = persistenceSession;
this.specificationLoader = specificationLoader;
@@ -129,11 +129,11 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
return oid;
}
- @Override
- public void replaceOid(Oid persistedOid) {
- Objects.requireNonNull(oid); // values have no oid, so cannot be replaced
- this.oid = persistedOid;
- }
+// @Override
+// public void replaceOid(Oid persistedOid) {
+// Objects.requireNonNull(oid); // values have no oid, so cannot be replaced
+// this.oid = persistedOid;
+// }
// -- isParentedCollection, isValue
@@ -437,6 +437,9 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
throw new UnsupportedOperationException();
}
-
+ @Override
+ public ObjectAdapter withOid(RootOid newOid) {
+ return new PojoAdapter(pojo, newOid, authenticationSession, specificationLoader, persistenceSession);
+ }
}
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 6d5baa6..e72a73c 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -110,8 +110,8 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.Persiste
import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
import org.apache.isis.core.runtime.services.RequestScopedService;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy.ObjectAdapterContext;
import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
@@ -985,18 +985,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
return adapter.isParentedCollection();
}
-
- // -- ObjectPersistor impl
-
- private void makePersistent(final ObjectAdapter adapter) {
- makePersistentInTransaction(adapter);
- }
-
-
- private void remove(final ObjectAdapter adapter) {
- destroyObjectInTransaction(adapter);
- }
-
// -- destroyObjectInTransaction
/**
@@ -1019,8 +1007,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
});
}
-
-
// -- newXxxCommand
/**
* Makes an {@link ObjectAdapter} persistent. The specified object should be
@@ -1112,7 +1098,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
public ObjectAdapter getAdapterFor(final Object pojo) {
Objects.requireNonNull(pojo);
- return objectAdapterContext.lookupPojoAdapter(pojo);
+ return objectAdapterContext.lookupAdapterByPojo(pojo);
}
@Override
@@ -1120,7 +1106,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
Objects.requireNonNull(oid);
ensureMapsConsistent(oid);
- return objectAdapterContext.lookupOidAdapter(oid);
+ return objectAdapterContext.lookupAdapterById(oid);
}
@@ -1182,7 +1168,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
private void ensureMapsConsistent(final Oid oid) {
Objects.requireNonNull(oid);
- final ObjectAdapter adapter = objectAdapterContext.lookupOidAdapter(oid);
+ final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
if (adapter == null) {
return;
}
@@ -1192,7 +1178,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
final Object adapterPojo = adapter.getObject();
- final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupPojoAdapter(adapterPojo);
+ final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(adapterPojo);
if(adapterPojo == null) {
// nothing to check
@@ -1203,7 +1189,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
final Oid adapterOid = adapter.getOid();
- final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupOidAdapter(adapterOid);
+ final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterById(adapterOid);
if(adapterOid == null) {
// nothing to check
@@ -1700,7 +1686,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
Assert.assertNotNull(adapter);
final Object pojo = adapter.getObject();
- Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsPojoAdapter(pojo));
+ Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsAdapterForPojo(pojo));
if (LOG.isDebugEnabled()) {
// don't interact with the underlying object because may be a ghost
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
new file mode 100644
index 0000000..59a6b46
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -0,0 +1,227 @@
+/*
+ * 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.adaptermanager;
+
+import org.apache.isis.core.commons.ensure.IsisAssertException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+public class ObjectAdapterContext {
+ private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
+ private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
+ private final ServicesInjector servicesInjector;
+
+ ObjectAdapterContext(ServicesInjector servicesInjector) {
+ this.servicesInjector = servicesInjector;
+ }
+
+ // -- LIFE-CYCLING
+
+ public void open() {
+ oidAdapterMap.open();
+ pojoAdapterMap.open();
+ }
+
+ public void close() {
+
+ try {
+ oidAdapterMap.close();
+ } catch(final Throwable ex) {
+ // ignore
+ ObjectAdapterLegacy.LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
+ }
+
+ try {
+ pojoAdapterMap.close();
+ } catch(final Throwable ex) {
+ // ignore
+ ObjectAdapterLegacy.LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
+ }
+ }
+
+ public boolean containsAdapterForPojo(Object pojo) {
+ return pojoAdapterMap.containsPojo(pojo);
+ }
+
+ public ObjectAdapter lookupAdapterByPojo(Object pojo) {
+ return pojoAdapterMap.getAdapter(pojo);
+ }
+
+ public ObjectAdapter lookupAdapterById(Oid oid) {
+ return oidAdapterMap.getAdapter(oid);
+ }
+
+ public void removeAdapter(ObjectAdapter adapter) {
+ if(adapter==null) {
+ return; // nothing to do
+ }
+ final Oid oid = adapter.getOid();
+ if (oid != null) { // eg. value objects don't have an Oid
+ oidAdapterMap.remove(oid);
+ }
+ pojoAdapterMap.remove(adapter);
+ }
+
+ // ------------------------------------------------------------------------------------------------
+
+ public void addAdapterHonoringSpecImmutability(Object pojo, ObjectAdapter adapter) {
+ // add all aggregated collections
+ final ObjectSpecification objSpec = adapter.getSpecification();
+ if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
+ pojoAdapterMap.add(pojo, adapter);
+ }
+
+ // order is important - add to pojo map first, then identity map
+ oidAdapterMap.add(adapter.getOid(), adapter);
+ }
+
+ /**
+ * was in PersisenceSessionX, temporarily moved here to successfully compile
+ *
+ * <p>
+ * Note that there is no management of {@link Version}s here. That is
+ * because the {@link PersistenceSession} is expected to manage this.
+ *
+ * @param hintRootOid - allow a different persistent root oid to be provided.
+ * @param session
+ */
+ public void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid, PersistenceSession session) {
+
+ final ObjectAdapter rootAdapter = adapter.getAggregateRoot(); // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway.
+ final RootOid transientRootOid = (RootOid) rootAdapter.getOid();
+
+ final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, session);
+
+ removeFromCache(rootAndCollectionAdapters, transientRootOid);
+
+ // intended for testing (bit nasty)
+ final RootOid persistedRootOid;
+ if(hintRootOid != null) {
+ if(hintRootOid.isTransient()) {
+ throw new IsisAssertException("hintRootOid must be persistent");
+ }
+ final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId();
+ final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId();
+ if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
+ throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " +
+ "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
+ }
+ // ok
+ persistedRootOid = hintRootOid;
+ } else {
+ // normal flow - delegate to OidGenerator to obtain a persistent root oid
+ persistedRootOid = session.createPersistentOrViewModelOid(adapter.getObject());
+ }
+
+ // associate root adapter with the new Oid, and remap
+ if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+ ObjectAdapterLegacy.LOG.debug("replacing root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
+ }
+
+ final ObjectAdapter adapterReplacement = adapter.withOid(persistedRootOid);
+
+ replaceRootAdapter(persistedRootOid, adapterReplacement, rootAndCollectionAdapters);
+
+ if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+ ObjectAdapterLegacy.LOG.debug("made persistent {}; was {}", adapterReplacement, transientRootOid);
+ }
+ }
+
+ private void replaceRootAdapter(
+ final RootOid persistedRootOid,
+ final ObjectAdapter adapterReplacement,
+ final RootAndCollectionAdapters rootAndCollectionAdapters) {
+
+ oidAdapterMap.add(persistedRootOid, adapterReplacement);
+ pojoAdapterMap.add(adapterReplacement.getObject(), adapterReplacement);
+
+ // associate the collection adapters with new Oids, and re-map
+ ObjectAdapterLegacy.LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
+
+ for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
+ final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
+ final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
+ oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
+ }
+
+ // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
+ // proxy equivalent. So, ensure that the collection adapters still wrap the correct pojos.
+ if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+ ObjectAdapterLegacy.LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
+ }
+ for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
+ final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
+
+ final Object collectionPojoWrappedByAdapter = collectionAdapter.getObject();
+ final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapterReplacement);
+
+ if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
+ pojoAdapterMap.remove(collectionAdapter);
+ collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
+ pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
+ }
+ }
+
+ }
+
+ private void removeFromCache(
+ final RootAndCollectionAdapters rootAndCollectionAdapters,
+ final RootOid transientRootOid) {
+ ObjectAdapterLegacy.LOG.debug("remapAsPersistent: {}", transientRootOid);
+ ObjectAdapterLegacy.LOG.debug("removing root adapter from oid map");
+
+ boolean removed = oidAdapterMap.remove(transientRootOid);
+ if (!removed) {
+ ObjectAdapterLegacy.LOG.warn("could not remove oid: {}", transientRootOid);
+ // should we fail here with a more serious error?
+ }
+
+ if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+ ObjectAdapterLegacy.LOG.debug("removing collection adapter(s) from oid map");
+ }
+ for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
+ final Oid collectionOid = collectionAdapter.getOid();
+ removed = oidAdapterMap.remove(collectionOid);
+ if (!removed) {
+ ObjectAdapterLegacy.LOG.warn("could not remove collectionOid: {}", collectionOid);
+ // should we fail here with a more serious error?
+ }
+ }
+ }
+
+ private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
+ final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
+ return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
+ }
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
index 77e21a8..77b8ed1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
@@ -30,13 +30,10 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.commons.internal.exceptions._Exceptions;
import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.ensure.IsisAssertException;
import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.adapter.version.Version;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
@@ -44,7 +41,6 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.Contributed;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -67,7 +63,7 @@ import org.apache.isis.schema.utils.CommonDtoUtils;
*/
public class ObjectAdapterLegacy {
- private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterLegacy.class);
+ static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterLegacy.class);
public static ObjectAdapterContext openContext(ServicesInjector servicesInjector) {
final ObjectAdapterContext objectAdapterContext = new ObjectAdapterContext(servicesInjector);
@@ -79,190 +75,6 @@ public class ObjectAdapterLegacy {
}
- public static class ObjectAdapterContext /*implements AdapterManager*/ {
- private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
- private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
- private final ServicesInjector servicesInjector;
-
- private ObjectAdapterContext(ServicesInjector servicesInjector) {
- this.servicesInjector = servicesInjector;
- }
-
- // -- LIFE-CYCLING
-
- public void open() {
- oidAdapterMap.open();
- pojoAdapterMap.open();
- }
-
- public void close() {
-
- try {
- oidAdapterMap.close();
- } catch(final Throwable ex) {
- // ignore
- LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
- }
-
- try {
- pojoAdapterMap.close();
- } catch(final Throwable ex) {
- // ignore
- LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
- }
- }
-
- public boolean containsPojoAdapter(Object pojo) {
- return pojoAdapterMap.containsPojo(pojo);
- }
-
- public ObjectAdapter lookupPojoAdapter(Object pojo) {
- return pojoAdapterMap.getAdapter(pojo);
- }
-
- public ObjectAdapter lookupOidAdapter(Oid oid) {
- return oidAdapterMap.getAdapter(oid);
- }
-
- public void removeAdapter(ObjectAdapter adapter) {
- final Oid oid = adapter.getOid();
- if (oid != null) {
- oidAdapterMap.remove(oid);
- }
- pojoAdapterMap.remove(adapter);
- }
-
- // ------------------------------------------------------------------------------------------------
-
- public void addAdapterHonoringSpecImmutability(Object pojo, ObjectAdapter adapter) {
- // add all aggregated collections
- final ObjectSpecification objSpec = adapter.getSpecification();
- if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
- pojoAdapterMap.add(pojo, adapter);
- }
-
- // order is important - add to pojo map first, then identity map
- oidAdapterMap.add(adapter.getOid(), adapter);
- }
-
- /**
- * was in PersisenceSessionX, temporarily moved here to successfully compile
- *
- * <p>
- * Note that there is no management of {@link Version}s here. That is
- * because the {@link PersistenceSession5} is expected to manage this.
- *
- * @param hintRootOid - allow a different persistent root oid to be provided.
- * @param session
- */
- public void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid, PersistenceSession session) {
-
- final ObjectAdapter rootAdapter = adapter.getAggregateRoot(); // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway.
- final RootOid transientRootOid = (RootOid) rootAdapter.getOid();
-
- // no longer true, because isTransient now looks directly at the underlying pojo's state (for entities)
- // and doesn't apply for services.
- // Ensure.ensureThatArg(rootAdapter.isTransient(), is(true), "root adapter should be transient; oid:" + transientRootOid);
- // Ensure.ensureThatArg(transientRootOid.isTransient(), is(true), "root adapter's OID should be transient; oid:" + transientRootOid);
-
- final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, session);
-
- LOG.debug("remapAsPersistent: {}", transientRootOid);
- LOG.debug("removing root adapter from oid map");
-
- boolean removed = oidAdapterMap.remove(transientRootOid);
- if (!removed) {
- LOG.warn("could not remove oid: {}", transientRootOid);
- // should we fail here with a more serious error?
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("removing collection adapter(s) from oid map");
- }
- for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
- final Oid collectionOid = collectionAdapter.getOid();
- removed = oidAdapterMap.remove(collectionOid);
- if (!removed) {
- LOG.warn("could not remove collectionOid: {}", collectionOid);
- // should we fail here with a more serious error?
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("updating the Oid");
- }
-
- // intended for testing (bit nasty)
- final RootOid persistedRootOid;
- if(hintRootOid != null) {
- if(hintRootOid.isTransient()) {
- throw new IsisAssertException("hintRootOid must be persistent");
- }
- final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId();
- final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId();
- if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
- throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " +
- "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
- }
- // ok
- persistedRootOid = hintRootOid;
- } else {
- // normal flow - delegate to OidGenerator to obtain a persistent root oid
- persistedRootOid = session.createPersistentOrViewModelOid(adapter.getObject());
- }
-
- // associate root adapter with the new Oid, and remap
- if (LOG.isDebugEnabled()) {
- LOG.debug("replacing Oid for root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
- }
- adapter.replaceOid(persistedRootOid);
- oidAdapterMap.add(persistedRootOid, adapter);
-
- // associate the collection adapters with new Oids, and re-map
- if (LOG.isDebugEnabled()) {
- LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
- }
- for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
- final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
- final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
- oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
- }
-
-
- // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
- // proxy equivalent. So, ensure that the collection adapters still wrap the correct pojos.
- if (LOG.isDebugEnabled()) {
- LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
- }
- for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
- final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
-
- final Object collectionPojoWrappedByAdapter = collectionAdapter.getObject();
- final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapter);
-
- if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
- pojoAdapterMap.remove(collectionAdapter);
- collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
- pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("made persistent {}; was {}", adapter, transientRootOid);
- }
- }
-
- private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
- final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
- return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
- }
-
-
-
-
-
- }
-
// -- CommandExecutorServiceDefault --------------------------------------------------------
public static class __CommandExecutorServiceDefault {