package org.basex.http.webdav; import javax.servlet.http.*; import org.basex.http.*; import org.basex.server.*; import org.basex.util.*; import com.bradmcevoy.common.*; import com.bradmcevoy.http.*; /** * WebDAV resource factory. Main class for generating WebDAV resources. * * @author BaseX Team 2005-17, BSD License * @author Rositsa Shadura * @author Dimitar Popov */ final class WebDAVFactory implements ResourceFactory { /** Thread local variable to hold the current context. */ private static final ThreadLocal<WebDAVService> SERVICES = new ThreadLocal<>(); /** * Creates a new service. * @param conn HTTP connection */ static void init(final HTTPConnection conn) { SERVICES.set(new WebDAVService(conn)); } /** * Closes the database session. */ static void close() { SERVICES.get().close(); SERVICES.remove(); } @Override public Resource getResource(final String host, final String dbpath) { try { final WebDAVService service = SERVICES.get(); final HttpServletRequest r = service.conn.req; Path p = Path.path(dbpath); if(!r.getContextPath().isEmpty()) p = p.getStripFirst(); if(!r.getServletPath().isEmpty()) p = p.getStripFirst(); if(p.isRoot()) return new WebDAVRoot(service); final String db = p.getFirst(); return p.getLength() > 1 ? service.resource(db, p.getStripFirst().toString()) : service.dbExists(db) ? new WebDAVDatabase(new WebDAVMetaData(db, service.timestamp(db)), service) : null; } catch(final LoginException ex) { return WebDAVNotAuthorized.NOAUTH; } catch(final Exception ex) { Util.errln(ex); } return null; } /** * Creates a new resource representing a file. * @param s service instance * @param d file meta data * @return object representing the file */ static WebDAVFile file(final WebDAVService s, final WebDAVMetaData d) { return new WebDAVFile(d, s); } /** * Creates a new resource representing a folder. * @param s service instance * @param d folder meta data * @return object representing the folder */ static WebDAVFolder folder(final WebDAVService s, final WebDAVMetaData d) { return new WebDAVFolder(d, s); } /** * Creates a new resource representing a database. * @param s service instance * @param d database meta data * @return object representing the database */ static WebDAVDatabase database(final WebDAVService s, final WebDAVMetaData d) { return new WebDAVDatabase(d, s); } }