/* * Copyright Aduna (http://www.aduna-software.com/) (c) 2007. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.http.server.repository.namespaces; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import java.io.IOException; import java.util.HashMap; 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.io.IOUtil; import info.aduna.webapp.views.EmptySuccessView; import info.aduna.webapp.views.SimpleResponseView; import org.openrdf.http.server.ClientHTTPException; import org.openrdf.http.server.ServerHTTPException; import org.openrdf.http.server.repository.RepositoryInterceptor; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; /** * Handles requests for manipulating a specific namespace definition in a * repository. * * @author Herko ter Horst * @author Arjohn Kampman */ public class NamespaceController extends AbstractController { private Logger logger = LoggerFactory.getLogger(this.getClass()); public NamespaceController() throws ApplicationContextException { setSupportedMethods(new String[] { METHOD_GET, "PUT", "DELETE" }); } @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { String pathInfoStr = request.getPathInfo(); String[] pathInfo = pathInfoStr.substring(1).split("/"); String prefix = pathInfo[pathInfo.length - 1]; RepositoryConnection repositoryCon = RepositoryInterceptor.getRepositoryConnection(request); String reqMethod = request.getMethod(); if (METHOD_GET.equals(reqMethod)) { logger.info("GET namespace for prefix {}" + prefix); return getExportNamespaceResult(repositoryCon, prefix); } else if ("PUT".equals(reqMethod)) { logger.info("PUT prefix {}", prefix); return getUpdateNamespaceResult(repositoryCon, prefix, request); } else if ("DELETE".equals(reqMethod)) { logger.info("DELETE prefix {}", prefix); return getRemoveNamespaceResult(repositoryCon, prefix); } else { throw new ServerHTTPException("Unexpected request method: " + reqMethod); } } private ModelAndView getExportNamespaceResult(RepositoryConnection repositoryCon, String prefix) throws ServerHTTPException, ClientHTTPException { try { String namespace = repositoryCon.getNamespace(prefix); if (namespace == null) { throw new ClientHTTPException(SC_NOT_FOUND, "Undefined prefix: " + prefix); } Map<String, Object> model = new HashMap<String, Object>(); model.put(SimpleResponseView.CONTENT_KEY, namespace); return new ModelAndView(SimpleResponseView.getInstance(), model); } catch (RepositoryException e) { throw new ServerHTTPException("Repository error: " + e.getMessage(), e); } } private ModelAndView getUpdateNamespaceResult(RepositoryConnection repositoryCon, String prefix, HttpServletRequest request) throws IOException, ClientHTTPException, ServerHTTPException { String namespace = IOUtil.readString(request.getReader()); namespace = namespace.trim(); if (namespace.length() == 0) { throw new ClientHTTPException(SC_BAD_REQUEST, "No namespace name found in request body"); } // FIXME: perform some sanity checks on the namespace string try { repositoryCon.setNamespace(prefix, namespace); } catch (RepositoryException e) { throw new ServerHTTPException("Repository error: " + e.getMessage(), e); } return new ModelAndView(EmptySuccessView.getInstance()); } private ModelAndView getRemoveNamespaceResult(RepositoryConnection repositoryCon, String prefix) throws ServerHTTPException { try { repositoryCon.removeNamespace(prefix); } catch (RepositoryException e) { throw new ServerHTTPException("Repository error: " + e.getMessage(), e); } return new ModelAndView(EmptySuccessView.getInstance()); } }