package com.psddev.cms.tool;
import com.psddev.cms.db.PageFilter;
import com.psddev.cms.tool.page.content.Edit;
import com.psddev.dari.db.Query;
import com.psddev.dari.db.State;
import com.psddev.dari.util.AbstractFilter;
import com.psddev.dari.util.ObjectUtils;
import com.psddev.dari.util.TypeDefinition;
import com.psddev.dari.util.UrlBuilder;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
public class ContentEditWidgetFilter extends AbstractFilter implements AbstractFilter.Auto {
private static final String PATH = "/_content-edit-widget";
private static final String WIDGET_PARAMETER = "widget";
private static final String CONTENT_PARAMETER = "content";
private static final String PLACEMENT_PARAMETER = "placement";
public static void writeFrame(ToolPageContext page, Object content, ContentEditWidgetPlacement placement, ContentEditWidget widget) throws IOException {
page.writeStart("div", "class", "frame");
page.writeStart("a", "href", new UrlBuilder(page.getRequest())
.absolutePath(PATH)
.parameter(WIDGET_PARAMETER, widget.getClass().getName())
.parameter(CONTENT_PARAMETER, State.getInstance(content).getId())
.parameter(PLACEMENT_PARAMETER, placement.name())
.toString());
page.writeEnd();
page.writeEnd();
}
@Override
public void updateDependencies(Class<? extends AbstractFilter> filterClass, List<Class<? extends Filter>> dependencies) {
if (PageFilter.class.isAssignableFrom(filterClass)) {
dependencies.add(getClass());
}
}
@Override
protected void doRequest(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws Exception {
if (!request.getServletPath().equals(PATH)) {
chain.doFilter(request, response);
return;
}
ToolPageContext page = new ToolPageContext(getServletContext(), request, response);
Object content = Query
.fromAll()
.where("_id = ?", page.param(UUID.class, CONTENT_PARAMETER))
.first();
if (content == null) {
return;
}
Class<?> widgetClass = ObjectUtils.getClassByName(page.param(String.class, WIDGET_PARAMETER));
Edit.writeWidgetOrError(
page,
content,
ContentEditWidgetPlacement.valueOf(page.param(String.class, PLACEMENT_PARAMETER)),
(ContentEditWidget) TypeDefinition.getInstance(widgetClass).newInstance());
}
}