You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2014/02/06 12:32:38 UTC

svn commit: r1565182 - in /stanbol/trunk/enhancement-engines/dereference/entityhub/src/main: java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/ resources/OSGI-INF/metat...

Author: rwesten
Date: Thu Feb  6 11:32:38 2014
New Revision: 1565182

URL: http://svn.apache.org/r1565182
Log:
merged implementation for STANBOL-1276 to trunk

Added:
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java
      - copied unchanged from r1565177, stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java
      - copied unchanged from r1565177, stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/
      - copied from r1565177, stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/
Modified:
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java
    stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties

Modified: stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java?rev=1565182&r1=1565181&r2=1565182&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java (original)
+++ stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java Thu Feb  6 11:32:38 2014
@@ -22,7 +22,11 @@ import static org.apache.stanbol.enhance
 import static org.osgi.framework.Constants.SERVICE_RANKING;
 
 import java.util.Dictionary;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.ConfigurationPolicy;
@@ -34,6 +38,8 @@ import org.apache.stanbol.commons.namesp
 import org.apache.stanbol.enhancer.engines.dereference.DereferenceConstants;
 import org.apache.stanbol.enhancer.engines.dereference.DereferenceEngineConfig;
 import org.apache.stanbol.enhancer.engines.dereference.EntityDereferenceEngine;
+import org.apache.stanbol.enhancer.engines.dereference.entityhub.shared.SharedDereferenceThreadPool;
+import org.apache.stanbol.enhancer.engines.dereference.entityhub.shared.SharedExecutorServiceProvider;
 import org.apache.stanbol.enhancer.servicesapi.EnhancementEngine;
 import org.apache.stanbol.enhancer.servicesapi.ServiceProperties;
 import org.apache.stanbol.entityhub.servicesapi.Entityhub;
@@ -45,6 +51,8 @@ import org.osgi.service.component.Compon
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 /**
  * The EntityhubLinkingEngine in NOT an {@link EnhancementEngine} but only an
  * OSGI {@link Component} that allows to configure instances of the
@@ -72,6 +80,10 @@ import org.slf4j.LoggerFactory;
     @Property(name=DEREFERENCE_ENTITIES_FIELDS,cardinality=Integer.MAX_VALUE,
     	value={"rdfs:comment","geo:lat","geo:long","foaf:depiction","dbp-ont:thumbnail"}),
     @Property(name=DEREFERENCE_ENTITIES_LDPATH, cardinality=Integer.MAX_VALUE),
+    @Property(name=EntityhubDereferenceEngine.SHARED_THREAD_POOL_STATE,
+    	boolValue=EntityhubDereferenceEngine.DEFAULT_SHARED_THREAD_POOL_STATE),
+    @Property(name=EntityhubDereferenceEngine.THREAD_POOL_SIZE,
+    	intValue=EntityhubDereferenceEngine.DEFAULT_THREAD_POOL_SIZE),
     @Property(name=SERVICE_RANKING,intValue=0)
 })
 public class EntityhubDereferenceEngine implements ServiceTrackerCustomizer {
@@ -87,6 +99,18 @@ public class EntityhubDereferenceEngine 
      */
     public static final String SITE_ID = "enhancer.engines.dereference.entityhub.siteId";
 
+    /**
+     * If a Entityhub dereferencer should use the shared thread pool
+     */
+    public static final String SHARED_THREAD_POOL_STATE = "enhancer.engines.dereference.entityhub.threads.shared";
+
+    public static final boolean DEFAULT_SHARED_THREAD_POOL_STATE = true;
+    
+    public static final String THREAD_POOL_SIZE = "enhancer.engines.dereference.entityhub.threads.size";
+    
+    public static final int DEFAULT_THREAD_POOL_SIZE = 0;
+    
+    private int threadPoolSize = DEFAULT_THREAD_POOL_SIZE;
     
     /**
      * The engine initialised based on the configuration of this component
@@ -111,6 +135,8 @@ public class EntityhubDereferenceEngine 
 
     private BundleContext bundleContext;
 
+	private ExecutorService executorService;
+
     /**
      * Default constructor as used by OSGI. This expects that 
      * {@link #activate(ComponentContext)} is called before usage
@@ -139,17 +165,61 @@ public class EntityhubDereferenceEngine 
             siteName = "*";
         }
         log.debug(" - siteName: {}", siteName);
+        
+        final boolean sharedPoolState;
+        value = properties.get(SHARED_THREAD_POOL_STATE);
+        if(value instanceof Boolean){
+        	sharedPoolState = ((Boolean)value).booleanValue();
+        } else if(value != null && !StringUtils.isBlank(value.toString())){
+        	sharedPoolState = Boolean.parseBoolean(value.toString());
+        } else {
+        	sharedPoolState = DEFAULT_SHARED_THREAD_POOL_STATE;
+        }
+        final ExecutorServiceProvider esProvider;
+        log.debug(" - shared thread pool state: {}", sharedPoolState);
+        if(sharedPoolState){
+        	esProvider = new SharedExecutorServiceProvider(ctx.getBundleContext());
+        } else { //we need to create our own ExecutorService
+	        value = properties.get(THREAD_POOL_SIZE);
+	        if(value instanceof Number){
+	        	this.threadPoolSize = ((Number)value).intValue();
+	        } else if(value != null){
+	        	try {
+	        		this.threadPoolSize = Integer.parseInt(value.toString());
+	        	} catch (NumberFormatException e){
+	        		throw new ConfigurationException(THREAD_POOL_SIZE, "Value '" + value
+	        				+ "'(type: "+value.getClass().getName()+") can not be parsed "
+	        				+ "as Integer");
+	        	}
+	        } else {
+	        	this.threadPoolSize = DEFAULT_THREAD_POOL_SIZE;
+	        }
+	        if(threadPoolSize > 0){
+	            String namePattern = getClass().getSimpleName()+"-"
+	                    + engineConfig.getEngineName()+ "-thread-%s";
+	            ThreadFactory threadFactory = new ThreadFactoryBuilder()
+	                .setNameFormat(namePattern)
+	                .setDaemon(true).build();
+	            log.debug(" - create Threadpool(namePattern='{}' | size='{}')",
+	                namePattern,threadPoolSize);
+	            executorService = Executors.newFixedThreadPool(threadPoolSize, threadFactory);
+	        } else {
+	        	log.debug(" - no thread pool configured (poolSize: {})",threadPoolSize);
+	            executorService = null;
+	        }
+	        esProvider = new StaticExecutorServiceProvider(executorService);
+        }
         //init the tracking entity searcher
         trackedServiceCount = 0;
         if(Entityhub.ENTITYHUB_IDS.contains(siteName.toLowerCase())){
             log.info("  ... init Entityhub dereferencer");
-            entityDereferencer = new EntityhubDereferencer(bundleContext, this, null);
+            entityDereferencer = new EntityhubDereferencer(bundleContext, this, esProvider);
         } else if(siteName.equals("*")){
             log.info("  ... init dereferencer for all referenced sites");
-            entityDereferencer = new SitesDereferencer(bundleContext, this, null);
+            entityDereferencer = new SitesDereferencer(bundleContext, this, esProvider);
         } else {
             log.info(" ... init dereferencer for referenced site {}", siteName);
-            entityDereferencer = new SiteDereferencer(bundleContext,siteName, this, null);
+            entityDereferencer = new SiteDereferencer(bundleContext,siteName, this, esProvider);
         }
         //set the namespace prefix service to the dereferencer
         entityDereferencer.setNsPrefixService(prefixService);
@@ -175,6 +245,10 @@ public class EntityhubDereferenceEngine 
             reg.unregister();
             engineRegistration = null;
         }
+        if(executorService != null){
+        	executorService.shutdown();
+        	executorService = null;
+        }
         //* reset engine
         entityDereferenceEngine = null;
         engineMetadata = null;

Modified: stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java?rev=1565182&r1=1565181&r2=1565182&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java (original)
+++ stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java Thu Feb  6 11:32:38 2014
@@ -16,8 +16,6 @@
 */
 package org.apache.stanbol.enhancer.engines.dereference.entityhub;
 
-import java.util.concurrent.ExecutorService;
-
 import org.apache.stanbol.enhancer.engines.dereference.EntityDereferencer;
 import org.apache.stanbol.entityhub.ldpath.backend.EntityhubBackend;
 import org.apache.stanbol.entityhub.servicesapi.Entityhub;
@@ -36,14 +34,15 @@ import at.newmedialab.ldpath.api.backend
  */
 public final class EntityhubDereferencer extends TrackingDereferencerBase<Entityhub> implements EntityDereferencer {
     
-    private final ExecutorService executorService;
     
-    public EntityhubDereferencer(BundleContext context, ExecutorService executorService) {
-        this(context,null,executorService);
+    public EntityhubDereferencer(BundleContext context) {
+        this(context,null,null);
+    }
+    public EntityhubDereferencer(BundleContext context, ExecutorServiceProvider executorServiceProvider) {
+        this(context,null,executorServiceProvider);
     }
-    public EntityhubDereferencer(BundleContext context, ServiceTrackerCustomizer customizer, ExecutorService executorService) {
-        super(context,Entityhub.class,null,customizer);
-        this.executorService = executorService;
+    public EntityhubDereferencer(BundleContext context, ServiceTrackerCustomizer customizer, ExecutorServiceProvider executorServiceProvider) {
+        super(context,Entityhub.class,null,customizer, executorServiceProvider);
     }
     
     @Override
@@ -56,10 +55,6 @@ public final class EntityhubDereferencer
     public boolean supportsOfflineMode() {
         return true; //the entityhub is always offline
     }
-    @Override
-    public ExecutorService getExecutor() {
-        return executorService;
-    }
     
     @Override
     protected RDFBackend<Object> createRdfBackend(Entityhub service) {

Modified: stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java?rev=1565182&r1=1565181&r2=1565182&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java (original)
+++ stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java Thu Feb  6 11:32:38 2014
@@ -35,17 +35,18 @@ public final class SiteDereferencer exte
 //    private final Logger log = LoggerFactory.getLogger(SiteDereferencer.class);
     
     private final String siteId;
-    private final ExecutorService executorService;
 
-    public SiteDereferencer(BundleContext context, String siteId, ExecutorService executorService){
-        this(context,siteId, null, executorService);
+    public SiteDereferencer(BundleContext context, String siteId){
+        this(context,siteId, null, null);
     }
-    public SiteDereferencer(BundleContext context, String siteId, ServiceTrackerCustomizer customizer, ExecutorService executorService) {
+    public SiteDereferencer(BundleContext context, String siteId, ExecutorServiceProvider executorServiceProvider){
+        this(context,siteId, null, executorServiceProvider);
+    }
+    public SiteDereferencer(BundleContext context, String siteId, ServiceTrackerCustomizer customizer, ExecutorServiceProvider executorServiceProvider) {
         super(context, Site.class, 
             Collections.singletonMap(SiteConfiguration.ID,siteId),
-            customizer);
+            customizer, executorServiceProvider);
         this.siteId = siteId;
-        this.executorService = executorService;
     }
     
     @Override
@@ -54,10 +55,6 @@ public final class SiteDereferencer exte
         //Do not throw an exception here if the site is not available. Just return false
         return site == null ? false : site.supportsLocalMode();
     }
-    @Override
-    public ExecutorService getExecutor() {
-        return executorService;
-    }
     
     @Override
     protected Representation getRepresentation(Site site, String id, boolean offlineMode) throws EntityhubException {

Modified: stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java?rev=1565182&r1=1565181&r2=1565182&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java (original)
+++ stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java Thu Feb  6 11:32:38 2014
@@ -31,25 +31,22 @@ import at.newmedialab.ldpath.api.backend
 public final class SitesDereferencer extends TrackingDereferencerBase<SiteManager> {
     
 //    private final Logger log = LoggerFactory.getLogger(SiteDereferencer.class);
-    
-    private final ExecutorService executorService;
 
-    public SitesDereferencer(BundleContext context, ExecutorService executorService){
-        this(context, null, executorService);
+    public SitesDereferencer(BundleContext context){
+        this(context, null, null);
+    }
+    public SitesDereferencer(BundleContext context, ExecutorServiceProvider executorServiceProvider){
+        this(context, null, executorServiceProvider);
     }
-    public SitesDereferencer(BundleContext context, ServiceTrackerCustomizer customizer, ExecutorService executorService) {
-        super(context, SiteManager.class, null, customizer);
-        this.executorService = executorService;
+    public SitesDereferencer(BundleContext context, ServiceTrackerCustomizer customizer, 
+    		ExecutorServiceProvider executorServiceprovider) {
+        super(context, SiteManager.class, null, customizer, executorServiceprovider);
     }
     
     @Override
     public boolean supportsOfflineMode() {
         return true; //can not be determined here .. return true
     }
-    @Override
-    public ExecutorService getExecutor() {
-        return executorService;
-    }
     
     @Override
     protected Representation getRepresentation(SiteManager sm, String id, boolean offlineMode) throws EntityhubException {

Modified: stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java?rev=1565182&r1=1565181&r2=1565182&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java (original)
+++ stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java Thu Feb  6 11:32:38 2014
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.locks.Lock;
 
 import org.apache.clerezza.rdf.core.Language;
@@ -100,6 +101,8 @@ public abstract class TrackingDereferenc
     private Map<T,RDFBackend<Object>> rdfBackendCache = new IdentityHashMap<T,RDFBackend<Object>>();
 
     private final Class<T> serviceClass;
+
+	private ExecutorServiceProvider executorServiceProvider;
     /**
      * Creates a new instance for the parsed parameter
      * @param context the BundleContexed used to create the {@link ServiceTracker}
@@ -108,9 +111,11 @@ public abstract class TrackingDereferenc
      * @param filterEntries
      */
     protected TrackingDereferencerBase(BundleContext context, Class<T> serviceClass,
-            Map<String,String> filterEntries, ServiceTrackerCustomizer customizer){
+            Map<String,String> filterEntries, ServiceTrackerCustomizer customizer,
+            ExecutorServiceProvider executorServiceProvider){
         this.bundleContext = context;
         this.serviceClass = serviceClass;
+        this.executorServiceProvider = executorServiceProvider;
         //the fieldMapper allows to configure users fields that should be dereferenced
         if(filterEntries == null || filterEntries.isEmpty()){
             searchServiceTracker = new ServiceTracker(context, serviceClass.getName(), customizer);
@@ -271,6 +276,11 @@ public abstract class TrackingDereferenc
     }
     
     @Override
+    public final ExecutorService getExecutor() {
+    	return executorServiceProvider == null ? null : executorServiceProvider.getExecutorService();
+    }
+    
+    @Override
     public final boolean dereference(UriRef uri, MGraph graph, Lock writeLock, DereferenceContext derefContext) throws DereferenceException {
         T service = getService();
         if(service == null){

Modified: stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1565182&r1=1565181&r2=1565182&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ stanbol/trunk/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties Thu Feb  6 11:32:38 2014
@@ -71,3 +71,15 @@ dbpedia.org Resources regardless of the 
 his engine will use both the configured URI prefixes AND URI patterns to check \
 if it can dereference an Entity. If any of those configuration matches the \
 Entity will be dereferenced.
+
+enhancer.engines.dereference.entityhub.threads.size.name=Dereference Threads
+enhancer.engines.dereference.entityhub.threads.size.description=If no shared \
+Thread pool is used this allows to configure the size of the thread pool just \
+used by this engine. For values < 1 no Thread Pool will be created and the calling \
+thread will get used for dereferencing entities. 
+
+enhancer.engines.dereference.entityhub.threads.shared.name=Use Shared Thread Pool
+enhancer.engines.dereference.entityhub.threads.shared.description=If enabled the \
+Dereferencing will use a Thread Pool that is shared with other Entityhub Dereference \
+Engines. If disabled the 'Dereference Threads' property can be used to setup an \
+own Thread Pool used by just this engine instance.