package com.psddev.cms.tool.page;
import com.psddev.cms.db.Content;
import com.psddev.cms.db.Site;
import com.psddev.cms.db.ToolUser;
import com.psddev.dari.db.Query;
import com.psddev.dari.db.Record;
import com.psddev.dari.db.State;
import com.psddev.dari.util.CompactMap;
import com.psddev.dari.util.Task;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public class ContentEditBulkSubmission extends Record {
@Indexed
private Site submitSite;
@Indexed
private ToolUser submitUser;
@Indexed
private Date submitDate = new Date();
private Query<?> query;
private long count;
private Map<String, Object> replaces;
private Map<String, Object> adds;
private Map<String, Object> removes;
private Set<String> clears;
private Map<String, ContentEditBulkSubmissionError> errors;
private long successes;
private long failures;
@Indexed
private Date finishDate;
public Site getSubmitSite() {
return submitSite;
}
public void setSubmitSite(Site submitSite) {
this.submitSite = submitSite;
}
public ToolUser getSubmitUser() {
return submitUser;
}
public void setSubmitUser(ToolUser submitUser) {
this.submitUser = submitUser;
}
public Date getSubmitDate() {
return submitDate;
}
public void setSubmitDate(Date submitDate) {
this.submitDate = submitDate;
}
public Query<?> getQuery() {
return query;
}
public void setQuery(Query<?> query) {
this.query = query;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
public Map<String, Object> getReplaces() {
if (replaces == null) {
replaces = new CompactMap<>();
}
return replaces;
}
public void setReplaces(Map<String, Object> replaces) {
this.replaces = replaces;
}
public Map<String, Object> getAdds() {
if (adds == null) {
adds = new CompactMap<>();
}
return adds;
}
public void setAdds(Map<String, Object> adds) {
this.adds = adds;
}
public Map<String, Object> getRemoves() {
if (removes == null) {
removes = new CompactMap<>();
}
return removes;
}
public void setRemoves(Map<String, Object> removes) {
this.removes = removes;
}
public Set<String> getClears() {
if (clears == null) {
clears = new LinkedHashSet<>();
}
return clears;
}
public void setClears(Set<String> clears) {
this.clears = clears;
}
public Map<String, ContentEditBulkSubmissionError> getErrors() {
if (errors == null) {
errors = new CompactMap<>();
}
return errors;
}
public void setErrors(Map<String, ContentEditBulkSubmissionError> errors) {
this.errors = errors;
}
public long getSuccesses() {
return successes;
}
public void setSuccesses(long successes) {
this.successes = successes;
}
public long getFailures() {
return failures;
}
public void setFailures(long failures) {
this.failures = failures;
}
public Date getFinishDate() {
return finishDate;
}
public void setFinishDate(Date finishDate) {
this.finishDate = finishDate;
}
public void submitTask() {
save();
new ContentEditBulkTask().submit();
}
private class ContentEditBulkTask extends Task {
public ContentEditBulkTask() {
super("Content Edit Bulk", "");
}
@Override
@SuppressWarnings("unchecked")
protected void doTask() {
try {
Site site = getSubmitSite();
ToolUser user = getSubmitUser();
Map<String, Object> replaces = getReplaces();
Map<String, Object> adds = getAdds();
Map<String, Object> removes = getRemoves();
Set<String> clears = getClears();
Map<String, ContentEditBulkSubmissionError> errors = getErrors();
for (Iterator<?> i = getQuery().iterable(0).iterator(); shouldContinue() && i.hasNext();) {
Object item = i.next();
State itemState = State.getInstance(item);
itemState.putAll(replaces);
for (Map.Entry<String, Object> entry : adds.entrySet()) {
String fieldName = entry.getKey();
Object newValue = entry.getValue();
Object oldValue = itemState.get(fieldName);
if (oldValue instanceof Map) {
if (newValue instanceof Map) {
((Map<Object, Object>) oldValue).putAll((Map<Object, Object>) newValue);
} else if (newValue instanceof Collection) {
((Map<Object, Object>) oldValue).keySet().addAll((Collection<Object>) newValue);
}
} else if (oldValue instanceof Collection) {
if (newValue instanceof Map) {
((Collection<Object>) oldValue).addAll(((Map<Object, Object>) newValue).values());
} else if (newValue instanceof Collection) {
((Collection<Object>) oldValue).addAll((Collection<Object>) newValue);
} else {
((Collection<Object>) oldValue).add(newValue);
}
} else {
itemState.put(fieldName, newValue);
}
}
for (Map.Entry<String, Object> entry : removes.entrySet()) {
String fieldName = entry.getKey();
Object newValue = entry.getValue();
Object oldValue = itemState.get(fieldName);
if (oldValue instanceof Map) {
if (newValue instanceof Map) {
((Map<Object, Object>) oldValue).keySet().removeAll(((Map<Object, Object>) newValue).keySet());
} else if (newValue instanceof Collection) {
((Map<Object, Object>) oldValue).keySet().removeAll((Collection<Object>) newValue);
}
} else if (oldValue instanceof Collection) {
if (newValue instanceof Map) {
((Collection<Object>) oldValue).removeAll(((Map<Object, Object>) newValue).values());
} else if (newValue instanceof Collection) {
((Collection<Object>) oldValue).removeAll((Collection<Object>) newValue);
} else {
((Collection<Object>) oldValue).remove(newValue);
}
}
}
for (String clear : clears) {
itemState.remove(clear);
}
try {
Content.Static.publish(item, site, user);
setSuccesses(getSuccesses() + 1);
} catch (Exception error) {
setFailures(getFailures() + 1);
String key = error.getClass().getSimpleName() + "-" + error.getStackTrace()[0].toString();
if (!errors.containsKey(key)) {
ContentEditBulkSubmissionError editBulkSubmissionError = new ContentEditBulkSubmissionError();
editBulkSubmissionError.setErrorLabel(key);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
error.printStackTrace(pw);
editBulkSubmissionError.setStackTrace(sw.toString());
editBulkSubmissionError.save();
errors.put(key, editBulkSubmissionError);
setErrors(errors);
}
}
save();
}
} finally {
setFinishDate(new Date());
save();
}
}
}
}