/*
* 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.rdf.model.impl;
import org.apache.jena.datatypes.RDFDatatype ;
import org.apache.jena.enhanced.EnhGraph ;
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.rdf.model.* ;
import org.apache.jena.shared.PropertyNotFoundException;
/** An implementation of Resource.
*/
public class ResourceImpl extends EnhNode implements Resource {
final static public Implementation factory = new Implementation() {
@Override
public boolean canWrap( Node n, EnhGraph eg )
{ return !n.isLiteral(); }
@Override
public EnhNode wrap(Node n,EnhGraph eg) {
if (n.isLiteral()) throw new ResourceRequiredException( n );
return new ResourceImpl(n,eg);
}
};
final static public Implementation rdfNodeFactory = new Implementation() {
@Override
public boolean canWrap( Node n, EnhGraph eg )
{ return true; }
@Override
public EnhNode wrap(Node n,EnhGraph eg) {
if ( n.isURI() || n.isBlank() )
return new ResourceImpl(n,eg);
if ( n.isLiteral() )
return new LiteralImpl(n,eg);
return null;
}
};
/**
the master constructor: make a new Resource in the given model,
rooted in the given node.
NOT FOR PUBLIC USE - used in ModelCom [and ContainerImpl]
*/
public ResourceImpl( Node n, ModelCom m ) {
super( n, m );
}
/** Creates new ResourceImpl */
public ResourceImpl() {
this( (ModelCom) null );
}
public ResourceImpl( ModelCom m ) {
this( fresh( null ), m );
}
public ResourceImpl( Node n, EnhGraph m ) {
super( n, m );
}
public ResourceImpl( String uri ) {
super( fresh( uri ), null );
}
public ResourceImpl(String nameSpace, String localName) {
super( NodeFactory.createURI( nameSpace + localName ), null );
}
public ResourceImpl(AnonId id) {
this( id, null );
}
public ResourceImpl(AnonId id, ModelCom m) {
this( NodeFactory.createBlankNode( id.getLabelString() ), m );
}
public ResourceImpl(String uri, ModelCom m) {
this( fresh( uri ), m );
}
public ResourceImpl( Resource r, ModelCom m ) {
this( r.asNode(), m );
}
public ResourceImpl(String nameSpace, String localName, ModelCom m) {
this( NodeFactory.createURI( nameSpace + localName ), m );
}
@Override
public Object visitWith( RDFVisitor rv )
{ return isAnon() ? rv.visitBlank( this, getId() ) : rv.visitURI( this, getURI() ); }
@Override
public Resource asResource()
{ return this; }
@Override
public Literal asLiteral()
{ throw new LiteralRequiredException( asNode() ); }
@Override
public Resource inModel( Model m )
{
return
getModel() == m ? this
: isAnon() ? m.createResource( getId() )
: asNode().isConcrete() == false ? (Resource) m.getRDFNode( asNode() )
: m.createResource( getURI() );
}
private static Node fresh( String uri )
{ return uri == null ? NodeFactory.createBlankNode() : NodeFactory.createURI( uri ); }
@Override
public AnonId getId()
{ return new AnonId(asNode().getBlankNodeId()); }
@Override
public String getURI() {
return isAnon() ? null : node.getURI();
}
@Override
public String getNameSpace() {
return isAnon() ? null : node.getNameSpace();
}
@Override
public String getLocalName() {
return isAnon() ? null : node.getLocalName();
}
@Override
public boolean hasURI( String uri )
{ return node.hasURI( uri ); }
@Override
public String toString()
{ return asNode().toString(); }
protected ModelCom mustHaveModel()
{
ModelCom model = getModelCom();
if (model == null) throw new HasNoModelException( this );
return model;
}
@Override
public Statement getRequiredProperty(Property p)
{ return mustHaveModel().getRequiredProperty( this, p ); }
@Override
public Statement getRequiredProperty( final Property p, final String lang )
{
final StmtIterator it = listProperties(p, lang) ;
if (!it.hasNext()) throw new PropertyNotFoundException( p );
return it.next();
}
@Override
public Statement getProperty( Property p )
{ return mustHaveModel().getProperty( this, p ); }
@Override
public Statement getProperty( final Property p, final String lang )
{
final StmtIterator it = listProperties(p, lang) ;
return it.hasNext() ? it.next() : null;
}
@Override
public StmtIterator listProperties(Property p)
{ return mustHaveModel().listStatements( this, p, (RDFNode) null ); }
@Override
public StmtIterator listProperties(Property p, String lang)
{ return mustHaveModel().listStatements( this, p, null, lang); }
@Override
public StmtIterator listProperties()
{ return mustHaveModel().listStatements( this, null, (RDFNode) null ); }
@Override
public Resource addLiteral( Property p, boolean o )
{
ModelCom m = mustHaveModel();
m.add( this, p, m.createTypedLiteral( o ) );
return this;
}
public Resource addProperty(Property p, long o) {
mustHaveModel().addLiteral( this, p, o );
return this;
}
@Override
public Resource addLiteral( Property p, long o )
{
Model m = mustHaveModel();
m.add( this, p, m.createTypedLiteral( o ) );
return this;
}
@Override
public Resource addLiteral( Property p, char o )
{
ModelCom m = mustHaveModel();
m.add( this, p, m.createTypedLiteral( o ) );
return this;
}
public Resource addProperty(Property p, float o) {
mustHaveModel().addLiteral( this, p, o );
return this;
}
public Resource addProperty(Property p, double o) {
mustHaveModel().addLiteral( this, p, o );
return this;
}
@Override
public Resource addLiteral( Property p, double o )
{
Model m = mustHaveModel();
m.add( this, p, m.createTypedLiteral( o ) );
return this;
}
@Override
public Resource addLiteral( Property p, float o )
{
Model m = mustHaveModel();
m.add( this, p, m.createTypedLiteral( o ) );
return this;
}
@Override
public Resource addProperty(Property p, String o) {
mustHaveModel().add( this, p, o );
return this;
}
@Override
public Resource addProperty(Property p, String o, String l)
{
mustHaveModel().add( this, p, o, l );
return this;
}
@Override
public Resource addProperty(Property p, String lexicalForm, RDFDatatype datatype)
{
mustHaveModel().add(this, p, lexicalForm, datatype) ;
return this ;
}
@Override
public Resource addLiteral( Property p, Object o )
{
ModelCom m = mustHaveModel();
m.add( this, p, m.createTypedLiteral( o ) );
return this;
}
@Override
public Resource addLiteral( Property p, Literal o )
{
mustHaveModel().add( this, p, o );
return this;
}
@Override
public Resource addProperty( Property p, RDFNode o )
{
mustHaveModel().add( this, p, o );
return this;
}
@Override
public boolean hasProperty(Property p) {
return mustHaveModel().contains( this, p );
}
@Override
public boolean hasLiteral( Property p, boolean o )
{
ModelCom m = mustHaveModel();
return m.contains( this, p, m.createTypedLiteral( o ) );
}
@Override
public boolean hasLiteral( Property p, long o )
{
ModelCom m = mustHaveModel();
return m.contains( this, p, m.createTypedLiteral( o ) );
}
@Override
public boolean hasLiteral( Property p, char o )
{
ModelCom m = mustHaveModel();
return m.contains( this, p, m.createTypedLiteral( o ) );
}
@Override
public boolean hasLiteral( Property p, double o )
{
ModelCom m = mustHaveModel();
return m.contains( this, p, m.createTypedLiteral( o ) );
}
@Override
public boolean hasLiteral( Property p, float o )
{
ModelCom m = mustHaveModel();
return m.contains( this, p, m.createTypedLiteral( o ) );
}
@Override
public boolean hasProperty(Property p, String o) {
return mustHaveModel().contains( this, p, o );
}
@Override
public boolean hasProperty(Property p, String o, String l) {
return mustHaveModel().contains( this, p, o, l );
}
@Override
public boolean hasLiteral( Property p, Object o )
{
ModelCom m = mustHaveModel();
return m.contains( this, p, m.createTypedLiteral( o ) );
}
@Override
public boolean hasProperty(Property p, RDFNode o) {
return mustHaveModel().contains( this, p, o );
}
@Override
public Resource removeProperties() {
removeAll(null);
return this;
}
@Override
public Resource removeAll( Property p ) {
mustHaveModel().removeAll( this, p, (RDFNode) null );
return this;
}
@Override
public Resource begin() {
mustHaveModel().begin();
return this;
}
@Override
public Resource abort() {
mustHaveModel().abort();
return this;
}
@Override
public Resource commit() {
mustHaveModel().commit();
return this;
}
@Override
public Model getModel() {
return (Model) getGraph();
}
protected ModelCom getModelCom()
{ return (ModelCom) getGraph(); }
@Override
public Resource getPropertyResourceValue(Property p)
{
StmtIterator it = listProperties(p) ;
try {
while (it.hasNext())
{
RDFNode n = it.next().getObject() ;
if (n.isResource()) return (Resource)n ;
}
return null ;
} finally { it.close() ; }
}
}