package org.dcache.srm.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.dcache.srm.AbstractStorageElement;
import org.dcache.srm.SRM;
import org.dcache.srm.SRMException;
import org.dcache.srm.SRMInternalErrorException;
import org.dcache.srm.SRMInvalidRequestException;
import org.dcache.srm.SRMUser;
import org.dcache.srm.v2_2.ArrayOfString;
import org.dcache.srm.v2_2.SrmGetSpaceTokensRequest;
import org.dcache.srm.v2_2.SrmGetSpaceTokensResponse;
import org.dcache.srm.v2_2.TReturnStatus;
import org.dcache.srm.v2_2.TStatusCode;
import static com.google.common.base.Preconditions.checkNotNull;
public class SrmGetSpaceTokens
{
private static final Logger LOGGER =
LoggerFactory.getLogger(SrmGetSpaceTokens.class);
private final AbstractStorageElement storage;
private final SrmGetSpaceTokensRequest request;
private final SRMUser user;
private SrmGetSpaceTokensResponse response;
public SrmGetSpaceTokens(SRMUser user,
SrmGetSpaceTokensRequest request,
AbstractStorageElement storage,
SRM srm,
String clientHost)
{
this.request = checkNotNull(request);
this.user = checkNotNull(user);
this.storage = checkNotNull(storage);
}
public SrmGetSpaceTokensResponse getResponse()
{
if (response == null) {
try {
response = srmGetSpaceTokens();
} catch (SRMInvalidRequestException e) {
response = getFailedResponse(e.getMessage(), TStatusCode.SRM_INVALID_REQUEST);
} catch (SRMInternalErrorException e) {
LOGGER.error(e.toString());
response = getFailedResponse(e.getMessage(), TStatusCode.SRM_INTERNAL_ERROR);
} catch (SRMException e) {
response = getFailedResponse(e.toString());
}
}
return response;
}
private SrmGetSpaceTokensResponse srmGetSpaceTokens()
throws SRMException
{
String description = request.getUserSpaceTokenDescription();
String[] spaceTokens = storage.srmGetSpaceTokens(user, description);
if (spaceTokens.length == 0) {
throw new SRMInvalidRequestException("No such space tokens");
}
return new SrmGetSpaceTokensResponse(
new TReturnStatus(TStatusCode.SRM_SUCCESS, null),
new ArrayOfString(spaceTokens));
}
public static final SrmGetSpaceTokensResponse getFailedResponse(String text)
{
return getFailedResponse(text, TStatusCode.SRM_FAILURE);
}
public static final SrmGetSpaceTokensResponse getFailedResponse(String text, TStatusCode statusCode)
{
SrmGetSpaceTokensResponse response = new SrmGetSpaceTokensResponse();
response.setReturnStatus(new TReturnStatus(statusCode, text));
return response;
}
}