/* * 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.jena.permissions.model.impl; import java.io.*; import java.net.URL; import java.util.*; import java.util.function.Predicate; import java.util.function.Supplier; import org.apache.jena.datatypes.RDFDatatype; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.graph.Triple; import org.apache.jena.graph.impl.CollectionGraph; import org.apache.jena.permissions.SecuredItem; import org.apache.jena.permissions.SecurityEvaluator; import org.apache.jena.permissions.graph.SecuredGraph; import org.apache.jena.permissions.graph.SecuredPrefixMapping; import org.apache.jena.permissions.impl.ItemHolder; import org.apache.jena.permissions.impl.SecuredItemImpl; import org.apache.jena.permissions.impl.SecuredItemInvoker; import org.apache.jena.permissions.model.*; import org.apache.jena.rdf.model.*; import org.apache.jena.rdf.model.impl.RDFReaderFImpl; import org.apache.jena.shared.*; import org.apache.jena.util.iterator.ExtendedIterator; import org.apache.jena.util.iterator.WrappedIterator; import org.apache.jena.vocabulary.RDF; /** * Implementation of SecuredModel to be used by a SecuredItemInvoker proxy. */ public class SecuredModelImpl extends SecuredItemImpl implements SecuredModel { // a class that implements ModelChangedListener private class SecuredModelChangedListener implements ModelChangedListener { private final ModelChangedListener wrapped; private SecuredModelChangedListener(final ModelChangedListener wrapped) { this.wrapped = wrapped; } @Override public void addedStatement(final Statement s) throws AuthenticationRequiredException { if (canRead(s)) { wrapped.addedStatement(s); } } @Override public void addedStatements(final List<Statement> statements) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.addedStatements(statements); } else { final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), WrappedIterator.create(statements.iterator())); try { wrapped.addedStatements(iter.toList()); } finally { iter.close(); } } } @Override public void addedStatements(final Model m) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.addedStatements(m); } else { wrapped.addedStatements(SecuredModelImpl.getInstance(holder.getSecuredItem(), m)); } } @Override public void addedStatements(final Statement[] statements) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.addedStatements(statements); } else { final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), WrappedIterator.create(Arrays.asList(statements).iterator())); try { final List<Statement> stmts = iter.toList(); wrapped.addedStatements(stmts.toArray(new Statement[stmts.size()])); } finally { iter.close(); } } } @Override public void addedStatements(final StmtIterator statements) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.addedStatements(statements); } else { final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), statements); try { wrapped.addedStatements(iter); } finally { iter.close(); } } } @Override public void notifyEvent(final Model m, final Object event) { wrapped.notifyEvent(m, event); } @Override public void removedStatement(final Statement s) throws AuthenticationRequiredException { if (canRead(s)) { wrapped.removedStatement(s); } } @Override public void removedStatements(final List<Statement> statements) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.removedStatements(statements); } else { final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), WrappedIterator.create(statements.iterator())); try { wrapped.removedStatements(iter.toList()); } finally { iter.close(); } } } @Override public void removedStatements(final Model m) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.removedStatements(m); } else { wrapped.removedStatements(SecuredModelImpl.getInstance(holder.getSecuredItem(), m)); } } @Override public void removedStatements(final Statement[] statements) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.removedStatements(statements); } else { final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), WrappedIterator.create(Arrays.asList(statements).iterator())); try { final List<Statement> stmts = iter.toList(); wrapped.removedStatements(stmts.toArray(new Statement[stmts.size()])); } finally { iter.close(); } } } @Override public void removedStatements(final StmtIterator statements) throws AuthenticationRequiredException { if (canRead(Triple.ANY)) { wrapped.removedStatements(statements); } else { final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), statements); try { wrapped.removedStatements(iter); } finally { iter.close(); } } } } private static final RDFReaderF readerFactory = new RDFReaderFImpl(); /** * Get an instance of SecuredModel * * @param securedItem * the item providing the security context. * @param model * the Model to secure. * @return The SecuredModel */ public static SecuredModel getInstance(final SecuredItem securedItem, final Model model) { return org.apache.jena.permissions.Factory.getInstance(securedItem.getSecurityEvaluator(), securedItem.getModelIRI(), model); } /** * Get an instance of SecuredModel * * @param securityEvaluator * The security evaluator to use * @param modelIRI * The IRI (graph IRI) to name this model. * @param model * The Model to secure. * @return the SecuredModel */ public static SecuredModel getInstance(final SecurityEvaluator securityEvaluator, final String modelIRI, final Model model) { final ItemHolder<Model, SecuredModel> holder = new ItemHolder<Model, SecuredModel>(model); final SecuredModelImpl checker = new SecuredModelImpl(securityEvaluator, modelIRI, holder); // if we are going to create a duplicate proxy, just return this // one. if (model instanceof SecuredModel) { if (checker.isEquivalent((SecuredModel) model)) { return (SecuredModel) model; } } return holder.setSecuredItem(new SecuredItemInvoker(model.getClass(), checker)); } // the item holder that contains this SecuredModel. private final ItemHolder<Model, SecuredModel> holder; // The secured graph that this securedModel contains. private final SecuredGraph graph; Map<ModelChangedListener, SecuredModelChangedListener> listeners = new HashMap<ModelChangedListener, SecuredModelChangedListener>(); /** * Constructor. * * @param securityEvaluator * The security evaluator to use * @param modelURI * The securedModel IRI to verify against. * @param holder * The item holder that will contain this SecuredModel. */ private SecuredModelImpl(final SecurityEvaluator securityEvaluator, final String modelURI, final ItemHolder<Model, SecuredModel> holder) { super(securityEvaluator, modelURI, holder); this.graph = org.apache.jena.permissions.Factory.getInstance(securityEvaluator, modelURI, holder.getBaseItem().getGraph()); this.holder = holder; } private RDFNode asObject(Object o) { return o instanceof RDFNode ? (RDFNode) o : ResourceFactory.createTypedLiteral(o); } @Override public SecuredModel abort() { holder.getBaseItem().abort(); return holder.getSecuredItem(); } @Override public SecuredModel add(final List<Statement> statements) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreateFrontsTriples(WrappedIterator.create(statements.iterator())); holder.getBaseItem().add(statements); return holder.getSecuredItem(); } @Override public SecuredModel add(final Model m) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canCreate(Triple.ANY)) { checkCreateFrontsTriples(m.listStatements()); } holder.getBaseItem().add(m); return holder.getSecuredItem(); } @Override public SecuredModel add(final Resource s, final Property p, final RDFNode o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), o.asNode())); holder.getBaseItem().add(s, p, o); return holder.getSecuredItem(); } @Override public SecuredModel add(final Resource s, final Property p, final String o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return add(s, p, o, false); } @Override public SecuredModel add(final Resource s, final Property p, final String o, final boolean wellFormed) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), NodeFactory.createLiteral(o, "", wellFormed))); holder.getBaseItem().add(s, p, o, wellFormed); return holder.getSecuredItem(); } @Override public SecuredModel add(final Resource s, final Property p, final String lex, final RDFDatatype datatype) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), NodeFactory.createLiteral(lex, datatype))); holder.getBaseItem().add(s, p, lex, datatype); return holder.getSecuredItem(); } @Override public SecuredModel add(final Resource s, final Property p, final String o, final String l) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), NodeFactory.createLiteral(o, l, false))); holder.getBaseItem().add(s, p, o, l); return holder.getSecuredItem(); } @Override public SecuredModel add(final Statement s) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(s); holder.getBaseItem().add(s); return holder.getSecuredItem(); } @Override public SecuredModel add(final Statement[] statements) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canCreate(Triple.ANY)) { for (final Statement s : statements) { checkCreate(s); } } holder.getBaseItem().add(statements); return holder.getSecuredItem(); } @Override public SecuredModel add(final StmtIterator iter) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canCreate(Triple.ANY)) { final List<Triple> lst = new ArrayList<Triple>(); try { while (iter.hasNext()) { final Statement s = iter.next(); checkCreate(s); lst.add(s.asTriple()); } final Model m = ModelFactory.createModelForGraph(new CollectionGraph(lst)); holder.getBaseItem().add(m.listStatements()); } finally { iter.close(); } } else { holder.getBaseItem().add(iter); } return holder.getSecuredItem(); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final boolean o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Literal l = ResourceFactory.createTypedLiteral(o); if (l == null) { throw new IllegalArgumentException("How did we get a null"); } return add(s, p, l); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final char o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Literal l = ResourceFactory.createTypedLiteral(o); return add(s, p, l); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final double o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Literal l = ResourceFactory.createTypedLiteral(o); return add(s, p, l); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final float o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Literal l = ResourceFactory.createTypedLiteral(o); return add(s, p, l); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final int o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Literal l = ResourceFactory.createTypedLiteral(o); return add(s, p, l); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final Literal o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return add(s, p, o); } @Override public SecuredModel addLiteral(final Resource s, final Property p, final long o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Literal l = ResourceFactory.createTypedLiteral(o); return add(s, p, l); } @Override @Deprecated public SecuredModel addLiteral(final Resource s, final Property p, final Object o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return add(s, p, asObject(o)); } @Override public SecuredRDFNode asRDFNode(final Node n) { return SecuredRDFNodeImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().asRDFNode(n)); } @Override public SecuredStatement asStatement(final Triple t) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final ExtendedIterator<Triple> iter = holder.getBaseItem().getGraph().find(t); final boolean exists = iter.hasNext(); iter.close(); if (exists) { checkRead(); checkRead(t); } else { checkUpdate(); checkCreate(t); } return SecuredStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().asStatement(t)); } @Override public SecuredModel begin() { holder.getBaseItem().begin(); return holder.getSecuredItem(); } @Override public void close() { holder.getBaseItem().close(); } @Override public SecuredModel commit() { holder.getBaseItem().commit(); return holder.getSecuredItem(); } @Override public boolean contains(final Resource s, final Property p) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(s, p, (RDFNode) null)); try { return iter.hasNext(); } finally { iter.close(); } } @Override public boolean contains(final Resource s, final Property p, final RDFNode o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(s, p, o)); try { return iter.hasNext(); } finally { iter.close(); } } @Override public boolean contains(final Resource s, final Property p, final String o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(s, p, o)); try { return iter.hasNext(); } finally { iter.close(); } } @Override public boolean contains(final Resource s, final Property p, final String o, final String l) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final SecuredStatementIterator iter = new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(s, p, o, l)); try { return iter.hasNext(); } finally { iter.close(); } } @Override public boolean contains(final Statement s) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(s); return holder.getBaseItem().contains(s); } @Override public boolean containsAll(final Model model) throws ReadDeniedException, AuthenticationRequiredException { return containsAll(model.listStatements()); } @Override public boolean containsAll(final StmtIterator iter) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final boolean doCheck = canRead(Triple.ANY); try { while (iter.hasNext()) { final Statement stmt = iter.next(); if (doCheck) { checkRead(stmt); } if (!holder.getBaseItem().contains(stmt)) { return false; } } return true; } finally { iter.close(); } } @Override public boolean containsAny(final Model model) throws ReadDeniedException, AuthenticationRequiredException { return containsAny(model.listStatements()); } @Override public boolean containsAny(final StmtIterator iter) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final boolean skipCheck = canRead(Triple.ANY); try { while (iter.hasNext()) { final Statement stmt = iter.next(); if (skipCheck || canRead(stmt)) { if (holder.getBaseItem().contains(stmt)) { return true; } } } return false; } finally { iter.close(); } } @Override public boolean containsLiteral(final Resource s, final Property p, final boolean o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public boolean containsLiteral(final Resource s, final Property p, final char o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public boolean containsLiteral(final Resource s, final Property p, final double o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public boolean containsLiteral(final Resource s, final Property p, final float o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public boolean containsLiteral(final Resource s, final Property p, final int o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public boolean containsLiteral(final Resource s, final Property p, final long o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public boolean containsLiteral(final Resource s, final Property p, final Object o) throws ReadDeniedException, AuthenticationRequiredException { return contains(s, p, asObject(o)); } @Override public boolean containsResource(final RDFNode r) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(new Triple(Node.ANY, Node.ANY, Node.ANY))) { return holder.getBaseItem().containsResource(r); } else { ExtendedIterator<Statement> iter = listStatements(null, null, r); if (r.isResource()) { if (r.isURIResource()) { iter = iter.andThen( listStatements(null, ResourceFactory.createProperty(r.asNode().getURI()), (RDFNode) null)); } else { iter = iter.andThen(listStatements(null, ResourceFactory.createProperty(r.asNode().getBlankNodeLabel()), (RDFNode) null)); } iter = iter.andThen(listStatements(r.asResource(), null, (RDFNode) null)); } try { return iter.hasNext(); } finally { iter.close(); } } } @Override public SecuredAlt createAlt() throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(SecurityEvaluator.FUTURE, RDF.type.asNode(), RDF.Alt.asNode())); return SecuredAltImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createAlt()); } @Override public SecuredAlt createAlt(final String uri) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(NodeFactory.createURI(uri), RDF.type.asNode(), RDF.Alt.asNode())); return SecuredAltImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createAlt(uri)); } @Override public SecuredBag createBag() throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(SecurityEvaluator.FUTURE, RDF.type.asNode(), RDF.Bag.asNode())); return SecuredBagImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createBag()); } @Override public SecuredBag createBag(final String uri) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(NodeFactory.createURI(uri), RDF.type.asNode(), RDF.Bag.asNode())); return SecuredBagImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createBag(uri)); } private Model createCopy() throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return ModelFactory.createDefaultModel().add(holder.getSecuredItem()); } @Override public SecuredRDFList createList() throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(SecurityEvaluator.FUTURE, RDF.first.asNode(), RDF.nil.asNode())); return SecuredRDFListImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createList()); } @Override public SecuredRDFList createList(final Iterator<? extends RDFNode> members) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(SecurityEvaluator.FUTURE, RDF.rest.asNode(), SecurityEvaluator.FUTURE)); boolean canCreateAny = canCreate(new Triple(SecurityEvaluator.FUTURE, RDF.first.asNode(), Node.ANY)); if (!canCreateAny) { // have to check each of the possible entries in the list for // creation. final List<RDFNode> nodes = new ArrayList<RDFNode>(); while (members.hasNext()) { final RDFNode n = members.next(); checkCreate(new Triple(SecurityEvaluator.FUTURE, RDF.first.asNode(), n.asNode())); nodes.add(n); } return SecuredRDFListImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createList(nodes.iterator())); } else { return SecuredRDFListImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createList(members)); } } @Override public SecuredRDFList createList(final RDFNode[] members) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return createList(Arrays.asList(members).iterator()); } @Override public SecuredLiteral createLiteral(final String v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createLiteral(v)); } @Override public SecuredLiteral createLiteral(final String v, final boolean wellFormed) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createLiteral(v, wellFormed)); } @Override public SecuredLiteral createLiteral(final String v, final String language) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createLiteral(v, language)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final boolean o) { return createStatement(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final char o) { return createStatement(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final double o) { return createStatement(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final float o) { return createStatement(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final int o) { return createStatement(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final long o) { return createStatement(s, p, ResourceFactory.createTypedLiteral(o)); } @Override public SecuredStatement createLiteralStatement(final Resource s, final Property p, final Object o) { return createStatement(s, p, asObject(o)); } @Override public SecuredProperty createProperty(final String uri) { return SecuredPropertyImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createProperty(uri)); } @Override public SecuredProperty createProperty(final String nameSpace, final String localName) { return SecuredPropertyImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createProperty(nameSpace, localName)); } @Override public SecuredReifiedStatement createReifiedStatement(final Statement s) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreateReified(null, s); return SecuredReifiedStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createReifiedStatement(s)); } @Override public SecuredReifiedStatement createReifiedStatement(final String uri, final Statement s) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreateReified(uri, s); return SecuredReifiedStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createReifiedStatement(uri, s)); } @Override public SecuredResource createResource() { // checkCreateAnonymousResource(SecurityEvaluator.FUTURE); return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createResource()); } @Override public SecuredResource createResource(final AnonId id) { // checkCreateAnonymousResource(new SecurityEvaluator.SecNode( // SecurityEvaluator.SecNode.Type.Anonymous, id.getLabelString())); return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createResource(id)); } @Override public SecuredResource createResource(final Resource type) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); final Triple t = new Triple(SecurityEvaluator.FUTURE, RDF.type.asNode(), type.asNode()); checkCreate(t); return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createResource(type)); } @Override @Deprecated public SecuredResource createResource(final ResourceF f) throws AuthenticationRequiredException { return createResource(null, f); } @Override public SecuredResource createResource(final String uri) { return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createResource(uri)); } @Override public SecuredResource createResource(final String uri, final Resource type) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final Resource r = ResourceFactory.createResource(uri); final Triple t = new Triple(r.asNode(), RDF.type.asNode(), type.asNode()); if (holder.getBaseItem().contains(r, RDF.type, type)) { checkRead(); checkRead(t); } else { checkUpdate(); checkCreate(t); } return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createResource(uri, type)); } @Override @Deprecated public SecuredResource createResource(final String uri, final ResourceF f) { return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createResource(uri, f)); } @Override public SecuredSeq createSeq() throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(SecurityEvaluator.FUTURE, RDF.type.asNode(), RDF.Alt.asNode())); return SecuredSeqImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createSeq()); } @Override public SecuredSeq createSeq(final String uri) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(NodeFactory.createURI(uri), RDF.type.asNode(), RDF.Alt.asNode())); return SecuredSeqImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createSeq(uri)); } @Override public SecuredStatement createStatement(final Resource s, final Property p, final RDFNode o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), o.asNode())); return SecuredStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createStatement(s, p, o)); } @Override public SecuredStatement createStatement(final Resource s, final Property p, final String o) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), NodeFactory.createURI(o))); return SecuredStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createStatement(s, p, o)); } @Override public SecuredStatement createStatement(final Resource s, final Property p, final String o, final boolean wellFormed) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return createStatement(s, p, o, "", wellFormed); } @Override public SecuredStatement createStatement(final Resource s, final Property p, final String o, final String l) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { return createStatement(s, p, o, l, false); } @Override public SecuredStatement createStatement(final Resource s, final Property p, final String o, final String l, final boolean wellFormed) throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { checkUpdate(); checkCreate(new Triple(s.asNode(), p.asNode(), NodeFactory.createLiteral(o, l, wellFormed))); return SecuredStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createStatement(s, p, o, l, wellFormed)); } @Override public SecuredLiteral createTypedLiteral(final boolean v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final Calendar d) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(d)); } @Override public SecuredLiteral createTypedLiteral(final char v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final double v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final float v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final int v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final long v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final Object value) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(value)); } @Override public SecuredLiteral createTypedLiteral(final Object value, final RDFDatatype dtype) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(value, dtype)); } @Override public SecuredLiteral createTypedLiteral(final Object value, final String typeURI) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(value, typeURI)); } @Override public SecuredLiteral createTypedLiteral(final String v) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(v)); } @Override public SecuredLiteral createTypedLiteral(final String lex, final RDFDatatype dtype) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(lex, dtype)); } @Override public SecuredLiteral createTypedLiteral(final String lex, final String typeURI) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().createTypedLiteral(lex, typeURI)); } @Override public Model difference(final Model model) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { return holder.getBaseItem().difference(model); } else { return createCopy().difference(model); } } @Override public void enterCriticalSection(final boolean readLockRequested) throws UpdateDeniedException, ReadDeniedException, AuthenticationRequiredException { if (readLockRequested) { checkRead(); } else { checkUpdate(); } holder.getBaseItem().enterCriticalSection(readLockRequested); } @Deprecated @Override public Object executeInTransaction(final Command cmd) { return holder.getBaseItem().executeInTransaction(cmd); } @Override public void executeInTxn(Runnable action) { holder.getBaseItem().executeInTxn(action); } @Override public <T> T calculateInTxn(Supplier<T> action) { return holder.getBaseItem().calculateInTxn(action); } @Override public String expandPrefix(final String prefixed) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().expandPrefix(prefixed); } @Override public SecuredAlt getAlt(final Resource r) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(new Triple(r.asNode(), RDF.type.asNode(), RDF.Alt.asNode())); return SecuredAltImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getAlt(r)); } @Override public SecuredAlt getAlt(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(new Triple(NodeFactory.createURI(uri), RDF.type.asNode(), RDF.Alt.asNode())); return SecuredAltImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getAlt(uri)); } @Override public SecuredResource getAnyReifiedStatement(final Statement s) throws ReadDeniedException, UpdateDeniedException, AddDeniedException, AuthenticationRequiredException { final RSIterator it = listReifiedStatements(s); if (it.hasNext()) { try { return SecuredReifiedStatementImpl.getInstance(holder.getSecuredItem(), it.nextRS()); } finally { it.close(); } } else { return SecuredReifiedStatementImpl.getInstance(holder.getSecuredItem(), createReifiedStatement(s)); } } @Override public SecuredBag getBag(final Resource r) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(new Triple(r.asNode(), RDF.type.asNode(), RDF.Bag.asNode())); return SecuredBagImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getBag(r)); } @Override public SecuredBag getBag(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(new Triple(NodeFactory.createURI(uri), RDF.type.asNode(), RDF.Bag.asNode())); return SecuredBagImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getBag(uri)); } @Override public SecuredGraph getGraph() { return graph; } @Override public Lock getLock() { return holder.getBaseItem().getLock(); } @Override public Map<String, String> getNsPrefixMap() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().getNsPrefixMap(); } @Override public String getNsPrefixURI(final String prefix) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().getNsPrefixURI(prefix); } @Override public String getNsURIPrefix(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().getNsURIPrefix(uri); } @Override public SecuredStatement getProperty(final Resource s, final Property p) throws ReadDeniedException, AuthenticationRequiredException { final StmtIterator stmt = listStatements(s, p, (RDFNode) null); try { if (stmt.hasNext()) { return SecuredStatementImpl.getInstance(holder.getSecuredItem(), stmt.next()); } return null; } finally { if (stmt != null) { stmt.close(); } } } @Override public SecuredStatement getProperty(Resource s, Property p, String lang) throws ReadDeniedException, AuthenticationRequiredException { final StmtIterator stmt = listStatements(s, p, null, lang); try { if (stmt.hasNext()) { return SecuredStatementImpl.getInstance(holder.getSecuredItem(), stmt.next()); } return null; } finally { if (stmt != null) { stmt.close(); } } } @Override public SecuredProperty getProperty(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return SecuredPropertyImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getProperty(uri)); } @Override public SecuredProperty getProperty(final String nameSpace, final String localName) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return SecuredPropertyImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getProperty(nameSpace, localName)); } @Override public SecuredRDFNode getRDFNode(final Node n) throws ReadDeniedException, UpdateDeniedException, AuthenticationRequiredException { RDFNode rdfNode = null; if (n.isLiteral()) { rdfNode = ResourceFactory.createTypedLiteral(n.getLiteralLexicalForm(), n.getLiteralDatatype()); } else if (n.isURI()) { rdfNode = ResourceFactory.createProperty(n.getURI()); } else if (n.isBlank()) { rdfNode = ResourceFactory.createResource(n.getBlankNodeId().toString()); } else { throw new IllegalArgumentException("Illegal Node type: " + n.getClass()); } if (holder.getBaseItem().containsResource(rdfNode)) { checkRead(); } else { checkUpdate(); } if (n.isLiteral()) { return SecuredLiteralImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getRDFNode(n).asLiteral()); } else { return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getRDFNode(n).asResource()); } } @Override public RDFReader getReader() { return holder.getBaseItem().getReader(); } @Override public RDFReader getReader(final String lang) { return holder.getBaseItem().getReader(lang); } @SuppressWarnings("deprecation") @Override public void resetRDFReaderF() { holder.getBaseItem().resetRDFReaderF(); } @SuppressWarnings("deprecation") @Override public String removeReader(String lang) throws IllegalArgumentException { return holder.getBaseItem().removeReader(lang); } @Override public SecuredStatement getRequiredProperty(final Resource s, final Property p) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { return SecuredStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getRequiredProperty(s, p)); } else { final SecuredStatementIterator si = listStatements(s, p, (RDFNode) null); try { if (si.hasNext()) { return (SecuredStatement) si.next(); } else { throw new PropertyNotFoundException(p); } } finally { si.close(); } } } @Override public SecuredStatement getRequiredProperty(final Resource s, final Property p, String lang) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { return SecuredStatementImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getRequiredProperty(s, p, lang)); } else { final SecuredStatementIterator si = listStatements(s, p, null, lang); try { if (si.hasNext()) { return (SecuredStatement) si.next(); } else { throw new PropertyNotFoundException(p); } } finally { si.close(); } } } @Override public SecuredResource getResource(final String uri) { return createResource(uri); } @Override @Deprecated public SecuredResource getResource(final String uri, final ResourceF f) { return createResource(uri, f); } @Override public SecuredSeq getSeq(final Resource r) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(new Triple(r.asNode(), RDF.type.asNode(), RDF.Seq.asNode())); return SecuredSeqImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getSeq(r)); } @Override public SecuredSeq getSeq(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(new Triple(NodeFactory.createURI(uri), RDF.type.asNode(), RDF.Seq.asNode())); return SecuredSeqImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().getSeq(uri)); } @Override public RDFWriter getWriter() { return holder.getBaseItem().getWriter(); } @Override public RDFWriter getWriter(final String lang) { return holder.getBaseItem().getWriter(lang); } @SuppressWarnings("deprecation") @Override public void resetRDFWriterF() { holder.getBaseItem().resetRDFWriterF(); } @SuppressWarnings("deprecation") @Override public String removeWriter(String lang) throws IllegalArgumentException { return holder.getBaseItem().removeWriter(lang); } @Override public boolean independent() { return false; } @Override public Model intersection(final Model model) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (!canRead(Triple.ANY)) { return holder.getBaseItem().intersection(model); } else { return createCopy().intersection(model); } } @Override public boolean isClosed() { return holder.getBaseItem().isClosed(); } @Override public boolean isEmpty() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().isEmpty(); } @Override public boolean isIsomorphicWith(final Model g) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final boolean retval = holder.getBaseItem().isIsomorphicWith(g); if (retval && !canRead(Triple.ANY)) { // in this case we have to check all the items in the graph to see // if the user can read // them all. final ExtendedIterator<Statement> stmtIter = holder.getBaseItem().listStatements(); try { while (stmtIter.hasNext()) { if (!canRead(stmtIter.next())) { return false; } } } finally { if (stmtIter != null) { stmtIter.close(); } } } return retval; } @Override public boolean isReified(final Statement s) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(s); final RSIterator it = listReifiedStatements(s); try { return it.hasNext(); } finally { it.close(); } } @Override public void leaveCriticalSection() { holder.getBaseItem().leaveCriticalSection(); } @Override public SecuredStatementIterator listLiteralStatements(final Resource subject, final Property predicate, final boolean object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listLiteralStatements(subject, predicate, object)); } @Override public SecuredStatementIterator listLiteralStatements(final Resource subject, final Property predicate, final char object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listLiteralStatements(subject, predicate, object)); } @Override public SecuredStatementIterator listLiteralStatements(final Resource subject, final Property predicate, final double object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listLiteralStatements(subject, predicate, object)); } @Override public SecuredStatementIterator listLiteralStatements(final Resource subject, final Property predicate, final float object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listLiteralStatements(subject, predicate, object)); } @Override public SecuredStatementIterator listLiteralStatements(final Resource subject, final Property predicate, final long object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listLiteralStatements(subject, predicate, object)); } @Override public SecuredStatementIterator listLiteralStatements(final Resource subject, final Property predicate, final int object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listLiteralStatements(subject, predicate, object)); } @Override public NsIterator listNameSpaces() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().listNameSpaces(); } @Override public SecuredNodeIterator<RDFNode> listObjects() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<RDFNode> nIter = holder.getBaseItem().listObjects(); if (!canRead(Triple.ANY)) { nIter = nIter.filterKeep(new ObjectFilter()); } return new SecuredNodeIterator<RDFNode>(holder.getSecuredItem(), nIter); } @Override public SecuredNodeIterator<RDFNode> listObjectsOfProperty(final Property p) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<RDFNode> nIter = holder.getBaseItem().listObjectsOfProperty(p); if (!canRead(Triple.ANY)) { nIter = nIter.filterKeep(new ObjectFilter(p)); } return new SecuredNodeIterator<RDFNode>(holder.getSecuredItem(), nIter); } @Override public SecuredNodeIterator<RDFNode> listObjectsOfProperty(final Resource s, final Property p) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<RDFNode> nIter = holder.getBaseItem().listObjectsOfProperty(s, p); if (!canRead(Triple.ANY)) { nIter = nIter.filterKeep(new ObjectFilter(p)); } return new SecuredNodeIterator<RDFNode>(holder.getSecuredItem(), nIter); } @Override public SecuredRSIterator listReifiedStatements() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredRSIterator(holder.getSecuredItem(), holder.getBaseItem().listReifiedStatements()); } @Override public SecuredRSIterator listReifiedStatements(final Statement st) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); checkRead(st); return new SecuredRSIterator(holder.getSecuredItem(), holder.getBaseItem().listReifiedStatements(st)); } @Override public SecuredResIterator listResourcesWithProperty(final Property p) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p)); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final boolean o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createTypedLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final char o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createTypedLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final double o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createTypedLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final float o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createTypedLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final long o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createTypedLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final Object o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createTypedLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listResourcesWithProperty(final Property p, final RDFNode o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listResourcesWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, o)); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredStatementIterator listStatements() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements()); } @Override public SecuredStatementIterator listStatements(final Resource s, final Property p, final RDFNode o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(s, p, o)); } @Override public SecuredStatementIterator listStatements(final Resource subject, final Property predicate, final String object) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(subject, predicate, object)); } @Override public SecuredStatementIterator listStatements(final Resource subject, final Property predicate, final String object, final String lang) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(subject, predicate, object, lang)); } @Override public SecuredStatementIterator listStatements(final Selector s) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return new SecuredStatementIterator(holder.getSecuredItem(), holder.getBaseItem().listStatements(s)); } @Override public SecuredResIterator listSubjects() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listSubjects(); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter()); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listSubjectsWithProperty(final Property p) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listSubjectsWithProperty(p); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p)); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listSubjectsWithProperty(final Property p, final RDFNode o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listSubjectsWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, o)); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listSubjectsWithProperty(final Property p, final String o) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listSubjectsWithProperty(p, o); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createPlainLiteral(o))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredResIterator listSubjectsWithProperty(final Property p, final String o, final String l) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); ExtendedIterator<Resource> rIter = holder.getBaseItem().listSubjectsWithProperty(p, o, l); if (!canRead(Triple.ANY)) { rIter = rIter.filterKeep(new ResourceFilter(p, ResourceFactory.createLangLiteral(o, l))); } return new SecuredResIterator(holder.getSecuredItem(), rIter); } @Override public SecuredPrefixMapping lock() throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); holder.getBaseItem().lock(); return holder.getSecuredItem(); } @Override public SecuredModel notifyEvent(final Object e) { holder.getBaseItem().notifyEvent(e); return holder.getSecuredItem(); } @Override public String qnameFor(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().qnameFor(uri); } @Override public SecuredModel query(final Selector s) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return SecuredModelImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().query(new SecuredSelector(holder.getSecuredItem(), s))); } @Override public SecuredModel read(final InputStream in, final String base) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); SecuredModelImpl.readerFactory.getReader().read(holder.getSecuredItem(), in, base); return holder.getSecuredItem(); } @Override public SecuredModel read(final InputStream in, final String base, final String lang) throws ReadDeniedException, AuthenticationRequiredException { checkUpdate(); SecuredModelImpl.readerFactory.getReader(lang).read(holder.getSecuredItem(), in, base); return holder.getSecuredItem(); } @Override public SecuredModel read(final Reader reader, final String base) throws ReadDeniedException, AuthenticationRequiredException { checkUpdate(); SecuredModelImpl.readerFactory.getReader().read(holder.getSecuredItem(), reader, base); return holder.getSecuredItem(); } @Override public SecuredModel read(final Reader reader, final String base, final String lang) throws ReadDeniedException, AuthenticationRequiredException { checkUpdate(); SecuredModelImpl.readerFactory.getReader(lang).read(holder.getSecuredItem(), reader, base); return holder.getSecuredItem(); } @Override public SecuredModel read(final String url) throws ReadDeniedException, AuthenticationRequiredException { checkUpdate(); SecuredModelImpl.readerFactory.getReader().read(holder.getSecuredItem(), url); return holder.getSecuredItem(); } @Override public SecuredModel read(final String url, final String lang) throws ReadDeniedException, AuthenticationRequiredException { checkUpdate(); SecuredModelImpl.readerFactory.getReader(lang).read(holder.getSecuredItem(), url); return holder.getSecuredItem(); } @Override public SecuredModel read(final String url, final String base, final String lang) throws ReadDeniedException, AuthenticationRequiredException { try (InputStream is = new URL(url).openStream()) { read(is, base, lang); } catch (final IOException e) { throw new WrappedIOException(e); } return holder.getSecuredItem(); } @Override public SecuredModel register(final ModelChangedListener listener) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (!listeners.containsKey(listener)) { final SecuredModelChangedListener secL = new SecuredModelChangedListener(listener); listeners.put(listener, secL); holder.getBaseItem().register(secL); } return holder.getSecuredItem(); } @Override public SecuredModel remove(final List<Statement> statements) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(Triple.ANY)) { for (final Statement s : statements) { checkDelete(s); } } holder.getBaseItem().remove(statements); return holder.getSecuredItem(); } @Override public SecuredModel remove(final Model m) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(Triple.ANY)) { final StmtIterator iter = m.listStatements(); try { while (iter.hasNext()) { final Statement stmt = iter.next(); checkDelete(stmt); } } finally { iter.close(); } } holder.getBaseItem().remove(m); return holder.getSecuredItem(); } @Override public SecuredModel remove(final Resource s, final Property p, final RDFNode o) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); checkDelete(new Triple(s.asNode(), p.asNode(), o.asNode())); holder.getBaseItem().remove(s, p, o); return holder.getSecuredItem(); } @Override public SecuredModel remove(final Statement s) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); checkDelete(wildCardTriple(s)); holder.getBaseItem().remove(s); return holder.getSecuredItem(); } @Override public SecuredModel remove(final Statement[] statements) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(Triple.ANY)) { for (final Statement s : statements) { checkDelete(s); } } holder.getBaseItem().remove(statements); return holder.getSecuredItem(); } @Override public SecuredModel remove(final StmtIterator iter) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(Triple.ANY)) { final List<Triple> lst = new ArrayList<Triple>(); try { while (iter.hasNext()) { final Statement s = iter.next(); checkDelete(s); lst.add(s.asTriple()); } final Model m = ModelFactory.createModelForGraph(new CollectionGraph(lst)); holder.getBaseItem().remove(m.listStatements()); } finally { iter.close(); } } else { holder.getBaseItem().remove(iter); } return holder.getSecuredItem(); } @Override public SecuredModel removeAll() throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(Triple.ANY)) { final StmtIterator iter = holder.getBaseItem().listStatements(); try { while (iter.hasNext()) { checkDelete(iter.next()); } } finally { iter.close(); } } holder.getBaseItem().removeAll(); return holder.getSecuredItem(); } @Override public SecuredModel removeAll(final Resource s, final Property p, final RDFNode r) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(new Triple(wildCardNode(s), wildCardNode(p), wildCardNode(r)))) { final StmtIterator iter = holder.getBaseItem().listStatements(s, p, r); try { while (iter.hasNext()) { checkDelete(iter.next()); } } finally { iter.close(); } } holder.getBaseItem().removeAll(s, p, r); return holder.getSecuredItem(); } @Override public void removeAllReifications(final Statement s) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (canDelete(new Triple(Node.ANY, RDF.subject.asNode(), wildCardNode(s.getSubject()))) && canDelete(new Triple(Node.ANY, RDF.predicate.asNode(), wildCardNode(s.getPredicate()))) && canDelete(new Triple(Node.ANY, RDF.object.asNode(), wildCardNode(s.getObject())))) { holder.getBaseItem().removeAllReifications(s); } else { final RSIterator iter = holder.getBaseItem().listReifiedStatements(s); try { while (iter.hasNext()) { final ReifiedStatement rs = iter.next(); checkDelete(new Triple(rs.asNode(), RDF.subject.asNode(), wildCardNode(s.getSubject()))); checkDelete(new Triple(rs.asNode(), RDF.predicate.asNode(), wildCardNode(s.getPredicate()))); checkDelete(new Triple(rs.asNode(), RDF.object.asNode(), wildCardNode(s.getObject()))); } holder.getBaseItem().removeAllReifications(s); } finally { iter.close(); } } } @Override public SecuredPrefixMapping removeNsPrefix(final String prefix) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); holder.getBaseItem().removeNsPrefix(prefix); return holder.getSecuredItem(); } @Override public SecuredPrefixMapping clearNsPrefixMap() { checkUpdate(); holder.getBaseItem().clearNsPrefixMap(); return holder.getSecuredItem(); } @Override public void removeReification(final ReifiedStatement rs) throws UpdateDeniedException, DeleteDeniedException, AuthenticationRequiredException { checkUpdate(); if (!canDelete(Triple.ANY)) { final StmtIterator stmtIter = rs.listProperties(); try { while (stmtIter.hasNext()) { checkDelete(stmtIter.next()); } } finally { stmtIter.close(); } } holder.getBaseItem().removeReification(rs); } @Override public boolean samePrefixMappingAs(final PrefixMapping other) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().samePrefixMappingAs(other); } @Override public SecuredPrefixMapping setNsPrefix(final String prefix, final String uri) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); holder.getBaseItem().setNsPrefix(prefix, uri); return holder.getSecuredItem(); } @Override public SecuredPrefixMapping setNsPrefixes(final Map<String, String> map) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); holder.getBaseItem().setNsPrefixes(map); return holder.getSecuredItem(); } @Override public SecuredPrefixMapping setNsPrefixes(final PrefixMapping other) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); holder.getBaseItem().setNsPrefixes(other); return holder.getSecuredItem(); } @SuppressWarnings("deprecation") @Override public String setReaderClassName(final String lang, final String className) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); return holder.getBaseItem().setReaderClassName(lang, className); } @SuppressWarnings("deprecation") @Override public String setWriterClassName(final String lang, final String className) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); return holder.getBaseItem().setWriterClassName(lang, className); } @Override public String shortForm(final String uri) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().shortForm(uri); } @Override public long size() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); return holder.getBaseItem().size(); } @Override public boolean supportsSetOperations() { return holder.getBaseItem().supportsSetOperations(); } @Override public boolean supportsTransactions() { return holder.getBaseItem().supportsTransactions(); } @Override public Model union(final Model model) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { return holder.getBaseItem().union(model); } else { return createCopy().union(model); } } @Override public SecuredModel unregister(final ModelChangedListener listener) { if (listeners.containsKey(listener)) { final SecuredModelChangedListener secL = listeners.get(listener); holder.getBaseItem().unregister(secL); listeners.remove(listener); } return holder.getSecuredItem(); } private Node wildCardNode(final RDFNode node) { return node == null ? Node.ANY : node.asNode(); } private Triple wildCardTriple(final Statement s) { return new Triple(wildCardNode(s.getSubject()), wildCardNode(s.getPredicate()), wildCardNode(s.getObject())); } @Override public SecuredPrefixMapping withDefaultMappings(final PrefixMapping map) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); holder.getBaseItem().withDefaultMappings(map); return holder.getSecuredItem(); } @Override public SecuredResource wrapAsResource(final Node n) { return SecuredResourceImpl.getInstance(holder.getSecuredItem(), holder.getBaseItem().wrapAsResource(n)); } @Override public SecuredModel write(final OutputStream out) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { holder.getBaseItem().write(out); } else { getWriter().write(holder.getSecuredItem(), out, ""); } return holder.getSecuredItem(); } @Override public SecuredModel write(final OutputStream out, final String lang) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { holder.getBaseItem().write(out, lang); } else { getWriter(lang).write(holder.getSecuredItem(), out, ""); } return holder.getSecuredItem(); } @Override public SecuredModel write(final OutputStream out, final String lang, final String base) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { holder.getBaseItem().write(out, lang, base); } else { getWriter(lang).write(holder.getSecuredItem(), out, base); } return holder.getSecuredItem(); } @Override public SecuredModel write(final Writer writer) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { holder.getBaseItem().write(writer); } else { getWriter().write(holder.getSecuredItem(), writer, ""); } return holder.getSecuredItem(); } @Override public SecuredModel write(final Writer writer, final String lang) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { holder.getBaseItem().write(writer, lang); } else { getWriter(lang).write(holder.getSecuredItem(), writer, ""); } return holder.getSecuredItem(); } @Override public SecuredModel write(final Writer writer, final String lang, final String base) throws ReadDeniedException, AuthenticationRequiredException { checkRead(); if (canRead(Triple.ANY)) { holder.getBaseItem().write(writer, lang, base); } else { getWriter(lang).write(holder.getSecuredItem(), writer, base); } return holder.getSecuredItem(); } private class ResourceFilter implements Predicate<Resource> { Property p; RDFNode o; ResourceFilter() { this(null, null); } ResourceFilter(Property p) { this(p, null); } ResourceFilter(Property p, RDFNode o) { this.p = p; this.o = o; } @Override public boolean test(Resource s) { StmtIterator iter = listStatements(s, p, o); try { return iter.hasNext(); } finally { iter.close(); } } } private class ObjectFilter implements Predicate<RDFNode> { Resource s; Property p; ObjectFilter() { this(null, null); } ObjectFilter(Property p) { this(null, p); } ObjectFilter(Resource s, Property p) { this.s = s; this.p = p; } @Override public boolean test(RDFNode o) { StmtIterator iter = listStatements(s, p, o); try { return iter.hasNext(); } finally { iter.close(); } } } }