package org.dcache.srm.handler;
import org.dcache.srm.AbstractStorageElement;
import org.dcache.srm.SRM;
import org.dcache.srm.SRMAuthorizationException;
import org.dcache.srm.SRMException;
import org.dcache.srm.SRMInvalidRequestException;
import org.dcache.srm.SRMUser;
import org.dcache.srm.request.Request;
import org.dcache.srm.util.JDC;
import org.dcache.srm.v2_2.SrmAbortRequestRequest;
import org.dcache.srm.v2_2.SrmAbortRequestResponse;
import org.dcache.srm.v2_2.TReturnStatus;
import org.dcache.srm.v2_2.TStatusCode;
import static com.google.common.base.Preconditions.checkNotNull;
public class SrmAbortRequest
{
private final SrmAbortRequestRequest request;
private final SRMUser user;
private SrmAbortRequestResponse response;
public SrmAbortRequest(
SRMUser user,
SrmAbortRequestRequest request,
AbstractStorageElement storage,
SRM srm,
String clientHost)
{
this.user = user;
this.request = checkNotNull(request);
}
public SrmAbortRequestResponse getResponse()
{
if (response == null) {
try {
response = abortRequest();
} catch (SRMException e) {
response = getFailedResponse(e.getMessage(), e.getStatusCode());
}
}
return response;
}
private SrmAbortRequestResponse abortRequest()
throws SRMInvalidRequestException, SRMAuthorizationException
{
Request requestToAbort = Request.getRequest(request.getRequestToken(), Request.class);
try (JDC ignored = requestToAbort.applyJdc()) {
if (!user.hasAccessTo(requestToAbort)) {
throw new SRMAuthorizationException("User is not the owner of request " + request.getRequestToken() + ".");
}
return new SrmAbortRequestResponse(requestToAbort.abort("Request aborted by client."));
}
}
public static final SrmAbortRequestResponse getFailedResponse(String error)
{
return getFailedResponse(error, TStatusCode.SRM_FAILURE);
}
public static final SrmAbortRequestResponse getFailedResponse(String error,
TStatusCode statusCode)
{
return new SrmAbortRequestResponse(new TReturnStatus(statusCode, error));
}
}