package com.psddev.cms.db; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Date; import java.util.UUID; import com.psddev.dari.db.Modification; import com.psddev.dari.db.ObjectField; import com.psddev.dari.db.ObjectType; import com.psddev.dari.db.Query; import com.psddev.dari.db.Record; import com.psddev.dari.db.State; import com.psddev.dari.util.ObjectUtils; public class WorkflowLog extends Record { @Indexed @ToolUi.Hidden private UUID objectId; private transient Object object; @Indexed @ToolUi.Hidden private Date date; @ToolUi.Hidden private String transition; @ToolUi.Hidden private String oldWorkflowState; @ToolUi.Hidden private String newWorkflowState; @ToolUi.Hidden private String userId; @ToolUi.Placeholder("Optional Workflow Comment") private String comment; public UUID getObjectId() { return objectId; } public void setObjectId(UUID objectId) { this.objectId = objectId; this.object = null; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getTransition() { return transition; } public void setTransition(String transition) { this.transition = transition; } public String getOldWorkflowState() { return oldWorkflowState; } public void setOldWorkflowState(String oldWorkflowState) { this.oldWorkflowState = oldWorkflowState; } public String getNewWorkflowState() { return newWorkflowState; } public void setNewWorkflowState(String newWorkflowState) { this.newWorkflowState = newWorkflowState; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } /** * Returns the object. * * @return May be {@code null}. */ public Object getObject() { if (object == null) { object = Query.from(Object.class).where("_id = ?", getObjectId()).first(); } return object; } /** * Sets the object. * * @param object May be {@code null}. */ public void setObject(Object object) { if (object != null) { setObjectId(State.getInstance(object).getId()); } this.object = object; } /** * Returns the tool user that initiated the workflow transition. * * @return May be {@code null}. */ public ToolUser getUser() { return Query.from(ToolUser.class).where("_id = ?", getUserId()).first(); } /** * Returns the name of the user that initiated the workflow transition. * * @return Never blank. */ public String getUserName() { ToolUser user = getUser(); String name = user != null ? user.getLabel() : getUserId(); return ObjectUtils.isBlank(name) ? "Unknown User" : name; } /** * {@link WorkflowLog}-specific field type modification. */ @FieldInternalNamePrefix("cms.workflowLog.") public static class FieldData extends Modification<ObjectField> { private boolean persistent; public boolean isPersistent() { return persistent; } public void setPersistent(boolean persistent) { this.persistent = persistent; } } /** * Specifies that the target field should persist and copy from the * previous workflow log when a new one is created. */ @Documented @Inherited @ObjectField.AnnotationProcessorClass(PersistentProcessor.class) @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Persistent { boolean value() default true; } private static class PersistentProcessor implements ObjectField.AnnotationProcessor<Persistent> { @Override public void process(ObjectType type, ObjectField field, Persistent annotation) { field.as(FieldData.class).setPersistent(annotation.value()); } } }