package com.bradmcevoy.http;
import com.bradmcevoy.http.exceptions.BadRequestException;
import com.bradmcevoy.http.exceptions.ConflictException;
import com.bradmcevoy.http.exceptions.NotAuthorizedException;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Default implementation of DeleteHelper
*
* It will delegate to the resource if it implements DeletableCollectionResource,
* otherwise it will walk the collection if its a CollectionResource, and finally
* will just call handlerHelper.isLockedOut otherwise
*
*/
public class DeleteHelperImpl implements DeleteHelper {
private Logger log = LoggerFactory.getLogger(DeleteHelperImpl.class);
private final HandlerHelper handlerHelper;
public DeleteHelperImpl(HandlerHelper handlerHelper) {
this.handlerHelper = handlerHelper;
}
public boolean isLockedOut(Request req, Resource r) {
if (r instanceof DeletableCollectionResource) {
DeletableCollectionResource dcr = (DeletableCollectionResource) r;
boolean locked = dcr.isLockedOutRecursive(req);
if( locked && log.isInfoEnabled()) {
log.info("isLocked, as reported by DeletableCollectionResource: " + dcr.getName());
}
return locked;
} else if (r instanceof CollectionResource) {
CollectionResource col = (CollectionResource) r;
List<Resource> list = new ArrayList<Resource>();
list.addAll(col.getChildren());
for (Resource rChild : list) {
if (rChild instanceof DeletableResource) {
DeletableResource rChildDel = (DeletableResource) rChild;
if (isLockedOut(req, rChildDel)) {
if( log.isInfoEnabled()) {
log.info("isLocked: " + rChild.getName() + " type:" + rChild.getClass());
}
return true;
}
} else {
if( log.isInfoEnabled() ) {
log.info("a child resource is not deletable: " + rChild.getName() + " type: " + rChild.getClass());
}
return true;
}
}
return false;
} else {
boolean locked = handlerHelper.isLockedOut(req, r);
if( locked && log.isInfoEnabled()) {
log.info("isLocked, as reported by handlerHelper on resource: " + r.getName());
}
return locked;
}
}
public void delete(DeletableResource r) throws NotAuthorizedException, ConflictException, BadRequestException {
if (r instanceof DeletableCollectionResource) {
r.delete();
} else if (r instanceof CollectionResource) {
CollectionResource col = (CollectionResource) r;
List<Resource> list = new ArrayList<Resource>();
list.addAll(col.getChildren());
for (Resource rChild : list) {
if( rChild == null ) {
log.warn( "got a null item in list");
} else {
if (rChild instanceof DeletableResource) {
DeletableResource rChildDel = (DeletableResource) rChild;
delete(rChildDel);
} else {
log.warn( "Couldnt delete child resource: " + rChild.getName() + " of type; " + rChild.getClass().getName() + " because it does not implement: " + DeletableResource.class.getCanonicalName());
throw new ConflictException( rChild );
}
}
}
r.delete();
} else {
r.delete();
}
}
}