package org.dcache.srm.handler; import org.apache.axis.types.URI; import org.dcache.srm.AbstractStorageElement; import org.dcache.srm.SRM; import org.dcache.srm.SRMInvalidRequestException; import org.dcache.srm.SRMUser; import org.dcache.srm.request.CopyRequest; import org.dcache.srm.request.Request; import org.dcache.srm.util.JDC; import org.dcache.srm.v2_2.SrmStatusOfCopyRequestRequest; import org.dcache.srm.v2_2.SrmStatusOfCopyRequestResponse; import org.dcache.srm.v2_2.TReturnStatus; import org.dcache.srm.v2_2.TStatusCode; import static com.google.common.base.Preconditions.checkNotNull; public class SrmStatusOfCopyRequest { private final SrmStatusOfCopyRequestRequest request; private SrmStatusOfCopyRequestResponse response; public SrmStatusOfCopyRequest(SRMUser user, SrmStatusOfCopyRequestRequest request, AbstractStorageElement storage, SRM srm, String clientHost) { this.request = checkNotNull(request); } public SrmStatusOfCopyRequestResponse getResponse() { if (response == null) { try { response = srmStatusOfCopyRequest(); } catch (SRMInvalidRequestException e) { response = getFailedResponse(e.getMessage(), TStatusCode.SRM_INVALID_REQUEST); } } return response; } private SrmStatusOfCopyRequestResponse srmStatusOfCopyRequest() throws SRMInvalidRequestException { CopyRequest copyRequest = Request.getRequest(request.getRequestToken(), CopyRequest.class); try (JDC ignored = copyRequest.applyJdc()) { if (request.getArrayOfSourceSURLs() == null || request.getArrayOfTargetSURLs() == null) { return copyRequest.getSrmStatusOfCopyRequest(); } URI[] fromsurls = request.getArrayOfSourceSURLs().getUrlArray(); URI[] tosurls = request.getArrayOfTargetSURLs().getUrlArray(); if (fromsurls.length == 0 || tosurls.length == 0) { return copyRequest.getSrmStatusOfCopyRequest(); } if (tosurls.length != fromsurls.length) { throw new SRMInvalidRequestException("Length of arrayOfSourceSURLs and arrayOfTargetSURLs differ."); } return copyRequest.getSrmStatusOfCopyRequest(fromsurls, tosurls); } } public static final SrmStatusOfCopyRequestResponse getFailedResponse(String text) { return getFailedResponse(text, TStatusCode.SRM_FAILURE); } public static final SrmStatusOfCopyRequestResponse getFailedResponse(String text, TStatusCode statusCode) { SrmStatusOfCopyRequestResponse response = new SrmStatusOfCopyRequestResponse(); response.setReturnStatus(new TReturnStatus(statusCode, text)); return response; } }