Author: reto
Date: Thu Jul 15 09:30:12 2010
New Revision: 964351
URL: http://svn.apache.org/viewvc?rev=964351&view=rev
Log:
CLEREZZA-253: ckecking for graph-specific read permissions
Added:
incubator/clerezza/issues/CLEREZZA-253/
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/
- copied from r960982,
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/security/TcAccessController.java
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/resources/META-INF/documentation.nt
- copied unchanged from r961697,
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/src/main/resources/META-INF/documentation.nt
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/pom.xml
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/GraphServiceFactory.java
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/MGraphServiceFactory.java
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredMGraph.java
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredTripleCollection.java
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/pom.xml?rev=964351&r1=960982&r2=964351&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/pom.xml
(original)
+++ incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/pom.xml
Thu Jul 15 09:30:12 2010
@@ -25,6 +25,10 @@
<artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.clerezza</groupId>
+ <artifactId>org.apache.clerezza.utils</artifactId>
+ </dependency>
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/GraphServiceFactory.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/GraphServiceFactory.java?rev=964351&r1=960982&r2=964351&view=diff
==============================================================================
---
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/GraphServiceFactory.java
(original)
+++
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/GraphServiceFactory.java
Thu Jul 15 09:30:12 2010
@@ -23,6 +23,7 @@ import org.osgi.framework.ServiceFactory
import org.osgi.framework.ServiceRegistration;
import org.apache.clerezza.rdf.core.TripleCollection;
import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.security.TcAccessController;
import org.apache.clerezza.rdf.core.impl.SimpleGraph;
/**
@@ -33,18 +34,22 @@ import org.apache.clerezza.rdf.core.impl
*/
public class GraphServiceFactory implements ServiceFactory {
- private TcManager tcManager;
- private UriRef name;
+ private final TcManager tcManager;
+ private final UriRef name;
+ private final TcAccessController tcAccessController;
- GraphServiceFactory(TcManager tcManager, UriRef name) {
+ GraphServiceFactory(TcManager tcManager, UriRef name,
+ TcAccessController tcAccessController) {
this.tcManager = tcManager;
this.name = name;
+ this.tcAccessController = tcAccessController;
}
@Override
public Object getService(Bundle arg0, ServiceRegistration arg1) {
TripleCollection tc =
- new
SecuredTripleCollection(tcManager.getGraph(name), name);
+ new
SecuredTripleCollection(tcManager.getGraph(name), name,
+ tcAccessController);
return new SimpleGraph(tc);
}
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/MGraphServiceFactory.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/MGraphServiceFactory.java?rev=964351&r1=960982&r2=964351&view=diff
==============================================================================
---
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/MGraphServiceFactory.java
(original)
+++
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/MGraphServiceFactory.java
Thu Jul 15 09:30:12 2010
@@ -22,6 +22,7 @@ import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.security.TcAccessController;
/**
* @see <a
href="http://www.osgi.org/javadoc/r4v41/org/osgi/framework/ServiceFactory.html">
@@ -33,15 +34,18 @@ public class MGraphServiceFactory implem
private TcManager tcManager;
private UriRef name;
+ private final TcAccessController tcAccessController;
- MGraphServiceFactory(TcManager tcManager, UriRef name) {
+ MGraphServiceFactory(TcManager tcManager, UriRef name,
+ TcAccessController tcAccessController) {
this.tcManager = tcManager;
this.name = name;
+ this.tcAccessController = tcAccessController;
}
@Override
public Object getService(Bundle arg0, ServiceRegistration arg1) {
- return new SecuredMGraph(tcManager.getMGraph(name), name);
+ return new SecuredMGraph(tcManager.getMGraph(name), name,
tcAccessController);
}
@Override
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredMGraph.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredMGraph.java?rev=964351&r1=960982&r2=964351&view=diff
==============================================================================
---
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredMGraph.java
(original)
+++
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredMGraph.java
Thu Jul 15 09:30:12 2010
@@ -21,6 +21,7 @@ package org.apache.clerezza.rdf.core.acc
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.clerezza.rdf.core.Graph;
import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.security.TcAccessController;
import org.apache.clerezza.rdf.core.impl.SimpleGraph;
/**
@@ -34,8 +35,9 @@ public class SecuredMGraph extends Secur
private LockableMGraph wrapped;
- public SecuredMGraph(LockableMGraph wrapped, UriRef name) {
- super(wrapped, name);
+ public SecuredMGraph(LockableMGraph wrapped, UriRef name,
+ TcAccessController tcAccessController) {
+ super(wrapped, name, tcAccessController);
this.wrapped = wrapped;
}
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredTripleCollection.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredTripleCollection.java?rev=964351&r1=960982&r2=964351&view=diff
==============================================================================
---
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredTripleCollection.java
(original)
+++
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/SecuredTripleCollection.java
Thu Jul 15 09:30:12 2010
@@ -25,6 +25,7 @@ import org.apache.clerezza.rdf.core.Reso
import org.apache.clerezza.rdf.core.Triple;
import org.apache.clerezza.rdf.core.TripleCollection;
import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.security.TcAccessController;
import org.apache.clerezza.rdf.core.access.security.TcPermission;
import org.apache.clerezza.rdf.core.event.FilterTriple;
import org.apache.clerezza.rdf.core.event.GraphListener;
@@ -38,12 +39,15 @@ import org.apache.clerezza.rdf.core.even
*/
public class SecuredTripleCollection implements TripleCollection {
- private TripleCollection wrapped;
- private String name;
+ private final TripleCollection wrapped;
+ private final UriRef name;
+ private final TcAccessController tcAccessController;
- public SecuredTripleCollection(TripleCollection wrapped, UriRef name) {
+ public SecuredTripleCollection(TripleCollection wrapped, UriRef name,
+ TcAccessController tcAccessController) {
this.wrapped = wrapped;
- this.name = name.getUnicodeString();
+ this.name = name;
+ this.tcAccessController = tcAccessController;
}
@Override
@@ -160,19 +164,11 @@ public class SecuredTripleCollection imp
}
private void checkRead() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new TcPermission(name,
- TcPermission.READ));
- }
+ tcAccessController.checkReadPermission(name);
}
private void checkWrite() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new TcPermission(name,
- TcPermission.READWRITE));
- }
+ tcAccessController.checkReadWritePermission(name);
}
@Override
Modified:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java?rev=964351&r1=960982&r2=964351&view=diff
==============================================================================
---
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
(original)
+++
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/TcManager.java
Thu Jul 15 09:30:12 2010
@@ -18,7 +18,6 @@
*/
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;
@@ -43,6 +42,8 @@ import org.apache.clerezza.rdf.core.Grap
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.access.security.TcAccessController;
+import org.apache.clerezza.rdf.core.access.security.TcAccessController;
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;
@@ -51,6 +52,11 @@ import org.apache.clerezza.rdf.core.spar
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;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
/**
* This class implements <code>TcManager</code>, delegating the actual
@@ -74,19 +80,20 @@ import org.apache.clerezza.rdf.core.spar
*
* @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"
- *
*/
+...@component
+...@service(TcManager.class)
+...@reference(name="weightedTcProvider", policy=ReferencePolicy.DYNAMIC,
+ referenceInterface=WeightedTcProvider.class,
+ cardinality=ReferenceCardinality.MANDATORY_MULTIPLE)
public class TcManager implements TcProvider {
private SortedSet<WeightedTcProvider> providerList = new
TreeSet<WeightedTcProvider>(
new WeightedProviderComparator());
private static volatile TcManager instance;
+ private TcAccessController tcAccessController = new
TcAccessController(this);
+
/**
* 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,
@@ -271,10 +278,10 @@ public class TcManager implements TcProv
MGraph.class.getName(),
LockableMGraph.class.getName()
};
- service = new MGraphServiceFactory(this, name);
+ service = new MGraphServiceFactory(this, name,
tcAccessController);
} else if (triples instanceof Graph) {
interfaceNames = new String[]{Graph.class.getName()};
- service = new GraphServiceFactory(this, name);
+ service = new GraphServiceFactory(this, name,
tcAccessController);
} else {
return null;
}
@@ -326,11 +333,7 @@ public class TcManager implements TcProv
@Override
public Graph getGraph(UriRef name) throws NoSuchEntityException {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new
TcPermission(name.getUnicodeString(),
- "read"));
- }
+ tcAccessController.checkReadPermission(name);
for (TcProvider provider : providerList) {
try {
return provider.getGraph(name);
@@ -345,16 +348,11 @@ public class TcManager implements TcProv
@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));
- }
+ try {
+ tcAccessController.checkReadWritePermission(name);
+ } catch (AccessControlException e) {
+ tcAccessController.checkReadPermission(name);
+ return new WriteBlockedMGraph(getUnsecuredMGraph(name));
}
return getUnsecuredMGraph(name);
}
@@ -412,17 +410,12 @@ public class TcManager implements TcProv
@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));
- }
+ try {
+ tcAccessController.checkReadWritePermission(name);
+ } catch (AccessControlException e) {
+ tcAccessController.checkReadPermission(name);
+ return new WriteBlockedTripleCollection(
+ getUnsecuredTriples(name));
}
return getUnsecuredTriples(name);
}
@@ -451,11 +444,7 @@ public class TcManager implements TcProv
@Override
public LockableMGraph createMGraph(UriRef name)
throws UnsupportedOperationException {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new
TcPermission(name.getUnicodeString(),
- "readwrite"));
- }
+ tcAccessController.checkReadWritePermission(name);
for (WeightedTcProvider provider : providerList) {
try {
MGraph providedMGraph =
provider.createMGraph(name);
@@ -486,11 +475,7 @@ public class TcManager implements TcProv
@Override
public Graph createGraph(UriRef name, TripleCollection triples) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new
TcPermission(name.getUnicodeString(),
- "readwrite"));
- }
+ tcAccessController.checkReadWritePermission(name);
for (WeightedTcProvider provider : providerList) {
try {
Graph result = provider.createGraph(name,
triples);
@@ -515,11 +500,7 @@ public class TcManager implements TcProv
@Override
public void deleteTripleCollection(UriRef name) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkPermission(new
TcPermission(name.getUnicodeString(),
- "readwrite"));
- }
+ tcAccessController.checkReadWritePermission(name);
for (TcProvider provider : providerList) {
try {
provider.deleteTripleCollection(name);
@@ -591,8 +572,7 @@ public class TcManager implements TcProv
Set<UriRef> result = new HashSet<UriRef>();
for (UriRef name : tcNames) {
try {
- security.checkPermission(new TcPermission(name
- .getUnicodeString(), "read"));
+ tcAccessController.checkReadPermission(name);
} catch (AccessControlException e) {
continue;
}
@@ -720,6 +700,14 @@ public class TcManager implements TcProv
}
/**
+ * @return the TcAccessController that can be used to set the
permissions
+ * needed to access a Triple Collection
+ */
+ public TcAccessController getTcAccessController() {
+ return tcAccessController;
+ }
+
+ /**
* Contains an unsecured LockableMGraph, a ServiceRegistration and
* the WeightedTcProvider that generated the graph
*/
Added:
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/security/TcAccessController.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/security/TcAccessController.java?rev=964351&view=auto
==============================================================================
---
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/security/TcAccessController.java
(added)
+++
incubator/clerezza/issues/CLEREZZA-253/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/access/security/TcAccessController.java
Thu Jul 15 09:30:12 2010
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.rdf.core.access.security;
+
+import java.security.AccessController;
+import java.security.Permission;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.concurrent.locks.Lock;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TypedLiteral;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
+import org.apache.clerezza.rdf.core.access.NoSuchEntityException;
+import org.apache.clerezza.rdf.core.access.TcManager;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.utils.security.PermissionParser;
+
+/**
+ * Controls the permissions needed to access a triple collection provided by
+ * <code>TcManager</code>.
+ *
+ * Clients with a ConfigureTcAcessPermission can set the permissions required
to
+ * access a TripleCollection. These permissions are stored persistently in an
+ * MGraph named http://zz.localhost/graph-access.graph
+ *
+ * @author reto
+ */
+public class TcAccessController {
+
+ private final TcManager tcManager;
+ private final UriRef permissionGraphName = new
UriRef("http://zz.localhost/graph-access.graph");
+ //we can't rely on ontology plugin in rdf core
+ private String ontologyNamespace =
"http://clerezza.apache.org/2010/07/10/graphpermssions#";
+ private final UriRef readPermissionListProperty = new
UriRef(ontologyNamespace + "readPermissionList");
+ /**
+ * The first item in the subject RDF list.
+ */
+ public static final UriRef first = new
UriRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#first");
+ /**
+ * The rest of the subject RDF list after the first item.
+ */
+ public static final UriRef rest = new
UriRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#rest");
+ public static final UriRef rdfNil = new
UriRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#nil");
+ private final Map<UriRef, Collection<Permission>> permissionCache =
+ Collections.synchronizedMap(new HashMap<UriRef,
Collection<Permission>>());
+
+ /**
+ *
+ * @param tcManager the tcManager used to locate
http://zz.localhost/graph-access.graph
+ */
+ public TcAccessController(TcManager tcManager) {
+ this.tcManager = tcManager;
+ }
+
+ public void checkReadPermission(UriRef tripleCollectionUri) {
+ if (tripleCollectionUri.equals(permissionGraphName)) {
+ //This is world readable, as this prevents as from
doingf things as
+ //priviledged during verfification
+ return;
+ }
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ Collection<Permission> perms =
getRequiredReadPermissions(tripleCollectionUri);
+ if (perms.size() > 0) {
+ for (Permission permission : perms) {
+
AccessController.checkPermission(permission);
+ }
+ } else {
+ AccessController.checkPermission(new
TcPermission(
+
tripleCollectionUri.getUnicodeString(), TcPermission.READ));
+ }
+ }
+ }
+
+ public void checkReadWritePermission(UriRef tripleCollectionUri) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ AccessController.checkPermission(new TcPermission(
+ tripleCollectionUri.getUnicodeString(),
TcPermission.READWRITE));
+ }
+ }
+
+ /**
+ * Set the set of permissions required to access a triple-collection, if
+ * the set is non-empty the default TCPermisson is no longer required.
+ *
+ * @param tripleCollectionUri
+ * @param permissionDescriptions
+ */
+ public void setRequiredReadPermissions(UriRef tripleCollectionUri,
+ Collection<String> permissionDescriptions) {
+ permissionCache.remove(tripleCollectionUri);
+ final LockableMGraph permissionMGraph =
tcManager.getMGraph(permissionGraphName);
+ Lock l = permissionMGraph.getLock().writeLock();
+ l.lock();
+ try {
+
removeExistingRequiredReadPermissions(tripleCollectionUri, permissionMGraph);
+ final NonLiteral permissionList =
createList(permissionDescriptions.iterator(), permissionMGraph);
+ permissionMGraph.add(new TripleImpl(tripleCollectionUri,
+ readPermissionListProperty,
permissionList));
+ } finally {
+ l.unlock();
+ }
+ }
+
+ private Collection<Permission> getRequiredReadPermissions(UriRef
tripleCollectionUri) {
+ Collection<Permission> result =
permissionCache.get(tripleCollectionUri);
+ if (result == null) {
+ result = new ArrayList<Permission>();
+ Collection<String> permissionStrings =
getRequiredReadPermissionStrings(tripleCollectionUri);
+ for (String string : permissionStrings) {
+
result.add(PermissionParser.getPermission(string, getClass().getClassLoader()));
+ }
+ permissionCache.put(tripleCollectionUri, result);
+ }
+ return result;
+ }
+
+ private NonLiteral createList(Iterator<String> iterator, LockableMGraph
permissionMGraph) {
+ if (!iterator.hasNext()) {
+ return rdfNil;
+ }
+ final BNode result = new BNode();
+ permissionMGraph.add(new TripleImpl(result, first,
+
LiteralFactory.getInstance().createTypedLiteral(iterator.next())));
+ permissionMGraph.add(new TripleImpl(result, first,
+ createList(iterator, permissionMGraph)));
+ return result;
+
+ }
+
+ //called withiong write-lock
+ private void removeExistingRequiredReadPermissions(UriRef
tripleCollectionUri,
+ LockableMGraph permissionMGraph) {
+ try {
+ Triple t = permissionMGraph.filter(tripleCollectionUri,
readPermissionListProperty, null).next();
+ Resource list = t.getObject();
+ removeList((NonLiteral) list, permissionMGraph);
+ permissionMGraph.remove(t);
+ } catch (NoSuchElementException e) {
+ //There was no existing to remove
+ }
+ }
+
+ private void removeList(NonLiteral list, LockableMGraph
permissionMGraph) {
+ try {
+ Triple t = permissionMGraph.filter(list, rest,
null).next();
+ Resource restList = t.getObject();
+ removeList((NonLiteral) restList, permissionMGraph);
+ permissionMGraph.remove(t);
+ Iterator<Triple> iter = permissionMGraph.filter(list,
first, null);
+ iter.next();
+ iter.remove();
+ } catch (NoSuchElementException e) {
+ //if it has no rest its rdf:NIL and has no first
+ }
+ }
+
+ private Collection<String> getRequiredReadPermissionStrings(final
UriRef tripleCollectionUri) {
+ try {
+ final LockableMGraph permissionMGraph =
tcManager.getMGraph(permissionGraphName);
+ Lock l = permissionMGraph.getLock().readLock();
+ try {
+ Triple t =
permissionMGraph.filter(tripleCollectionUri, readPermissionListProperty,
null).next();
+ NonLiteral list = (NonLiteral) t.getObject();
+ LinkedList<String> result = new
LinkedList<String>();
+ readList(list, permissionMGraph, result);
+ return result;
+ } catch (NoSuchElementException e) {
+ return new ArrayList<String>(0);
+ } finally {
+ l.unlock();
+ }
+ } catch (NoSuchEntityException e) {
+ return new ArrayList<String>(0);
+ }
+ }
+
+ private void readList(NonLiteral list, LockableMGraph permissionMGraph,
LinkedList<String> target) {
+ if (list.equals(rdfNil)) {
+ return;
+ }
+ Triple restTriple = permissionMGraph.filter(list, rest,
null).next();
+ NonLiteral restList = (NonLiteral) restTriple.getObject();
+ readList(restList, permissionMGraph, target);
+ Triple firstTriple = permissionMGraph.filter(list, first,
null).next();
+ TypedLiteral firstValue = (TypedLiteral)
firstTriple.getObject();
+ String value =
LiteralFactory.getInstance().createObject(String.class, firstValue);
+ target.addFirst(value);
+ }
+}