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 2020/03/25 09:35:44 UTC
[isis] branch master updated (d935c4a -> 5dca8ce)
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.
from d935c4a ISIS-2327: use popover label for object reference tooltips
new f50f78c ISIS-2327: extend _Timing to allow use of System.currentMillis
new 5dca8ce ISIS-2330: implement ObjectBulkLoader to decouple f. PersistenceSession
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../isis/core/commons/internal/base/_Lazy.java | 8 ++
.../core/commons/internal/base/_Lazy_Simple.java | 13 ++-
.../commons/internal/base/_Lazy_ThreadSafe.java | 15 ++-
.../isis/core/commons/internal/base/_Timing.java | 5 +
.../facets/object/entity/EntityFacet.java | 7 +-
.../metamodel/objectmanager/ObjectManager.java | 9 ++
.../objectmanager/ObjectManagerDefault.java | 9 +-
.../load/ObjectLoader_builtinHandlers.java | 7 +-
.../ObjectBulkLoader.java} | 27 ++---
.../query/ObjectBulkLoader_builtinHandlers.java | 128 +++++++++++++++++++++
.../isis/core/metamodel/spec/ManagedObject.java | 40 ++++++-
.../isis/core/runtime/context/IsisContext.java | 15 +--
.../isis/core/runtime/iactn/IsisInteraction.java | 4 +-
.../persistence/session/PersistenceSession.java | 4 -
.../command/CommandExecutorServiceDefault.java | 40 ++-----
.../repository/RepositoryServiceDefault.java | 25 ++--
...trappingTest.java => JpaBootstrappingTest.java} | 79 ++++++++-----
.../UnstableJpaBootstrappingTest.java | 77 -------------
.../JdoPersistenceCapableFacetImpl.java | 16 ++-
.../persistence/IsisPersistenceSessionJdoBase.java | 10 --
.../persistence/PersistenceSession5.java | 2 -
.../context/ResourceContext_getArg_Test.java | 20 ++--
.../ajaxtable/IsisAjaxNavigationToolbar.java | 7 +-
.../ajaxtable/IsisTotalRecordsToolbar.java | 8 +-
.../ajaxtable/PrototypingMessageProvider.java | 25 +++-
.../wicket/ui/panels/FormExecutorDefault.java | 6 +-
26 files changed, 362 insertions(+), 244 deletions(-)
copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/{load/ObjectLoader.java => query/ObjectBulkLoader.java} (71%)
create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java
copy examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/{JdoBootstrappingTest.java => JpaBootstrappingTest.java} (56%)
delete mode 100644 examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/UnstableJpaBootstrappingTest.java
[isis] 01/02: ISIS-2327: extend _Timing to allow use of
System.currentMillis
Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit f50f78cc2d25fc5e38e1eece4a37e3ffff4536dd
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 25 09:26:32 2020 +0100
ISIS-2327: extend _Timing to allow use of System.currentMillis
---
.../java/org/apache/isis/core/commons/internal/base/_Timing.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Timing.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Timing.java
index 1de50af..2f160f4 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Timing.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Timing.java
@@ -57,6 +57,11 @@ public final class _Timing {
}
+ public static StopWatch atSystemMillis(long startedAtSystemMillis) {
+ return atSystemNanos(startedAtSystemMillis * 1_000_000L);
+ }
+
+
/**
* Non thread safe start/stop watch utilizing the currently running
* JVM's high-resolution time source.
[isis] 02/02: ISIS-2330: implement ObjectBulkLoader to decouple f.
PersistenceSession
Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 5dca8cef317d5a02f074f83f8cc8bdae09fff222
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 25 10:35:30 2020 +0100
ISIS-2330: implement ObjectBulkLoader to decouple f. PersistenceSession
---
.../isis/core/commons/internal/base/_Lazy.java | 8 ++
.../core/commons/internal/base/_Lazy_Simple.java | 13 +-
.../commons/internal/base/_Lazy_ThreadSafe.java | 15 +-
.../facets/object/entity/EntityFacet.java | 7 +-
.../metamodel/objectmanager/ObjectManager.java | 9 ++
.../objectmanager/ObjectManagerDefault.java | 9 +-
.../load/ObjectLoader_builtinHandlers.java | 7 +-
.../objectmanager/query/ObjectBulkLoader.java | 77 +++++++++++
.../query/ObjectBulkLoader_builtinHandlers.java | 128 +++++++++++++++++
.../isis/core/metamodel/spec/ManagedObject.java | 40 +++++-
.../isis/core/runtime/context/IsisContext.java | 15 +-
.../isis/core/runtime/iactn/IsisInteraction.java | 4 +-
.../persistence/session/PersistenceSession.java | 4 -
.../command/CommandExecutorServiceDefault.java | 40 ++----
.../repository/RepositoryServiceDefault.java | 25 ++--
.../bootstrapping/JpaBootstrappingTest.java | 151 +++++++++++++++++++++
.../UnstableJpaBootstrappingTest.java | 77 -----------
.../JdoPersistenceCapableFacetImpl.java | 16 ++-
.../persistence/IsisPersistenceSessionJdoBase.java | 10 --
.../persistence/PersistenceSession5.java | 2 -
.../context/ResourceContext_getArg_Test.java | 20 ++-
.../ajaxtable/IsisAjaxNavigationToolbar.java | 7 +-
.../ajaxtable/IsisTotalRecordsToolbar.java | 8 +-
.../ajaxtable/PrototypingMessageProvider.java | 25 +++-
.../wicket/ui/panels/FormExecutorDefault.java | 6 +-
25 files changed, 523 insertions(+), 200 deletions(-)
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy.java
index 526d739..07fcf34 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy.java
@@ -57,6 +57,14 @@ public interface _Lazy<T> extends Supplier<T> {
*/
@Override
public T get();
+
+ /**
+ * Sets the memoized value, if not already memoized.
+ * @param value
+ * @throws IllegalStateException if already memoized
+ */
+ public void set(T value);
+
// -- FACTORIES
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_Simple.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_Simple.java
index 8010bcc..e602fc7 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_Simple.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_Simple.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.commons.internal.base;
import java.util.function.Supplier;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+
import static org.apache.isis.core.commons.internal.base._With.requires;
/**
@@ -53,8 +55,17 @@ final class _Lazy_Simple<T> implements _Lazy<T> {
if(memoized) {
return value;
}
- memoized=true;
+ memoized = true;
return value = supplier.get();
}
+ @Override
+ public void set(T value) {
+ if(memoized) {
+ throw _Exceptions.illegalState("cannot set value '%s' on Lazy that has already memoized a value", ""+value);
+ }
+ memoized = true;
+ this.value = value;
+ }
+
}
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_ThreadSafe.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_ThreadSafe.java
index f1de3c2..260950b 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_ThreadSafe.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/base/_Lazy_ThreadSafe.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.commons.internal.base;
import java.util.function.Supplier;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+
import static org.apache.isis.core.commons.internal.base._With.requires;
/**
@@ -58,9 +60,20 @@ final class _Lazy_ThreadSafe<T> implements _Lazy<T> {
if(memoized) {
return value;
}
- memoized=true;
+ memoized = true;
return value = supplier.get();
}
}
+
+ @Override
+ public void set(T value) {
+ synchronized (this) {
+ if(memoized) {
+ throw _Exceptions.illegalState("cannot set value '%s' on Lazy that has already memoized a value", ""+value);
+ }
+ memoized = true;
+ this.value = value;
+ }
+ }
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
index c08da10..4634cf6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
@@ -21,8 +21,11 @@ package org.apache.isis.core.metamodel.facets.object.entity;
import java.lang.reflect.Method;
+import org.apache.isis.applib.query.Query;
import org.apache.isis.applib.services.repository.EntityState;
+import org.apache.isis.core.commons.collections.Can;
import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
/**
@@ -33,7 +36,8 @@ public interface EntityFacet extends Facet {
String identifierFor(ObjectSpecification spec, Object pojo);
- Object fetchByIdentifier(ObjectSpecification spec, String identifier);
+ ManagedObject fetchByIdentifier(ObjectSpecification spec, String identifier);
+ Can<ManagedObject> fetchByQuery(ObjectSpecification spec, Query<?> query);
void persist(ObjectSpecification spec, Object pojo);
@@ -51,4 +55,5 @@ public interface EntityFacet extends Facet {
boolean isProxyEnhancement(Method method);
<T> T detach(T pojo);
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
index 70d582c..003099e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
@@ -20,12 +20,14 @@ package org.apache.isis.core.metamodel.objectmanager;
import javax.annotation.Nullable;
+import org.apache.isis.core.commons.collections.Can;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.context.MetaModelContext;
import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
import org.apache.isis.core.metamodel.objectmanager.detach.ObjectDetacher;
import org.apache.isis.core.metamodel.objectmanager.identify.ObjectIdentifier;
import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
import org.apache.isis.core.metamodel.objectmanager.refresh.ObjectRefresher;
import org.apache.isis.core.metamodel.spec.ManagedObject;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -45,6 +47,7 @@ public interface ObjectManager {
ObjectCreator getObjectCreator();
ObjectLoader getObjectLoader();
+ ObjectBulkLoader getObjectBulkLoader();
ObjectIdentifier getObjectIdentifier();
ObjectRefresher getObjectRefresher();
ObjectDetacher getObjectDetacher();
@@ -69,6 +72,10 @@ public interface ObjectManager {
return getObjectLoader().loadObject(objectLoadRequest);
}
+ public default Can<ManagedObject> queryObjects(ObjectBulkLoader.Request objectQuery) {
+ return getObjectBulkLoader().loadObject(objectQuery);
+ }
+
/**
* Returns an object identifier for the instance.
* @param managedObject
@@ -105,5 +112,7 @@ public interface ObjectManager {
default ObjectSpecification loadSpecification(@Nullable final Class<?> domainType) {
return getMetaModelContext().getSpecificationLoader().loadSpecification(domainType);
}
+
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java
index 9e8b9cc..be2f233 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java
@@ -33,6 +33,7 @@ import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
import org.apache.isis.core.metamodel.objectmanager.detach.ObjectDetacher;
import org.apache.isis.core.metamodel.objectmanager.identify.ObjectIdentifier;
import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
import org.apache.isis.core.metamodel.objectmanager.refresh.ObjectRefresher;
import lombok.Getter;
@@ -53,6 +54,7 @@ public class ObjectManagerDefault implements ObjectManager {
@Inject @Getter(onMethod = @__(@Override)) private MetaModelContext metaModelContext;
@Getter(onMethod = @__(@Override)) private ObjectLoader objectLoader;
+ @Getter(onMethod = @__(@Override)) private ObjectBulkLoader objectBulkLoader;
@Getter(onMethod = @__(@Override)) private ObjectCreator objectCreator;
@Getter(onMethod = @__(@Override)) private ObjectIdentifier objectIdentifier;
@Getter(onMethod = @__(@Override)) private ObjectRefresher objectRefresher;
@@ -62,6 +64,7 @@ public class ObjectManagerDefault implements ObjectManager {
public void init() {
objectCreator = ObjectCreator.createDefault(metaModelContext);
objectLoader = ObjectLoader.createDefault(metaModelContext);
+ objectBulkLoader = ObjectBulkLoader.createDefault(metaModelContext);
objectIdentifier = ObjectIdentifier.createDefault();
objectRefresher = ObjectRefresher.createDefault();
objectDetacher = ObjectDetacher.createDefault(metaModelContext);
@@ -76,9 +79,5 @@ public class ObjectManagerDefault implements ObjectManager {
objectManager.init();
return objectManager;
}
-
- @Override
- public ObjectDetacher getObjectDetacher() {
- return objectDetacher;
- }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
index 6efc2ad..fe534ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
@@ -221,11 +221,12 @@ final class ObjectLoader_builtinHandlers {
}
val identifier = objectLoadRequest.getObjectIdentifier();
- val entityPojo = entityFacet.fetchByIdentifier(spec, identifier);
+ val entity = entityFacet.fetchByIdentifier(spec, identifier);
- metaModelContext.getServiceInjector().injectServicesInto(entityPojo);
+ //TODO injection should have already be done by DataNucleus
+ metaModelContext.getServiceInjector().injectServicesInto(entity.getPojo());
- return ManagedObject.of(spec, entityPojo);
+ return entity;
}
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader.java
new file mode 100644
index 0000000..51e8c43
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader.java
@@ -0,0 +1,77 @@
+/*
+ * 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.metamodel.objectmanager.query;
+
+import org.apache.isis.applib.query.Query;
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.handler.ChainOfResponsibility;
+import org.apache.isis.core.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.context.MetaModelContextAware;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+import lombok.Value;
+import lombok.val;
+
+/**
+ * @since 2.0
+ */
+public interface ObjectBulkLoader {
+
+ Can<ManagedObject> loadObject(Request objectQuery);
+
+ // -- REQUEST (VALUE) TYPE
+
+ @Value(staticConstructor = "of")
+ public static class Request {
+ ObjectSpecification objectSpecification;
+ Query<?> query;
+ }
+
+ // -- HANDLER
+
+ static interface Handler
+ extends
+ MetaModelContextAware,
+ ChainOfResponsibility.Handler<ObjectBulkLoader.Request, Can<ManagedObject>> {
+ }
+
+ // -- FACTORY
+
+ public static ObjectBulkLoader createDefault(MetaModelContext metaModelContext) {
+
+ val chainOfHandlers = _Lists.of(
+ new ObjectBulkLoader_builtinHandlers.GuardAgainstNull(),
+ new ObjectBulkLoader_builtinHandlers.BulkLoadEntity(),
+ new ObjectBulkLoader_builtinHandlers.LoadOther());
+
+ chainOfHandlers.forEach(h->h.setMetaModelContext(metaModelContext));
+
+ val chainOfRespo = ChainOfResponsibility.of(chainOfHandlers);
+
+ return request -> chainOfRespo
+ .handle(request)
+ .orElseThrow(()->_Exceptions.unrecoverableFormatted(
+ "ObjectBulkLoader failed to handle request %s", request));
+ }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java
new file mode 100644
index 0000000..33c64d1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java
@@ -0,0 +1,128 @@
+/*
+ * 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.metamodel.objectmanager.query;
+
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+
+import lombok.Data;
+import lombok.val;
+
+/**
+ *
+ * @since 2.0
+ *
+ */
+final class ObjectBulkLoader_builtinHandlers {
+
+ // -- NULL GUARD
+
+ @Data
+ public static class GuardAgainstNull implements ObjectBulkLoader.Handler {
+
+ private MetaModelContext metaModelContext;
+
+ @Override
+ public boolean isHandling(ObjectBulkLoader.Request objectQuery) {
+
+ if(objectQuery==null) {
+ return true;
+ }
+
+ val spec = objectQuery.getObjectSpecification();
+ if(spec == null) {
+ // eg "NONEXISTENT:123"
+ return true;
+ }
+
+ // we don't guard against the identifier being null, because, this is ok
+ // for services and values
+ return false;
+ }
+
+ @Override
+ public Can<ManagedObject> handle(ObjectBulkLoader.Request objectQuery) {
+ return Can.empty();
+ }
+
+ }
+
+ // -- ENTITIES
+
+ @Data
+ public static class BulkLoadEntity implements ObjectBulkLoader.Handler {
+
+ private MetaModelContext metaModelContext;
+
+ @Override
+ public boolean isHandling(ObjectBulkLoader.Request objectQuery) {
+
+ val spec = objectQuery.getObjectSpecification();
+ return spec.isEntity();
+ }
+
+ @Override
+ public Can<ManagedObject> handle(ObjectBulkLoader.Request objectQuery) {
+
+ val spec = objectQuery.getObjectSpecification();
+ val entityFacet = spec.getFacet(EntityFacet.class);
+ if(entityFacet==null) {
+ throw _Exceptions.illegalArgument(
+ "ObjectSpecification is missing an EntityFacet: %s", spec);
+ }
+
+ val entities = entityFacet.fetchByQuery(spec, objectQuery.getQuery());
+ val serviceInjector = metaModelContext.getServiceInjector();
+
+ //TODO injection should have already be done by DataNucleus
+ entities.forEach(serviceInjector::injectServicesInto);
+ return entities;
+ }
+
+ }
+
+ // -- UNKNOWN LOAD REQUEST
+
+ @Data
+ public static class LoadOther implements ObjectBulkLoader.Handler {
+
+ private MetaModelContext metaModelContext;
+
+ @Override
+ public boolean isHandling(ObjectBulkLoader.Request objectQuery) {
+ return true; // the last handler in the chain
+ }
+
+ @Override
+ public Can<ManagedObject> handle(ObjectBulkLoader.Request objectQuery) {
+
+ // unknown object load request
+
+ throw _Exceptions.illegalArgument(
+ "unknown bulk object load request, loader: %s loading ObjectSpecification %s",
+ this.getClass().getName(), objectQuery.getObjectSpecification());
+
+ }
+
+ }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index ffbfad5..f0b64cb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -162,11 +162,30 @@ public interface ManagedObject {
@EqualsAndHashCode(of = "pojo")
@ToString(of = {"specification", "pojo"}) //ISIS-2317 make sure toString() is without side-effects
static final class SimpleManagedObject implements ManagedObject {
+
+ public static ManagedObject identified(
+ @NonNull final ObjectSpecification spec,
+ final Object pojo,
+ @NonNull final RootOid rootOid) {
+ val managedObject = SimpleManagedObject.of(spec, pojo);
+ managedObject.rootOidLazy.set(Optional.of(rootOid));
+ return managedObject;
+ }
+
@NonNull private final ObjectSpecification specification;
@NonNull private final Object pojo;
+
+ public Optional<RootOid> getRootOid() {
+ return rootOidLazy.get();
+ }
+
+ // -- LAZY ID HANDLING
+ private final _Lazy<Optional<RootOid>> rootOidLazy = _Lazy.threadSafe(this::identify);
+ private Optional<RootOid> identify() {
+ return Optional.ofNullable(ManagedObjectInternalUtil._identify(this));
+ }
+
- @Getter(lazy=true, onMethod = @__(@Override))
- private final Optional<RootOid> rootOid = Optional.ofNullable(ManagedObjectInternalUtil._identify(this));
}
// -- LAZY
@@ -325,6 +344,21 @@ public interface ManagedObject {
}
return new SimpleManagedObject(specification, pojo);
}
+
+ /**
+ * Optimized for cases, when the pojo's specification and rootOid are already available.
+ */
+ public static ManagedObject identified(ObjectSpecification specification, Object pojo, RootOid rootOid) {
+ if(!specification.getCorrespondingClass().isAssignableFrom(pojo.getClass())) {
+ throw _Exceptions.illegalArgument(
+ "Pojo not compatible with ObjectSpecification, " +
+ "objectSpec.correspondingClass = %s, " +
+ "pojo.getClass() = %s, " +
+ "pojo.toString() = %s",
+ specification.getCorrespondingClass(), pojo.getClass(), pojo.toString());
+ }
+ return SimpleManagedObject.identified(specification, pojo, rootOid);
+ }
/**
* For cases, when the pojo's specification is not available and needs to be looked up.
@@ -872,4 +906,6 @@ public interface ManagedObject {
+
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/context/IsisContext.java
index cd042c7..a822a13 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/context/IsisContext.java
@@ -18,7 +18,6 @@
*/
package org.apache.isis.core.runtime.context;
-import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
@@ -57,19 +56,13 @@ public interface IsisContext {
return CompletableFuture.supplyAsync(computation);
}
-
// -- DEPRECATIONS
- /**
- * FIXME[2058] generally there might be multiple persistence contexts,
- * so entity management must be delegated to the ObjectManager, which
- * handles persistence of entities individually according to their object-spec
- * @return framework's currently resolvable PersistenceSessions
- */
@Deprecated
- public static Optional<PersistenceSession> getPersistenceSession() {
- return PersistenceSession.current(PersistenceSession.class)
- .getFirst();
+ public static void flush() {
+ PersistenceSession.current(PersistenceSession.class)
+ .stream()
+ .forEach(ps->ps.flush());
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/iactn/IsisInteraction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/iactn/IsisInteraction.java
index 30fd88a..8e725e5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/iactn/IsisInteraction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/iactn/IsisInteraction.java
@@ -30,7 +30,6 @@ import org.apache.isis.core.commons.internal.exceptions._Exceptions;
import org.apache.isis.core.metamodel.commons.ToString;
import org.apache.isis.core.metamodel.context.MetaModelContext;
import org.apache.isis.core.runtime.context.session.RuntimeContextBase;
-import org.apache.isis.core.runtime.persistence.session.PersistenceSession;
import org.apache.isis.core.security.authentication.AuthenticationSession;
import lombok.Getter;
@@ -44,6 +43,7 @@ import lombok.NonNull;
public class IsisInteraction extends RuntimeContextBase {
@Getter private final AuthenticationSession authenticationSession;
+ @Getter private final long lifecycleStartedAtSystemMillis;
public IsisInteraction(
@NonNull final MetaModelContext mmc,
@@ -51,6 +51,7 @@ public class IsisInteraction extends RuntimeContextBase {
super(mmc);
this.authenticationSession = authenticationSession; // binds this session to given authenticationSession
+ this.lifecycleStartedAtSystemMillis = System.currentTimeMillis(); // used to measure time periods, so not using ClockService here
}
// -- FLUSH
@@ -118,7 +119,6 @@ public class IsisInteraction extends RuntimeContextBase {
@Override
public String toString() {
final ToString asString = new ToString(this);
- asString.append("persistenceSession", PersistenceSession.current(PersistenceSession.class));
asString.append("transaction", getCurrentTransactionId());
return asString.toString();
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java
index 4743cd6..ac255f4 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java
@@ -115,10 +115,6 @@ public interface PersistenceSession {
*/
void makePersistentInTransaction(ManagedObject adapter);
- // -- OTHERS
-
- long getLifecycleStartedAtSystemNanos();
-
// -- LOOKUP
static <T extends PersistenceSession> Can<T> current(Class<T> requiredType) {
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index 829f722..3902118 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -65,7 +65,6 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.iactn.IsisInteraction;
import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
import org.apache.isis.core.runtime.iactn.IsisInteractionTracker;
-import org.apache.isis.core.runtime.persistence.session.PersistenceSession;
import org.apache.isis.schema.cmd.v2.ActionDto;
import org.apache.isis.schema.cmd.v2.CommandDto;
import org.apache.isis.schema.cmd.v2.MemberDto;
@@ -77,6 +76,7 @@ import org.apache.isis.schema.common.v2.OidDto;
import org.apache.isis.schema.common.v2.OidsDto;
import org.apache.isis.schema.common.v2.ValueWithTypeDto;
+import lombok.Getter;
import lombok.val;
import lombok.extern.log4j.Log4j2;
@@ -91,6 +91,16 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
private static final Pattern ID_PARSER =
Pattern.compile("(?<className>[^#]+)#?(?<localId>[^(]+)(?<args>[(][^)]*[)])?");
+ @Inject private BookmarkService bookmarkService;
+ @Inject private SudoService sudoService;
+ @Inject private ClockService clockService;
+ @Inject private TransactionService transactionService;
+ @Inject private IsisInteractionTracker isisInteractionTracker;
+ @Inject private javax.inject.Provider<InteractionContext> interactionContextProvider;
+
+ @Inject @Getter private IsisInteractionFactory isisInteractionFactory;
+ @Inject @Getter private SpecificationLoader specificationLoader;
+
@Override
public void executeCommand(
final CommandExecutorService.SudoPolicy sudoPolicy,
@@ -377,32 +387,4 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
}
- // //////////////////////////////////////
-
- protected IsisInteractionFactory getIsisInteractionFactory() {
- return isisInteractionFactory;
- }
-
- protected PersistenceSession getPersistenceSession() {
- return PersistenceSession.current(PersistenceSession.class)
- .getFirst()
- .orElse(null);
- }
-
- protected SpecificationLoader getSpecificationLoader() {
- return specificationLoader;
- }
-
- // -- DEPENDENCIES
-
- @Inject BookmarkService bookmarkService;
- @Inject SudoService sudoService;
- @Inject ClockService clockService;
- @Inject TransactionService transactionService;
- @Inject SpecificationLoader specificationLoader;
- @Inject IsisInteractionFactory isisInteractionFactory;
- @Inject IsisInteractionTracker isisInteractionTracker;
-
- @Inject private javax.inject.Provider<InteractionContext> interactionContextProvider;
-
}
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
index c343c61..8c63d81 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
@@ -35,10 +35,8 @@ import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;
-import org.apache.isis.applib.NonRecoverableException;
import org.apache.isis.applib.PersistFailedException;
import org.apache.isis.applib.RepositoryException;
-import org.apache.isis.applib.annotation.IsisInteractionScope;
import org.apache.isis.applib.annotation.OrderPrecedence;
import org.apache.isis.applib.query.Query;
import org.apache.isis.applib.query.QueryFindAllInstances;
@@ -51,19 +49,17 @@ import org.apache.isis.core.commons.internal.base._Casts;
import org.apache.isis.core.commons.internal.base._NullSafe;
import org.apache.isis.core.config.IsisConfiguration;
import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
-import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.runtime.persistence.session.PersistenceSession;
import lombok.val;
-import lombok.extern.log4j.Log4j2;
@Repository
@Named("isisRuntimeServices.RepositoryServiceDefault")
@Order(OrderPrecedence.EARLY)
@Primary
@Qualifier("Default")
-@Log4j2
+//@Log4j2
public class RepositoryServiceDefault implements RepositoryService {
@Inject private FactoryService factoryService;
@@ -170,7 +166,12 @@ public class RepositoryServiceDefault implements RepositoryService {
}
<T> List<T> submitQuery(final Query<T> query) {
- val allMatching = getPersistenceSession().allMatchingQuery(query);
+ val resultTypeSpec = objectManager.getMetaModelContext()
+ .getSpecificationLoader()
+ .loadSpecification(query.getResultType());
+
+ val queryRequest = ObjectBulkLoader.Request.of(resultTypeSpec, query);
+ val allMatching = objectManager.queryObjects(queryRequest);
return _Casts.uncheckedCast(ManagedObject.unwrapMultipleAsList(allMatching));
}
@@ -210,14 +211,14 @@ public class RepositoryServiceDefault implements RepositoryService {
public <T> T refresh(T pojo) {
val managedObject = objectManager.adapt(pojo);
objectManager.getObjectRefresher().refreshObject(managedObject);
- return (T) managedObject.getPojo();
+ return _Casts.uncheckedCast(managedObject.getPojo());
}
@Override
public <T> T detach(T entity) {
val managedObject = objectManager.adapt(entity);
val managedDetachedObject = objectManager.getObjectDetacher().detachObject(managedObject);
- return (T)managedDetachedObject.getPojo();
+ return _Casts.uncheckedCast(managedDetachedObject.getPojo());
}
// -- HELPER
@@ -231,12 +232,6 @@ public class RepositoryServiceDefault implements RepositoryService {
private Object unwrapped(Object domainObject) {
return wrapperFactory != null ? wrapperFactory.unwrap(domainObject) : domainObject;
}
-
- protected PersistenceSession getPersistenceSession() {
- return PersistenceSession.current(PersistenceSession.class)
- .getFirst()
- .orElseThrow(()->new NonRecoverableException("No IsisInteraction on current thread."));
- }
}
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JpaBootstrappingTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JpaBootstrappingTest.java
new file mode 100644
index 0000000..155868e
--- /dev/null
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/JpaBootstrappingTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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.testdomain.bootstrapping;
+
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.Transactional;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.core.config.presets.IsisPresets;
+import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
+import org.apache.isis.testdomain.Incubating;
+import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.conf.Configuration_usingJpa;
+import org.apache.isis.testdomain.jpa.entities.JpaBook;
+import org.apache.isis.testdomain.jpa.entities.JpaInventory;
+import org.apache.isis.testdomain.jpa.entities.JpaProduct;
+
+import lombok.val;
+
+@Smoketest
+@SpringBootTest(
+ classes = {
+ Configuration_usingJpa.class,
+ }
+)
+@TestPropertySource(IsisPresets.UseLog4j2Test)
+@Transactional @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+@Incubating("JPA support is under construction")
+class JpaBootstrappingTest /*extends IsisIntegrationTestAbstract*/ {
+
+ @Inject private Optional<PlatformTransactionManager> platformTransactionManager;
+ @Inject private RepositoryService repository;
+ @Inject private IsisInteractionFactory isisInteractionFactory;
+ //@Inject private TransactionService transactionService;
+
+ @BeforeAll
+ static void beforeAll() throws SQLException {
+ // launch H2Console for troubleshooting ...
+ // Util_H2Console.main(null);
+ }
+
+ @AfterAll
+ static void afterAll() throws SQLException {
+ }
+
+ void cleanUp() {
+
+ repository.allInstances(JpaInventory.class).forEach(repository::remove);
+ repository.allInstances(JpaBook.class).forEach(repository::remove);
+ repository.allInstances(JpaProduct.class).forEach(repository::remove);
+ System.out.println("!!! CLEANUP DONE");
+ }
+
+ void setUp() {
+
+ // setup sample Inventory
+ Set<JpaProduct> products = new HashSet<>();
+
+ products.add(JpaBook.of("Sample Book", "A sample book for testing.", 99., "Sample Author", "Sample ISBN",
+ "Sample Publisher"));
+
+ val inventory = JpaInventory.of("Sample Inventory", products);
+ repository.persist(inventory);
+
+ System.out.println("!!! SETUP DONE");
+ }
+
+ @Test @Order(0)
+ void platformTransactionManager_shouldBeAvailable() {
+ assertTrue(platformTransactionManager.isPresent());
+ }
+
+ @Test @Order(1) @Rollback(false)
+ void sampleInventoryShouldBeSetUp() {
+
+ isisInteractionFactory.runAnonymous(()->{
+
+ // given - expected pre condition: no inventories
+
+ cleanUp();
+ assertEquals(0, repository.allInstances(JpaInventory.class).size());
+ System.out.println("!!! VERIFY CLEANUP DONE");
+
+ // when
+
+ setUp();
+
+ // then - expected post condition: ONE inventory
+
+ val inventories = repository.allInstances(JpaInventory.class);
+ assertEquals(1, inventories.size());
+
+ val inventory = inventories.get(0);
+ assertNotNull(inventory);
+ assertNotNull(inventory.getProducts());
+ assertEquals(1, inventory.getProducts().size());
+
+ val product = inventory.getProducts().iterator().next();
+ assertEquals("Sample Book", product.getName());
+
+ });
+
+
+
+ }
+
+ @Test @Order(2) @Rollback(false)
+ void aSecondRunShouldWorkAsWell() {
+ sampleInventoryShouldBeSetUp();
+ }
+
+
+
+
+}
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/UnstableJpaBootstrappingTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/UnstableJpaBootstrappingTest.java
deleted file mode 100644
index cbe62ff..0000000
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/UnstableJpaBootstrappingTest.java
+++ /dev/null
@@ -1,77 +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.testdomain.bootstrapping;
-
-import java.sql.SQLException;
-import java.util.Optional;
-
-import javax.inject.Inject;
-
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.transaction.PlatformTransactionManager;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.testdomain.Smoketest;
-import org.apache.isis.testdomain.conf.Configuration_usingJpa;
-
-@Smoketest
-@SpringBootTest(
- classes = {
- Configuration_usingJpa.class,
- }
-)
-
-//@DataJpaTest
-//@Import({
-// Configuration_usingJpa.class
-//})
-@TestPropertySource(IsisPresets.UseLog4j2Test)
-////@Transactional @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-//@Incubating("JPA support is under construction")
-class UnstableJpaBootstrappingTest {
-
- @Inject private Optional<PlatformTransactionManager> platformTransactionManager;
- @Inject private RepositoryService repository;
- //@Inject private TransactionService transactionService;
-
- @BeforeAll
- static void beforeAll() throws SQLException {
- // launch H2Console for troubleshooting ...
- // Util_H2Console.main(null);
- }
-
- @AfterAll
- static void afterAll() throws SQLException {
- }
-
- @Test //@Order(1)
- void platformTransactionManager_shouldBeAvailable() {
- assertTrue(platformTransactionManager.isPresent());
- }
-
-
-
-}
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
index 023d4dd..5be59f1 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
@@ -24,7 +24,9 @@ import javax.jdo.annotations.IdentityType;
import org.datanucleus.enhancement.Persistable;
+import org.apache.isis.applib.query.Query;
import org.apache.isis.applib.services.repository.EntityState;
+import org.apache.isis.core.commons.collections.Can;
import org.apache.isis.core.commons.internal.exceptions._Exceptions;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -45,7 +47,7 @@ public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAb
}
@Override
- public Object fetchByIdentifier(ObjectSpecification spec, String identifier) {
+ public ManagedObject fetchByIdentifier(ObjectSpecification spec, String identifier) {
if(!spec.isEntity()) {
throw _Exceptions.unexpectedCodeReach();
@@ -53,10 +55,18 @@ public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAb
val persistenceSession = super.getPersistenceSessionJdo();
val rootOid = Oid.Factory.root(spec.getSpecId(), identifier);
-
val pojo = persistenceSession.fetchPersistentPojo(rootOid);
- return pojo;
+ return ManagedObject.identified(spec, pojo, rootOid);
+ }
+
+ @Override
+ public Can<ManagedObject> fetchByQuery(ObjectSpecification spec, Query<?> query) {
+ if(!spec.isEntity()) {
+ throw _Exceptions.unexpectedCodeReach();
+ }
+ val persistenceSession = super.getPersistenceSessionJdo();
+ return persistenceSession.allMatchingQuery(query);
}
@Override
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
index 175edbd..bee01ff 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisPersistenceSessionJdoBase.java
@@ -75,11 +75,6 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
protected final Supplier<MetricsService> metricsServiceProvider;
/**
- * Set to System.nanoTime() when session opens.
- */
- protected long openedAtSystemNanos = -1L;
-
- /**
* Used to create the {@link #persistenceManager} when {@link #open()}ed.
*/
protected final PersistenceManagerFactory jdoPersistenceManagerFactory;
@@ -156,11 +151,6 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
return persistenceManager;
}
- @Override
- public long getLifecycleStartedAtSystemNanos() {
- return openedAtSystemNanos;
- }
-
// -- ENUMS
protected enum Type {
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 18adcad..12097e2 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -136,8 +136,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
public void open() {
ensureNotOpened();
- openedAtSystemNanos = System.nanoTime();
-
if (log.isDebugEnabled()) {
log.debug("opening {}", this);
}
diff --git a/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java b/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java
index d8a7030..ef40c0a 100644
--- a/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java
+++ b/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java
@@ -40,7 +40,6 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.iactn.IsisInteraction;
import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
import org.apache.isis.core.runtime.iactn.IsisInteractionTracker;
-import org.apache.isis.core.runtime.persistence.session.PersistenceSession;
import org.apache.isis.core.security.authentication.AuthenticationSession;
import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
@@ -53,16 +52,15 @@ public class ResourceContext_getArg_Test {
@Rule public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
- @Mock HttpServletRequest mockHttpServletRequest;
- @Mock ServletContext mockServletContext;
- @Mock IsisInteraction mockIsisInteraction;
- @Mock IsisInteractionFactory mockIsisInteractionFactory;
- @Mock IsisInteractionTracker mockIsisInteractionTracker;
- @Mock AuthenticationManager mockAuthenticationManager;
- @Mock AuthenticationSession mockAuthenticationSession;
- @Mock PersistenceSession mockPersistenceSession;
- @Mock SpecificationLoader mockSpecificationLoader;
- @Mock WebApplicationContext webApplicationContext;
+ @Mock private HttpServletRequest mockHttpServletRequest;
+ @Mock private ServletContext mockServletContext;
+ @Mock private IsisInteraction mockIsisInteraction;
+ @Mock private IsisInteractionFactory mockIsisInteractionFactory;
+ @Mock private IsisInteractionTracker mockIsisInteractionTracker;
+ @Mock private AuthenticationManager mockAuthenticationManager;
+ @Mock private AuthenticationSession mockAuthenticationSession;
+ @Mock private SpecificationLoader mockSpecificationLoader;
+ @Mock private WebApplicationContext webApplicationContext;
private ResourceContext resourceContext;
private MetaModelContext metaModelContext;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxNavigationToolbar.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxNavigationToolbar.java
index b670069..b450009 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxNavigationToolbar.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxNavigationToolbar.java
@@ -18,8 +18,6 @@
*/
package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
-import javax.inject.Inject;
-
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -28,7 +26,6 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
-import org.apache.isis.core.commons.internal.environment.IsisSystemEnvironment;
import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -38,8 +35,6 @@ public class IsisAjaxNavigationToolbar extends AjaxNavigationToolbar {
private static final long serialVersionUID = 1L;
- @Inject private transient IsisSystemEnvironment systemEnvironment;
-
private static final String navigatorContainerId = "span";
private static final String ID_SHOW_ALL = "showAll";
private static final String HINT_KEY_SHOW_ALL = "showAll";
@@ -91,7 +86,7 @@ public class IsisAjaxNavigationToolbar extends AjaxNavigationToolbar {
}
});
- container.add(new Label("prototypingLabel", PrototypingMessageProvider.getTookTimingMessageModel(systemEnvironment.isPrototyping())));
+ container.add(new Label("prototypingLabel", PrototypingMessageProvider.getTookTimingMessageModel()));
}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisTotalRecordsToolbar.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisTotalRecordsToolbar.java
index 2af312c..45a0471 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisTotalRecordsToolbar.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisTotalRecordsToolbar.java
@@ -18,8 +18,6 @@
*/
package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
-import javax.inject.Inject;
-
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
@@ -29,8 +27,6 @@ import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
-import org.apache.isis.core.commons.internal.environment.IsisSystemEnvironment;
-
/**
* Responsibility: Display 'Showing all of 123' at the bottom of data tables.
* <p>
@@ -43,8 +39,6 @@ public class IsisTotalRecordsToolbar extends AbstractToolbar {
private static final long serialVersionUID = 1L;
private static final String navigatorContainerId = "navigatorContainer";
- @Inject private transient IsisSystemEnvironment systemEnvironment;
-
public IsisTotalRecordsToolbar(final DataTable<?, ?> table) {
this(table, new Model<String>() {
@@ -84,7 +78,7 @@ public class IsisTotalRecordsToolbar extends AbstractToolbar {
}
}));
container.add(new Label("navigatorLabel", messageModel));
- container.add(new Label("prototypingLabel", PrototypingMessageProvider.getTookTimingMessageModel(systemEnvironment.isPrototyping())));
+ container.add(new Label("prototypingLabel", PrototypingMessageProvider.getTookTimingMessageModel()));
}
/**
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java
index 223537c..13d5a18 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/PrototypingMessageProvider.java
@@ -21,8 +21,10 @@ package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable
import java.util.Locale;
import org.apache.isis.core.commons.internal.base._Timing;
-import org.apache.isis.core.commons.internal.base._Timing.StopWatch;
-import org.apache.isis.core.runtime.context.IsisContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
+
+import lombok.val;
/**
* Responsibility: produce additional info when in prototyping mode
@@ -35,20 +37,31 @@ import org.apache.isis.core.runtime.context.IsisContext;
*/
class PrototypingMessageProvider {
- public static String getTookTimingMessageModel(boolean isPrototyping) {
- return isPrototyping
+ private static IsisWebAppCommonContext commonContext = null;
+
+ public static String getTookTimingMessageModel() {
+ return isPrototyping()
? getTookTimingMessage()
: "";
}
// -- HELPER
+ private static IsisWebAppCommonContext commonContext() {
+ return commonContext = CommonContextUtils.computeIfAbsent(commonContext);
+ }
+
+ private static boolean isPrototyping() {
+ return commonContext().getSystemEnvironment().isPrototyping();
+ }
+
private static String getTookTimingMessage() {
final StringBuilder tookTimingMessage = new StringBuilder();
- IsisContext.getPersistenceSession().ifPresent(session->{
- StopWatch stopWatch = _Timing.atSystemNanos(session.getLifecycleStartedAtSystemNanos());
+ commonContext().getIsisInteractionTracker().currentInteraction()
+ .ifPresent(interaction->{
+ val stopWatch = _Timing.atSystemMillis(interaction.getLifecycleStartedAtSystemMillis());
tookTimingMessage.append(String.format(Locale.US, "... took %.2f seconds", stopWatch.getSeconds()));
});
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index c10dfb1..cb61039 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -50,8 +50,8 @@ import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
import org.apache.isis.core.metamodel.spec.ManagedObject;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.context.IsisContext;
import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
-import org.apache.isis.core.runtime.persistence.session.PersistenceSession;
import org.apache.isis.core.security.authentication.AuthenticationSession;
import org.apache.isis.core.security.authentication.MessageBroker;
import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
@@ -149,9 +149,7 @@ implements FormExecutor {
{
val commonContext = targetEntityModel.getCommonContext();
if(commonContext.getIsisInteractionTracker().isInInteraction()) {
- PersistenceSession.current(PersistenceSession.class)
- .stream()
- .forEach(ps->ps.flush());
+ IsisContext.flush();
}
}