You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/04/01 11:53:46 UTC
svn commit: r929898 -
/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
Author: reto
Date: Thu Apr 1 09:53:46 2010
New Revision: 929898
URL: http://svn.apache.org/viewvc?rev=929898&view=rev
Log:
CLEREZZA-181 registering MGraph as LockableMGraphs as well
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java?rev=929898&r1=929897&r2=929898&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java Thu Apr 1 09:53:46 2010
@@ -16,734 +16,737 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.clerezza.rdf.core.access;
-
-import org.apache.clerezza.rdf.core.access.security.TcPermission;
-import org.apache.clerezza.rdf.core.impl.WriteBlockedMGraph;
-import org.apache.clerezza.rdf.core.impl.WriteBlockedTripleCollection;
-
-import java.lang.ref.WeakReference;
-import java.security.AccessControlException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.HashSet;
-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.osgi.framework.ServiceRegistration;
-import org.osgi.service.component.ComponentContext;
-import org.apache.clerezza.rdf.core.Graph;
-import org.apache.clerezza.rdf.core.MGraph;
-import org.apache.clerezza.rdf.core.TripleCollection;
-import org.apache.clerezza.rdf.core.UriRef;
-import org.apache.clerezza.rdf.core.sparql.query.AskQuery;
-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.NoQueryEngineException;
-import org.apache.clerezza.rdf.core.sparql.query.Query;
-import org.apache.clerezza.rdf.core.sparql.QueryEngine;
-import org.apache.clerezza.rdf.core.sparql.ResultSet;
-import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
-
-/**
- * This class implements <code>TcManager</code>, delegating the actual
- * provision and creation of Graphs or MGraphs to registered <code>TcProvider</code>s. The class
- * attempts to satisfy the request using the register <code>WeightedTcProvider</code>
- * in decreasing order of weight. If multiple providers have the same weight the
- * lexicographical order of the fully qualified class name determines which one
- * is used, namely the one that occurs earlier. If a call to a registered provider
- * causes an <code>IllegalArgumentException</code>, <code>NoSuchEntityException</code>
- * or <code>UnsupportedOperationException</code> then the call is delegated to the
- * next provider.
- *
- * Only one instance of this class should exist in a system, the public no
- * argument constructor is meant for initialization by dependency injection systems
- * such as OSGi-DS. Applications should use the static <code>getInstance()</code>
- * method if they aren't using a framework that injects them the instance.
- *
- * This class returns <code>LockableMGraph</code>s a subtype of <code>MGraph</code>
- * that allows read/write locks.
- *
- *
- * @author reto, mir, hasan
- *
- * @scr.component
- * @scr.service interface="org.apache.clerezza.rdf.core.access.TcManager"
- * @scr.reference name="weightedTcProvider" cardinality="1..n"
- * policy="dynamic"
- * interface="org.apache.clerezza.rdf.core.access.WeightedTcProvider"
- *
- */
-public class TcManager implements TcProvider {
-
- private SortedSet<WeightedTcProvider> providerList = new TreeSet<WeightedTcProvider>(
- new WeightedProviderComparator());
- private static volatile TcManager instance;
-
- /**
- * Mapping to LockableMGraph's and ServiceRegistration using their URI's as key.
- * Makes sure that per URI only one instance of the LockableMGraph is used,
- * otherwise the locks in the <code>LockableMGraph</code>s would have no effect
- * between different instances and concurrency issues could occur.
- */
- private Map<UriRef, GraphHolder> synchronizedLockableMGraphCache = Collections
- .synchronizedMap(new HashMap<UriRef, GraphHolder>());
-
- /**
- * @scr.reference cardinality="0..1"
- */
- protected QueryEngine queryEngine;
-
- private ComponentContext componentContext;
-
- /*
- * A store that keeps <code>WeightedTcProvider</code>S in case the
- * componentContext is null. Used in activate().
- */
- private Set<WeightedTcProvider> providerStore =
- Collections.synchronizedSet(new HashSet<WeightedTcProvider>());
-
- /**
- * the constructor sets the singleton instance to allow instantiation by
- * OSGi-DS. This constructor should not be called except by OSGi-DS,
- * otherwise the static <code>getInstance</code> method should be used.
- */
- public TcManager() {
- TcManager.instance = this;
- }
-
- /**
- * This returns the singleton instance. If an instance has been previously
- * created (e.g. by OSGi declarative services) this instance is returned,
- * otherwise a new instance is created and providers are injected using the
- * service provider interface (META-INF/services/)
- *
- * @return the singleton instance
- */
- public static TcManager getInstance() {
- if (instance == null) {
- synchronized (TcManager.class) {
- if (instance == null) {
- new TcManager();
- Iterator<WeightedTcProvider> weightedProviders = ServiceLoader
- .load(WeightedTcProvider.class).iterator();
- while (weightedProviders.hasNext()) {
- WeightedTcProvider weightedProvider = weightedProviders
- .next();
- instance
- .bindWeightedTcProvider(weightedProvider);
- }
- Iterator<QueryEngine> queryEngines = ServiceLoader.load(
- QueryEngine.class).iterator();
- System.out.println("looking for QE");
- if (queryEngines.hasNext()) {
- instance.queryEngine = queryEngines.next();
- System.out.println("QE: "
- + instance.queryEngine.getClass());
- }
- }
- }
- }
- return instance;
- }
-
- protected void activate(final ComponentContext componentContext) {
- this.componentContext = componentContext;
- Iterator<WeightedTcProvider> it = providerStore.iterator();
- while (it.hasNext()) {
- WeightedTcProvider provider = it.next();
- updateLockableMGraphCache(provider, true);
- }
- providerStore.clear();
- }
-
- protected void deactivate(final ComponentContext componentContext) {
- this.componentContext = null;
- }
-
- /**
- * Registers a provider
- *
- * @param provider
- * the provider to be registered
- */
- protected void bindWeightedTcProvider(WeightedTcProvider provider) {
- providerList.add(provider);
- if (componentContext != null) {
- updateLockableMGraphCache(provider, true);
- } else {
- providerStore.add(provider);
- }
- }
-
- /**
- * Unregister a provider
- *
- * @param provider
- * the provider to be deregistered
- */
- protected void unbindWeightedTcProvider(
- WeightedTcProvider provider) {
- providerList.remove(provider);
- providerStore.remove(provider);
- updateLockableMGraphCache(provider, false);
- }
-
- /**
- * Updates the lockableMGraphCache AFTER a new <code>provider</code> was
- * bound or unbound.
- * This method also takes care of registering and unregistering
- * provided triple collections as services based on the weight of
- * all affected providers.
- *
- * @param provider
- * the provider that was added or removed
- * @param providerAdded
- * <code>boolean</code> that should be set as <code>true</code>
- * if <code>provider</code> was added to
- * <code>org.apache.clerezza.rdf.core.TcManager.providerList</code>
- * otherwise <code>false</code>
- */
- private void updateLockableMGraphCache(WeightedTcProvider provider,
- boolean providerAdded) {
- Set<UriRef> uriSet = provider.listTripleCollections();
- if (!(uriSet == null || uriSet.isEmpty())) {
- if (providerAdded) {
- weightedProviderAdded(provider, uriSet);
- } else {
- weightedProviderRemoved(provider, uriSet);
- }
- }
- }
-
- private void weightedProviderAdded(WeightedTcProvider newProvider,
- Set<UriRef> newProvidedUris) {
- Set<WeightedTcProvider> lowerWeightedProviderList = getLowerWeightedProvider(newProvider);
- for (UriRef name : newProvidedUris) {
- final GraphHolder holder = synchronizedLockableMGraphCache
- .get(name);
- if ((holder != null) && (holder.getWeightedTcProvider() != null)) {
- if (lowerWeightedProviderList.contains(holder
- .getWeightedTcProvider())) {
- unregisterService(name);
- synchronizedLockableMGraphCache.remove(name);
- } else {
- continue;
- }
- }
- ServiceRegistration serviceReg = registerAsService(name,
- newProvider.getTriples(name));
- if (serviceReg != null) {
- synchronizedLockableMGraphCache.put(name,
- new GraphHolder(newProvider, null, serviceReg));
- }
- }
- }
-
- private void unregisterService(UriRef name) {
- GraphHolder entry = synchronizedLockableMGraphCache.get(name);
- if (entry != null) {
- ServiceRegistration reg = entry.getServiceRegistration();
- if (reg != null) {
- reg.unregister();
- }
- }
- }
-
- private ServiceRegistration registerAsService(UriRef name,
- TripleCollection triples) {
- if (componentContext == null) {
- return null;
- }
- Dictionary props = new Properties();
- props.put("name", name.getUnicodeString());
- String interfaceName;
- Object service;
- if (triples instanceof MGraph) {
- interfaceName = MGraph.class.getName();
- service = new MGraphServiceFactory(this, name);
- } else if (triples instanceof Graph) {
- interfaceName = Graph.class.getName();
- service = new GraphServiceFactory(this, name);
- } else {
- return null;
- }
- return componentContext.getBundleContext().registerService(
- interfaceName, service, props);
- }
-
-
- private Set<WeightedTcProvider> getLowerWeightedProvider(
- WeightedTcProvider newProvider) {
- boolean referenceProviderPassed = false;
- Set<WeightedTcProvider> lowerWeightedProviderList = new HashSet<WeightedTcProvider>();
- for (WeightedTcProvider weightedProvider : providerList) {
- if (referenceProviderPassed) {
- lowerWeightedProviderList.add(weightedProvider);
- } else if (newProvider.equals(weightedProvider)) {
- referenceProviderPassed = true;
- }
- }
- return lowerWeightedProviderList;
- }
-
- private void weightedProviderRemoved(WeightedTcProvider oldProvider,
- Set<UriRef> oldProvidedUris) {
- for (UriRef name : oldProvidedUris) {
- final GraphHolder holder = synchronizedLockableMGraphCache
- .get(name);
- if ((holder != null) && (holder.getWeightedTcProvider() != null)
- && holder.getWeightedTcProvider().equals(oldProvider)) {
- unregisterService(name);
- synchronizedLockableMGraphCache.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);
- synchronizedLockableMGraphCache.put(name, new GraphHolder(
- provider, null, registerAsService(name, triples)));
- break;
- } catch (NoSuchEntityException e) {
- // continue;
- }
- }
-
- }
- }
- }
-
- @Override
- public Graph getGraph(UriRef name) throws NoSuchEntityException {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new TcPermission(name.getUnicodeString(),
- "read"));
- }
- for (TcProvider provider : providerList) {
- try {
- return provider.getGraph(name);
- } catch (NoSuchEntityException e) {
- //we do nothing and try our luck with the next provider
- } catch (IllegalArgumentException e) {
- //we do nothing and try our luck with the next provider
- }
- }
- throw new NoSuchEntityException(name);
- }
-
- @Override
- public LockableMGraph getMGraph(UriRef name) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- try {
- security.checkPermission(new TcPermission(name
- .getUnicodeString(), "readwrite"));
- } catch (AccessControlException e) {
- security.checkPermission(new TcPermission(name
- .getUnicodeString(), "read"));
- return new WriteBlockedMGraph(getUnsecuredMGraph(name));
- }
- }
- return getUnsecuredMGraph(name);
- }
-
- private LockableMGraph getUnsecuredMGraph(UriRef name)
- throws NoSuchEntityException {
- LockableMGraph result = getMGraphFromCache(name);
- if (result == null) {
- synchronized (this) {
- result = getMGraphFromCache(name);
- if (result == null) {
- result = getUnsecuredMGraphAndAddToCache(name);
- }
- }
- }
- return result;
- }
-
- private LockableMGraph getMGraphFromCache(UriRef name) {
- GraphHolder holder = synchronizedLockableMGraphCache.get(name);
- if (holder == null) {
- return null;
- }
- return holder.getMGraph();
- }
-
- private LockableMGraph getUnsecuredMGraphAndAddToCache(UriRef name)
- throws NoSuchEntityException {
- for (WeightedTcProvider provider : providerList) {
- try {
- MGraph providedMGraph = provider.getMGraph(name);
- LockableMGraph result;
- if (providedMGraph instanceof LockableMGraph) {
- result = (LockableMGraph) providedMGraph;
- } else {
- result = new LockableMGraphWrapper(providedMGraph);
- }
-
- GraphHolder holder = synchronizedLockableMGraphCache.get(name);
- ServiceRegistration serviceReg = null;
- if (holder != null) {
- serviceReg = holder.getServiceRegistration();
- }
- synchronizedLockableMGraphCache.put(name, new GraphHolder(
- provider, result, serviceReg));
- return result;
- } catch (NoSuchEntityException e) {
- //we do nothing and try our luck with the next provider
- } catch (IllegalArgumentException e) {
- //we do nothing and try our luck with the next provider
- }
- }
- throw new NoSuchEntityException(name);
- }
-
- @Override
- public TripleCollection getTriples(UriRef name) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- try {
- security.checkPermission(new TcPermission(name
- .getUnicodeString(), "readwrite"));
- } catch (AccessControlException e) {
- security.checkPermission(new TcPermission(name
- .getUnicodeString(), "read"));
- return new WriteBlockedTripleCollection(
- getUnsecuredTriples(name));
- }
- }
- return getUnsecuredTriples(name);
- }
-
- private TripleCollection getUnsecuredTriples(UriRef name)
- throws NoSuchEntityException {
- TripleCollection result;
- for (WeightedTcProvider provider : providerList) {
- try {
- result = provider.getTriples(name);
- if (!(result instanceof MGraph)) {
- return result;
- } else {
- // This is to ensure the MGraph gets added to the cache
- return getUnsecuredMGraph(name);
- }
- } catch (NoSuchEntityException e) {
- //we do nothing and try our luck with the next provider
- } catch (IllegalArgumentException e) {
- //we do nothing and try our luck with the next provider
- }
- }
- throw new NoSuchEntityException(name);
- }
-
- @Override
- public LockableMGraph createMGraph(UriRef name)
- throws UnsupportedOperationException {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new TcPermission(name.getUnicodeString(),
- "readwrite"));
- }
- for (WeightedTcProvider provider : providerList) {
- try {
- MGraph providedMGraph = provider.createMGraph(name);
- LockableMGraph result;
- if (providedMGraph instanceof LockableMGraph) {
- result = (LockableMGraph) providedMGraph;
- } else {
- result = new LockableMGraphWrapper(providedMGraph);
- }
-
- // unregisters a possible Graph or MGraph service under this name
- // provided by a WeightedTcProvider with a lower weight.
- unregisterService(name);
-
- ServiceRegistration newReg = registerAsService(name, result);
- synchronizedLockableMGraphCache.put(name, new GraphHolder(
- provider, result, newReg));
- return result;
- } catch (UnsupportedOperationException e) {
- //we do nothing and try our luck with the next provider
- } catch (IllegalArgumentException e) {
- //we do nothing and try our luck with the next provider
- }
- }
- throw new UnsupportedOperationException(
- "No provider could create MGraph.");
- }
-
- @Override
- public Graph createGraph(UriRef name, TripleCollection triples) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new TcPermission(name.getUnicodeString(),
- "readwrite"));
- }
- for (WeightedTcProvider provider : providerList) {
- try {
- Graph result = provider.createGraph(name, triples);
-
- // unregisters a possible Graph or MGraph service under this name
- // provided by a WeightedTcProvider with a lower weight.
- unregisterService(name);
-
- ServiceRegistration newReg = registerAsService(name, result);
- synchronizedLockableMGraphCache.put(name, new GraphHolder(
- provider, null, newReg));
- return result;
- } catch (UnsupportedOperationException e) {
- //we do nothing and try our luck with the next provider
- } catch (IllegalArgumentException e) {
- //we do nothing and try our luck with the next provider
- }
- }
- throw new UnsupportedOperationException(
- "No provider could create Graph.");
- }
-
- @Override
- public void deleteTripleCollection(UriRef name) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new TcPermission(name.getUnicodeString(),
- "readwrite"));
- }
- for (TcProvider provider : providerList) {
- try {
- provider.deleteTripleCollection(name);
- final GraphHolder holder = synchronizedLockableMGraphCache
- .get(name);
- if ((holder != null)
- && (holder.getWeightedTcProvider() != null)
- && holder.getWeightedTcProvider().equals(provider)) {
- unregisterService(name);
- synchronizedLockableMGraphCache.remove(name);
- }
- return;
- } catch (UnsupportedOperationException e) {
- // we do nothing and try our luck with the next provider
- } catch (NoSuchEntityException e) {
- //we do nothing and try our luck with the next provider
- } catch (IllegalArgumentException e) {
- //we do nothing and try our luck with the next provider
- }
- }
- // this throws a NoSuchEntityException if the graph doesn't exist
- getTriples(name);
- // the entity exists but cannot be deleted
- throw new UnsupportedOperationException(
- "No provider could delete the entity.");
- }
-
- @Override
- public Set<UriRef> getNames(Graph graph) {
- Set<UriRef> result = new HashSet<UriRef>();
- for (TcProvider provider : providerList) {
- result.addAll(provider.getNames(graph));
- }
- return result;
- }
-
- @Override
- public Set<UriRef> listGraphs() {
- Set<UriRef> result = new HashSet<UriRef>();
- for (TcProvider provider : providerList) {
- result.addAll(provider.listGraphs());
- }
- return excludeNonReadable(result);
- }
-
- @Override
- public Set<UriRef> listMGraphs() {
- Set<UriRef> result = new HashSet<UriRef>();
- for (TcProvider provider : providerList) {
- result.addAll(provider.listMGraphs());
- }
- return excludeNonReadable(result);
- }
-
- @Override
- public Set<UriRef> listTripleCollections() {
- Set<UriRef> result = new HashSet<UriRef>();
- for (TcProvider provider : providerList) {
- result.addAll(provider.listTripleCollections());
- }
- return excludeNonReadable(result);
- }
-
- private Set<UriRef> excludeNonReadable(Set<UriRef> tcNames) {
- SecurityManager security = System.getSecurityManager();
- if (security == null) {
- return tcNames;
- }
- Set<UriRef> result = new HashSet<UriRef>();
- for (UriRef name : tcNames) {
- try {
- security.checkPermission(new TcPermission(name
- .getUnicodeString(), "read"));
- } catch (AccessControlException e) {
- continue;
- }
- result.add(name);
- }
- return result;
- }
-
- /**
- * Compares the WeightedTcManagementProviders, descending for weight and
- * ascending by name
- */
- static class WeightedProviderComparator implements
- Comparator<WeightedTcProvider> {
-
- @Override
- public int compare(WeightedTcProvider o1, WeightedTcProvider o2) {
- int o1Weight = o1.getWeight();
- int o2Weight = o2.getWeight();
- if (o1Weight != o2Weight) {
- return o2Weight - o1Weight;
- }
- return o1.getClass().toString().compareTo(o2.getClass().toString());
- }
- }
-
- /**
- * Executes any sparql query. The type of the result object will vary
- * depending on the type of the query.
- *
- * @param query
- * the sparql query to execute
- * @param defaultGraph
- * the default graph against which to execute the query if not
- * FROM clause is present
- * @return the resulting ResultSet, Graph or Boolean value
- */
- public Object executeSparqlQuery(Query query, TripleCollection defaultGraph) {
- final QueryEngine queryEngine = this.queryEngine;
- if (queryEngine != null) {
- return queryEngine.execute(this, defaultGraph, query);
- } else {
- throw new NoQueryEngineException();
- }
- }
-
- /**
- * Executes a sparql SELECT query.
- *
- * @param query
- * the sparql SELECT query to execute
- * @param defaultGraph
- * the default graph against which to execute the query if not
- * FROM clause is present
- * @return the resulting ResultSet
- */
- public ResultSet executeSparqlQuery(SelectQuery query,
- TripleCollection defaultGraph) {
- final QueryEngine queryEngine = this.queryEngine;
- if (queryEngine != null) {
- return (ResultSet) queryEngine.execute(this, defaultGraph, query);
- } else {
- throw new NoQueryEngineException();
- }
- }
-
- /**
- * Executes a sparql ASK query.
- *
- * @param query
- * the sparql ASK query to execute
- * @param defaultGraph
- * the default graph against which to execute the query if not
- * FROM clause is present
- * @return the boolean value this query evaluates to
- */
- public boolean executeSparqlQuery(AskQuery query,
- TripleCollection defaultGraph) {
- final QueryEngine queryEngine = this.queryEngine;
- if (queryEngine != null) {
- return (Boolean) queryEngine.execute(this, defaultGraph, query);
- } else {
- throw new NoQueryEngineException();
- }
- }
-
- /**
- * Executes a sparql DESCRIBE query.
- *
- * @param query
- * the sparql DESCRIBE query to execute
- * @param defaultGraph
- * the default graph against which to execute the query if not
- * FROM clause is present
- * @return the resulting Graph
- */
- public Graph executeSparqlQuery(DescribeQuery query,
- TripleCollection defaultGraph) {
- final QueryEngine queryEngine = this.queryEngine;
- if (queryEngine != null) {
- return (Graph) queryEngine.execute(this, defaultGraph, query);
- } else {
- throw new NoQueryEngineException();
- }
- }
-
- /**
- * Executes a sparql CONSTRUCT query.
- *
- * @param query
- * the sparql CONSTRUCT query to execute
- * @param defaultGraph
- * the default graph against which to execute the query if not
- * FROM clause is present
- * @return the resulting Graph
- */
- public Graph executeSparqlQuery(ConstructQuery query,
- TripleCollection defaultGraph) {
- final QueryEngine queryEngine = this.queryEngine;
- if (queryEngine != null) {
- return (Graph) queryEngine.execute(this, defaultGraph, query);
- } else {
- throw new NoQueryEngineException();
- }
- }
-
- /**
- * Contains an unsecured LockableMGraph, a ServiceRegistration and
- * the WeightedTcProvider that generated the graph
- */
- private static class GraphHolder {
- private WeightedTcProvider tcProvider;
- private WeakReference<LockableMGraph> mGraphReference;
- private ServiceRegistration serviceReg;
-
- private GraphHolder(WeightedTcProvider tcProvider, LockableMGraph mGraph,
- ServiceRegistration serviceReg) {
- this.tcProvider = tcProvider;
- this.mGraphReference = new WeakReference<LockableMGraph>(mGraph);
- this.serviceReg = serviceReg;
- }
-
- private LockableMGraph getMGraph() {
- return this.mGraphReference.get();
- }
-
- private WeightedTcProvider getWeightedTcProvider() {
- return this.tcProvider;
- }
-
- private ServiceRegistration getServiceRegistration() {
- return serviceReg;
- }
-
- }
-
-}
+package org.apache.clerezza.rdf.core.access;
+
+import org.apache.clerezza.rdf.core.access.security.TcPermission;
+import org.apache.clerezza.rdf.core.impl.WriteBlockedMGraph;
+import org.apache.clerezza.rdf.core.impl.WriteBlockedTripleCollection;
+
+import java.lang.ref.WeakReference;
+import java.security.AccessControlException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.HashSet;
+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.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+import org.apache.clerezza.rdf.core.Graph;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.sparql.query.AskQuery;
+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.NoQueryEngineException;
+import org.apache.clerezza.rdf.core.sparql.query.Query;
+import org.apache.clerezza.rdf.core.sparql.QueryEngine;
+import org.apache.clerezza.rdf.core.sparql.ResultSet;
+import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
+
+/**
+ * This class implements <code>TcManager</code>, delegating the actual
+ * provision and creation of Graphs or MGraphs to registered <code>TcProvider</code>s. The class
+ * attempts to satisfy the request using the register <code>WeightedTcProvider</code>
+ * in decreasing order of weight. If multiple providers have the same weight the
+ * lexicographical order of the fully qualified class name determines which one
+ * is used, namely the one that occurs earlier. If a call to a registered provider
+ * causes an <code>IllegalArgumentException</code>, <code>NoSuchEntityException</code>
+ * or <code>UnsupportedOperationException</code> then the call is delegated to the
+ * next provider.
+ *
+ * Only one instance of this class should exist in a system, the public no
+ * argument constructor is meant for initialization by dependency injection systems
+ * such as OSGi-DS. Applications should use the static <code>getInstance()</code>
+ * method if they aren't using a framework that injects them the instance.
+ *
+ * This class returns <code>LockableMGraph</code>s a subtype of <code>MGraph</code>
+ * that allows read/write locks.
+ *
+ *
+ * @author reto, mir, hasan
+ *
+ * @scr.component
+ * @scr.service interface="org.apache.clerezza.rdf.core.access.TcManager"
+ * @scr.reference name="weightedTcProvider" cardinality="1..n"
+ * policy="dynamic"
+ * interface="org.apache.clerezza.rdf.core.access.WeightedTcProvider"
+ *
+ */
+public class TcManager implements TcProvider {
+
+ private SortedSet<WeightedTcProvider> providerList = new TreeSet<WeightedTcProvider>(
+ new WeightedProviderComparator());
+ private static volatile TcManager instance;
+
+ /**
+ * Mapping to LockableMGraph's and ServiceRegistration using their URI's as key.
+ * Makes sure that per URI only one instance of the LockableMGraph is used,
+ * otherwise the locks in the <code>LockableMGraph</code>s would have no effect
+ * between different instances and concurrency issues could occur.
+ */
+ private Map<UriRef, GraphHolder> synchronizedLockableMGraphCache = Collections
+ .synchronizedMap(new HashMap<UriRef, GraphHolder>());
+
+ /**
+ * @scr.reference cardinality="0..1"
+ */
+ protected QueryEngine queryEngine;
+
+ private ComponentContext componentContext;
+
+ /*
+ * A store that keeps <code>WeightedTcProvider</code>S in case the
+ * componentContext is null. Used in activate().
+ */
+ private Set<WeightedTcProvider> providerStore =
+ Collections.synchronizedSet(new HashSet<WeightedTcProvider>());
+
+ /**
+ * the constructor sets the singleton instance to allow instantiation by
+ * OSGi-DS. This constructor should not be called except by OSGi-DS,
+ * otherwise the static <code>getInstance</code> method should be used.
+ */
+ public TcManager() {
+ TcManager.instance = this;
+ }
+
+ /**
+ * This returns the singleton instance. If an instance has been previously
+ * created (e.g. by OSGi declarative services) this instance is returned,
+ * otherwise a new instance is created and providers are injected using the
+ * service provider interface (META-INF/services/)
+ *
+ * @return the singleton instance
+ */
+ public static TcManager getInstance() {
+ if (instance == null) {
+ synchronized (TcManager.class) {
+ if (instance == null) {
+ new TcManager();
+ Iterator<WeightedTcProvider> weightedProviders = ServiceLoader
+ .load(WeightedTcProvider.class).iterator();
+ while (weightedProviders.hasNext()) {
+ WeightedTcProvider weightedProvider = weightedProviders
+ .next();
+ instance
+ .bindWeightedTcProvider(weightedProvider);
+ }
+ Iterator<QueryEngine> queryEngines = ServiceLoader.load(
+ QueryEngine.class).iterator();
+ System.out.println("looking for QE");
+ if (queryEngines.hasNext()) {
+ instance.queryEngine = queryEngines.next();
+ System.out.println("QE: "
+ + instance.queryEngine.getClass());
+ }
+ }
+ }
+ }
+ return instance;
+ }
+
+ protected void activate(final ComponentContext componentContext) {
+ this.componentContext = componentContext;
+ Iterator<WeightedTcProvider> it = providerStore.iterator();
+ while (it.hasNext()) {
+ WeightedTcProvider provider = it.next();
+ updateLockableMGraphCache(provider, true);
+ }
+ providerStore.clear();
+ }
+
+ protected void deactivate(final ComponentContext componentContext) {
+ this.componentContext = null;
+ }
+
+ /**
+ * Registers a provider
+ *
+ * @param provider
+ * the provider to be registered
+ */
+ protected void bindWeightedTcProvider(WeightedTcProvider provider) {
+ providerList.add(provider);
+ if (componentContext != null) {
+ updateLockableMGraphCache(provider, true);
+ } else {
+ providerStore.add(provider);
+ }
+ }
+
+ /**
+ * Unregister a provider
+ *
+ * @param provider
+ * the provider to be deregistered
+ */
+ protected void unbindWeightedTcProvider(
+ WeightedTcProvider provider) {
+ providerList.remove(provider);
+ providerStore.remove(provider);
+ updateLockableMGraphCache(provider, false);
+ }
+
+ /**
+ * Updates the lockableMGraphCache AFTER a new <code>provider</code> was
+ * bound or unbound.
+ * This method also takes care of registering and unregistering
+ * provided triple collections as services based on the weight of
+ * all affected providers.
+ *
+ * @param provider
+ * the provider that was added or removed
+ * @param providerAdded
+ * <code>boolean</code> that should be set as <code>true</code>
+ * if <code>provider</code> was added to
+ * <code>org.apache.clerezza.rdf.core.TcManager.providerList</code>
+ * otherwise <code>false</code>
+ */
+ private void updateLockableMGraphCache(WeightedTcProvider provider,
+ boolean providerAdded) {
+ Set<UriRef> uriSet = provider.listTripleCollections();
+ if (!(uriSet == null || uriSet.isEmpty())) {
+ if (providerAdded) {
+ weightedProviderAdded(provider, uriSet);
+ } else {
+ weightedProviderRemoved(provider, uriSet);
+ }
+ }
+ }
+
+ private void weightedProviderAdded(WeightedTcProvider newProvider,
+ Set<UriRef> newProvidedUris) {
+ Set<WeightedTcProvider> lowerWeightedProviderList = getLowerWeightedProvider(newProvider);
+ for (UriRef name : newProvidedUris) {
+ final GraphHolder holder = synchronizedLockableMGraphCache
+ .get(name);
+ if ((holder != null) && (holder.getWeightedTcProvider() != null)) {
+ if (lowerWeightedProviderList.contains(holder
+ .getWeightedTcProvider())) {
+ unregisterService(name);
+ synchronizedLockableMGraphCache.remove(name);
+ } else {
+ continue;
+ }
+ }
+ ServiceRegistration serviceReg = registerAsService(name,
+ newProvider.getTriples(name));
+ if (serviceReg != null) {
+ synchronizedLockableMGraphCache.put(name,
+ new GraphHolder(newProvider, null, serviceReg));
+ }
+ }
+ }
+
+ private void unregisterService(UriRef name) {
+ GraphHolder entry = synchronizedLockableMGraphCache.get(name);
+ if (entry != null) {
+ ServiceRegistration reg = entry.getServiceRegistration();
+ if (reg != null) {
+ reg.unregister();
+ }
+ }
+ }
+
+ private ServiceRegistration registerAsService(UriRef name,
+ TripleCollection triples) {
+ if (componentContext == null) {
+ return null;
+ }
+ Dictionary props = new Properties();
+ props.put("name", name.getUnicodeString());
+ String[] interfaceNames;
+ Object service;
+ if (triples instanceof MGraph) {
+ interfaceNames = new String[]{
+ MGraph.class.getName(),
+ LockableMGraph.class.getName()
+ };
+ service = new MGraphServiceFactory(this, name);
+ } else if (triples instanceof Graph) {
+ interfaceNames = new String[]{Graph.class.getName()};
+ service = new GraphServiceFactory(this, name);
+ } else {
+ return null;
+ }
+ return componentContext.getBundleContext().registerService(
+ interfaceNames, service, props);
+ }
+
+
+ private Set<WeightedTcProvider> getLowerWeightedProvider(
+ WeightedTcProvider newProvider) {
+ boolean referenceProviderPassed = false;
+ Set<WeightedTcProvider> lowerWeightedProviderList = new HashSet<WeightedTcProvider>();
+ for (WeightedTcProvider weightedProvider : providerList) {
+ if (referenceProviderPassed) {
+ lowerWeightedProviderList.add(weightedProvider);
+ } else if (newProvider.equals(weightedProvider)) {
+ referenceProviderPassed = true;
+ }
+ }
+ return lowerWeightedProviderList;
+ }
+
+ private void weightedProviderRemoved(WeightedTcProvider oldProvider,
+ Set<UriRef> oldProvidedUris) {
+ for (UriRef name : oldProvidedUris) {
+ final GraphHolder holder = synchronizedLockableMGraphCache
+ .get(name);
+ if ((holder != null) && (holder.getWeightedTcProvider() != null)
+ && holder.getWeightedTcProvider().equals(oldProvider)) {
+ unregisterService(name);
+ synchronizedLockableMGraphCache.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);
+ synchronizedLockableMGraphCache.put(name, new GraphHolder(
+ provider, null, registerAsService(name, triples)));
+ break;
+ } catch (NoSuchEntityException e) {
+ // continue;
+ }
+ }
+
+ }
+ }
+ }
+
+ @Override
+ public Graph getGraph(UriRef name) throws NoSuchEntityException {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPermission(new TcPermission(name.getUnicodeString(),
+ "read"));
+ }
+ for (TcProvider provider : providerList) {
+ try {
+ return provider.getGraph(name);
+ } catch (NoSuchEntityException e) {
+ //we do nothing and try our luck with the next provider
+ } catch (IllegalArgumentException e) {
+ //we do nothing and try our luck with the next provider
+ }
+ }
+ throw new NoSuchEntityException(name);
+ }
+
+ @Override
+ public LockableMGraph getMGraph(UriRef name) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ try {
+ security.checkPermission(new TcPermission(name
+ .getUnicodeString(), "readwrite"));
+ } catch (AccessControlException e) {
+ security.checkPermission(new TcPermission(name
+ .getUnicodeString(), "read"));
+ return new WriteBlockedMGraph(getUnsecuredMGraph(name));
+ }
+ }
+ return getUnsecuredMGraph(name);
+ }
+
+ private LockableMGraph getUnsecuredMGraph(UriRef name)
+ throws NoSuchEntityException {
+ LockableMGraph result = getMGraphFromCache(name);
+ if (result == null) {
+ synchronized (this) {
+ result = getMGraphFromCache(name);
+ if (result == null) {
+ result = getUnsecuredMGraphAndAddToCache(name);
+ }
+ }
+ }
+ return result;
+ }
+
+ private LockableMGraph getMGraphFromCache(UriRef name) {
+ GraphHolder holder = synchronizedLockableMGraphCache.get(name);
+ if (holder == null) {
+ return null;
+ }
+ return holder.getMGraph();
+ }
+
+ private LockableMGraph getUnsecuredMGraphAndAddToCache(UriRef name)
+ throws NoSuchEntityException {
+ for (WeightedTcProvider provider : providerList) {
+ try {
+ MGraph providedMGraph = provider.getMGraph(name);
+ LockableMGraph result;
+ if (providedMGraph instanceof LockableMGraph) {
+ result = (LockableMGraph) providedMGraph;
+ } else {
+ result = new LockableMGraphWrapper(providedMGraph);
+ }
+
+ GraphHolder holder = synchronizedLockableMGraphCache.get(name);
+ ServiceRegistration serviceReg = null;
+ if (holder != null) {
+ serviceReg = holder.getServiceRegistration();
+ }
+ synchronizedLockableMGraphCache.put(name, new GraphHolder(
+ provider, result, serviceReg));
+ return result;
+ } catch (NoSuchEntityException e) {
+ //we do nothing and try our luck with the next provider
+ } catch (IllegalArgumentException e) {
+ //we do nothing and try our luck with the next provider
+ }
+ }
+ throw new NoSuchEntityException(name);
+ }
+
+ @Override
+ public TripleCollection getTriples(UriRef name) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ try {
+ security.checkPermission(new TcPermission(name
+ .getUnicodeString(), "readwrite"));
+ } catch (AccessControlException e) {
+ security.checkPermission(new TcPermission(name
+ .getUnicodeString(), "read"));
+ return new WriteBlockedTripleCollection(
+ getUnsecuredTriples(name));
+ }
+ }
+ return getUnsecuredTriples(name);
+ }
+
+ private TripleCollection getUnsecuredTriples(UriRef name)
+ throws NoSuchEntityException {
+ TripleCollection result;
+ for (WeightedTcProvider provider : providerList) {
+ try {
+ result = provider.getTriples(name);
+ if (!(result instanceof MGraph)) {
+ return result;
+ } else {
+ // This is to ensure the MGraph gets added to the cache
+ return getUnsecuredMGraph(name);
+ }
+ } catch (NoSuchEntityException e) {
+ //we do nothing and try our luck with the next provider
+ } catch (IllegalArgumentException e) {
+ //we do nothing and try our luck with the next provider
+ }
+ }
+ throw new NoSuchEntityException(name);
+ }
+
+ @Override
+ public LockableMGraph createMGraph(UriRef name)
+ throws UnsupportedOperationException {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPermission(new TcPermission(name.getUnicodeString(),
+ "readwrite"));
+ }
+ for (WeightedTcProvider provider : providerList) {
+ try {
+ MGraph providedMGraph = provider.createMGraph(name);
+ LockableMGraph result;
+ if (providedMGraph instanceof LockableMGraph) {
+ result = (LockableMGraph) providedMGraph;
+ } else {
+ result = new LockableMGraphWrapper(providedMGraph);
+ }
+
+ // unregisters a possible Graph or MGraph service under this name
+ // provided by a WeightedTcProvider with a lower weight.
+ unregisterService(name);
+
+ ServiceRegistration newReg = registerAsService(name, result);
+ synchronizedLockableMGraphCache.put(name, new GraphHolder(
+ provider, result, newReg));
+ return result;
+ } catch (UnsupportedOperationException e) {
+ //we do nothing and try our luck with the next provider
+ } catch (IllegalArgumentException e) {
+ //we do nothing and try our luck with the next provider
+ }
+ }
+ throw new UnsupportedOperationException(
+ "No provider could create MGraph.");
+ }
+
+ @Override
+ public Graph createGraph(UriRef name, TripleCollection triples) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPermission(new TcPermission(name.getUnicodeString(),
+ "readwrite"));
+ }
+ for (WeightedTcProvider provider : providerList) {
+ try {
+ Graph result = provider.createGraph(name, triples);
+
+ // unregisters a possible Graph or MGraph service under this name
+ // provided by a WeightedTcProvider with a lower weight.
+ unregisterService(name);
+
+ ServiceRegistration newReg = registerAsService(name, result);
+ synchronizedLockableMGraphCache.put(name, new GraphHolder(
+ provider, null, newReg));
+ return result;
+ } catch (UnsupportedOperationException e) {
+ //we do nothing and try our luck with the next provider
+ } catch (IllegalArgumentException e) {
+ //we do nothing and try our luck with the next provider
+ }
+ }
+ throw new UnsupportedOperationException(
+ "No provider could create Graph.");
+ }
+
+ @Override
+ public void deleteTripleCollection(UriRef name) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkPermission(new TcPermission(name.getUnicodeString(),
+ "readwrite"));
+ }
+ for (TcProvider provider : providerList) {
+ try {
+ provider.deleteTripleCollection(name);
+ final GraphHolder holder = synchronizedLockableMGraphCache
+ .get(name);
+ if ((holder != null)
+ && (holder.getWeightedTcProvider() != null)
+ && holder.getWeightedTcProvider().equals(provider)) {
+ unregisterService(name);
+ synchronizedLockableMGraphCache.remove(name);
+ }
+ return;
+ } catch (UnsupportedOperationException e) {
+ // we do nothing and try our luck with the next provider
+ } catch (NoSuchEntityException e) {
+ //we do nothing and try our luck with the next provider
+ } catch (IllegalArgumentException e) {
+ //we do nothing and try our luck with the next provider
+ }
+ }
+ // this throws a NoSuchEntityException if the graph doesn't exist
+ getTriples(name);
+ // the entity exists but cannot be deleted
+ throw new UnsupportedOperationException(
+ "No provider could delete the entity.");
+ }
+
+ @Override
+ public Set<UriRef> getNames(Graph graph) {
+ Set<UriRef> result = new HashSet<UriRef>();
+ for (TcProvider provider : providerList) {
+ result.addAll(provider.getNames(graph));
+ }
+ return result;
+ }
+
+ @Override
+ public Set<UriRef> listGraphs() {
+ Set<UriRef> result = new HashSet<UriRef>();
+ for (TcProvider provider : providerList) {
+ result.addAll(provider.listGraphs());
+ }
+ return excludeNonReadable(result);
+ }
+
+ @Override
+ public Set<UriRef> listMGraphs() {
+ Set<UriRef> result = new HashSet<UriRef>();
+ for (TcProvider provider : providerList) {
+ result.addAll(provider.listMGraphs());
+ }
+ return excludeNonReadable(result);
+ }
+
+ @Override
+ public Set<UriRef> listTripleCollections() {
+ Set<UriRef> result = new HashSet<UriRef>();
+ for (TcProvider provider : providerList) {
+ result.addAll(provider.listTripleCollections());
+ }
+ return excludeNonReadable(result);
+ }
+
+ private Set<UriRef> excludeNonReadable(Set<UriRef> tcNames) {
+ SecurityManager security = System.getSecurityManager();
+ if (security == null) {
+ return tcNames;
+ }
+ Set<UriRef> result = new HashSet<UriRef>();
+ for (UriRef name : tcNames) {
+ try {
+ security.checkPermission(new TcPermission(name
+ .getUnicodeString(), "read"));
+ } catch (AccessControlException e) {
+ continue;
+ }
+ result.add(name);
+ }
+ return result;
+ }
+
+ /**
+ * Compares the WeightedTcManagementProviders, descending for weight and
+ * ascending by name
+ */
+ static class WeightedProviderComparator implements
+ Comparator<WeightedTcProvider> {
+
+ @Override
+ public int compare(WeightedTcProvider o1, WeightedTcProvider o2) {
+ int o1Weight = o1.getWeight();
+ int o2Weight = o2.getWeight();
+ if (o1Weight != o2Weight) {
+ return o2Weight - o1Weight;
+ }
+ return o1.getClass().toString().compareTo(o2.getClass().toString());
+ }
+ }
+
+ /**
+ * Executes any sparql query. The type of the result object will vary
+ * depending on the type of the query.
+ *
+ * @param query
+ * the sparql query to execute
+ * @param defaultGraph
+ * the default graph against which to execute the query if not
+ * FROM clause is present
+ * @return the resulting ResultSet, Graph or Boolean value
+ */
+ public Object executeSparqlQuery(Query query, TripleCollection defaultGraph) {
+ final QueryEngine queryEngine = this.queryEngine;
+ if (queryEngine != null) {
+ return queryEngine.execute(this, defaultGraph, query);
+ } else {
+ throw new NoQueryEngineException();
+ }
+ }
+
+ /**
+ * Executes a sparql SELECT query.
+ *
+ * @param query
+ * the sparql SELECT query to execute
+ * @param defaultGraph
+ * the default graph against which to execute the query if not
+ * FROM clause is present
+ * @return the resulting ResultSet
+ */
+ public ResultSet executeSparqlQuery(SelectQuery query,
+ TripleCollection defaultGraph) {
+ final QueryEngine queryEngine = this.queryEngine;
+ if (queryEngine != null) {
+ return (ResultSet) queryEngine.execute(this, defaultGraph, query);
+ } else {
+ throw new NoQueryEngineException();
+ }
+ }
+
+ /**
+ * Executes a sparql ASK query.
+ *
+ * @param query
+ * the sparql ASK query to execute
+ * @param defaultGraph
+ * the default graph against which to execute the query if not
+ * FROM clause is present
+ * @return the boolean value this query evaluates to
+ */
+ public boolean executeSparqlQuery(AskQuery query,
+ TripleCollection defaultGraph) {
+ final QueryEngine queryEngine = this.queryEngine;
+ if (queryEngine != null) {
+ return (Boolean) queryEngine.execute(this, defaultGraph, query);
+ } else {
+ throw new NoQueryEngineException();
+ }
+ }
+
+ /**
+ * Executes a sparql DESCRIBE query.
+ *
+ * @param query
+ * the sparql DESCRIBE query to execute
+ * @param defaultGraph
+ * the default graph against which to execute the query if not
+ * FROM clause is present
+ * @return the resulting Graph
+ */
+ public Graph executeSparqlQuery(DescribeQuery query,
+ TripleCollection defaultGraph) {
+ final QueryEngine queryEngine = this.queryEngine;
+ if (queryEngine != null) {
+ return (Graph) queryEngine.execute(this, defaultGraph, query);
+ } else {
+ throw new NoQueryEngineException();
+ }
+ }
+
+ /**
+ * Executes a sparql CONSTRUCT query.
+ *
+ * @param query
+ * the sparql CONSTRUCT query to execute
+ * @param defaultGraph
+ * the default graph against which to execute the query if not
+ * FROM clause is present
+ * @return the resulting Graph
+ */
+ public Graph executeSparqlQuery(ConstructQuery query,
+ TripleCollection defaultGraph) {
+ final QueryEngine queryEngine = this.queryEngine;
+ if (queryEngine != null) {
+ return (Graph) queryEngine.execute(this, defaultGraph, query);
+ } else {
+ throw new NoQueryEngineException();
+ }
+ }
+
+ /**
+ * Contains an unsecured LockableMGraph, a ServiceRegistration and
+ * the WeightedTcProvider that generated the graph
+ */
+ private static class GraphHolder {
+ private WeightedTcProvider tcProvider;
+ private WeakReference<LockableMGraph> mGraphReference;
+ private ServiceRegistration serviceReg;
+
+ private GraphHolder(WeightedTcProvider tcProvider, LockableMGraph mGraph,
+ ServiceRegistration serviceReg) {
+ this.tcProvider = tcProvider;
+ this.mGraphReference = new WeakReference<LockableMGraph>(mGraph);
+ this.serviceReg = serviceReg;
+ }
+
+ private LockableMGraph getMGraph() {
+ return this.mGraphReference.get();
+ }
+
+ private WeightedTcProvider getWeightedTcProvider() {
+ return this.tcProvider;
+ }
+
+ private ServiceRegistration getServiceRegistration() {
+ return serviceReg;
+ }
+
+ }
+
+}