package fr.openwide.core.jpa.more.business.task.model; import java.text.SimpleDateFormat; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Version; import org.bindgen.Bindable; import org.hibernate.annotations.Type; import org.hibernate.search.annotations.Analyzer; import org.hibernate.search.annotations.DocumentId; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Fields; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.SortableField; import org.springframework.core.style.ToStringCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import fr.openwide.core.commons.util.CloneUtils; import fr.openwide.core.jpa.business.generic.model.GenericEntity; import fr.openwide.core.jpa.more.business.task.util.TaskResult; import fr.openwide.core.jpa.more.business.task.util.TaskStatus; import fr.openwide.core.jpa.search.util.HibernateSearchAnalyzer; @Entity @Bindable @Indexed public class QueuedTaskHolder extends GenericEntity<Long, QueuedTaskHolder> { private static final long serialVersionUID = 3926959721176678607L; public static final String NAME_SORT_FIELD_NAME = "nameSort"; @Id @GeneratedValue @DocumentId private Long id; @Column(nullable = false) @Fields({ @Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT)), @Field(name = NAME_SORT_FIELD_NAME, analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT_SORT)) }) @SortableField(forField = NAME_SORT_FIELD_NAME) @Type(type = "fr.openwide.core.jpa.hibernate.usertype.StringClobType") private String name; @Column(nullable = true) @Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.KEYWORD), indexNullAs = Field.DEFAULT_NULL_TOKEN) private String queueId; @Column(nullable = false) @Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.KEYWORD)) private String taskType; @Column(nullable = false) @Field private Date creationDate; @Field private Date triggeringDate = null; @Field private Date startDate = null; @Field private Date endDate = null; @Version @Column(name = "optLock") private int version; @Column(nullable = false) @Type(type = "fr.openwide.core.jpa.hibernate.usertype.StringClobType") private String serializedTask; @Column(nullable = false) @Enumerated(EnumType.STRING) @Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.KEYWORD)) private TaskStatus status; @Column @Enumerated(EnumType.STRING) @Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.KEYWORD)) private TaskResult result; @Column @Type(type = "fr.openwide.core.jpa.hibernate.usertype.StringClobType") private String stackTrace; @Column @Type(type = "fr.openwide.core.jpa.hibernate.usertype.StringClobType") private String report; protected QueuedTaskHolder() { } public QueuedTaskHolder(String name, String queueId, String taskType, String serializedTask) { super(); setName(name); setQueueId(queueId); setTaskType(taskType); setSerializedTask(serializedTask); setStatus(TaskStatus.TO_RUN); } @Override public Long getId() { return id; } @Override public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getQueueId() { return queueId; } public void setQueueId(String queueId) { this.queueId = queueId; } public String getTaskType() { return taskType; } public void setTaskType(String taskType) { this.taskType = taskType; } public Date getCreationDate() { return CloneUtils.clone(creationDate); } public void setCreationDate(Date creationDate) { this.creationDate = CloneUtils.clone(creationDate); } public Date getTriggeringDate() { return CloneUtils.clone(triggeringDate); } public void setTriggeringDate(Date triggeringDate) { this.triggeringDate = CloneUtils.clone(triggeringDate); } public Date getStartDate() { return CloneUtils.clone(startDate); } public void setStartDate(Date startDate) { this.startDate = CloneUtils.clone(startDate); } public Date getEndDate() { return CloneUtils.clone(endDate); } public void setEndDate(Date completionDate) { this.endDate = CloneUtils.clone(completionDate); } public String getSerializedTask() { return serializedTask; } public void setSerializedTask(String serializedTask) { this.serializedTask = serializedTask; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public TaskStatus getStatus() { return status; } public void setStatus(TaskStatus status) { this.status = status; } public TaskResult getResult() { return result; } public void setResult(TaskResult result) { this.result = result; } public String getStackTrace() { return stackTrace; } public void setStackTrace(String stackTrace) { this.stackTrace = stackTrace; } public String getReport() { return report; } public void setReport(String report) { this.report = report; } @JsonIgnore public void resetExecutionInformation() { setResult(null); setStackTrace(null); setReport(null); } @JsonIgnore public void updateExecutionInformation(TaskExecutionResult executionResult, ObjectMapper objectMapper) throws JsonProcessingException { if (executionResult != null) { setResult(executionResult.getResult()); setStackTrace(executionResult.getStackTrace()); setReport(objectMapper.writeValueAsString(executionResult.getReport())); } } @Override public String getNameForToString() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z"); return new ToStringCreator(this) .append("id", getId()) .append("name", getName()) .append("creationDate", (getCreationDate() != null) ? dateFormat.format(getCreationDate()) : null) .append("startDate", (getStartDate() != null) ? dateFormat.format(getStartDate()) : null) .append("completionDate", (getEndDate() != null) ? dateFormat.format(getEndDate()) : null) .toString(); } @Override public String getDisplayName() { return getName(); } }