package cz.benky.webdav; import cz.benky.webdav.dao.CassandraDao; import cz.benky.webdav.dao.CassandraFileDao; import cz.benky.webdav.service.CassandraService; import cz.benky.webdav.service.FileStorageService; import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavMethods; import org.apache.jackrabbit.webdav.DavResource; import org.apache.jackrabbit.webdav.DavResourceFactory; import org.apache.jackrabbit.webdav.DavResourceLocator; import org.apache.jackrabbit.webdav.DavServletRequest; import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import java.net.URLDecoder; import java.util.UUID; public class CassandraDavResourceFactory implements DavResourceFactory { private final FileStorageService fileStorageService; private final CassandraService cassandraService; public CassandraDavResourceFactory(final CassandraDao cassandraDao, final CassandraFileDao cassandraFileDao) { this.fileStorageService = new FileStorageService(cassandraDao, cassandraFileDao); this.cassandraService = new CassandraService(cassandraDao); } @Override public DavResource createResource(DavResourceLocator locator, DavServletRequest request, DavServletResponse response) throws DavException { return createResource(locator, request.getDavSession(), request); } @Override public DavResource createResource(DavResourceLocator locator, DavSession davSession) throws DavException { return createResource(locator, davSession, null); } private DavResource createResource(DavResourceLocator locator, DavSession davSession, DavServletRequest request) throws DavException { final String localPath = getPath(locator); final UUID file = cassandraService.getFile(localPath); if (file == null) { final boolean isCreateCollection; isCreateCollection = request != null && DavMethods.isCreateCollectionRequest(request); return new DavNullResource(this, locator, davSession, cassandraService, fileStorageService, isCreateCollection); } else { if (cassandraService.isFile(localPath)) { return new DavFileResource(this, locator, davSession, cassandraService, fileStorageService); } else { return new DavCollectionResource(this, locator, davSession, cassandraService, fileStorageService); } } } private String getPath(DavResourceLocator locator) { String pathStr = StringUtils.chomp(locator.getResourcePath(), "/"); if (StringUtils.isEmpty(pathStr)) { pathStr = "/"; } return URLDecoder.decode(pathStr); } }