do not wrap transaction sail if it is not needed (safes memory and performance)


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/278a80a0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/278a80a0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/278a80a0

Branch: refs/heads/develop
Commit: 278a80a06de03cad9c243a1405077309eaaf0642
Parents: 5598e30
Author: Sebastian Schaffert <[email protected]>
Authored: Wed Oct 2 22:31:49 2013 +0200
Committer: Sebastian Schaffert <[email protected]>
Committed: Wed Oct 2 22:31:49 2013 +0200

----------------------------------------------------------------------
 .../backend/bigdata/BigDataStoreProvider.java   |  2 +
 .../services/triplestore/SesameServiceImpl.java | 41 +++++++++++-------
 .../marmotta/platform/core/util/CDIContext.java | 44 +++++++++++++++++++-
 3 files changed, 72 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/278a80a0/platform/marmotta-backend-bigdata/src/main/java/org/apache/marmotta/platform/backend/bigdata/BigDataStoreProvider.java
----------------------------------------------------------------------
diff --git 
a/platform/marmotta-backend-bigdata/src/main/java/org/apache/marmotta/platform/backend/bigdata/BigDataStoreProvider.java
 
b/platform/marmotta-backend-bigdata/src/main/java/org/apache/marmotta/platform/backend/bigdata/BigDataStoreProvider.java
index c86687a..64eb2ef 100644
--- 
a/platform/marmotta-backend-bigdata/src/main/java/org/apache/marmotta/platform/backend/bigdata/BigDataStoreProvider.java
+++ 
b/platform/marmotta-backend-bigdata/src/main/java/org/apache/marmotta/platform/backend/bigdata/BigDataStoreProvider.java
@@ -17,6 +17,7 @@
 
 package org.apache.marmotta.platform.backend.bigdata;
 
+import com.bigdata.Banner;
 import com.bigdata.rdf.sail.BigdataSail;
 import org.apache.marmotta.platform.core.api.config.ConfigurationService;
 import org.apache.marmotta.platform.core.api.triplestore.StoreProvider;
@@ -68,6 +69,7 @@ public class BigDataStoreProvider implements StoreProvider {
         properties.setProperty( BigdataSail.Options.STATEMENT_IDENTIFIERS, 
"false");
         properties.setProperty( BigdataSail.Options.AXIOMS_CLASS, 
"com.bigdata.rdf.axioms.NoAxioms");
         properties.setProperty( BigdataSail.Options.TEXT_INDEX, "true");
+        properties.setProperty( Banner.Options.LOG4J_MBEANS_DISABLE, "true");
 
 
         return new BigDataSesame27Sail(properties);

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/278a80a0/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/triplestore/SesameServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/triplestore/SesameServiceImpl.java
 
b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/triplestore/SesameServiceImpl.java
index 118d208..9881282 100644
--- 
a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/triplestore/SesameServiceImpl.java
+++ 
b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/services/triplestore/SesameServiceImpl.java
@@ -27,6 +27,7 @@ import org.apache.marmotta.platform.core.api.triplestore.*;
 import 
org.apache.marmotta.platform.core.qualifiers.event.transaction.AfterCommit;
 import 
org.apache.marmotta.platform.core.qualifiers.event.transaction.AfterRollback;
 import 
org.apache.marmotta.platform.core.qualifiers.event.transaction.BeforeCommit;
+import org.apache.marmotta.platform.core.util.CDIContext;
 import org.openrdf.model.ValueFactory;
 import org.openrdf.repository.RepositoryConnection;
 import org.openrdf.repository.RepositoryException;
@@ -119,8 +120,6 @@ public class SesameServiceImpl implements SesameService {
 
     private NotifyingSail store;
 
-    private KiWiTransactionalSail tsail;
-
     private SailRepository repository;
 
     private ReentrantReadWriteLock restartLock = new ReentrantReadWriteLock();
@@ -149,23 +148,39 @@ public class SesameServiceImpl implements SesameService {
 
             store = storeProviders.get().createStore();
 
-            tsail = new KiWiTransactionalSail(store);
+
+            NotifyingSail notifyingSail;
 
             log.info("initialising repository plugins ...");
 
-            // wrap all stackable transactional sails
-            TransactionalSail transactionalSail = tsail;
-            for(TransactionalSailProvider provider : 
transactionalSailProviders) {
-                if(provider.isEnabled()) {
-                    log.info("- transaction plugin: {}",provider.getName());
-                    transactionalSail = provider.createSail(transactionalSail);
-                } else {
-                    log.info("- transaction plugin: {} (DISABLED)", 
provider.getName());
+            // TODO: should also wrap a transactional sail in case there are 
observers on the classpath!
+            if(   !transactionalSailProviders.isUnsatisfied() || 
CDIContext.hasObservers(this, "beforeCommitEvent")
+               || CDIContext.hasObservers(this, "afterCommitEvent") || 
CDIContext.hasObservers(this, "afterRollbackEvent")) {
+                log.info("enabling transaction notification");
+
+                KiWiTransactionalSail tsail = new KiWiTransactionalSail(store);
+
+                // the CDI events should be triggered once all internal events 
have been handled, so register the transaction listener last
+                tsail.addTransactionListener(new LMFTransactionEventProxy());
+
+
+                // wrap all stackable transactional sails
+                TransactionalSail transactionalSail = tsail;
+                for(TransactionalSailProvider provider : 
transactionalSailProviders) {
+                    if(provider.isEnabled()) {
+                        log.info("- transaction plugin: 
{}",provider.getName());
+                        transactionalSail = 
provider.createSail(transactionalSail);
+                    } else {
+                        log.info("- transaction plugin: {} (DISABLED)", 
provider.getName());
+                    }
                 }
+                notifyingSail = transactionalSail;
+            } else {
+                log.info("not enabling transaction notification, because no 
transaction observers are registered");
+                notifyingSail = store;
             }
 
             // wrap all stackable notifying sails
-            NotifyingSail notifyingSail = transactionalSail;
             for(NotifyingSailProvider provider : notifyingSailProviders) {
                 if(provider.isEnabled()) {
                     log.info("- notifying plugin: {}",provider.getName());
@@ -186,8 +201,6 @@ public class SesameServiceImpl implements SesameService {
                 }
             }
 
-            // the CDI events should be triggered once all internal events 
have been handled, so register the transaction listener last
-            tsail.addTransactionListener(new LMFTransactionEventProxy());
 
             repository = storeProviders.get().createRepository(standardSail);
 

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/278a80a0/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/util/CDIContext.java
----------------------------------------------------------------------
diff --git 
a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/util/CDIContext.java
 
b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/util/CDIContext.java
index f49cbbf..2a81693 100644
--- 
a/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/util/CDIContext.java
+++ 
b/platform/marmotta-core/src/main/java/org/apache/marmotta/platform/core/util/CDIContext.java
@@ -23,8 +23,11 @@ import org.slf4j.LoggerFactory;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Qualifier;
 import javax.naming.*;
-
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -108,6 +111,45 @@ public class CDIContext {
         return result;
     }
 
+    /**
+     * Returns true in case the given event with qualifier has event observers 
listening of the event
+     * @param event
+     * @param qualifier
+     * @param <T>
+     * @return
+     */
+    public static <T> boolean hasObservers(T event, Annotation qualifier) {
+        BeanManager beanManager = getBeanManager();
+        return !beanManager.resolveObserverMethods(event,qualifier).isEmpty();
+    }
+
+    public static <T> boolean hasObservers(Object o, String fieldName) {
+        Class type = o.getClass();
+        try {
+            Field field = type.getDeclaredField(fieldName);
+            if(!field.getType().getClass().getSimpleName().equals("Event")) {
+                Class persistentClass = (Class<T>) ((ParameterizedType) 
field.getGenericType()).getActualTypeArguments()[0];
+                Annotation qualifier = null;
+                for(Annotation a : field.getDeclaredAnnotations()) {
+                    
if(a.annotationType().isAnnotationPresent(Qualifier.class)) {
+                        qualifier = a;
+                    }
+                }
+                return hasObservers(persistentClass.newInstance(), qualifier);
+            } else {
+                log.warn("list observers: field {} of class {} is not an 
event", fieldName, type.getName());
+            }
+        } catch (NoSuchFieldException e) {
+            log.warn("list observers: event field {} not found for class {}", 
fieldName, type.getName());
+        } catch (InstantiationException e) {
+            log.warn("list observers: could not instantiate object of event 
field {} for class {}", fieldName, type.getName());
+        } catch (IllegalAccessException e) {
+            log.warn("list observers: could not instantiate object of event 
field {} for class {}", fieldName, type.getName());
+        }
+        return false;
+
+    }
+
 
     public static void showJndiContext(Context ctx, String name, String path) {
         try {

Reply via email to