package cz.benky.webdav; 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.DavResource; import org.apache.jackrabbit.webdav.DavResourceIterator; import org.apache.jackrabbit.webdav.DavResourceIteratorImpl; import org.apache.jackrabbit.webdav.DavResourceLocator; import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.io.InputContext; import org.apache.jackrabbit.webdav.io.OutputContext; import org.apache.jackrabbit.webdav.property.DavPropertyName; import org.apache.jackrabbit.webdav.property.DavPropertySet; import org.apache.jackrabbit.webdav.property.DefaultDavProperty; import org.apache.jackrabbit.webdav.property.ResourceType; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class DavCollectionResource extends AbstractDavResource { public DavCollectionResource(final CassandraDavResourceFactory factory, final DavResourceLocator locator, final DavSession davSession, final CassandraService cassandraService, final FileStorageService fileStorageService) { super(factory, locator, davSession, cassandraService, fileStorageService); } @Override public boolean isCollection() { return true; } @Override public void spool(OutputContext outputContext) throws IOException { // nothing here } @Override public void addMember(DavResource resource, InputContext inputContext) throws DavException { final AbstractDavResource cassandraResource = (AbstractDavResource) resource; final String destPath = cassandraResource.getPath(); if (cassandraResource.isCollection()) { getCassandraService().createDirectory(destPath); } else { getFileStorageService().createFile(destPath, inputContext); } } @Override public DavResourceIterator getMembers() { if (!isCollection()) { return new DavResourceIteratorImpl(Collections.<DavResource>emptyList()); } else { ArrayList<DavResource> list = new ArrayList<DavResource>(); for (String sub : getCassandraService().getSiblings(getPath())) { DavResourceLocator resourceLocator = getLocator().getFactory().createResourceLocator(getLocator().getPrefix(), getLocator().getWorkspacePath(), StringUtils.chomp(getPath(), "/") + "/" + sub, false); try { list.add(getFactory().createResource(resourceLocator, getSession())); } catch (DavException ex) { ex.printStackTrace(); } } return new DavResourceIteratorImpl(list); } } @Override public void removeMember(DavResource resource) throws DavException { final AbstractDavResource cassandraResource = (AbstractDavResource) resource; final String path = cassandraResource.getPath(); if (path.equals("/")) { return; } if (cassandraResource.isCollection()) { final List<String> siblings = getCassandraService().getSiblings(path); if (!siblings.isEmpty()) { throw new DavException(DavServletResponse.SC_CONFLICT, "You cannot delete collection with content"); } getCassandraService().deleteDirectory(path); } else { getFileStorageService().deleteFile(path); } } @Override protected DavPropertySet createProperties() { final DavPropertySet properties = super.createProperties(); properties.add(new ResourceType(ResourceType.COLLECTION)); properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "1")); return properties; } }