package org.dcache.srm.handler; import org.apache.axis.types.URI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.dcache.srm.AbstractStorageElement; import org.dcache.srm.SRM; import org.dcache.srm.SRMAbortedException; import org.dcache.srm.SRMAuthorizationException; import org.dcache.srm.SRMException; import org.dcache.srm.SRMFileRequestNotFoundException; import org.dcache.srm.SRMInternalErrorException; import org.dcache.srm.SRMInvalidRequestException; import org.dcache.srm.SRMRequestTimedOutException; import org.dcache.srm.SRMUser; import org.dcache.srm.request.PutFileRequest; import org.dcache.srm.request.PutRequest; import org.dcache.srm.request.Request; 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.SrmPutDoneRequest; import org.dcache.srm.v2_2.SrmPutDoneResponse; 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; public class SrmPutDone { private static final Logger LOGGER = LoggerFactory.getLogger(SrmPutDone.class); private final SrmPutDoneRequest request; private final SRMUser user; private SrmPutDoneResponse response; public SrmPutDone(SRMUser user, SrmPutDoneRequest request, AbstractStorageElement storage, SRM srm, String clientHost) { this.request = checkNotNull(request); this.user = checkNotNull(user); } public SrmPutDoneResponse getResponse() { if (response == null) { try { response = srmPutDone(); } catch (SRMException e) { response = getFailedResponse(e.getMessage(), e.getStatusCode()); } } return response; } private SrmPutDoneResponse srmPutDone() throws SRMInvalidRequestException, SRMRequestTimedOutException, SRMAbortedException, SRMInternalErrorException, SRMAuthorizationException { URI[] surls = getSurls(request); PutRequest putRequest = Request.getRequest(request.getRequestToken(), PutRequest.class); try (JDC ignored = putRequest.applyJdc()) { putRequest.wlock(); try { if (!user.hasAccessTo(putRequest)) { throw new SRMAuthorizationException("User is not the owner of request " + request.getRequestToken() + "."); } switch (putRequest.getState()) { case FAILED: if (putRequest.getStatusCode() == TStatusCode.SRM_REQUEST_TIMED_OUT) { throw new SRMRequestTimedOutException("Total request time exceeded"); } break; case CANCELED: throw new SRMAbortedException("Request has been aborted."); } TSURLReturnStatus[] returnStatuses = new TSURLReturnStatus[surls.length]; for (int i = 0; i < surls.length; ++i) { if (surls[i] == null) { throw new SRMInvalidRequestException("SiteURLs[" + (i + 1) + "] is null."); } TReturnStatus returnStatus; try { PutFileRequest fileRequest = putRequest .getFileRequestBySurl(java.net.URI.create(surls[i].toString())); try (JDC ignore = fileRequest.applyJdc()) { returnStatus = fileRequest.done(this.user); } } catch (SRMFileRequestNotFoundException e) { returnStatus = new TReturnStatus(TStatusCode.SRM_INVALID_PATH, "File does not exist."); } returnStatuses[i] = new TSURLReturnStatus(surls[i], returnStatus); } putRequest.updateStatus(); return new SrmPutDoneResponse( ReturnStatuses.getSummaryReturnStatus(returnStatuses), new ArrayOfTSURLReturnStatus(returnStatuses)); } finally { putRequest.wunlock(); } } } private static URI[] getSurls(SrmPutDoneRequest request) throws SRMInvalidRequestException { ArrayOfAnyURI arrayOfSURLs = request.getArrayOfSURLs(); if (arrayOfSURLs == null || arrayOfSURLs.getUrlArray().length == 0) { throw new SRMInvalidRequestException("arrayOfSURLs is empty."); } return arrayOfSURLs.getUrlArray(); } public static final SrmPutDoneResponse getFailedResponse(String error) { return getFailedResponse(error, TStatusCode.SRM_FAILURE); } public static final SrmPutDoneResponse getFailedResponse(String error, TStatusCode statusCode) { SrmPutDoneResponse srmPutDoneResponse = new SrmPutDoneResponse(); srmPutDoneResponse.setReturnStatus(new TReturnStatus(statusCode, error)); return srmPutDoneResponse; } }