Repository: clerezza
Updated Branches:
  refs/heads/master 70b63d940 -> 68a9b1ec6


CLEREZZA-939: Caching and exposing as service made optional


Project: http://git-wip-us.apache.org/repos/asf/clerezza/repo
Commit: http://git-wip-us.apache.org/repos/asf/clerezza/commit/ba3004ac
Tree: http://git-wip-us.apache.org/repos/asf/clerezza/tree/ba3004ac
Diff: http://git-wip-us.apache.org/repos/asf/clerezza/diff/ba3004ac

Branch: refs/heads/master
Commit: ba3004ac6c3a1a2e867a92448724d62b84852108
Parents: 70b63d9
Author: Minto van der Sluis <[email protected]>
Authored: Tue Aug 12 18:11:53 2014 +0200
Committer: Minto van der Sluis <[email protected]>
Committed: Tue Aug 12 18:11:53 2014 +0200

----------------------------------------------------------------------
 rdf.core/pom.xml                                |   7 +-
 .../clerezza/rdf/core/access/TcManager.java     |  88 +++++++++++-----
 .../rdf/core/access/TcProviderMultiplexer.java  | 105 ++++++++++++-------
 3 files changed, 132 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/clerezza/blob/ba3004ac/rdf.core/pom.xml
----------------------------------------------------------------------
diff --git a/rdf.core/pom.xml b/rdf.core/pom.xml
index cd6fcae..6c43334 100644
--- a/rdf.core/pom.xml
+++ b/rdf.core/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <artifactId>clerezza</artifactId>
         <groupId>org.apache.clerezza</groupId>
-        <version>0.5</version>
+        <version>1.0.0-SNAPSHOT</version>
         <relativePath>../parent</relativePath>
     </parent>
     <groupId>org.apache.clerezza</groupId>
@@ -40,11 +40,10 @@
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
         </dependency>
-        <!-- <dependency>
+        <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.6</version>
-        </dependency> -->
+        </dependency>
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.scr.ds-annotations</artifactId>

http://git-wip-us.apache.org/repos/asf/clerezza/blob/ba3004ac/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
----------------------------------------------------------------------
diff --git 
a/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java 
b/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
index c59b048..48a5c9a 100644
--- a/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
+++ b/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
@@ -24,11 +24,13 @@ import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Properties;
 import java.util.ServiceLoader;
 import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.apache.clerezza.rdf.core.Graph;
 import org.apache.clerezza.rdf.core.MGraph;
@@ -48,7 +50,11 @@ import 
org.apache.clerezza.rdf.core.sparql.query.ConstructQuery;
 import org.apache.clerezza.rdf.core.sparql.query.DescribeQuery;
 import org.apache.clerezza.rdf.core.sparql.query.Query;
 import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Component;
@@ -99,9 +105,15 @@ import 
org.osgi.service.component.annotations.ReferencePolicy;
  */
 //immedia is set to true as this should register the graph services (even if 
manager service is not required)
 @Component(service = TcManager.class, immediate = true)
+@Properties({
+       @Property(name = TcManager.MGRAPH_CACHE_ENABLED, boolValue = true, 
description = "Enable caching mgraphs."),
+       @Property(name = TcManager.TRIPLECOLLECTION_SERVICES_ENABLED, boolValue 
= true, description = "Register triple collections as services.") })
 public class TcManager extends TcProviderMultiplexer {
 
     public final static String GENERAL_PURPOSE_TC = "general.purpose.tc";
+    public final static String TRIPLECOLLECTION_SERVICES_ENABLED = 
"triplecollection.services.enabled";
+    public final static String MGRAPH_CACHE_ENABLED = "mgraph.cache.enabled";
+
     private static volatile TcManager instance;
     private TcAccessController tcAccessController = new TcAccessController() {
 
@@ -115,10 +127,12 @@ public class TcManager extends TcProviderMultiplexer {
             .synchronizedMap(new HashMap<UriRef, ServiceRegistration>());
     
     protected QueryEngine queryEngine;
+    private boolean isActivated = false;
+    private boolean isTcServicesEnabled = true;
 
     private ComponentContext componentContext;
-    private Collection<UriRef> mGraphsToRegisterOnActivation = new 
HashSet<UriRef>();
-    private Collection<UriRef> graphsToRegisterOnActivation = new 
HashSet<UriRef>();
+    protected SortedSet<WeightedTcProvider> tempProviderList = new 
TreeSet<WeightedTcProvider>(
+            new WeightedProviderComparator());
 
     /**
      * the constructor sets the singleton instance to allow instantiation by
@@ -143,6 +157,7 @@ public class TcManager extends TcProviderMultiplexer {
             synchronized (TcManager.class) {
                 if (instance == null) {
                     instance = new TcManager();
+                    instance.isActivated = true;
                     Iterator<WeightedTcProvider> weightedProviders = 
ServiceLoader
                             .load(WeightedTcProvider.class).iterator();
                     while (weightedProviders.hasNext()) {
@@ -164,15 +179,26 @@ public class TcManager extends TcProviderMultiplexer {
         }
         return instance;
     }
-
+    
     protected void activate(final ComponentContext componentContext) {
         this.componentContext = componentContext;
-        for (UriRef name : mGraphsToRegisterOnActivation) {
-            registerTripleCollectionAsService(name, true);
-        }
-        for (UriRef name : graphsToRegisterOnActivation) {
-            registerTripleCollectionAsService(name, false);
+        
+        // Read configuration
+               isTcServicesEnabled = true;
+               Object configTcServicesEnabled = 
componentContext.getProperties().get(TRIPLECOLLECTION_SERVICES_ENABLED);
+               if ( configTcServicesEnabled != null && configTcServicesEnabled 
instanceof String ) {
+                       isTcServicesEnabled = 
Boolean.valueOf((String)configTcServicesEnabled);                         
+               }
+               Object configCacheEnabled = 
componentContext.getProperties().get(MGRAPH_CACHE_ENABLED);
+               if ( configCacheEnabled != null && configCacheEnabled 
instanceof String ) {
+                       
setCachingEnabled(Boolean.valueOf((String)configCacheEnabled));                 
        
+               }
+               isActivated = true;
+               
+        for (WeightedTcProvider provider : tempProviderList) {
+               addWeightedTcProvider(provider);
         }
+        tempProviderList.clear();
     }
 
     protected void deactivate(final ComponentContext componentContext) {
@@ -181,6 +207,7 @@ public class TcManager extends TcProviderMultiplexer {
         }
         serviceRegistrations.clear();
         this.componentContext = null;
+               isActivated = false;
     }
 
     @Override
@@ -476,7 +503,11 @@ public class TcManager extends TcProviderMultiplexer {
     @Reference(policy = ReferencePolicy.DYNAMIC, 
             cardinality = ReferenceCardinality.MULTIPLE)
     protected void bindWeightedTcProvider(WeightedTcProvider provider) {
-        addWeightedTcProvider(provider);
+       if (isActivated) {
+               addWeightedTcProvider(provider);
+       } else {
+               tempProviderList.add(provider);                 
+       }
     }
 
     /**
@@ -498,7 +529,11 @@ public class TcManager extends TcProviderMultiplexer {
             cardinality = ReferenceCardinality.AT_LEAST_ONE,
             target = "("+TcManager.GENERAL_PURPOSE_TC+"=true)")
     protected void bindGpWeightedTcProvider(WeightedTcProvider provider) {
-        addWeightedTcProvider(provider);
+       if (isActivated) {
+               addWeightedTcProvider(provider);
+       } else {
+               tempProviderList.add(provider);                 
+       }
     }
 
     /**
@@ -523,24 +558,28 @@ public class TcManager extends TcProviderMultiplexer {
 
     @Override
     protected void mGraphAppears(UriRef name) {
-        if (componentContext == null) {
-            mGraphsToRegisterOnActivation.add(name);
-        } else {
-            registerTripleCollectionAsService(name, true);
-        }
+       if (isTcServicesEnabled()) {
+               // Only create the service when activated. When not activated
+               // creating will be delayed till after activation.
+               if (componentContext != null) {
+                   registerTripleCollectionAsService(name, true);
+               }
+       }
     }
 
     @Override
     protected void graphAppears(UriRef name) {
-        if (componentContext == null) {
-            graphsToRegisterOnActivation.add(name);
-        } else {
-            registerTripleCollectionAsService(name, false);
-        }
+       if (isTcServicesEnabled()) {
+               // Only create the service when activated. When not activated
+               // creating will be delayed till after activation.
+               if (componentContext != null) {
+                   registerTripleCollectionAsService(name, false);
+               }
+       }
     }
 
     private void registerTripleCollectionAsService(UriRef name, boolean 
isMGraph) {
-        Dictionary props = new Properties();
+        Dictionary<String,Object> props = new Hashtable<String, Object>();
         props.put("name", name.getUnicodeString());
         String[] interfaceNames;
         Object service;
@@ -564,8 +603,6 @@ public class TcManager extends TcProviderMultiplexer {
 
     @Override
     protected void tcDisappears(UriRef name) {
-        mGraphsToRegisterOnActivation.remove(name);
-        graphsToRegisterOnActivation.remove(name);
         ServiceRegistration reg = serviceRegistrations.get(name);
         if (reg != null) {
             reg.unregister();
@@ -590,4 +627,7 @@ public class TcManager extends TcProviderMultiplexer {
         return singleTargetTcProvider;
     }
 
+    public boolean isTcServicesEnabled() {
+               return isTcServicesEnabled;
+       }
 }

http://git-wip-us.apache.org/repos/asf/clerezza/blob/ba3004ac/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java
----------------------------------------------------------------------
diff --git 
a/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java
 
b/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java
index 8c0f832..65f663e 100644
--- 
a/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java
+++ 
b/rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcProviderMultiplexer.java
@@ -54,6 +54,12 @@ public class TcProviderMultiplexer implements TcProvider {
      */
     private Map<UriRef, MGraphHolder> mGraphCache = 
Collections.synchronizedMap(new HashMap<UriRef, MGraphHolder>());
 
+       /**
+        * Flag to indicate whether mgraphs should be cached for faster access. 
By
+        * default caching is enabled for backward compatibility.
+        */
+       private boolean isCachingEnabled = true;
+
     /**
      * Registers a provider
      *
@@ -142,24 +148,25 @@ public class TcProviderMultiplexer implements TcProvider {
     private void weightedProviderAdded(WeightedTcProvider newProvider,
             Set<UriRef> newProvidedUris) {
         Set<WeightedTcProvider> lowerWeightedProviderList = 
getLowerWeightedProvider(newProvider);
-        for (UriRef name : newProvidedUris) {
-            final MGraphHolder holder = mGraphCache.get(name);
-            if ((holder != null) && (holder.getWeightedTcProvider() != null)) {
-                if 
(lowerWeightedProviderList.contains(holder.getWeightedTcProvider())) {
-                    tcDisappears(name);
-                    mGraphCache.remove(name);
-                } else {
-                    continue;
-                }
-            }
-            TripleCollection triples = newProvider.getTriples(name);
-            if (triples instanceof MGraph) {
-                mGraphCache.put(name, new MGraphHolder(newProvider, 
ensureLockable((MGraph)triples)));
-                mGraphAppears(name);
-            } else {
-                graphAppears(name);
-            }
-
+       if (isCachingEnabled()) {
+               for (UriRef name : newProvidedUris) {
+                   final MGraphHolder holder = mGraphCache.get(name);
+                   if ((holder != null) && (holder.getWeightedTcProvider() != 
null)) {
+                       if 
(lowerWeightedProviderList.contains(holder.getWeightedTcProvider())) {
+                           tcDisappears(name);
+                           mGraphCache.remove(name);
+                       } else {
+                           continue;
+                       }
+                   }
+                   TripleCollection triples = newProvider.getTriples(name);
+                   if (triples instanceof MGraph) {
+                               mGraphCache.put(name, new 
MGraphHolder(newProvider, ensureLockable((MGraph)triples)));
+                       mGraphAppears(name);
+                   } else {
+                       graphAppears(name);
+                   }
+               }
         }
     }
 
@@ -188,23 +195,24 @@ public class TcProviderMultiplexer implements TcProvider {
                 tcDisappears(name);
                 mGraphCache.remove(name);
 
-                // check if another WeightedTcProvider has the 
TripleCollection.
-                // And if so register as service.
-                for (WeightedTcProvider provider : providerList) {
-                    try {
-                        TripleCollection triples = provider.getTriples(name);
-                        if (triples instanceof MGraph) {
-                            mGraphCache.put(name, new MGraphHolder(provider, 
ensureLockable((MGraph)triples)));
-                            mGraphAppears(name);
-                        } else {
-                            graphAppears(name);
-                        }
-                        break;
-                    } catch (NoSuchEntityException e) {
-                        // continue;
-                    }
-                }
-
+               if (isCachingEnabled()) {
+                       // check if another WeightedTcProvider has the 
TripleCollection.
+                       // And if so register as service.
+                       for (WeightedTcProvider provider : providerList) {
+                           try {
+                               TripleCollection triples = 
provider.getTriples(name);
+                               if (triples instanceof MGraph) {
+                                       mGraphCache.put(name, new 
MGraphHolder(provider, ensureLockable((MGraph)triples)));
+                                   mGraphAppears(name);
+                               } else {
+                                   graphAppears(name);
+                               }
+                               break;
+                           } catch (NoSuchEntityException e) {
+                               // continue;
+                           }
+                       }
+               }
             }
         }
     }
@@ -253,9 +261,10 @@ public class TcProviderMultiplexer implements TcProvider {
                 MGraph providedMGraph = provider.getMGraph(name);
                 LockableMGraph result = ensureLockable(providedMGraph);
 
-                MGraphHolder holder = mGraphCache.get(name);
-                mGraphCache.put(name, new MGraphHolder(
-                        provider, result));
+                if (isCachingEnabled()) {
+                       mGraphCache.put(name, new MGraphHolder(
+                               provider, result));
+                }
                 return result;
             } catch (NoSuchEntityException e) {
                 //we do nothing and try our luck with the next provider
@@ -305,7 +314,9 @@ public class TcProviderMultiplexer implements TcProvider {
                 // unregisters a possible Graph or MGraph service under this 
name
                 // provided by a WeightedTcProvider with a lower weight.
                 tcDisappears(name);
-                mGraphCache.put(name, new MGraphHolder(provider, null));
+                if (isCachingEnabled()) {
+                       mGraphCache.put(name, new MGraphHolder(provider, null));
+                }
                 mGraphAppears(name);
                 return result;
             } catch (UnsupportedOperationException e) {
@@ -327,7 +338,9 @@ public class TcProviderMultiplexer implements TcProvider {
                 // unregisters a possible Graph or MGraph service under this 
name
                 // provided by a WeightedTcProvider with a lower weight.
                 tcDisappears(name);
-                mGraphCache.put(name, new MGraphHolder(provider, null));
+                if (isCachingEnabled()) {
+                       mGraphCache.put(name, new MGraphHolder(provider, null));
+                }
                 graphAppears(name);
                 return result;
             } catch (UnsupportedOperationException e) {
@@ -441,4 +454,16 @@ public class TcProviderMultiplexer implements TcProvider {
     public SortedSet<WeightedTcProvider> getProviderList() {
         return providerList;
     }
+
+    public boolean isCachingEnabled() {
+               return isCachingEnabled;
+       }
+    
+    public void setCachingEnabled(boolean isCachingEnabled) {
+               this.isCachingEnabled = isCachingEnabled;
+               
+               if (!isCachingEnabled()) {
+                       mGraphCache.clear();
+               }
+       }
 }

Reply via email to