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/10/05 12:04:41 UTC
[isis] branch 2441-auditing updated: ISIS-2441: let
ChangedObjectsService implement MetricsService
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 2441-auditing
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/2441-auditing by this push:
new 03a6f56 ISIS-2441: let ChangedObjectsService implement MetricsService
03a6f56 is described below
commit 03a6f56050811c60fa26e1b4355d5e52aa63212c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Oct 5 14:04:28 2020 +0200
ISIS-2441: let ChangedObjectsService implement MetricsService
on instance to handle all the entity change aspects
---
.../isis/applib/services/audit/AuditerService.java | 1 -
.../changetracking/ChangedObjectsService.java | 30 ++++++--
.../changetracking/EntityChangeTracker.java | 2 +
.../datanucleus5/IsisModuleJdoDataNucleus5.java | 2 -
.../JdoStoreLifecycleListenerForIsis.java | 6 +-
.../lifecycles/LoadLifecycleListenerForIsis.java | 28 ++++++--
.../datanucleus5/metrics/MetricsServiceForJdo.java | 79 ----------------------
.../persistence/PersistenceSession5.java | 38 +++++------
.../persistence/PersistenceSessionFactory5.java | 8 ---
9 files changed, 73 insertions(+), 121 deletions(-)
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerService.java b/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerService.java
index 5cfc02a..2119854 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/audit/AuditerService.java
@@ -21,7 +21,6 @@ package org.apache.isis.applib.services.audit;
import java.sql.Timestamp;
import java.util.UUID;
-import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.services.bookmark.Bookmark;
/**
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java
index 996e11a..ca44252 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/ChangedObjectsService.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.runtime.persistence.changetracking;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.LongAdder;
import java.util.function.Function;
import javax.inject.Inject;
@@ -37,6 +38,7 @@ import org.apache.isis.applib.events.lifecycle.AbstractLifecycleEvent;
import org.apache.isis.applib.services.HasUniqueId;
import org.apache.isis.applib.services.TransactionScopeListener;
import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.metrics.MetricsService;
import org.apache.isis.commons.internal.base._Lazy;
import org.apache.isis.commons.internal.collections._Maps;
import org.apache.isis.commons.internal.collections._Sets;
@@ -76,8 +78,9 @@ import lombok.val;
//@Log4j2
public class ChangedObjectsService
implements TransactionScopeListener,
+MetricsService,
EntityChangeTracker,
-HasEnlistedForAuditing, HasEnlistedForPublishing, HasEnlistedForMetrics {
+HasEnlistedForAuditing, HasEnlistedForPublishing {
// end::refguide[]
/**
@@ -148,11 +151,6 @@ HasEnlistedForAuditing, HasEnlistedForPublishing, HasEnlistedForMetrics {
return changedObjectPropertiesRef.get().size();
}
- @Override
- public int numberObjectsDirtied() {
- return changeKindByEnlistedAdapter.size();
- }
-
protected boolean shouldIgnore(final @NonNull ManagedObject adapter) {
val spec = adapter.getSpecification();
return HasUniqueId.class.isAssignableFrom(spec.getCorrespondingClass());
@@ -268,6 +266,18 @@ HasEnlistedForAuditing, HasEnlistedForPublishing, HasEnlistedForMetrics {
preAndPostValues.setPost(adapterAndProperty.getPropertyValue());
}
}
+
+ // -- METRICS SERVICE
+
+ @Override
+ public int numberObjectsLoaded() {
+ return Math.toIntExact(numberLoaded.longValue());
+ }
+
+ @Override
+ public int numberObjectsDirtied() {
+ return changeKindByEnlistedAdapter.size();
+ }
// -- ENTITY CHANGE TRACKING
@@ -320,6 +330,13 @@ HasEnlistedForAuditing, HasEnlistedForPublishing, HasEnlistedForMetrics {
CallbackFacet.Util.callCallback(entity, UpdatedCallbackFacet.class);
postLifecycleEventIfRequired(entity, UpdatedLifecycleEventFacet.class);
}
+
+ private final LongAdder numberLoaded = new LongAdder();
+
+ @Override
+ public void incrementLoaded() {
+ numberLoaded.increment();
+ }
// -- HELPER
@@ -348,4 +365,5 @@ HasEnlistedForAuditing, HasEnlistedForPublishing, HasEnlistedForMetrics {
}
}
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java
index 2483fc7..114299f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/EntityChangeTracker.java
@@ -74,5 +74,7 @@ public interface EntityChangeTracker {
*/
void recognizeUpdating(ManagedObject entity);
+ void incrementLoaded();
+
}
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java
index e4a3b43..7e844bc 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/IsisModuleJdoDataNucleus5.java
@@ -41,7 +41,6 @@ import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistabl
import org.apache.isis.persistence.jdo.datanucleus5.jdosupport.mixins.Persistable_downloadJdoMetadata;
import org.apache.isis.persistence.jdo.datanucleus5.metamodel.JdoMetamodelMenu;
import org.apache.isis.persistence.jdo.datanucleus5.metamodel.JdoProgrammingModelPlugin;
-import org.apache.isis.persistence.jdo.datanucleus5.metrics.MetricsServiceForJdo;
import org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisPlatformTransactionManagerForJdo;
import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSessionFactory5;
@@ -64,7 +63,6 @@ import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSessi
IsisJdoSupportDN5.class,
IsisPlatformTransactionManagerForJdo.class,
JdoPersistenceLifecycleService.class,
- MetricsServiceForJdo.class,
PersistenceSessionFactory5.class,
JdoMetamodelMenu.class,
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/JdoStoreLifecycleListenerForIsis.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/JdoStoreLifecycleListenerForIsis.java
index 752c692..11a557c 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/JdoStoreLifecycleListenerForIsis.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/JdoStoreLifecycleListenerForIsis.java
@@ -18,6 +18,7 @@
*/
package org.apache.isis.persistence.jdo.datanucleus5.lifecycles;
+import javax.enterprise.inject.Vetoed;
import javax.inject.Inject;
import javax.jdo.listener.InstanceLifecycleEvent;
@@ -33,8 +34,9 @@ import lombok.val;
* @since 2.0
*
*/
-public class JdoStoreLifecycleListenerForIsis implements
-javax.jdo.listener.StoreLifecycleListener {
+@Vetoed // managed by isis
+public class JdoStoreLifecycleListenerForIsis
+implements javax.jdo.listener.StoreLifecycleListener {
@Inject private RuntimeEventService runtimeEventService;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedForMetrics.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/LoadLifecycleListenerForIsis.java
similarity index 51%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedForMetrics.java
rename to persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/LoadLifecycleListenerForIsis.java
index 47fe26d..ea8f8ad 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/changetracking/HasEnlistedForMetrics.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/lifecycles/LoadLifecycleListenerForIsis.java
@@ -16,11 +16,31 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.isis.core.runtime.persistence.changetracking;
+package org.apache.isis.persistence.jdo.datanucleus5.lifecycles;
-//TODO[ISIS-2441] intermediate for refactoring keep?
-public interface HasEnlistedForMetrics {
+import javax.enterprise.inject.Vetoed;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.jdo.listener.InstanceLifecycleEvent;
- int numberObjectsDirtied();
+import org.apache.isis.core.runtime.persistence.changetracking.EntityChangeTracker;
+
+/**
+ * To be registered with each JDO PersistenceManager instance, in order to collect
+ * persistence related metrics
+ *
+ * @since 2.0
+ *
+ */
+@Vetoed // managed by isis
+public class LoadLifecycleListenerForIsis
+implements javax.jdo.listener.LoadLifecycleListener {
+
+ @Inject private Provider<EntityChangeTracker> entityChangeTrackerProvider;
+
+ @Override
+ public void postLoad(final InstanceLifecycleEvent event) {
+ entityChangeTrackerProvider.get().incrementLoaded();
+ }
}
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceForJdo.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceForJdo.java
deleted file mode 100644
index fa60534..0000000
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metrics/MetricsServiceForJdo.java
+++ /dev/null
@@ -1,79 +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.persistence.jdo.datanucleus5.metrics;
-
-import java.util.concurrent.atomic.LongAdder;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.jdo.listener.InstanceLifecycleEvent;
-import javax.jdo.listener.InstanceLifecycleListener;
-import javax.jdo.listener.LoadLifecycleListener;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.annotation.IsisInteractionScope;
-import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.TransactionScopeListener;
-import org.apache.isis.applib.services.metrics.MetricsService;
-import org.apache.isis.core.runtime.persistence.changetracking.HasEnlistedForMetrics;
-
-@Service
-@Named("isisJdoDn5.MetricsServiceForJdo")
-@Order(OrderPrecedence.MIDPOINT)
-@Primary
-@Qualifier("Default")
-@IsisInteractionScope
-//@Log4j2
-public class MetricsServiceForJdo
-implements MetricsService, InstanceLifecycleListener, LoadLifecycleListener, TransactionScopeListener {
-
- @Inject private javax.inject.Provider<HasEnlistedForMetrics> changedObjectsProvider;
-
- private LongAdder numberLoaded = new LongAdder();
-
- @Override
- public int numberObjectsLoaded() {
- return Math.toIntExact(numberLoaded.longValue());
- }
-
- @Override
- public int numberObjectsDirtied() {
- return changedObjectsProvider.get().numberObjectsDirtied();
- }
-
- @Override
- public void postLoad(final InstanceLifecycleEvent event) {
- numberLoaded.increment();
- }
-
- /**
- * Intended to be called at the end of a transaction. (This service really ought to be considered
- * a transaction-scoped service; since that isn't yet supported by the framework, we have to manually reset).
- */
- @Override
- public void onTransactionEnding() {
- numberLoaded.reset();
- }
-
-
-}
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 48b2561..6cd2e6a 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
@@ -37,8 +37,6 @@ import javax.jdo.FetchPlan;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.identity.SingleFieldIdentity;
-import javax.jdo.listener.InstanceLifecycleListener;
-import javax.jdo.listener.StoreLifecycleListener;
import org.datanucleus.enhancement.Persistable;
import org.datanucleus.exceptions.NucleusObjectNotFoundException;
@@ -70,6 +68,8 @@ import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.quer
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryProcessor;
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.spi.JdoObjectIdSerializer;
+import org.apache.isis.persistence.jdo.datanucleus5.lifecycles.JdoStoreLifecycleListenerForIsis;
+import org.apache.isis.persistence.jdo.datanucleus5.lifecycles.LoadLifecycleListenerForIsis;
import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapter;
import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext;
import org.apache.isis.persistence.jdo.datanucleus5.persistence.command.CreateObjectCommand;
@@ -94,7 +94,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
private ObjectAdapterContext objectAdapterContext;
@Getter private final TransactionService transactionService;
- private final StoreLifecycleListener storeLifecycleListener;
+ private Runnable unregisterLifecycleListeners;
/**
* Initialize the object store so that calls to this object store access
@@ -104,12 +104,10 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
public PersistenceSession5(
final MetaModelContext metaModelContext,
final PersistenceManagerFactory jdoPersistenceManagerFactory,
- final StoreLifecycleListener storeLifecycleListener,
final FixturesInstalledStateHolder stateHolder) {
super(metaModelContext, jdoPersistenceManagerFactory, stateHolder);
this.transactionService = metaModelContext.getTransactionService();
- this.storeLifecycleListener = storeLifecycleListener;
}
// -- open
@@ -141,20 +139,21 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
objectAdapterContext = ObjectAdapterContext.openContext(super.metaModelContext, this);
- // tell the proxy of all request-scoped services to instantiate the underlying
- // services, store onto the thread-local and inject into them...
- //startRequestOnRequestScopedServices();
-
- // ... and invoke all @PostConstruct
- //postConstructOnRequestScopedServices();
-
- val metricsService = metricsServiceProvider.get();
- if(metricsService instanceof InstanceLifecycleListener) {
- persistenceManager
- .addInstanceLifecycleListener((InstanceLifecycleListener)metricsService, (Class[]) null);
- }
-
+ // install JDO specific entity change listeners ...
+
+ val loadLifecycleListener = new LoadLifecycleListenerForIsis();
+ val storeLifecycleListener = new JdoStoreLifecycleListenerForIsis();
+
+ serviceInjector.injectServicesInto(loadLifecycleListener);
+ serviceInjector.injectServicesInto(storeLifecycleListener);
+
+ persistenceManager.addInstanceLifecycleListener(loadLifecycleListener, (Class[]) null);
persistenceManager.addInstanceLifecycleListener(storeLifecycleListener, (Class[]) null);
+
+ this.unregisterLifecycleListeners = ()->{
+ persistenceManager.removeInstanceLifecycleListener(loadLifecycleListener);
+ persistenceManager.removeInstanceLifecycleListener(storeLifecycleListener);
+ };
this.state = State.OPEN;
}
@@ -182,7 +181,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
completeCommandFromInteractionAndClearDomainEvents();
- persistenceManager.removeInstanceLifecycleListener(storeLifecycleListener);
+ unregisterLifecycleListeners.run();
+ unregisterLifecycleListeners = null;
try {
persistenceManager.close();
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
index 2adda5d..1dbbbaa 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSessionFactory5.java
@@ -26,7 +26,6 @@ import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
-import javax.jdo.listener.StoreLifecycleListener;
import org.datanucleus.PropertyNames;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -47,7 +46,6 @@ import org.apache.isis.persistence.jdo.applib.fixturestate.FixturesInstalledStat
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.DataNucleusContextUtil;
import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.DataNucleusSettings;
import org.apache.isis.persistence.jdo.datanucleus5.entities.JdoEntityTypeRegistry;
-import org.apache.isis.persistence.jdo.datanucleus5.lifecycles.JdoStoreLifecycleListenerForIsis;
import lombok.Getter;
import lombok.Setter;
@@ -74,7 +72,6 @@ implements PersistenceSessionFactory, FixturesInstalledStateHolder {
private final _Lazy<DataNucleusApplicationComponents5> applicationComponents =
_Lazy.threadSafe(this::createDataNucleusApplicationComponents);
- private StoreLifecycleListener storeLifecycleListener;
private MetaModelContext metaModelContext;
private IsisConfiguration configuration;
private final JdoEntityTypeRegistry jdoEntityTypeRegistry = new JdoEntityTypeRegistry();
@@ -91,9 +88,6 @@ implements PersistenceSessionFactory, FixturesInstalledStateHolder {
// Why? because that method causes entity classes to be loaded which register with DN's EnhancementHelper,
// which are then cached in DN. It results in our CreateSchema listener not firing.
_Blackhole.consume(applicationComponents.get());
-
- this.storeLifecycleListener = new JdoStoreLifecycleListenerForIsis();
- metaModelContext.getServiceInjector().injectServicesInto(storeLifecycleListener);
}
@@ -196,7 +190,6 @@ implements PersistenceSessionFactory, FixturesInstalledStateHolder {
applicationComponents.clear();
}
this.configuration = null;
- this.storeLifecycleListener = null;
}
@Override
@@ -211,7 +204,6 @@ implements PersistenceSessionFactory, FixturesInstalledStateHolder {
return new PersistenceSession5(
metaModelContext,
persistenceManagerFactory,
- storeLifecycleListener,
this);
}