package com.psddev.cms.tool.page;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import com.psddev.cms.db.ContentField;
import com.psddev.cms.db.ContentType;
import com.psddev.cms.db.ToolUi;
import com.psddev.cms.tool.PageServlet;
import com.psddev.cms.tool.ToolPageContext;
import com.psddev.dari.db.Database;
import com.psddev.dari.db.ObjectField;
import com.psddev.dari.db.ObjectType;
import com.psddev.dari.db.Query;
import com.psddev.dari.util.RoutingFilter;
@RoutingFilter.Path(application = "cms", value = "adminContentTypes")
@SuppressWarnings("serial")
public class AdminContentTypes extends PageServlet {
@Override
protected String getPermissionId() {
return "area/admin/contentTypes";
}
@Override
protected void doService(ToolPageContext page) throws IOException, ServletException {
List<ObjectType> types = new ArrayList<ObjectType>(Database.Static.getDefault().getEnvironment().getTypes());
UUID selectedId = page.param(UUID.class, "typeId");
ObjectType selected = null;
ContentType sct = null;
for (ObjectType t : types) {
if (t.getId().equals(selectedId)) {
selected = t;
break;
}
}
if (selected != null) {
sct = Query.from(ContentType.class).where("internalName = ?", selected.getInternalName()).first();
if (page.isFormPost()) {
if (sct == null) {
sct = new ContentType();
sct.getState().setId(page.param(UUID.class, "id"));
}
if (page.tryStandardUpdate(sct)) {
return;
}
} else if (sct == null) {
sct = new ContentType();
sct.setDisplayName(selected.getDisplayName());
sct.setInternalName(selected.getInternalName());
}
for (ObjectField of : selected.getFields()) {
ToolUi ui = of.as(ToolUi.class);
if (!ui.isHidden()) {
boolean found = false;
for (ContentField cf : sct.getFields()) {
if (of.getInternalName().equals(cf.getInternalName())) {
found = true;
break;
}
}
if (!found) {
ContentField cf = new ContentField();
cf.setTab(ui.getTab());
cf.setDisplayName(of.getDisplayName());
cf.setInternalName(of.getInternalName());
sct.getFields().add(cf);
}
}
}
for (Iterator<ContentField> i = sct.getFields().iterator(); i.hasNext();) {
ContentField cf = i.next();
boolean found = false;
for (ObjectField of : selected.getFields()) {
if (of.getInternalName().equals(cf.getInternalName())) {
found = true;
break;
}
}
if (!found) {
i.remove();
}
}
}
Collections.sort(types);
page.writeHeader();
page.writeStart("div", "class", "withLeftNav");
page.writeStart("div", "class", "leftNav");
page.writeStart("div", "class", "widget");
page.writeStart("h1", "class");
page.writeHtml("Content Types");
page.writeEnd();
page.writeStart("ul", "class", "links");
for (ObjectType t : types) {
if (t.isAbstract()) {
continue;
}
page.writeStart("li", "class", t.equals(selected) ? "selected" : null);
page.writeStart("a", "href", page.url(null, "typeId", t.getId()));
page.writeObjectLabel(t);
page.writeEnd();
page.writeEnd();
}
page.writeEnd();
page.writeEnd();
page.writeEnd();
if (sct != null) {
page.writeStart("div", "class", "main");
page.writeStart("div", "class", "widget");
page.writeStandardForm(sct, false);
page.writeEnd();
page.writeEnd();
}
page.writeEnd();
page.writeFooter();
}
}