package org.dcache.srm.handler; 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.ContainerRequest; import org.dcache.srm.request.Request; import org.dcache.srm.util.JDC; import org.dcache.srm.v2_2.ArrayOfTRequestSummary; import org.dcache.srm.v2_2.SrmGetRequestSummaryRequest; import org.dcache.srm.v2_2.SrmGetRequestSummaryResponse; import org.dcache.srm.v2_2.TRequestSummary; import org.dcache.srm.v2_2.TReturnStatus; import org.dcache.srm.v2_2.TStatusCode; import static com.google.common.base.Preconditions.checkNotNull; public class SrmGetRequestSummary { private final SrmGetRequestSummaryRequest request; private SrmGetRequestSummaryResponse response; public SrmGetRequestSummary( SRMUser user, SrmGetRequestSummaryRequest request, AbstractStorageElement storage, SRM srm, String clientHost) { this.request = checkNotNull(request); } public SrmGetRequestSummaryResponse getResponse() { if (response == null) { try { response = srmGetRequestSummary(); } catch (SRMInvalidRequestException e) { response = getFailedResponse(e.getMessage(), TStatusCode.SRM_INVALID_REQUEST); } } return response; } private SrmGetRequestSummaryResponse srmGetRequestSummary() throws SRMInvalidRequestException { String[] requestTokens = request.getArrayOfRequestTokens().getStringArray(); if (requestTokens == null || requestTokens.length == 0) { throw new SRMInvalidRequestException("arrayOfRequestTokens is empty"); } TRequestSummary[] requestSummaries = new TRequestSummary[requestTokens.length]; boolean hasFailure = false; boolean hasSuccess = false; for (int i = 0; i < requestTokens.length; ++i) { String requestToken = requestTokens[i]; TRequestSummary summary; try { ContainerRequest<?> request = Request.getRequest(requestToken, ContainerRequest.class); try (JDC ignored = request.applyJdc()) { summary = request.getRequestSummary(); } hasSuccess = true; } catch (SRMInvalidRequestException e) { summary = new TRequestSummary(); summary.setRequestToken(requestToken); summary.setStatus(new TReturnStatus(TStatusCode.SRM_INVALID_REQUEST, e.getMessage())); hasFailure = true; } requestSummaries[i] = summary; } return new SrmGetRequestSummaryResponse( getSummaryReturnStatus(hasFailure, hasSuccess), new ArrayOfTRequestSummary(requestSummaries)); } public static TReturnStatus getSummaryReturnStatus(boolean hasFailure, boolean hasSuccess) { if (!hasFailure) { return new TReturnStatus(TStatusCode.SRM_SUCCESS, null); } else if (!hasSuccess) { return new TReturnStatus(TStatusCode.SRM_FAILURE, "The operation failed for all request tokens"); } else { return new TReturnStatus(TStatusCode.SRM_PARTIAL_SUCCESS, "The operation failed for some request tokens"); } } public static final SrmGetRequestSummaryResponse getFailedResponse(String error) { return getFailedResponse(error, TStatusCode.SRM_FAILURE); } public static final SrmGetRequestSummaryResponse getFailedResponse(String error, TStatusCode statusCode) { TReturnStatus status = new TReturnStatus(statusCode, error); SrmGetRequestSummaryResponse srmGetRequestSummaryResponse = new SrmGetRequestSummaryResponse(); srmGetRequestSummaryResponse.setReturnStatus(status); return srmGetRequestSummaryResponse; } }