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.DavCompliance;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavResourceFactory;
import org.apache.jackrabbit.webdav.DavResourceLocator;
import org.apache.jackrabbit.webdav.DavSession;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
import org.apache.jackrabbit.webdav.lock.ActiveLock;
import org.apache.jackrabbit.webdav.lock.LockInfo;
import org.apache.jackrabbit.webdav.lock.LockManager;
import org.apache.jackrabbit.webdav.lock.Scope;
import org.apache.jackrabbit.webdav.lock.SimpleLockManager;
import org.apache.jackrabbit.webdav.lock.Type;
import org.apache.jackrabbit.webdav.property.DavProperty;
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.PropEntry;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import static cz.benky.webdav.util.PathUtils.getParentDirectory;
public abstract class AbstractDavResource implements DavResource {
private static final String COMPLIANCE_CLASS =
DavCompliance.concatComplianceClasses(new String[]{DavCompliance._2_});
private static final String SUPPORTED_METHODS
= "OPTIONS, GET, HEAD, POST, TRACE, MKCOL, COPY, PUT, DELETE, MOVE, PROPFIND";
private final DavResourceLocator locator;
private final DavSession davSession;
private final CassandraDavResourceFactory factory;
private final FileStorageService fileStorageService;
private final CassandraService cassandraService;
private final String path;
private LockManager lockManager = new SimpleLockManager();
private DavPropertySet properties = null;
public AbstractDavResource(final CassandraDavResourceFactory factory,
final DavResourceLocator locator,
final DavSession davSession,
final CassandraService cassandraService,
final FileStorageService fileStorageService) {
this.factory = factory;
this.locator = locator;
this.davSession = davSession;
this.cassandraService = cassandraService;
this.fileStorageService = fileStorageService;
String pathStr = StringUtils.chomp(locator.getResourcePath(), "/");
if (StringUtils.isEmpty(pathStr)) {
pathStr = "/";
}
this.path = URLDecoder.decode(pathStr);
}
@Override
public String getComplianceClass() {
return COMPLIANCE_CLASS;
}
@Override
public String getSupportedMethods() {
return SUPPORTED_METHODS;
}
@Override
public boolean exists() {
return cassandraService.resourceExists(getPath());
}
@Override
public String getDisplayName() {
return null;
}
@Override
public DavResourceLocator getLocator() {
return locator;
}
@Override
public String getResourcePath() {
throw new UnsupportedOperationException("not yet implemented");
}
@Override
public String getHref() {
return getPath();
}
@Override
public long getModificationTime() {
return new Date().getTime();
}
@Override
public DavPropertyName[] getPropertyNames() {
initProperties();
return properties.getPropertyNames();
}
@Override
public DavProperty<?> getProperty(DavPropertyName name) {
initProperties();
return properties.get(name);
}
@Override
public DavPropertySet getProperties() {
initProperties();
return properties;
}
@Override
public void setProperty(DavProperty<?> davProperty) throws DavException {
initProperties();
}
@Override
public void removeProperty(DavPropertyName name) throws DavException {
initProperties();
properties.remove(name);
}
@Override
public MultiStatusResponse alterProperties(List<? extends PropEntry> propEntries) throws DavException {
return null;
}
@Override
public DavResource getCollection() {
final DavResourceLocator newLocator = locator.getFactory()
.createResourceLocator(locator.getPrefix(), getParentDirectory(getPath()));
try {
return factory.createResource(newLocator, getSession());
} catch (DavException ex) {
throw new RuntimeException(ex);
}
}
@Override
public void move(DavResource davResource) throws DavException {
throw new UnsupportedOperationException("not yet implemented");
}
@Override
public void copy(DavResource davResource, boolean b) throws DavException {
throw new UnsupportedOperationException("not yet implemented");
}
@Override
public boolean isLockable(Type type, Scope scope) {
return false;
}
@Override
public boolean hasLock(Type type, Scope scope) {
return false;
}
@Override
public ActiveLock getLock(Type type, Scope scope) {
return lockManager.getLock(type, scope, this);
}
@Override
public ActiveLock[] getLocks() {
return new ActiveLock[0];
}
@Override
public ActiveLock lock(LockInfo lockInfo) throws DavException {
return lockManager.createLock(lockInfo, this);
}
@Override
public ActiveLock refreshLock(LockInfo lockInfo, String s) throws DavException {
return lockManager.refreshLock(lockInfo, s, this);
}
@Override
public void unlock(String s) throws DavException {
}
@Override
public void addLockManager(LockManager lockManager) {
this.lockManager = lockManager;
}
@Override
public DavResourceFactory getFactory() {
return factory;
}
@Override
public DavSession getSession() {
return davSession;
}
public String getPath() {
return path;
}
private void initProperties() {
if (properties != null) {
return;
}
this.properties = createProperties();
}
protected DavPropertySet createProperties() {
final DavPropertySet localProperties = new DavPropertySet();
SimpleDateFormat simpleFormat = (SimpleDateFormat) DavConstants.modificationDateFormat.clone();
simpleFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
localProperties.add(new DefaultDavProperty(DavPropertyName.GETLASTMODIFIED, simpleFormat.format(new Date())));
if (getDisplayName() != null) {
localProperties.add(new DefaultDavProperty(DavPropertyName.DISPLAYNAME, getDisplayName()));
}
return localProperties;
}
public CassandraService getCassandraService() {
return cassandraService;
}
public FileStorageService getFileStorageService() {
return fileStorageService;
}
}