package net.johnewart.gearman.common; import com.fasterxml.jackson.annotation.JsonIgnore; import net.johnewart.gearman.constants.JobPriority; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Date; import java.util.UUID; public class Job { private static Logger LOG = LoggerFactory.getLogger(Job.class); private JobPriority priority; private boolean background; private String functionName; private String uniqueID; private String jobHandle; private byte[] data; private int numerator; private int denominator; private long timeToRun; private JobState state = JobState.QUEUED; public Job() { background = false; functionName = null; uniqueID = null; jobHandle = null; data = null; priority = JobPriority.NORMAL; timeToRun = -1; } public Job(final String functionName, final String uniqueID, final byte[] data, final JobPriority priority, boolean isBackground) { this(functionName, uniqueID, data, priority, isBackground, -1); } public Job(final String functionName, final String uniqueID, final byte[] data, final JobPriority priority, boolean isBackground, long timeToRun) { this.functionName = functionName; this.uniqueID = uniqueID; this.data = data.clone(); this.priority = priority; this.timeToRun = timeToRun; this.background = isBackground; } public Job(final String functionName, final String uniqueID, final byte[] data, final byte[] jobHandle, final JobPriority priority, boolean isBackground, long timeToRun) { this.functionName = functionName; this.uniqueID = uniqueID; this.data = data.clone(); this.priority = priority; this.timeToRun = timeToRun; this.background = isBackground; this.jobHandle = new String(jobHandle); } public Job(Job otherJob) { this.cloneOtherJob(otherJob); } protected void cloneOtherJob(Job otherJob) { this.priority = otherJob.priority; this.data = otherJob.data; this.background = otherJob.background; this.timeToRun = otherJob.timeToRun; this.uniqueID = otherJob.uniqueID; this.jobHandle = otherJob.jobHandle; this.functionName = otherJob.functionName; this.numerator = otherJob.numerator; this.denominator = otherJob.denominator; } public String getFunctionName() { return functionName; } public byte[] getData() { return this.data; } public String getJobHandle() { return this.jobHandle; } public void setJobHandle(String jobHandle) { this.jobHandle = jobHandle; } public JobPriority getPriority() { return this.priority; } public JobState getState() { return this.state; } public void setState(final JobState state) { this.state = state; } public long getTimeToRun() { return timeToRun; } public String getUniqueID() { return this.uniqueID; } public void setUniqueID(String uniqueID) { this.uniqueID = uniqueID; } public boolean isBackground() { return this.background; } public void setStatus(int numerator, int denominator) { this.numerator = numerator; this.denominator = denominator; } public int getNumerator() { return numerator; } public int getDenominator() { return denominator; } public final void complete() { this.state = JobState.COMPLETE; } @JsonIgnore public String toString() { return this.getJobHandle(); } @JsonIgnore public JobStatus getStatus() { return new JobStatus(numerator, denominator, state, jobHandle); } @JsonIgnore public boolean isReady() { return this.timeToRun < (new Date().getTime() / 1000); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Job job = (Job) o; if (background != job.background) return false; if (!Arrays.equals(data, job.data)) return false; if (functionName != null ? !functionName.equals(job.functionName) : job.functionName != null) return false; if (priority != job.priority) return false; if (uniqueID != null ? !uniqueID.equals(job.uniqueID) : job.uniqueID != null) return false; return true; } @Override public int hashCode() { int result = functionName != null ? functionName.hashCode() : 0; result = 31 * result + (uniqueID != null ? uniqueID.hashCode() : 0); return result; } public void markInProgress() { this.state = JobState.WORKING; } @JsonIgnore public boolean isRunning() { return this.state == JobState.WORKING; } public static class Builder { private Job job; public Builder() { this.job = new Job(); } public Job build() { if(job.uniqueID == null) { job.uniqueID = UUID.randomUUID().toString(); } if(job.priority == null) { job.priority = JobPriority.NORMAL; } return new Job(job); } public Builder priority(JobPriority value) { job.priority = value; return this; } public Builder data(byte[] data) { job.data = data; return this; } public Builder jobHandle(String data) { job.jobHandle = data; return this; } public Builder uniqueID(String data) { job.uniqueID = data; return this; } public Builder background(boolean data) { job.background = data; return this; } public Builder functionName(String data) { job.functionName = data; return this; } } }