/*
* Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com>
*
* Licensed 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 com.obidea.semantika.materializer;
import static java.lang.String.format;
import java.net.URISyntaxException;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.ValueFactoryImpl;
import com.obidea.semantika.datatype.AbstractXmlType;
import com.obidea.semantika.datatype.XmlDataTypeProfile;
import com.obidea.semantika.datatype.primitive.XsdString;
import com.obidea.semantika.util.TemplateStringHelper;
/* package */class SesameStatement implements Statement
{
private static final long serialVersionUID = 629451L;
private ValueFactory mValueFactory = ValueFactoryImpl.getInstance();
private String mSubjectValue;
private String mPredicateValue;
private String mObjectValue;
private TriplesProjection mProjection;
public SesameStatement(TriplesProjection projection, String subjectValue, String predicateValue, String objectValue)
{
mSubjectValue = subjectValue;
mPredicateValue = predicateValue;
mObjectValue = objectValue;
mProjection = projection;
}
@Override
public Resource getContext()
{
return null;
}
@Override
public Resource getSubject()
{
int category = mProjection.getDataCategory(1);
switch (category) {
case TriplesProjection.DATA_URI:
return mValueFactory.createURI(getUriString(mSubjectValue));
case TriplesProjection.DATA_LITERAL:
throw new TriplesStatementException("Subject cannot be literal"); //$NON-NLS-1$
default:
throw new TriplesStatementException(format("Illegal data category (%s)", category)); //$NON-NLS-1$
}
}
@Override
public URI getPredicate()
{
int category = mProjection.getDataCategory(2);
switch (category) {
case TriplesProjection.DATA_URI:
return mValueFactory.createURI(mPredicateValue);
case TriplesProjection.DATA_LITERAL:
throw new TriplesStatementException("Predicate cannot be literal"); //$NON-NLS-1$
default:
throw new TriplesStatementException(format("Illegal data category (%s)", category)); //$NON-NLS-1$
}
}
@Override
public Value getObject()
{
int category = mProjection.getDataCategory(3);
switch (category) {
case TriplesProjection.DATA_URI:
return mValueFactory.createURI(getUriString(mObjectValue));
case TriplesProjection.DATA_LITERAL:
try {
AbstractXmlType<?> xmlType = XmlDataTypeProfile.getXmlDatatype(mProjection.getDatatype(3));
Object value = xmlType.getValue(mObjectValue);
return (xmlType instanceof XsdString) ?
mValueFactory.createLiteral(String.valueOf(value)) : // use syntactic sugar
mValueFactory.createLiteral(String.valueOf(value), mValueFactory.createURI(xmlType.getName()));
}
catch (Exception e) {
throw new TriplesStatementException("Failed to create literal", e); //$NON-NLS-1$
}
default:
throw new TriplesStatementException(format("Illegal data category (%s)", category)); //$NON-NLS-1$
}
}
private String getUriString(String value)
{
String uriString = value;
/*
* Check if the given object value is a URI-template string or a URI string.
*/
if (!validUri(uriString)) {
/*
* If it is a URI template string then reconstruct it to be a URI string.
*/
uriString = TemplateStringHelper.buildUri(value);
}
return uriString;
}
/*
* A utility method to check if the given URI string is a valid URI construction.
* This method is used exclusively to check if the given value is in the form of
* a URI template string or an already URI string.
*/
private static boolean validUri(String uriString)
{
try {
new java.net.URI(uriString);
}
catch (URISyntaxException e) {
return false;
}
return true;
}
}