package edu.kit.aifb.cumulus.webapp.endpoint;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openrdf.http.protocol.Protocol;
import org.openrdf.repository.sail.SailRepository;
import org.springframework.web.servlet.ModelAndView;
import edu.kit.aifb.cumulus.store.RepositoryManager;
import edu.kit.aifb.cumulus.webapp.AbstractCumulusServlet;
import edu.kit.aifb.cumulus.webapp.endpoint.protocol.ProtocolHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.RepositoryHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.contexts.ContextsHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.graph.GraphHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.namespaces.NamespaceHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.namespaces.NamespacesHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.size.SizeHandler;
import edu.kit.aifb.cumulus.webapp.endpoint.repository.statements.StatementHandler;
/**
* SesameHTTPRespositoryAdapter is a servlet, which dispatches incoming Sesame HTTP Protocol requests.
*
* @author Yongtao Ma
* @see <a href="org.openrdf.http.client.HTTPClient">org.openrdf.http.client.HTTPClient</a>
* @see <a href="http://openrdf.callimachus.net/sesame/2.7/docs/system.docbook?view#graph-store-support">http://openrdf.callimachus.net/sesame/2.7/docs/system.docbook?view#graph-store-support</a>
*/
public class SesameHTTPProtocolEndpoint extends AbstractCumulusServlet {
private static final long serialVersionUID = 1L;
@Override
public void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
String requestUri = request.getRequestURI();
ModelAndView result = null;
//the requestURI must refer to the servelet URI that begins with "/protocol" or "/repositories"
try {
//if the requestUri end with "/protocol"
//it requests the protocol version (GET)
if (requestUri.endsWith("/" + Protocol.PROTOCOL)) {
result = (new ProtocolHandler()).serve();
} else {
String id = requestUri.substring(requestUri.indexOf("repositories/") + "repositories/".length());
if (id.contains("/")) {
id = id.substring(0, id.indexOf("/"));
}
final SailRepository repository = (SailRepository) RepositoryManager.getInstance().getRepository(id);
if (repository == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (requestUri.endsWith("/" + Protocol.STATEMENTS)) {
//if the requestUsri ends with "/statements"
//it requests on repository statements (GET/POST/PUT/DELETE)
result = (new StatementHandler()).serve(repository, request, response);
} else if (requestUri.endsWith("/" + Protocol.CONTEXTS)) {
//if the requestUri ends with "/contexts"
//it requests context overview (GET)
result = (new ContextsHandler()).serve(repository, request, response);
} else if (requestUri.endsWith("/" + Protocol.SIZE)) {
//if the requestUri ends with "/size"
//it requests # statements in repository (GET)
result = (new SizeHandler()).serve(repository, request, response);
} else if (requestUri.matches("(/|^)(\\w|\\-|\\_)*/repositories/(\\w|\\-|\\_)(\\w|\\-|\\_)*/rdf-graphs(/(\\w|\\-|\\_)(\\w|\\-|\\_)*|$)")) {
//if the requestUri ends with "/rdf-graphs/*"
//it requests according to the follows:
//"/rdf-graphs": named graphs overview (GET)
//"/ref-graphs/service": SPARQL Graph Store operations on indirectly referenced named graphs in repository (GET/PUT/POST/DELETE)
//"/ref-graphs/<NAME>": SPARQL Graph Store operationson directly referenced named graphs in repository (GET/PUT/POST/DELETE)
result = (new GraphHandler()).serve(repository, request, response);
} else if (requestUri.endsWith("/" + Protocol.NAMESPACES)) {
//if the requestUri ends with "/namespaces"
//it requests overview of namespace definitions (GET/DELETE)
result = (new NamespacesHandler()).serve(repository, request, response);
} else if (requestUri.matches("(/|^)(\\w|\\-|\\_)*/repositories/(\\w|\\-|\\_)(\\w|\\-|\\_)*/namespaces/(\\w|\\-|\\_)(\\w|\\-|\\_)*")) {
//if the request matches with "/namespaces/<PREFIX>"
//it requests namespace-prefix definition (GET/PUT/DELETE)
result = (new NamespaceHandler()).serve(repository, request, response);
} else if (requestUri.matches("(/|^)(\\w|\\-|\\_)*/repositories/\\w(\\w|\\-|\\_)*$")) {
//else it requests the repository information
result = (new RepositoryHandler()).serve(repository, request, response);
} else if (requestUri.endsWith("/repositories")) {
result = (new RepositoryHandler()).serve(repository, request, response);
}
}
result.getView().render(result.getModel(), request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}