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 {
