package com.psddev.cms.db;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 Schedule extends Record {
public static final String FIRST_TRIGGER_EXTRA = "cms.schedule.firstTrigger";
private static final Logger LOGGER = LoggerFactory.getLogger(Schedule.class);
@Indexed(unique = true)
private String name;
private String description;
@Indexed
private Date triggerDate;
@ToolUi.Hidden
private Site triggerSite;
@ToolUi.Hidden
private ToolUser triggerUser;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getTriggerDate() {
return triggerDate;
}
public void setTriggerDate(Date triggerDate) {
this.triggerDate = triggerDate;
}
public Site getTriggerSite() {
return triggerSite;
}
public void setTriggerSite(Site triggerSite) {
this.triggerSite = triggerSite;
}
public ToolUser getTriggerUser() {
return triggerUser;
}
public void setTriggerUser(ToolUser triggerUser) {
this.triggerUser = triggerUser;
}
protected void beforeSave() {
if (ObjectUtils.isBlank(getName()) && getTriggerDate() == null) {
throw new IllegalArgumentException("Must provide either the name or the trigger date!");
}
}
/**
* @return {@code true} if this schedule was triggered.
*/
public boolean trigger() {
Date triggerDate = getTriggerDate();
if (triggerDate == null
|| !triggerDate.before(new Date())) {
return false;
}
LOGGER.debug("Triggering [{}] schedule", getLabel());
try {
beginWrites();
for (Object draftObject : Query
.fromAll()
.where("com.psddev.cms.db.Draft/schedule = ?", this)
.master()
.noCache()
.resolveInvisible()
.selectAll()) {
if (!(draftObject instanceof Draft)) {
continue;
}
Draft draft = (Draft) draftObject;
Object object = draft.recreate();
LOGGER.debug("Processing [{}] draft in [{}] schedule", draft.getLabel(), getLabel());
if (object != null) {
ToolUser triggerUser = getTriggerUser();
if (triggerUser == null) {
triggerUser = draft.as(Content.ObjectModification.class).getUpdateUser();
if (triggerUser == null) {
triggerUser = draft.getOwner();
}
}
State state = State.getInstance(object);
Content.ObjectModification contentData = state.as(Content.ObjectModification.class);
if (!state.isVisible()) {
state.getExtras().put(FIRST_TRIGGER_EXTRA, Boolean.TRUE);
contentData.setPublishDate(triggerDate);
contentData.setPublishUser(triggerUser);
}
contentData.setDraft(false);
state.as(BulkUploadDraft.class).setRunAfterSave(true);
Content.Static.publish(object, getTriggerSite(), triggerUser);
}
draft.delete();
}
delete();
commitWrites();
return true;
} finally {
endWrites();
}
}
@Override
public String getLabel() {
String name = getName();
StringBuilder label = new StringBuilder();
if (ObjectUtils.isBlank(name)) {
Date triggerDate = getTriggerDate();
label.append(triggerDate != null
? triggerDate.toString()
: getId().toString());
} else {
label.append(name);
}
long draftCount = Query
.from(Draft.class)
.where("schedule = ?", this)
.count();
if (draftCount > 1) {
label.append(" (");
label.append(draftCount);
label.append(" items)");
}
return label.toString();
}
}