import org.apache.jackrabbit.server.SessionProvider;
+/** WebDav servlet whoe repository is injected */
public class SimpleWebdavServlet extends
org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet {
private static final long serialVersionUID = -369787931175177080L;
private final Repository repository;
- public SimpleWebdavServlet(Repository repository, SessionProvider sessionProvider) {
+ public SimpleWebdavServlet(Repository repository,
+ SessionProvider sessionProvider) {
this.repository = repository;
setSessionProvider(sessionProvider);
}
package org.argeo.jcr.mvc;
+import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.List;
import java.util.Properties;
import javax.jcr.Repository;
private final static Log log = LogFactory
.getLog(MultipleRepositoryHandlerMapping.class);
+ private final static String MKCOL = "MKCOL";
+
private ConfigurableApplicationContext applicationContext;
private ServletContext servletContext;
log.trace("getPathInfo=" + request.getPathInfo());
}
- String repositoryName = extractRepositoryName(request);
+ String pathInfo = request.getPathInfo();
+
+ // tokenize path
+ // TODO factorize
+ List<String> tokens = new ArrayList<String>();
+ StringBuffer curr = new StringBuffer();
+ char[] arr = pathInfo.toCharArray();
+ chars: for (int i = 0; i < arr.length; i++) {
+ char c = arr[i];
+ if (c == '/') {
+ if (i == 0 || (i == arr.length - 1))
+ continue chars;
+ if (curr.length() > 0) {
+ tokens.add(curr.toString());
+ curr = new StringBuffer();
+ }
+ } else
+ curr.append(c);
+ }
+ if (curr.length() > 0) {
+ tokens.add(curr.toString());
+ curr = new StringBuffer();
+ }
+
+ // check if repository can be found
+ if (tokens.size() == 0
+ || (tokens.size() == 1 && tokens.get(0).equals("")))
+ return null;
+ // MKCOL on repository or root node doesn't make sense
+ if ((tokens.size() == 1 || tokens.size() == 2)
+ && request.getMethod().equals(MKCOL))
+ return null;
+ String repositoryName = extractRepositoryName(tokens);
String pathPrefix = request.getServletPath() + '/' + repositoryName;
String beanName = pathPrefix;
}
/** The repository name is the first part of the path info */
- protected String extractRepositoryName(HttpServletRequest request) {
- String pathInfo = request.getPathInfo();
- // TODO: optimize by checking character by character
- String[] tokens = pathInfo.split("/");
+ protected String extractRepositoryName(List<String> pathTokens) {
StringBuffer currName = new StringBuffer("");
- tokens: for (String token : tokens) {
- if (token.equals(""))
- continue tokens;
+ for (String token : pathTokens) {
currName.append(token);
if (repositoryRegister.getRepositories().containsKey(
currName.toString()))
currName.append('/');
}
throw new ArgeoException("No repository can be found for request "
- + pathInfo);
+ + pathTokens);
}
public void setApplicationContext(ApplicationContext applicationContext)
import javax.jcr.Binary;
import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.Session;
import javax.servlet.ServletException;
response.setContentType(contentType);
- binary = node.getNode(Property.JCR_CONTENT)
- .getProperty(Property.JCR_DATA).getBinary();
+ try {
+ binary = node.getNode(Property.JCR_CONTENT)
+ .getProperty(Property.JCR_DATA).getBinary();
+ } catch (PathNotFoundException e) {
+ log.error("Node "+node+" as no data under content");
+ throw e;
+ }
in = binary.getStream();
IOUtils.copy(in, response.getOutputStream());
} catch (Exception e) {