You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2020/05/15 08:38:06 UTC

[jena] branch master updated: JENA-1881: Model API changes for RDF*

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/master by this push:
     new 86779f6  JENA-1881: Model API changes for RDF*
     new d61ec2e  Merge pull request #743 from afs/rdf-star-2
86779f6 is described below

commit 86779f6e77613e51eaaa2c76247943c8ec055444
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Thu May 14 15:47:42 2020 +0100

    JENA-1881: Model API changes for RDF*
---
 .../engine/iterator/QueryIterBlockTriplesStar.java |   6 +-
 .../java/org/apache/jena/enhanced/EnhNode.java     |  11 ++-
 .../main/java/org/apache/jena/rdf/model/Model.java |   7 ++
 .../java/org/apache/jena/rdf/model/RDFNode.java    |   8 +-
 .../java/org/apache/jena/rdf/model/RDFVisitor.java |  10 ++
 .../java/org/apache/jena/rdf/model/Resource.java   |  13 ++-
 .../org/apache/jena/rdf/model/ResourceFactory.java | 102 ++++++++++++---------
 .../org/apache/jena/rdf/model/impl/ModelCom.java   |   6 +-
 .../apache/jena/rdf/model/impl/ResourceImpl.java   |  22 ++++-
 .../apache/jena/rdf/model/impl/StatementImpl.java  |   3 +-
 .../apache/jena/rdf/model/test/TestRDFNodes.java   |   6 ++
 .../jena/rdf/model/test/TestResourceFactory.java   |  23 ++++-
 .../permissions/model/impl/SecuredModelImpl.java   |   5 +
 .../permissions/model/impl/SecuredRDFNodeImpl.java |   5 +
 .../model/impl/SecuredResourceImpl.java            |   6 +-
 .../jena/permissions/model/SecuredRDFNodeTest.java |   4 +-
 .../permissions/model/SecuredResourceTest.java     |   1 -
 17 files changed, 172 insertions(+), 66 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterBlockTriplesStar.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterBlockTriplesStar.java
index bbf4e5d..59036f9 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterBlockTriplesStar.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterBlockTriplesStar.java
@@ -32,7 +32,6 @@ import org.apache.jena.sparql.engine.QueryIterator;
 import org.apache.jena.sparql.engine.binding.Binding;
 import org.apache.jena.sparql.serializer.SerializationContext;
 
-
 /**
  * Like {@link QueryIterBlockTriples} except it process triple term patterns (RDF*)
  * as well.
@@ -94,7 +93,7 @@ public class QueryIterBlockTriplesStar extends QueryIter1 {
 
     /**
      * Insert the stages necessary for a triple with triple pattern term inside it.
-     * If the triple pattern has am triple term, possibly with variables, introduce
+     * If the triple pattern has a triple term, possibly with variables, introduce
      * an iterator to solve for that, assign the matching triple term to a hidden
      * variable, and put allocated variable in to main triple pattern. Do for subject
      * and object positions, and also any nested triple pattern terms.
@@ -106,9 +105,8 @@ public class QueryIterBlockTriplesStar extends QueryIter1 {
     }
 
     // If we assume the data is correct (in PG mode), no need to test for the triple
-    // of a concrete Node_Triple because we able to // test for it in the triple
+    // of a concrete Node_Triple because we able to test for it in the triple
     // pattern itself.
-    // In SA: not an issue.
     // This should be "false".
     private static final boolean TEST_FOR_CONCRETE_TRIPLE_TERM = false;
 
diff --git a/jena-core/src/main/java/org/apache/jena/enhanced/EnhNode.java b/jena-core/src/main/java/org/apache/jena/enhanced/EnhNode.java
index 7b851f8..200319a 100644
--- a/jena-core/src/main/java/org/apache/jena/enhanced/EnhNode.java
+++ b/jena-core/src/main/java/org/apache/jena/enhanced/EnhNode.java
@@ -84,10 +84,17 @@ public class EnhNode extends Polymorphic<RDFNode> implements FrontsNode
     }
     
     /**
-        An enhanced node is a resource if it's node is a URI node or a blank node.
+        An enhanced node is a statement resource iff its underlying node is a triple term (RDF*).
+     */
+    public final boolean isStmtResource() {
+        return node.isNodeTriple();
+    }
+
+    /**
+        An enhanced node is a resource if it's node is a URI node, a blank node or a triple term.
     */
     public final boolean isResource() {
-        return node.isURI() || node.isBlank();
+        return node.isURI() || node.isBlank() || node.isNodeTriple();
     }
     
     /**
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java b/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
index 9c97229..0db88c9 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
@@ -190,6 +190,13 @@ public interface Model
 	   @return a new resource linked to this model.
 	*/
 	public Resource createResource( String uri ) ;
+	
+	/**
+	 * Create a resource that represents a statement. This is in support of RDF*.
+	 * @param statement
+	 * @return a new resource linked to this model.
+	 */
+	public Resource createResource( Statement statement ) ;
 
 	/**
         Create a property with a given URI composed from a namespace part and a
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/RDFNode.java b/jena-core/src/main/java/org/apache/jena/rdf/model/RDFNode.java
index 9a36053..cbfc0e6 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/RDFNode.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/RDFNode.java
@@ -55,12 +55,18 @@ public interface RDFNode extends FrontsNode
     
     /**
         Answer true iff this RDFNode is a URI resource or an anonymous
-        resource (ie is not a literal). Useful for one-off tests: see also 
+        resource or a statement term (ie is not a literal). Useful for one-off tests: see also 
         visitWith() for making literal/anon/URI choices.
     */
     public boolean isResource();
     
     /**
+        Answer true iff this RDFNode is a resource representing an RDF* triple term. 
+     */
+    
+    public boolean isStmtResource();
+    
+    /**
         RDFNodes can be converted to different implementation types. Convert
         this RDFNode to a type supporting the <code>view</code>interface. The 
         resulting RDFNode should be an instance of <code>view</code> and should 
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/RDFVisitor.java b/jena-core/src/main/java/org/apache/jena/rdf/model/RDFVisitor.java
index 1f99bbd..44a6f8f 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/RDFVisitor.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/RDFVisitor.java
@@ -39,6 +39,16 @@ public interface RDFVisitor
     */
     Object visitURI( Resource r, String uri );
     
+    
+    /**
+     * Method to call when visiting a resource with a statement.
+     *   @param r the resource node being visited
+     *   @param uri the statement of that node
+     *   @return value to be returned from the visit
+     */ 
+        
+    default Object visitStmt( Resource r, Statement statement) { return null; }
+    
     /**
         Method to call when visiting a literal RDF node l.
         @param l the RDF Literal node
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/Resource.java b/jena-core/src/main/java/org/apache/jena/rdf/model/Resource.java
index ac55405..741ed5f 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/Resource.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/Resource.java
@@ -65,7 +65,7 @@ public interface Resource extends RDFNode {
     public AnonId getId();
     
     /**
-        Override RDFNode.inModel() to produce a staticly-typed Resource
+        Override RDFNode.inModel() to produce a statically-typed Resource
         in the given Model.
     */
     @Override
@@ -77,10 +77,17 @@ public interface Resource extends RDFNode {
     */
     public boolean hasURI( String uri );
 
-    /** Return the URI of the resource, or null if it's a bnode.
-     * @return The URI of the resource, or null if it's a bnode.
+    /** Return the URI of the resource, or null if it's a bnode or statement.
+     * @return The URI of the resource, or null if it's a bnode or statement.
      */
     public String getURI();
+    
+    /**
+     * Return the statement of this resource, or null if it is not an RDF* triple term.
+     * This is not a resource for a reified statement.   
+     * @return The statement of this resource,or null if it is not an RDF* triple term.
+     */
+    public Statement getStmtTerm();
 
     /** Returns the namespace associated with this resource if it is a URI, else return null. 
      * <p> 
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/ResourceFactory.java b/jena-core/src/main/java/org/apache/jena/rdf/model/ResourceFactory.java
index 1a0d342..bae817d 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/ResourceFactory.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/ResourceFactory.java
@@ -53,14 +53,14 @@ public class ResourceFactory {
     private ResourceFactory() {
     }
 
-    /** get the current factory object.
+    /** Get the current factory object.
      * 
      *  @return the current factory object
      */
     public static Interface getInstance() {
         return instance;
     }
-    /** set the current factory object.
+    /** Set the current factory object.
      * 
      * @param newInstance the new factory object
      * @return the previous factory object
@@ -71,7 +71,7 @@ public class ResourceFactory {
         return previousInstance;
     }
 
-    /** create a new anonymous resource.
+    /** Create a new anonymous resource.
      * 
      * <p>Uses the current factory object to create a new anonymous resource.</p>
      * 
@@ -81,7 +81,7 @@ public class ResourceFactory {
         return instance.createResource();
     }
 
-    /** create a new resource.
+    /** Create a new resource.
      * 
      * <p>Uses the current factory object to create a new resource.</p>
      * 
@@ -92,9 +92,18 @@ public class ResourceFactory {
         return instance.createResource(uriref);
     }
     
+    /** 
+     * Create a new resource representing an RDF* triple term.
+     * @param statement
+     * @return a new resource 
+     */
+    public static Resource createStmtResource(Statement statement) {
+        return instance.createStmtResource(statement);
+    }
+    
     /**
      * Answer a string (xsd:string) literal.
-     * This is the equivalent of a plain liteal with no language from RDF 1.0
+     * This is the equivalent of a plain literal with no language from RDF 1.0
      * (also called a simple literal in SPARQL)
      * 
      * Using {@link #createStringLiteral} is preferred; "plain literal" is RDF 1.0 terminology.  
@@ -109,7 +118,7 @@ public class ResourceFactory {
     
     /**
      * Answer a string (xsd:string) literal.
-     * This is the equivalent of a plain liteal with no language from RDF 1.0
+     * This is the equivalent of a plain literal with no language from RDF 1.0
      * (also called a simple literal in SPARQL)
      * 
      * @param string
@@ -135,29 +144,25 @@ public class ResourceFactory {
 
     /**
      * Answer a typed literal.
-     * 
-     * @param string
-     *            the string which forms the value of the literal
-     * @param dType
-     *            RDFDatatype of the type literal
+     * @param string the string which forms the value of the literal
+     * @param dType RDFDatatype of the type literal
      * @return a Literal node with that string as value
      */
 
-    public static Literal createTypedLiteral( String string , RDFDatatype dType)
-    {
+    public static Literal createTypedLiteral( String string , RDFDatatype dType) {
         return instance.createTypedLiteral( string , dType);
     }
     
     /**
-    Answer a typed literal.
-    @param value a java Object, the default RDFDatatype for that object will be used
-    @return a Literal node with that value
-    */
+     * Answer a typed literal.
+     * @param value a java Object, the default RDFDatatype for that object will be used
+     * @return a Literal node with that value
+     */
     public static Literal createTypedLiteral( Object value ) {
         return instance.createTypedLiteral(value);
     }
     
-    /** create a new property.
+    /** Create a new property.
      * 
      * <p>Uses the current factory object to create a new resource.</p>
      * 
@@ -168,7 +173,7 @@ public class ResourceFactory {
         return instance.createProperty(uriref);
     }
 
-    /** create a new property.
+    /** Create a new property.
      * 
      * <p>Uses the current factory object to create a new property.</p>
      * 
@@ -180,12 +185,14 @@ public class ResourceFactory {
         return instance.createProperty(namespace, localName);
     }
 
-    /** create a new statement.
+    /** 
+     * Create a new statement.
+     * <p>
      * Uses the current factory object to create a new statement.</p>
      * 
      * @param subject the subject of the new statement
      * @param predicate the predicate of the new statement
-     * @param object the objectof the new statement
+     * @param object the object of the new statement
      * @return a new resource
      */
     public static Statement createStatement(
@@ -195,23 +202,30 @@ public class ResourceFactory {
         return instance.createStatement(subject, predicate, object);
     }
 
-    /** the interface to resource factory objects.
+    /** The interface to resource factory objects.
      */
     public interface Interface {
 
-        /** create a new anonymous resource.
+        /** Create a new anonymous resource.
          * 
          * @return a new anonymous resource
          */
         public Resource createResource();
 
-        /** create a new resource.
+        /** Create a new resource.
          * 
          * @param uriref URIREF of the resource
          * @return a new resource
          */
         public Resource createResource(String uriref);
         
+        /** Create a new resource representing an RDF* triple term.
+         * 
+         * @param statement
+         * @return a new resource
+         */
+        public Resource createStmtResource(Statement statement);
+        
         /**
          * Answer a string (xsd:string) literal.
          * This is the equivalent of a plain liteal with no language from RDF 1.0
@@ -230,38 +244,40 @@ public class ResourceFactory {
         }
 
         /**
-        Answer a plain (untyped) literal with no language and the given content.
-        @param string the string which forms the value of the literal
-        @param lang The language tag to be used
-        @return a Literal node with that string as value
+         * Answer a plain (untyped) literal with no language and the given content.
+         * 
+         * @param string the string which forms the value of the literal
+         * @param lang The language tag to be used
+         * @return a Literal node with that string as value
          */
 
         public Literal createLangLiteral( String string , String lang );
 
         /**
-        Answer a typed literal.
-        @param string the string which forms the value of the literal
-        @param datatype RDFDatatype of the type literal
-        @return a Literal node with that string as value
-        */
+         * Answer a typed literal.
+         * 
+         * @param string the string which forms the value of the literal
+         * @param datatype RDFDatatype of the type literal
+         * @return a Literal node with that string as value
+         */
         public Literal createTypedLiteral( String string , RDFDatatype datatype) ;
 
 
         /**
-        Answer a typed literal.
-        @param value a java Object, the default RDFDatatype for that object will be used
-        @return a Literal node with that value
-        */
+         * Answer a typed literal.
+         * @param value a java Object, the default RDFDatatype for that object will be used
+         * @return a Literal node with that value
+         */
         public Literal createTypedLiteral( Object value ) ;
 
-        /** create a new property.
+        /** Create a new property.
          * 
          * @param uriref URIREF of the property
          * @return a new property
          */
         public Property createProperty(String uriref);
 
-        /** create a new property.
+        /** Create a new property.
          * 
          * @param namespace uriref of the namespace
          * @param localName localname of the property
@@ -269,7 +285,7 @@ public class ResourceFactory {
          */
         public Property createProperty(String namespace, String localName);
 
-        /** create a new statement.
+        /** Create a new statement.
          * 
          * @param subject subject of the new statement
          * @param predicate predicate of the new statement
@@ -298,6 +314,11 @@ public class ResourceFactory {
         }
         
         @Override
+        public Resource createStmtResource(Statement statement) {
+            return new ResourceImpl(statement, null);
+        }
+        
+        @Override
         public Literal createStringLiteral( String string ) {
             return new LiteralImpl(  NodeFactory.createLiteral( string, "" ), null );
         }
@@ -342,6 +363,5 @@ public class ResourceFactory {
             RDFNode object) {
             return new StatementImpl(subject, predicate, object);
         }
-
     }
 }
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
index 09124e2..f989380 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
@@ -634,6 +634,10 @@ implements Model, PrefixMapping, Lock
     { return new ResourceImpl( id, this ); }
 
     @Override
+    public Resource createResource( Statement statement )
+    { return new ResourceImpl( statement, this ); }
+
+    @Override
     @Deprecated public Resource createResource( String uri, ResourceF f )  
     { return f.createResource( createResource( uri ) ); }
 
@@ -1455,7 +1459,7 @@ implements Model, PrefixMapping, Lock
       { return (Seq) getSeq(uri).addProperty( RDF.type, RDF.Seq ); }
 
       /**
-        Answer a Statement in this Model whcih encodes the given Triple.
+        Answer a Statement in this Model which encodes the given Triple.
         @param t a triple to wrap as a statement
         @return a statement wrapping the triple and in this model
        */
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ResourceImpl.java b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ResourceImpl.java
index c6dc0f7..7e17c34 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ResourceImpl.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ResourceImpl.java
@@ -24,6 +24,8 @@ import org.apache.jena.enhanced.EnhNode ;
 import org.apache.jena.enhanced.Implementation ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.NodeFactory ;
+import org.apache.jena.graph.Node_Triple;
+import org.apache.jena.graph.Triple;
 import org.apache.jena.rdf.model.* ;
 import org.apache.jena.shared.PropertyNotFoundException;
 
@@ -109,6 +111,10 @@ public class ResourceImpl extends EnhNode implements Resource {
         this( NodeFactory.createURI( nameSpace + localName ), m );
     }
 
+    public ResourceImpl(Statement statement, ModelCom m) {
+        this( NodeFactory.createTripleNode(statement.asTriple()), m);
+    }
+
     @Override
     public Object visitWith( RDFVisitor rv )
         { return isAnon() ? rv.visitBlank( this, getId() ) : rv.visitURI( this, getURI() ); }
@@ -135,12 +141,22 @@ public class ResourceImpl extends EnhNode implements Resource {
         { return uri == null ? NodeFactory.createBlankNode() : NodeFactory.createURI( uri ); }
 
     @Override
-    public AnonId getId() 
-        { return new AnonId(asNode().getBlankNodeId()); }
+    public AnonId getId() {
+        return new AnonId(asNode().getBlankNodeId());
+    }
 
     @Override
     public String  getURI() {
-        return isAnon() ? null : node.getURI();
+        return this.isURIResource() ? node.getURI() : null;
+    }
+    
+    @Override
+    public Statement getStmtTerm() {
+        if ( ! isStmtResource() )
+            return null;
+        Triple t =  Node_Triple.triple(node);
+        Statement stmt = StatementImpl.toStatement(t, getModelCom());
+        return stmt; 
     }
 
     @Override
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/StatementImpl.java b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/StatementImpl.java
index aa9b45c..e4c315c 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/StatementImpl.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/StatementImpl.java
@@ -24,7 +24,7 @@ import org.apache.jena.rdf.model.* ;
 
 /** An implementation of Statement.
  */
-public class StatementImpl  extends StatementBase implements Statement {
+public class StatementImpl extends StatementBase implements Statement {
     
     protected Resource subject;
     protected Property predicate;
@@ -40,7 +40,6 @@ public class StatementImpl  extends StatementBase implements Statement {
 		this.object = object.inModel( model );
 		}
     
-    // TODO fix this hack
     protected static ModelCom empty = (ModelCom) ModelFactory.createDefaultModel();
     
 	public StatementImpl(Resource subject, Property predicate, RDFNode object)
diff --git a/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestRDFNodes.java b/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestRDFNodes.java
index 12737c2..ca6ce78 100644
--- a/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestRDFNodes.java
+++ b/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestRDFNodes.java
@@ -157,6 +157,12 @@ public class TestRDFNodes extends AbstractModelTestBase
 				Assert.assertEquals("must have correct field", R.getURI(), uri);
 				return "uri result";
 			}
+
+            @Override
+            public Object visitStmt(Resource r, Statement statement) {
+                history.add("statementTerm");
+                return "statement term result";
+            }
 		};
 		/* */
 		Assert.assertEquals("blank result", S.visitWith(rv));
diff --git a/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestResourceFactory.java b/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestResourceFactory.java
index a2c83ef..96a00f7 100644
--- a/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestResourceFactory.java
+++ b/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestResourceFactory.java
@@ -80,6 +80,11 @@ public class TestResourceFactory extends TestCase
 		}
 
 		@Override
+        public Resource createStmtResource(Statement statement) {
+            return null;
+        }
+
+        @Override
 		public Statement createStatement( final Resource subject,
 				final Property predicate, final RDFNode object )
 		{
@@ -98,7 +103,6 @@ public class TestResourceFactory extends TestCase
 		{
 			return null;
 		}
-
 	}
 
 	static final String uri1 = "http://example.org/example#a1";
@@ -146,6 +150,19 @@ public class TestResourceFactory extends TestCase
 		Assert.assertTrue(r1.getURI().equals(TestResourceFactory.uri1));
 	}
 
+	public void testCreateStmtTerm() {
+	    Resource s = ResourceFactory.createResource();
+	    Property p = ResourceFactory.createProperty(TestResourceFactory.uri2);
+	    Resource o = ResourceFactory.createResource();
+	    Statement stmt = ResourceFactory.createStatement(s, p, o);
+
+	    Resource r = ResourceFactory.createStmtResource(stmt);
+	    Assert.assertTrue(r.isResource());
+	    Assert.assertFalse(r.isURIResource());
+	    Assert.assertFalse(r.isAnon());
+	    Assert.assertTrue(r.isStmtResource());
+	}
+
 	public void testCreateStatement()
 	{
 		final Resource s = ResourceFactory.createResource();
@@ -165,9 +182,7 @@ public class TestResourceFactory extends TestCase
 		Assert.assertTrue(l.getLexicalForm().equals("22"));
 		Assert.assertTrue(l.getLanguage().equals(""));
 		Assert.assertTrue(l.getDatatype() == XSDDatatype.XSDinteger);
-		Assert.assertTrue(l.getDatatypeURI().equals(
-				XSDDatatype.XSDinteger.getURI()));
-
+		Assert.assertTrue(l.getDatatypeURI().equals(XSDDatatype.XSDinteger.getURI()));
 	}
 
 	public void testCreateTypedLiteralObject()
diff --git a/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredModelImpl.java b/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredModelImpl.java
index dcea6dd..f172038 100644
--- a/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredModelImpl.java
+++ b/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredModelImpl.java
@@ -834,6 +834,11 @@ public class SecuredModelImpl extends SecuredItemImpl implements SecuredModel {
 	}
 
 	@Override
+    public Resource createResource(Statement statement) {
+        throw new UnsupportedOperationException("SecuredModel.createResource(Statement)");
+    }
+
+    @Override
 	public SecuredResource createResource(final String uri, final Resource type)
 			throws UpdateDeniedException, AddDeniedException, AuthenticationRequiredException {
 		final Resource r = ResourceFactory.createResource(uri);
diff --git a/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredRDFNodeImpl.java b/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredRDFNodeImpl.java
index e98d9b9..f5fbd82 100644
--- a/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredRDFNodeImpl.java
+++ b/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredRDFNodeImpl.java
@@ -178,6 +178,11 @@ public abstract class SecuredRDFNodeImpl extends SecuredItemImpl implements Secu
 		return holder.getBaseItem().isURIResource();
 	}
 
+	@Override
+	public boolean isStmtResource() {
+	    throw new UnsupportedOperationException("SecuredRDFNode.isStmtResource");
+	}
+	
 	/**
 	 * An RDFNode is equal to another enhanced node n iff the underlying nodes
 	 * are equal. We generalise to allow the other object to be any class
diff --git a/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredResourceImpl.java b/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredResourceImpl.java
index aade389..a8d40e8 100644
--- a/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredResourceImpl.java
+++ b/jena-permissions/src/main/java/org/apache/jena/permissions/model/impl/SecuredResourceImpl.java
@@ -580,6 +580,11 @@ public class SecuredResourceImpl extends SecuredRDFNodeImpl implements SecuredRe
 		return holder.getBaseItem().getURI();
 	}
 
+    @Override
+    public Statement getStmtTerm() {
+        throw new UnsupportedOperationException("SecuredResource.getStmtTerm");
+    }
+	
 	/**
 	 * Answer true iff this resource has the value <code>o</code> for property
 	 * <code>p</code>. <code>o</code> is interpreted as a typed literal with the
@@ -923,5 +928,4 @@ public class SecuredResourceImpl extends SecuredRDFNodeImpl implements SecuredRe
 	public Object visitWith(final RDFVisitor rv) {
 		return isAnon() ? rv.visitBlank(this, getId()) : rv.visitURI(this, getURI());
 	}
-
 }
diff --git a/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredRDFNodeTest.java b/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredRDFNodeTest.java
index 91e6925..dadffab 100644
--- a/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredRDFNodeTest.java
+++ b/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredRDFNodeTest.java
@@ -19,10 +19,8 @@ package org.apache.jena.permissions.model;
 
 import org.apache.jena.permissions.Factory;
 import org.apache.jena.permissions.MockSecurityEvaluator;
-import org.apache.jena.permissions.SecurityEvaluatorParameters;
 import org.apache.jena.permissions.SecurityEvaluator.Action;
-import org.apache.jena.permissions.model.SecuredModel;
-import org.apache.jena.permissions.model.SecuredRDFNode;
+import org.apache.jena.permissions.SecurityEvaluatorParameters;
 import org.apache.jena.permissions.model.impl.SecuredRDFNodeImpl;
 import org.apache.jena.rdf.model.*;
 import org.apache.jena.shared.ReadDeniedException;
diff --git a/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredResourceTest.java b/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredResourceTest.java
index 7c5c3f2..eea52a1 100644
--- a/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredResourceTest.java
+++ b/jena-permissions/src/test/java/org/apache/jena/permissions/model/SecuredResourceTest.java
@@ -28,7 +28,6 @@ import org.apache.jena.permissions.MockSecurityEvaluator;
 import org.apache.jena.permissions.SecurityEvaluator;
 import org.apache.jena.permissions.SecurityEvaluatorParameters;
 import org.apache.jena.permissions.SecurityEvaluator.Action;
-import org.apache.jena.permissions.model.SecuredResource;
 import org.apache.jena.permissions.model.impl.SecuredResourceImpl;
 import org.apache.jena.permissions.model.impl.SecuredStatementIterator;
 import org.apache.jena.rdf.model.Literal;