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:29:13 UTC
svn commit: r1565177 - in
/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main:
java/org/apache/stanbol/enhancer/engines/dereference/entityhub/
java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/
resource...
Author: rwesten
Date: Thu Feb 6 11:29:12 2014
New Revision: 1565177
URL: http://svn.apache.org/r1565177
Log:
implementation of STANBOL-1276 for 0.12.0
Added:
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedDereferenceThreadPool.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedExecutorServiceProvider.java
Modified:
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java
stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties
Modified: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java?rev=1565177&r1=1565176&r2=1565177&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferenceEngine.java Thu Feb 6 11:29:12 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/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java?rev=1565177&r1=1565176&r2=1565177&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/EntityhubDereferencer.java Thu Feb 6 11:29:12 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) {
Added: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java?rev=1565177&view=auto
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java (added)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/ExecutorServiceProvider.java Thu Feb 6 11:29:12 2014
@@ -0,0 +1,25 @@
+/*
+* 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.stanbol.enhancer.engines.dereference.entityhub;
+
+import java.util.concurrent.ExecutorService;
+
+public interface ExecutorServiceProvider {
+
+ ExecutorService getExecutorService();
+
+}
Modified: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java?rev=1565177&r1=1565176&r2=1565177&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SiteDereferencer.java Thu Feb 6 11:29:12 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/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java?rev=1565177&r1=1565176&r2=1565177&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/SitesDereferencer.java Thu Feb 6 11:29:12 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 {
Added: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java?rev=1565177&view=auto
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java (added)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/StaticExecutorServiceProvider.java Thu Feb 6 11:29:12 2014
@@ -0,0 +1,39 @@
+/*
+* 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.stanbol.enhancer.engines.dereference.entityhub;
+
+import java.util.concurrent.ExecutorService;
+
+public class StaticExecutorServiceProvider implements ExecutorServiceProvider {
+
+ private ExecutorService executorService;
+
+ public StaticExecutorServiceProvider(ExecutorService executorService){
+ this.executorService = executorService;
+ }
+
+ @Override
+ public ExecutorService getExecutorService() {
+ if(executorService != null && !executorService.isShutdown()){
+ return executorService;
+ } else {
+ return null;
+ }
+ }
+
+
+}
Modified: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java?rev=1565177&r1=1565176&r2=1565177&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/TrackingDereferencerBase.java Thu Feb 6 11:29:12 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){
Added: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedDereferenceThreadPool.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedDereferenceThreadPool.java?rev=1565177&view=auto
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedDereferenceThreadPool.java (added)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedDereferenceThreadPool.java Thu Feb 6 11:29:12 2014
@@ -0,0 +1,135 @@
+/*
+* 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.stanbol.enhancer.engines.dereference.entityhub.shared;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Property;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
+/**
+ * Component that registers a Thread
+ * @author westei
+ *
+ */
+@Component(
+ configurationFactory = false, //only a single instance
+ policy = ConfigurationPolicy.OPTIONAL, // the baseUri is required!
+ specVersion = "1.1",
+ metatype = true,
+ immediate = true)
+public class SharedDereferenceThreadPool {
+
+ private final Logger log = LoggerFactory.getLogger(SharedDereferenceThreadPool.class);
+
+ @Property(intValue=SharedDereferenceThreadPool.DEFAULT_SHARED_THREAD_POOL_SIZE)
+ public static final String SHARED_THREAD_POOL_SIZE = "enhancer.engines.dereference.entityhub.sharedthreadpool.size";
+ public static final int DEFAULT_SHARED_THREAD_POOL_SIZE = 8;
+
+ /**
+ * used as key for {@link Filter}s to track the shared thread pool
+ */
+ static final String SHARED_THREAD_POOL_NAME = "enhancer.engines.dereference.entityhub.sharedthreadpool.name";
+ /**
+ * used as value for {@link Filter}s to track the shared thread pool
+ */
+ static final String DEFAULT_SHARED_THREAD_POOL_NAME = "shared";
+
+ /**
+ * {@link Filter} string for tracking the {@link ExecutorService} registered
+ * by this component as OSGI service
+ */
+ public static String SHARED_THREAD_POOL_FILTER = String.format(
+ "(&(%s=%s)(%s=%s))",
+ Constants.OBJECTCLASS,ExecutorService.class.getName(),
+ SHARED_THREAD_POOL_NAME, DEFAULT_SHARED_THREAD_POOL_NAME);
+
+ private ServiceRegistration serviceRegistration;
+
+ private ExecutorService executorService;
+
+ @Activate
+ protected void activate(ComponentContext ctx) throws ConfigurationException {
+ log.info("activate {}",getClass().getSimpleName());
+ Object value = ctx.getProperties().get(SHARED_THREAD_POOL_SIZE);
+ int poolSize;
+ if(value == null){
+ poolSize = DEFAULT_SHARED_THREAD_POOL_SIZE;
+ } else if(value instanceof Number){
+ poolSize = ((Number)value).intValue();
+ } else {
+ try {
+ poolSize = Integer.parseInt(value.toString());
+ } catch (NumberFormatException e){
+ throw new ConfigurationException(SHARED_THREAD_POOL_SIZE, "Value '" + value
+ + "'(type: "+value.getClass().getName()+") can not be parsed "
+ + "as Integer");
+ }
+ }
+ if(poolSize == 0){
+ poolSize = DEFAULT_SHARED_THREAD_POOL_SIZE;
+ }
+ if(poolSize < 0){
+ log.info("{} is deactivated because configured thread pool size < 0",
+ getClass().getSimpleName());
+ } else {
+ String namePattern = getClass().getSimpleName()+"-thread-%s";
+ ThreadFactory threadFactory = new ThreadFactoryBuilder()
+ .setNameFormat(namePattern)
+ .setDaemon(true).build();
+ log.debug(" - create Threadpool(namePattern='{}' | size='{}')",
+ namePattern,poolSize);
+ executorService = Executors.newFixedThreadPool(poolSize, threadFactory);
+ Dictionary<String, Object> dict = new Hashtable<String, Object>();
+ dict.put(SHARED_THREAD_POOL_SIZE, poolSize);
+ dict.put(SHARED_THREAD_POOL_NAME, DEFAULT_SHARED_THREAD_POOL_NAME);
+ log.debug(" - register ExecutorService");
+ serviceRegistration = ctx.getBundleContext().registerService(
+ ExecutorService.class.getName(), executorService, dict);
+ }
+ }
+
+ @Deactivate
+ protected void deactivate(ComponentContext ctx){
+ log.info("deactivate {}", getClass().getSimpleName());
+ if(serviceRegistration != null){
+ serviceRegistration.unregister();
+ }
+ if(executorService != null){
+ log.info(" ... shutdown ExecutorService");
+ executorService.shutdown();
+ executorService = null;
+ }
+ }
+
+}
Added: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedExecutorServiceProvider.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedExecutorServiceProvider.java?rev=1565177&view=auto
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedExecutorServiceProvider.java (added)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/java/org/apache/stanbol/enhancer/engines/dereference/entityhub/shared/SharedExecutorServiceProvider.java Thu Feb 6 11:29:12 2014
@@ -0,0 +1,62 @@
+/*
+* 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.stanbol.enhancer.engines.dereference.entityhub.shared;
+
+import java.util.concurrent.ExecutorService;
+
+import org.apache.stanbol.enhancer.engines.dereference.entityhub.ExecutorServiceProvider;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Utility that wraps a {@link ServiceTracker} to lookup the shared thread
+ * pool for dereferencing
+ *
+ * @author Rupert Westenthaler
+ *
+ */
+public class SharedExecutorServiceProvider implements ExecutorServiceProvider {
+
+ private ServiceTracker tracker;
+
+ public SharedExecutorServiceProvider(BundleContext context) {
+ try {
+ this.tracker = new ServiceTracker(context, context.createFilter(
+ SharedDereferenceThreadPool.SHARED_THREAD_POOL_FILTER), null);
+ } catch (InvalidSyntaxException e) {
+ throw new IllegalStateException("Unable to create filter for the " +
+ SharedDereferenceThreadPool.class.getSimpleName(), e);
+ }
+ }
+
+ @Override
+ public ExecutorService getExecutorService(){
+ ExecutorService executorService = (ExecutorService)tracker.getService();
+ if(executorService != null && !executorService.isShutdown()){
+ return executorService;
+ } else {
+ return null;
+ }
+ }
+
+ public void close(){
+ tracker.close();
+ }
+
+
+}
Modified: stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1565177&r1=1565176&r2=1565177&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ stanbol/branches/release-0.12/enhancement-engines/dereference/entityhub/src/main/resources/OSGI-INF/metatype/metatype.properties Thu Feb 6 11:29:12 2014
@@ -73,3 +73,14 @@ his engine will use both the configured
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.