/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.http.server.repository.namespaces;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContextException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import info.aduna.iteration.CloseableIteration;
import info.aduna.webapp.views.EmptySuccessView;
import org.openrdf.http.server.ClientHTTPException;
import org.openrdf.http.server.ServerHTTPException;
import org.openrdf.http.server.ProtocolUtil;
import org.openrdf.http.server.repository.QueryResultView;
import org.openrdf.http.server.repository.RepositoryInterceptor;
import org.openrdf.http.server.repository.TupleQueryResultView;
import org.openrdf.model.Literal;
import org.openrdf.model.Namespace;
import org.openrdf.model.impl.LiteralImpl;
import org.openrdf.query.BindingSet;
import org.openrdf.query.impl.ListBindingSet;
import org.openrdf.query.impl.TupleQueryResultImpl;
import org.openrdf.query.resultio.TupleQueryResultWriterFactory;
import org.openrdf.query.resultio.TupleQueryResultWriterRegistry;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
/**
* Handles requests for the list of namespace definitions for a repository.
*
* @author Herko ter Horst
*/
public class NamespacesController extends AbstractController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public NamespacesController()
throws ApplicationContextException
{
setSupportedMethods(new String[] { METHOD_GET, "DELETE" });
}
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception
{
String reqMethod = request.getMethod();
if (METHOD_GET.equals(reqMethod)) {
logger.info("GET namespace list");
return getExportNamespacesResult(request, response);
}
else if ("DELETE".equals(reqMethod)) {
logger.info("DELETE namespaces");
return getClearNamespacesResult(request, response);
}
throw new ClientHTTPException(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "Method not allowed: "
+ reqMethod);
}
private ModelAndView getExportNamespacesResult(HttpServletRequest request, HttpServletResponse response)
throws ClientHTTPException, ServerHTTPException
{
List<String> columnNames = Arrays.asList("prefix", "namespace");
List<BindingSet> namespaces = new ArrayList<BindingSet>();
RepositoryConnection repositoryCon = RepositoryInterceptor.getRepositoryConnection(request);
try {
CloseableIteration<? extends Namespace, RepositoryException> iter = repositoryCon.getNamespaces();
try {
while (iter.hasNext()) {
Namespace ns = iter.next();
Literal prefix = new LiteralImpl(ns.getPrefix());
Literal namespace = new LiteralImpl(ns.getName());
BindingSet bindingSet = new ListBindingSet(columnNames, prefix, namespace);
namespaces.add(bindingSet);
}
}
finally {
iter.close();
}
}
catch (RepositoryException e) {
throw new ServerHTTPException("Repository error: " + e.getMessage(), e);
}
TupleQueryResultWriterFactory factory = ProtocolUtil.getAcceptableService(request, response,
TupleQueryResultWriterRegistry.getInstance());
Map<String, Object> model = new HashMap<String, Object>();
model.put(QueryResultView.QUERY_RESULT_KEY, new TupleQueryResultImpl(columnNames, namespaces));
model.put(QueryResultView.FILENAME_HINT_KEY, "namespaces");
model.put(QueryResultView.FACTORY_KEY, factory);
return new ModelAndView(TupleQueryResultView.getInstance(), model);
}
private ModelAndView getClearNamespacesResult(HttpServletRequest request, HttpServletResponse response)
throws ServerHTTPException
{
RepositoryConnection repositoryCon = RepositoryInterceptor.getRepositoryConnection(request);
try {
repositoryCon.clearNamespaces();
}
catch (RepositoryException e) {
throw new ServerHTTPException("Repository error: " + e.getMessage(), e);
}
return new ModelAndView(EmptySuccessView.getInstance());
}
}