package cz.cuni.mff.d3s.been.hostruntime;
import cz.cuni.mff.d3s.been.cluster.action.Action;
import cz.cuni.mff.d3s.been.cluster.action.Actions;
import cz.cuni.mff.d3s.been.cluster.context.ClusterContext;
import cz.cuni.mff.d3s.been.socketworks.SocketHandlerException;
import cz.cuni.mff.d3s.been.socketworks.twoway.ReadReplyHandler;
import cz.cuni.mff.d3s.been.socketworks.twoway.Replies;
import cz.cuni.mff.d3s.been.task.checkpoints.CheckpointRequest;
import cz.cuni.mff.d3s.been.util.JsonException;
/**
* Handler of CheckPoint requests.
*
* @author Radek Mácha
*/
public class CheckpointHandler implements ReadReplyHandler {
private final ClusterContext ctx;
private final HandlerRecycler recycler;
private CheckpointHandler(ClusterContext ctx, HandlerRecycler recycler) {
this.ctx = ctx;
this.recycler = recycler;
}
/**
* Create a {@link CheckpointHandler}, providing it a way to recycle itself
* after service.
*
* @param ctx
* Current cluster context (used to listening for checkpoints)
* @param recycler
* Recycler to use after service
*
* @return The {@link CheckpointHandler}
*/
static final CheckpointHandler create(ClusterContext ctx, HandlerRecycler recycler) {
return new CheckpointHandler(ctx, recycler);
}
@Override
public String handle(String message) throws SocketHandlerException, InterruptedException {
CheckpointRequest request = null;
try {
request = CheckpointRequest.fromJson(message);
} catch (JsonException e) {
return Replies.createErrorReply("Cannot deserialize").toJson();
}
Action action = Actions.createAction(request, ctx);
return action.handle().toJson();
}
@Override
public void markAsRecyclable() {
if (recycler != null) {
recycler.recycle(this);
}
}
}