
com.findwise.hydra.net.WriteHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hydra-core Show documentation
Show all versions of hydra-core Show documentation
Hydra Core - The main runnable artifact of Hydra
The newest version!
package com.findwise.hydra.net;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.findwise.hydra.CachingDocumentNIO;
import com.findwise.hydra.DatabaseConnector.ConversionException;
import com.findwise.hydra.DatabaseDocument;
import com.findwise.hydra.DatabaseType;
import com.findwise.hydra.Document;
import com.findwise.hydra.JsonException;
import com.findwise.hydra.local.LocalDocument;
import com.findwise.hydra.local.RemotePipeline;
import com.findwise.hydra.net.RESTTools.Method;
public class WriteHandler implements ResponsibleHandler {
private CachingDocumentNIO io;
private boolean performanceLogging;
private static Logger logger = LoggerFactory.getLogger(WriteHandler.class);
public WriteHandler(CachingDocumentNIO dbc, boolean performanceLogging) {
this.io = dbc;
this.performanceLogging = performanceLogging;
}
@Override
public void handle(HttpRequest request, HttpResponse response, HttpContext arg2)
throws HttpException, IOException {
logger.trace("handleWriteDocument()");
long start = System.currentTimeMillis();
HttpEntity requestEntity = ((HttpEntityEnclosingRequest) request).getEntity();
String requestContent = EntityUtils.toString(requestEntity);
long tostring = System.currentTimeMillis();
String stage = RESTTools.getParam(request, RemotePipeline.STAGE_PARAM);
if(stage==null) {
HttpResponseWriter.printMissingParameter(response, RemotePipeline.STAGE_PARAM);
return;
}
String partial = RESTTools.getParam(request, RemotePipeline.PARTIAL_PARAM);
if(partial==null) {
HttpResponseWriter.printMissingParameter(response, RemotePipeline.PARTIAL_PARAM);
return;
}
String norelease = RESTTools.getParam(request, RemotePipeline.NORELEASE_PARAM);
if(norelease==null) {
HttpResponseWriter.printMissingParameter(response, RemotePipeline.NORELEASE_PARAM);
return;
}
DatabaseDocument md;
try {
md = io.convert(new LocalDocument(requestContent));
}
catch(JsonException e) {
HttpResponseWriter.printJsonException(response, e);
return;
} catch (ConversionException e) {
logger.error("Caught Exception when trying to convert "+requestContent, e);
HttpResponseWriter.printBadRequestContent(response);
return;
}
long convert = System.currentTimeMillis();
String type;
boolean saveRes;
if(partial.equals("1")) {
saveRes = handlePartialWrite(md, response);
type="update";
}
else {
if(md.getID()!=null) {
saveRes = handleFullUpdate(md, response);
}
else {
saveRes = handleInsert(md, response);
}
type="insert";
}
long write = System.currentTimeMillis();
if (saveRes && norelease.equals("0")) {
boolean result = release(md, stage);
if (!result) {
HttpResponseWriter.printReleaseFailed(response);
return;
}
}
if(performanceLogging) {
long end = System.currentTimeMillis();
logger.info(String.format("type=performance event=%s stage_name=%s doc_id=\"%s\" start=%d end=%d total=%d entitystring=%d parse=%d query=%d serialize=%d", type, stage, md.getID(), start, end, end-start, tostring-start, convert-tostring, write-convert, end-write));
}
}
private boolean release(Document md, String stage) {
return io.markTouched(md.getID(), stage);
}
private boolean handlePartialWrite(DatabaseDocument md, HttpResponse response) throws UnsupportedEncodingException{
logger.trace("handlePartialWrite()");
if(md.getID()==null) {
HttpResponseWriter.printMissingID(response);
return false;
}
logger.debug("Handling a partial write for document "+md.getID());
DatabaseDocument inDB = io.getDocumentById(md.getID());
if(inDB==null) {
HttpResponseWriter.printNoDocument(response);
return false;
}
inDB.putAll(md);
if(io.update(inDB)){
HttpResponseWriter.printSaveOk(response, md.getID());
return true;
}
else {
HttpResponseWriter.printSaveFailed(response, md.getID());
return false;
}
}
private boolean handleFullUpdate(DatabaseDocument md, HttpResponse response) {
logger.trace("handleFullUpdate()");
if(io.update(md)) {
HttpResponseWriter.printSaveOk(response, md.getID());
return true;
}
HttpResponseWriter.printSaveFailed(response, md.getID());
return false;
}
private boolean handleInsert(DatabaseDocument md, HttpResponse response) {
if(io.insert(md)) {
HttpResponseWriter.printInsertOk(response, md);
return true;
}
else {
HttpResponseWriter.printInsertFailed(response);
return false;
}
}
@Override
public boolean supports(HttpRequest request) {
return RESTTools.getMethod(request) == Method.POST
&& RemotePipeline.WRITE_DOCUMENT_URL.equals(RESTTools
.getBaseUrl(request));
}
@Override
public String[] getSupportedUrls() {
return new String[] { RemotePipeline.WRITE_DOCUMENT_URL };
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy