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);
     }