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 2013/12/17 12:22:41 UTC
svn commit: r1551516 - in
/stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource:
ChainsRootResource.java EnhancementEnginesRootResource.java
Author: rwesten
Date: Tue Dec 17 11:22:41 2013
New Revision: 1551516
URL: http://svn.apache.org/r1551516
Log:
fixes for STANBOL-1188
Modified:
stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/ChainsRootResource.java
stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/EnhancementEnginesRootResource.java
Modified: stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/ChainsRootResource.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/ChainsRootResource.java?rev=1551516&r1=1551515&r2=1551516&view=diff
==============================================================================
--- stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/ChainsRootResource.java (original)
+++ stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/ChainsRootResource.java Tue Dec 17 11:22:41 2013
@@ -24,6 +24,7 @@ import static org.apache.clerezza.rdf.co
import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.RDF_XML;
import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.TURTLE;
import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.X_TURTLE;
+import static org.apache.stanbol.commons.web.base.utils.MediaTypeUtil.JSON_LD;
import static org.apache.stanbol.enhancer.jersey.utils.EnhancerUtils.addActiveChains;
import static org.apache.stanbol.enhancer.jersey.utils.EnhancerUtils.buildChainsMap;
@@ -49,19 +50,22 @@ import org.apache.clerezza.rdf.core.impl
import org.apache.clerezza.rdf.core.serializedform.Serializer;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.stanbol.commons.web.viewable.Viewable;
import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource;
import org.apache.stanbol.enhancer.servicesapi.Chain;
-import org.apache.stanbol.enhancer.servicesapi.ChainManager;
import org.apache.stanbol.enhancer.servicesapi.ContentItemFactory;
import org.apache.stanbol.enhancer.servicesapi.EnhancementEngineManager;
import org.apache.stanbol.enhancer.servicesapi.EnhancementJobManager;
+import org.apache.stanbol.enhancer.servicesapi.impl.ChainsTracker;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
@Component
@@ -75,22 +79,85 @@ public class ChainsRootResource extends
@Reference
private EnhancementEngineManager engineManager;
@Reference
- private ChainManager chainManager;
- @Reference
private ContentItemFactory ciFactory;
@Reference
private Serializer serializer;
+ protected Map<String,Map.Entry<ServiceReference,Chain>> _chainCache;
+ protected ChainsTracker chainTracker;
@Activate
public void activate(ComponentContext ctx) {
+ final BundleContext bc = ctx.getBundleContext();
+ chainTracker = new ChainsTracker(ctx.getBundleContext(), Collections.<String>emptySet(),
+ new ServiceTrackerCustomizer() {
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ Object service = bc.getService(reference);
+ if(service != null){
+ _chainCache = null; //rebuild the cache on the next call
+ }
+ return service;
+ }
+
+ @Override
+ public void modifiedService(ServiceReference reference, Object service) {
+ _chainCache = null; //rebuild the cache on the next call
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ if(reference != null){
+ bc.ungetService(reference);
+ _chainCache = null; //rebuild the cache on the next call
+ }
+ }
+ });
+ }
+
+ @Deactivate
+ protected void deactivate(ComponentContext ctx){
+ if(chainTracker != null){
+ chainTracker.close();
+ chainTracker = null;
+ }
}
-
+ /**
+ * Getter for the list of active chain
+ * @return the list of active chain (both {@link ServiceReference}
+ * and service).
+ */
+ protected Collection<Entry<ServiceReference,Chain>> getActiveChains(){
+ return getChainsMap().values();
+ }
+
+ /**
+ * Getter for an active chain by name
+ * @param name the name of the chain
+ * @return the active {@link Chain} (both {@link ServiceReference}
+ * and service) or <code>null<code> if none is active with this name
+ */
+ protected Entry<ServiceReference,Chain> getActiveChains(String name){
+ return getChainsMap().get(name);
+ }
+ /**
+ * @return
+ */
+ private Map<String,Entry<ServiceReference,Chain>> getChainsMap() {
+ Map<String, Entry<ServiceReference,Chain>> chains = _chainCache;
+ if(chains == null){
+ chains = buildChainsMap(chainTracker);
+ this._chainCache = Collections.unmodifiableMap(chains);
+ }
+ return chains;
+ }
+
@Path("{chain}")
public GenericEnhancerUiResource get(@PathParam(value = "chain") String chain) {
return new GenericEnhancerUiResource(chain, jobManager,
- engineManager, chainManager, ciFactory, serializer,
+ engineManager, chainTracker, ciFactory, serializer,
getLayoutConfiguration(), getUriInfo());
}
@@ -109,11 +176,11 @@ public class ChainsRootResource extends
return res.build();
}
@GET
- @Produces(value={APPLICATION_JSON,N3,N_TRIPLE,RDF_JSON,RDF_XML,TURTLE,X_TURTLE})
+ @Produces(value={JSON_LD, APPLICATION_JSON,N3,N_TRIPLE,RDF_JSON,RDF_XML,TURTLE,X_TURTLE})
public Response getEngines(@Context HttpHeaders headers){
String rootUrl = uriInfo.getBaseUriBuilder().path(getRootUrl()).build().toString();
MGraph graph = new SimpleMGraph();
- addActiveChains(buildChainsMap(chainManager).values(),chainManager.getDefault(),graph,rootUrl);
+ addActiveChains(getActiveChains(), chainTracker.getDefault(),graph,rootUrl);
ResponseBuilder res = Response.ok(graph);
//addCORSOrigin(servletContext,res, headers);
return res.build();
@@ -122,7 +189,7 @@ public class ChainsRootResource extends
public Collection<Chain> getChains(){
List<Chain> chains = new ArrayList<Chain>();
- for(Entry<ServiceReference,Chain> entry : buildChainsMap(chainManager).values()){
+ for(Entry<ServiceReference,Chain> entry : getActiveChains()){
chains.add(entry.getValue());
}
Collections.sort(chains, new Comparator<Chain>() {
@@ -134,7 +201,7 @@ public class ChainsRootResource extends
return chains;
}
public String getServicePid(String name){
- Entry<ServiceReference,Chain> entry = buildChainsMap(chainManager).get(name);
+ Entry<ServiceReference,Chain> entry = getActiveChains(name);
if(entry != null){
return (String)entry.getKey().getProperty(Constants.SERVICE_PID);
} else {
@@ -142,7 +209,7 @@ public class ChainsRootResource extends
}
}
public Integer getServiceRanking(String name){
- Entry<ServiceReference,Chain> entry = buildChainsMap(chainManager).get(name);
+ Entry<ServiceReference,Chain> entry = getActiveChains(name);
Integer ranking = null;
if(entry != null){
ranking = (Integer)entry.getKey().getProperty(Constants.SERVICE_RANKING);
@@ -154,7 +221,7 @@ public class ChainsRootResource extends
}
}
public Long getServiceId(String name){
- Entry<ServiceReference,Chain> entry = buildChainsMap(chainManager).get(name);
+ Entry<ServiceReference,Chain> entry = getActiveChains(name);
if(entry != null){
return (Long)entry.getKey().getProperty(Constants.SERVICE_ID);
} else {
@@ -162,10 +229,10 @@ public class ChainsRootResource extends
}
}
public Chain getDefaultChain(){
- return chainManager.getDefault();
+ return chainTracker.getDefault();
}
public boolean isDefault(String name){
- return chainManager.getDefault().getName().equals(name);
+ return chainTracker.getDefault().getName().equals(name);
}
Modified: stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/EnhancementEnginesRootResource.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/EnhancementEnginesRootResource.java?rev=1551516&r1=1551515&r2=1551516&view=diff
==============================================================================
--- stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/EnhancementEnginesRootResource.java (original)
+++ stanbol/trunk/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/resource/EnhancementEnginesRootResource.java Tue Dec 17 11:22:41 2013
@@ -23,6 +23,7 @@ import static org.apache.clerezza.rdf.co
import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.RDF_XML;
import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.TURTLE;
import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.X_TURTLE;
+import static org.apache.stanbol.commons.web.base.utils.MediaTypeUtil.JSON_LD;
import static org.apache.stanbol.enhancer.jersey.utils.EnhancerUtils.addActiveEngines;
import static org.apache.stanbol.enhancer.jersey.utils.EnhancerUtils.buildEnginesMap;
@@ -42,7 +43,9 @@ import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
+
import static javax.ws.rs.core.MediaType.TEXT_HTML;
+
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.UriInfo;
@@ -51,6 +54,7 @@ import org.apache.clerezza.rdf.core.MGra
import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
@@ -64,10 +68,13 @@ import org.apache.stanbol.enhancer.servi
import org.apache.stanbol.enhancer.servicesapi.EnhancementEngineManager;
import org.apache.stanbol.enhancer.servicesapi.EnhancementJobManager;
import org.apache.stanbol.enhancer.servicesapi.ServiceProperties;
+import org.apache.stanbol.enhancer.servicesapi.impl.EnginesTracker;
import org.apache.stanbol.enhancer.servicesapi.impl.SingleEngineChain;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
@Component
@@ -79,20 +86,91 @@ public class EnhancementEnginesRootResou
@Reference
private EnhancementJobManager jobManager;
@Reference
- private EnhancementEngineManager engineManager;
- @Reference
private ChainManager chainManager;
@Reference
private ContentItemFactory ciFactory;
+ /**
+ * Read-only list of active engines. Do not access directly as this is
+ * lazy initialised after any change in the list of active {@link EnhancementEngine}.
+ * Use {@link #getActiveEngine(String)} and {@link #getActiveEngines()} instead.
+ */
+ protected Map<String, Entry<ServiceReference,EnhancementEngine>> _enginesCache;
+
+ /**
+ * Tracks available EnhancementEngines
+ */
+ private EnginesTracker engineTracker;
- private Map<String, Entry<ServiceReference,EnhancementEngine>> engines;
-
@Activate
- public void activate(ComponentContext ctx) {
- engines = buildEnginesMap(engineManager);
+ protected void activate(ComponentContext ctx) {
+ final BundleContext bc = ctx.getBundleContext();
+ engineTracker = new EnginesTracker(bc, Collections.<String>emptySet(),
+ new ServiceTrackerCustomizer() {
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ Object service = bc.getService(reference);
+ if(service != null){
+ _enginesCache = null; //rebuild the cache on the next call
+ }
+ return service;
+ }
+
+ @Override
+ public void modifiedService(ServiceReference reference, Object service) {
+ _enginesCache = null; //rebuild the cache on the next call
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ if(reference != null){
+ bc.ungetService(reference);
+ _enginesCache = null; //rebuild the cache on the next call
+ }
+ }
+
+ });
}
+ @Deactivate
+ protected void deactivate(ComponentContext ctx){
+ if(engineTracker != null){
+ engineTracker.close();
+ engineTracker = null;
+ }
+ }
+ /**
+ * Getter for the list of active EnhancementEngines
+ * @return the list of active EnhancementEngines (both {@link ServiceReference}
+ * and service).
+ */
+ protected Collection<Entry<ServiceReference,EnhancementEngine>> getActiveEngines(){
+ Map<String,Entry<ServiceReference,EnhancementEngine>> engines = getEnginesMap();
+ return engines.values();
+ }
+
+ /**
+ * Getter for an active engine by name
+ * @param name the name of the engine
+ * @return the active EnhancementEngine (both {@link ServiceReference}
+ * and service) or <code>null<code> if none is active with this name
+ */
+ protected Entry<ServiceReference,EnhancementEngine> getActiveEngine(String name){
+ return getEnginesMap().get(name);
+ }
+ /**
+ * @return
+ */
+ private Map<String,Entry<ServiceReference,EnhancementEngine>> getEnginesMap() {
+ Map<String, Entry<ServiceReference,EnhancementEngine>> engines = _enginesCache;
+ if(engines == null){
+ engines = buildEnginesMap(engineTracker);
+ this._enginesCache = Collections.unmodifiableMap(engines);
+ }
+ return engines;
+ }
+
/* @OPTIONS
public Response handleCorsPreflight(@Context HttpHeaders headers){
ResponseBuilder res = Response.ok();
@@ -109,11 +187,11 @@ public class EnhancementEnginesRootResou
}
@GET
- @Produces(value={APPLICATION_JSON,N3,N_TRIPLE,RDF_JSON,RDF_XML,TURTLE,X_TURTLE})
+ @Produces(value={JSON_LD, APPLICATION_JSON,N3,N_TRIPLE,RDF_JSON,RDF_XML,TURTLE,X_TURTLE})
public Response getEngines(@Context HttpHeaders headers){
String rootUrl = uriInfo.getBaseUriBuilder().path(getRootUrl()).build().toString();
MGraph graph = new SimpleMGraph();
- addActiveEngines(engines.values(), graph, rootUrl);
+ addActiveEngines(getActiveEngines(), graph, rootUrl);
ResponseBuilder res = Response.ok(graph);
// addCORSOrigin(servletContext,res, headers);
return res.build();
@@ -121,7 +199,7 @@ public class EnhancementEnginesRootResou
public Collection<EnhancementEngine> getEngines(){
List<EnhancementEngine> engines = new ArrayList<EnhancementEngine>();
- for(Entry<ServiceReference,EnhancementEngine> entry : this.engines.values()){
+ for(Entry<ServiceReference,EnhancementEngine> entry : getActiveEngines()){
engines.add(entry.getValue());
}
Collections.sort(engines, new Comparator<EnhancementEngine>() {
@@ -133,7 +211,7 @@ public class EnhancementEnginesRootResou
return engines;
}
public String getServicePid(String name){
- Entry<ServiceReference,EnhancementEngine> entry = engines.get(name);
+ Entry<ServiceReference,EnhancementEngine> entry = getActiveEngine(name);
if(entry != null){
return (String)entry.getKey().getProperty(Constants.SERVICE_PID);
} else {
@@ -141,7 +219,7 @@ public class EnhancementEnginesRootResou
}
}
public Integer getServiceRanking(String name){
- Entry<ServiceReference,EnhancementEngine> entry = engines.get(name);
+ Entry<ServiceReference,EnhancementEngine> entry = getActiveEngine(name);
Integer ranking = null;
if(entry != null){
ranking = (Integer)entry.getKey().getProperty(Constants.SERVICE_RANKING);
@@ -153,7 +231,7 @@ public class EnhancementEnginesRootResou
}
}
public Long getServiceId(String name){
- Entry<ServiceReference,EnhancementEngine> entry = engines.get(name);
+ Entry<ServiceReference,EnhancementEngine> entry = getActiveEngine(name);
if(entry != null){
return (Long)entry.getKey().getProperty(Constants.SERVICE_ID);
} else {
@@ -163,7 +241,7 @@ public class EnhancementEnginesRootResou
@Path("{engineName}")
public EngineResource getEngine(@PathParam(value = "engineName") String name) {
- return new EngineResource(name, jobManager, engineManager, chainManager,
+ return new EngineResource(name, jobManager, engineTracker, chainManager,
ciFactory, getLayoutConfiguration(), getUriInfo());
}