package cz.cuni.mff.d3s.been.swrepository;
import static cz.cuni.mff.d3s.been.swrepository.HeaderNames.ARTIFACT_IDENTIFIER_HEADER_NAME;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cz.cuni.mff.d3s.been.bpk.ArtifactIdentifier;
import cz.cuni.mff.d3s.been.datastore.ArtifactStore;
import cz.cuni.mff.d3s.been.datastore.StorePersister;
import cz.cuni.mff.d3s.been.datastore.StoreReader;
import cz.cuni.mff.d3s.been.swrepository.httpserver.SkeletalRequestHandler;
import cz.cuni.mff.d3s.been.util.JSONUtils;
import cz.cuni.mff.d3s.been.util.JsonException;
/**
* A request handler that deals with artifact requests.
*
* @author darklight
*
*/
public class ArtifactRequestHandler extends SkeletalRequestHandler {
private static final Logger log = LoggerFactory.getLogger(ArtifactRequestHandler.class);
/** Persistence layer used to retrieve artifacts */
private final ArtifactStore store;
private final JSONUtils jsonUtils;
/**
* Create the handler.
*
* @param store
* Persistence to use
*/
public ArtifactRequestHandler(ArtifactStore store) {
this.store = store;
this.jsonUtils = JSONUtils.newInstance();
}
@Override
public void handleGet(HttpRequest request, HttpResponse response) {
ArtifactIdentifier artifactIdentifier;
try {
artifactIdentifier = jsonUtils.deserialize(
request.getFirstHeader(ARTIFACT_IDENTIFIER_HEADER_NAME).getValue(),
ArtifactIdentifier.class);
} catch (JsonException e) {
response.setStatusCode(400);
log.error("Could not read artifact identifier from request.");
return;
}
final StoreReader artifactReader = store.getArtifactReader(artifactIdentifier);
if (artifactReader == null) {
replyBadRequest(
response,
String.format("Could not retrieve reader for artifact identifier %s", artifactIdentifier.toString()));
return;
}
InputStreamEntity bpkEntity = null;
try {
bpkEntity = new InputStreamEntity(artifactReader.getContentStream(), artifactReader.getContentLength());
} catch (IOException e) {
log.error("Failed to open artifact reader {} - {}", artifactReader.toString(), e.getMessage());
}
response.setEntity(bpkEntity);
}
@Override
protected void handlePut(HttpRequest request, HttpResponse response) {
ArtifactIdentifier artifactIdentifier;
if (!BasicHttpEntityEnclosingRequest.class.isAssignableFrom(request.getClass())) {
final String errorMessage = String.format(
"Put request %s invalid, because it doesn't contain an entity.",
request.toString());
log.error(errorMessage);
replyBadRequest(response, errorMessage);
return;
}
BasicHttpEntityEnclosingRequest put = (BasicHttpEntityEnclosingRequest) request;
try {
artifactIdentifier = jsonUtils.deserialize(
request.getFirstHeader(ARTIFACT_IDENTIFIER_HEADER_NAME).getValue(),
ArtifactIdentifier.class);
} catch (JsonException e) {
final String errorMessage = String.format(
"could not read artifact identifier from request %s.",
request.toString());
log.error(errorMessage);
replyBadRequest(response, errorMessage);
return;
}
try {
final StorePersister artifactPersister = store.getArtifactPersister(artifactIdentifier);
if (artifactPersister == null) {
final String errorMessage = String.format(
"Could not retrieve persister for artifact %s",
artifactIdentifier.toString());
log.error(errorMessage);
replyBadRequest(response, errorMessage);
return;
}
final InputStream requestFile = put.getEntity().getContent();
artifactPersister.dump(requestFile);
} catch (IOException e) {
log.error("Could not persist artifact {} due to I/O error - {}.", artifactIdentifier.toString(), e.getMessage());
}
}
}