package de.unikiel.inf.comsys.neo4j.http;
/*
* #%L
* neo4j-sparql-extension
* %%
* Copyright (C) 2014 Niclas Hoyer
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.util.List;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Variant;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.sail.SailRepositoryConnection;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFParser;
import org.openrdf.rio.RDFParserRegistry;
/**
* Abstract super class for the implementation of RDF and SPARQL resources.
*/
public abstract class AbstractSailResource {
protected final SailRepository rep;
protected final List<Variant> rdfResultVariants;
/**
* Initialize result variants and save reference to repository.
* @param rep reference to repository
*/
public AbstractSailResource(SailRepository rep) {
this.rep = rep;
rdfResultVariants = Variant.mediaTypes(
MediaType.valueOf(RDFMediaType.RDF_TURTLE),
MediaType.valueOf(RDFMediaType.RDF_NTRIPLES),
MediaType.valueOf(RDFMediaType.RDF_XML),
MediaType.valueOf(RDFMediaType.RDF_JSON)
).add().build();
}
/**
* Returns an instance of {@link org.openrdf.rio.RDFFormat} for a
* given MIME-Type string.
*
* @param mimetype the MIME-Type as string
* @return the corresponding RDF-Format
*/
protected RDFFormat getRDFFormat(String mimetype) {
switch (mimetype) {
default:
case RDFMediaType.RDF_TURTLE:
return RDFFormat.TURTLE;
case RDFMediaType.RDF_XML:
return RDFFormat.RDFXML;
case RDFMediaType.RDF_NTRIPLES:
return RDFFormat.NTRIPLES;
case RDFMediaType.RDF_JSON:
return RDFFormat.RDFJSON;
}
}
/**
* Returns the corresponding RDF parser for a given RDF format.
*
* @param format the RDF format
* @return RDF parser
*/
protected RDFParser getRDFParser(RDFFormat format) {
return RDFParserRegistry.getInstance().get(format).getParser();
}
/**
* Returns a new connection for the current repository.
*
* @return a new connection
* @throws RepositoryException if there was a problem getting the connection
*/
protected SailRepositoryConnection getConnection()
throws RepositoryException {
return rep.getConnection();
}
/**
* Closes a repository connection if it is open. Does nothing if it is
* already closed.
*
* @param conn the connection to close
* @throws WebApplicationException if there was a problem while closing the
* connection
*/
protected void close(RepositoryConnection conn) {
if (conn != null) {
try {
if (conn.isOpen()) {
conn.close();
}
} catch (RepositoryException ex) {
throw new WebApplicationException(ex);
}
}
}
/**
* Closes a repository connection it it is open. Does nothing if it is
* closed. If an exception occurs while closing the connection it will be
* added as suppressed exception to the given exception.
*
* @param conn the connection to close
* @param ex an exception that caused the closing of the connection
*/
protected void close(RepositoryConnection conn, Exception ex) {
if (conn != null) {
try {
if (conn.isOpen()) {
conn.close();
}
} catch (RepositoryException ex2) {
ex.addSuppressed(ex2);
}
}
}
}