package com.psddev.cms.tool.page;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import com.psddev.cms.db.Content;
import com.psddev.cms.tool.CmsTool;
import com.psddev.cms.tool.PageServlet;
import com.psddev.cms.tool.SearchResultSelection;
import com.psddev.cms.tool.SearchResultSelectionGeneratable;
import com.psddev.cms.tool.ToolPageContext;
import com.psddev.dari.db.ObjectField;
import com.psddev.dari.db.ObjectType;
import com.psddev.dari.db.Query;
import com.psddev.dari.db.State;
import com.psddev.dari.util.ObjectUtils;
import com.psddev.dari.util.RoutingFilter;
@RoutingFilter.Path(application = "cms", value = CreateDraft.PATH)
public class CreateDraft extends PageServlet {
public static final String PATH = "/createDraft";
private static final long serialVersionUID = 1L;
@Override
protected String getPermissionId() {
return null;
}
@Override
protected void doService(ToolPageContext page) throws IOException, ServletException {
String typeIdAndField = page.param(String.class, "typeIdAndField");
int commaAt = typeIdAndField.indexOf(',');
ObjectType type = ObjectType.getInstance(ObjectUtils.to(UUID.class, commaAt == -1 ? typeIdAndField : typeIdAndField.substring(0, commaAt)));
ObjectField field = commaAt == -1 ? null : type.getField(typeIdAndField.substring(commaAt + 1));
UUID selectionId = page.param(UUID.class, "selectionId");
Object draftObject = type.createObject(null);
SearchResultSelection selection = Query.findById(SearchResultSelection.class, selectionId);
State state = State.getInstance(draftObject);
if (field != null) {
List<Object> items = selection.createItemsQuery()
.referenceOnly()
.selectAll();
state.put(field.getInternalName(), items.size() == 1 ? items.get(0) : items);
} else if (draftObject instanceof SearchResultSelectionGeneratable) {
// populate the new object using the SelectionGeneratable interface method, "fromSelection"
((SearchResultSelectionGeneratable) draftObject).fromSelection(Query.findById(SearchResultSelection.class, selectionId));
}
state.as(Content.ObjectModification.class).setDraft(true);
state.getExtras().put(SearchResultSelectionGeneratable.Data.IGNORE_VALIDATION_EXTRA, true);
Content.Static.publish(state, page.getUser().getCurrentSite(), page.getUser());
page.getUser().deactivateSelection(Query.from(SearchResultSelection.class).where("_id = ?", selectionId).first());
page.getResponse().sendRedirect(
page.toolUrl(CmsTool.class, "/content/edit.jsp",
"id", state.getId()));
}
}