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());
     }