package net.johnewart.gearman.common.packets; import com.google.common.primitives.Ints; import net.johnewart.gearman.common.packets.request.*; import net.johnewart.gearman.common.packets.response.EchoResponse; import net.johnewart.gearman.common.packets.response.JobAssign; import net.johnewart.gearman.common.packets.response.JobAssignUniq; import net.johnewart.gearman.common.packets.response.JobCreated; import net.johnewart.gearman.common.packets.response.NoJob; import net.johnewart.gearman.common.packets.response.NoOp; import net.johnewart.gearman.common.packets.response.StatusRes; import net.johnewart.gearman.common.packets.response.WorkCompleteResponse; import net.johnewart.gearman.common.packets.response.WorkDataResponse; import net.johnewart.gearman.common.packets.response.WorkExceptionResponse; import net.johnewart.gearman.common.packets.response.WorkFailResponse; import net.johnewart.gearman.common.packets.response.WorkStatus; import net.johnewart.gearman.common.packets.response.WorkWarningResponse; import net.johnewart.gearman.constants.PacketType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; public class PacketFactory { private static final Logger LOG = LoggerFactory.getLogger(PacketFactory.class); public static Packet packetFromBytes(byte[] packetBytes) { byte[] sizebytes = Arrays.copyOfRange(packetBytes, 8, 12); byte[] typebytes = Arrays.copyOfRange(packetBytes, 4, 8); byte[] magicbytes = Arrays.copyOfRange(packetBytes, 0, 4); int messagesize = Ints.fromByteArray(sizebytes); int messagetype = Ints.fromByteArray(typebytes); PacketType packetType = PacketType.fromPacketMagicNumber(messagetype); switch(packetType) { case JOB_CREATED: return new JobCreated(packetBytes); case WORK_DATA: return new WorkDataResponse(packetBytes); case WORK_WARNING: return new WorkWarningResponse(packetBytes); case WORK_STATUS: return new WorkStatus(packetBytes); case WORK_COMPLETE: return new WorkCompleteResponse(packetBytes); case WORK_FAIL: return new WorkFailResponse(packetBytes); case WORK_EXCEPTION: return new WorkExceptionResponse(packetBytes); case STATUS_RES: return new StatusRes(packetBytes); case GET_STATUS: return new GetStatus(packetBytes); /* Worker response packets */ case NOOP: return new NoOp(); case NO_JOB: return new NoJob(); case JOB_ASSIGN: return new JobAssign(packetBytes); case JOB_ASSIGN_UNIQ: return new JobAssignUniq(packetBytes); /* Worker request packets */ case RESET_ABILITIES: return new ResetAbilities(packetBytes); case CAN_DO_TIMEOUT: return new CanDoTimeout(packetBytes); case CANT_DO: return new CantDo(packetBytes); case CAN_DO: return new CanDo(packetBytes); case GRAB_JOB: return new GrabJob(packetBytes); case GRAB_JOB_UNIQ: return new GrabJobUniq(packetBytes); case GRAB_JOB_ALL: return new GrabJobAll(packetBytes); case PRE_SLEEP: return new PreSleep(packetBytes); case SET_CLIENT_ID: return new SetClientId(packetBytes); /* Client request packets */ case SUBMIT_JOB: case SUBMIT_JOB_HIGH: case SUBMIT_JOB_LOW: case SUBMIT_JOB_BG: case SUBMIT_JOB_HIGH_BG: case SUBMIT_JOB_LOW_BG: case SUBMIT_JOB_SCHED: case SUBMIT_JOB_EPOCH: return new SubmitJob(packetBytes); case ECHO_REQ: return new EchoRequest(packetBytes); case ECHO_RES: return new EchoResponse(packetBytes); /* TODO: Handle these. */ case OPTION_REQ: return new OptionRequest(packetBytes); case ERROR: default: LOG.error("Unhandled type: ", messagetype); return null; } } }