package org.dcache.srm.handler; import java.net.URI; import java.net.URISyntaxException; import org.dcache.srm.AbstractStorageElement; import org.dcache.srm.SRM; import org.dcache.srm.SRMAuthorizationException; import org.dcache.srm.SRMException; import org.dcache.srm.SRMFileRequestNotFoundException; import org.dcache.srm.SRMInvalidRequestException; import org.dcache.srm.SRMUser; import org.dcache.srm.request.ContainerRequest; import org.dcache.srm.request.Request; import org.dcache.srm.scheduler.IllegalStateTransition; import org.dcache.srm.util.JDC; import org.dcache.srm.v2_2.ArrayOfAnyURI; import org.dcache.srm.v2_2.ArrayOfTSURLReturnStatus; import org.dcache.srm.v2_2.SrmAbortFilesRequest; import org.dcache.srm.v2_2.SrmAbortFilesResponse; import org.dcache.srm.v2_2.TReturnStatus; import org.dcache.srm.v2_2.TSURLReturnStatus; import org.dcache.srm.v2_2.TStatusCode; import static com.google.common.base.Preconditions.checkNotNull; import static org.dcache.srm.handler.ReturnStatuses.getSummaryReturnStatus; public class SrmAbortFiles { private final SrmAbortFilesRequest request; private final SRMUser user; private SrmAbortFilesResponse response; public SrmAbortFiles( SRMUser user, SrmAbortFilesRequest request, AbstractStorageElement storage, SRM srm, String clientHost) { this.user = user; this.request = checkNotNull(request); } public SrmAbortFilesResponse getResponse() { if (response == null) { try { response = abortFiles(); } catch (SRMException e) { response = getFailedResponse(e.getMessage(), e.getStatusCode()); } } return response; } private SrmAbortFilesResponse abortFiles() throws SRMInvalidRequestException, SRMAuthorizationException { ContainerRequest<?> requestToAbort = Request.getRequest(this.request.getRequestToken(), ContainerRequest.class); try (JDC ignored = requestToAbort.applyJdc()) { if (!user.hasAccessTo(requestToAbort)) { throw new SRMAuthorizationException("User is not the owner of request " + request.getRequestToken() + "."); } org.apache.axis.types.URI[] surls = getSurls(); TSURLReturnStatus[] surlReturnStatusArray = new TSURLReturnStatus[surls.length]; for (int i = 0; i < surls.length; i++) { TReturnStatus returnStatus = abortSurl(requestToAbort, surls[i]); surlReturnStatusArray[i] = new TSURLReturnStatus(surls[i], returnStatus); } requestToAbort.updateStatus(); return new SrmAbortFilesResponse( getSummaryReturnStatus(surlReturnStatusArray), new ArrayOfTSURLReturnStatus(surlReturnStatusArray)); } } private TReturnStatus abortSurl(ContainerRequest<?> request, org.apache.axis.types.URI surl) { try { request.getFileRequestBySurl(new URI(surl.toString())).abort("File request aborted by client."); return new TReturnStatus(TStatusCode.SRM_SUCCESS, null); } catch (SRMFileRequestNotFoundException | URISyntaxException e) { return new TReturnStatus(TStatusCode.SRM_INVALID_PATH, "SURL does match any existing file request associated with the request token"); } catch (SRMException | IllegalStateTransition e) { return new TReturnStatus(TStatusCode.SRM_FAILURE, e.getMessage()); } } private org.apache.axis.types.URI[] getSurls() throws SRMInvalidRequestException { ArrayOfAnyURI arrayOfSURLs = request.getArrayOfSURLs(); if (arrayOfSURLs == null || arrayOfSURLs.getUrlArray().length == 0) { throw new SRMInvalidRequestException("Request contains no SURL"); } return arrayOfSURLs.getUrlArray(); } public static SrmAbortFilesResponse getFailedResponse(String error) { return getFailedResponse(error, TStatusCode.SRM_FAILURE); } public static SrmAbortFilesResponse getFailedResponse(String error, TStatusCode statusCode) { SrmAbortFilesResponse srmAbortFilesResponse = new SrmAbortFilesResponse(); srmAbortFilesResponse.setReturnStatus(new TReturnStatus(statusCode, error)); return srmAbortFilesResponse; } }