package cz.cuni.mff.d3s.been.hostruntime;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cz.cuni.mff.d3s.been.cluster.context.ClusterContext;
import cz.cuni.mff.d3s.been.persistence.DAOException;
import cz.cuni.mff.d3s.been.persistence.Query;
import cz.cuni.mff.d3s.been.persistence.QuerySerializer;
import cz.cuni.mff.d3s.been.socketworks.SocketHandlerException;
import cz.cuni.mff.d3s.been.socketworks.twoway.ReadReplyHandler;
import cz.cuni.mff.d3s.been.util.JsonException;
/**
* Handler for queries into persistence layer.
*
* @author darklight
*/
public class PersistenceQueryHandler implements ReadReplyHandler {
private static final Logger log = LoggerFactory.getLogger(PersistenceQueryHandler.class);
private final ClusterContext ctx;
private final ObjectMapper om;
private final QuerySerializer querySerializer;
private final HandlerRecycler recycler;
/**
* Creates new PersistenceQueryHandler.
*
* @param ctx
* connection to the cluster
* @param om
* mapper of objects
* @param recycler
* recycler of handlers
*/
PersistenceQueryHandler(ClusterContext ctx, ObjectMapper om, HandlerRecycler recycler) {
this.ctx = ctx;
this.om = om;
this.querySerializer = new QuerySerializer();
this.recycler = recycler;
}
@Override
public String handle(String message) throws SocketHandlerException, InterruptedException {
log.debug("Got {}", message);
Query q = null;
try {
q = querySerializer.deserializeQuery(message);
} catch (JsonException e) {
throw new SocketHandlerException(String.format("Failed to deserialize query '%s'", message), e);
}
try {
final String answer = querySerializer.serializeAnswer(ctx.getPersistence().query(q));
log.debug("Replying {}", answer);
return answer;
} catch (DAOException e) {
throw new SocketHandlerException("Query failed", e);
} catch (JsonException e) {
throw new SocketHandlerException("Failed to serialize query results", e);
}
}
@Override
public void markAsRecyclable() {
if (recycler != null) {
recycler.recycle(this);
}
}
}