package org.dcache.srm.handler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; import org.dcache.srm.AbstractStorageElement; import org.dcache.srm.SRM; import org.dcache.srm.SRMAuthorizationException; import org.dcache.srm.SRMException; import org.dcache.srm.SRMInternalErrorException; import org.dcache.srm.SRMInvalidPathException; import org.dcache.srm.SRMNonEmptyDirectoryException; import org.dcache.srm.SRMUser; import org.dcache.srm.v2_2.SrmRmdirRequest; import org.dcache.srm.v2_2.SrmRmdirResponse; import org.dcache.srm.v2_2.TReturnStatus; import org.dcache.srm.v2_2.TStatusCode; import static com.google.common.base.Preconditions.checkNotNull; public class SrmRmdir { private static final Logger LOGGER = LoggerFactory.getLogger(SrmRmdir.class); private final AbstractStorageElement storage; private final SrmRmdirRequest request; private final SRMUser user; private final SRM srm; private SrmRmdirResponse response; public SrmRmdir(SRMUser user, SrmRmdirRequest request, AbstractStorageElement storage, SRM srm, String clientHost) { this.srm = srm; this.request = checkNotNull(request); this.user = checkNotNull(user); this.storage = checkNotNull(storage); } public SrmRmdirResponse getResponse() { if (response == null) { try { response = srmRmdir(); } catch (SRMInternalErrorException e) { LOGGER.error(e.toString()); response = getFailedResponse(e.getMessage(), TStatusCode.SRM_INTERNAL_ERROR); } catch (SRMAuthorizationException e) { response = getFailedResponse(e.getMessage(), TStatusCode.SRM_AUTHORIZATION_FAILURE); } catch (SRMInvalidPathException e) { response = getFailedResponse(e.getMessage(), TStatusCode.SRM_INVALID_PATH); } catch (SRMNonEmptyDirectoryException e) { response = getFailedResponse(e.getMessage(), TStatusCode.SRM_NON_EMPTY_DIRECTORY); } catch (SRMException e) { response = getFailedResponse(e.toString()); } } return response; } private SrmRmdirResponse srmRmdir() throws SRMException { URI surl = URI.create(request.getSURL().toString()); /* If surl is a prefix to any active upload, then we report the directory as * non-empty. This is not strictly required by the SRM spec, however S2 tests * (usecase.RmdirBeingPutInto) check for this behaviour. */ srm.checkRemoveDirectory(surl); storage.removeDirectory(user, surl, request.getRecursive() != null && request.getRecursive()); return new SrmRmdirResponse(new TReturnStatus(TStatusCode.SRM_SUCCESS, null)); } public static final SrmRmdirResponse getFailedResponse(String error) { return getFailedResponse(error, TStatusCode.SRM_FAILURE); } public static final SrmRmdirResponse getFailedResponse(String error, TStatusCode statusCode) { SrmRmdirResponse response = new SrmRmdirResponse(); response.setReturnStatus(new TReturnStatus(statusCode, error)); return response; } }