PageGeneratorServlet.java 7.18 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.Node
 *  javax.jcr.NodeIterator
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.servlet.Servlet
 *  javax.servlet.ServletException
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.commons.html.HtmlParser
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.siteimporter.internal.servlet;

import com.day.cq.wcm.siteimporter.ProgressTracker;
import com.day.cq.wcm.siteimporter.internal.servlet.SiteImporterServletBase;
import com.day.cq.wcm.siteimporter.internal.util.MappingDefinition;
import com.day.cq.wcm.siteimporter.internal.util.PageGenerator;
import com.day.cq.wcm.siteimporter.internal.util.Utils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.commons.html.HtmlParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0, label="Page Generator Servlet", description="Generates page components")
@Service(value={Servlet.class})
@Properties(value={@Property(name="sling.servlet.paths", propertyPrivate=1, value={"/libs/wcm/bin/siteimporter/generate"}), @Property(name="sling.servlet.methods", propertyPrivate=1, value={"POST"}), @Property(name="service.description", value={"Page Generator Servlet"})})
public class PageGeneratorServlet
extends SiteImporterServletBase {
    private static final long serialVersionUID = 7152249883673446286L;
    private static final Logger log = LoggerFactory.getLogger(PageGeneratorServlet.class);
    @Reference(policy=ReferencePolicy.STATIC)
    private HtmlParser parser;

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        String status = request.getParameter(":status");
        boolean isBrowser = status != null && status.equals("browser");
        ResourceResolver resolver = request.getResourceResolver();
        String originalHtml = request.getParameter("resource");
        Resource res = resolver.getResource(originalHtml);
        if (res != null) {
            String projectName = "";
            String projectTitle = "";
            String resourceSuperType = null;
            String charset = null;
            try {
                int respStatus;
                Node node = (Node)res.adaptTo(Node.class);
                if (node != null) {
                    Node parent = node.getParent();
                    if (parent.hasProperty("cqProjectName")) {
                        projectName = parent.getProperty("cqProjectName").getString();
                    }
                    if (parent.hasProperty("cqProjectTitle")) {
                        projectTitle = parent.getProperty("cqProjectTitle").getString();
                    }
                    if (parent.hasProperty("cqResourceSupertype")) {
                        resourceSuperType = parent.getProperty("cqResourceSupertype").getString();
                    }
                    if (parent.hasProperty("cqProjectCharset")) {
                        charset = parent.getProperty("cqProjectCharset").getString();
                    }
                }
                Map<String, MappingDefinition> mappings = this.getMappings(request);
                ProgressTracker out = this.getOutput();
                String html = Utils.readFileNode(originalHtml, resolver, out);
                PageGenerator pg = new PageGenerator(resolver, this.parser, out);
                if (pg.generate(projectName, projectTitle, html = pg.replace(projectName, html, charset, mappings), resourceSuperType, charset, true)) {
                    respStatus = 200;
                    this.storeMappings(mappings, node);
                } else {
                    respStatus = 500;
                }
                this.sendResponse(respStatus, out.toString(), response, isBrowser);
            }
            catch (Exception e) {
                log.error("Could not generate page component", (Throwable)e);
                this.sendResponse(500, "Could not generate page component", response, isBrowser);
            }
        } else {
            this.sendResponse(500, "Original HTML could not be found", response, isBrowser);
        }
    }

    private void storeMappings(Map<String, MappingDefinition> mappings, Node node) throws RepositoryException {
        Node parent = node.getParent();
        Node mappingsParent = parent.hasNode("mappings") ? parent.getNode("mappings") : parent.addNode("mappings", "nt:unstructured");
        NodeIterator kids = mappingsParent.getNodes();
        while (kids.hasNext()) {
            Node kid = kids.nextNode();
            kid.remove();
        }
        mappingsParent.getSession().save();
        Set<String> keys = mappings.keySet();
        for (String id : keys) {
            MappingDefinition def = mappings.get(id);
            Node mapping = mappingsParent.hasNode(id) ? mappingsParent.getNode(id) : mappingsParent.addNode(id);
            mapping.setProperty("component", def.getResourceType());
            mapping.setProperty("path", def.getPath());
        }
        parent.getSession().save();
    }

    private Map<String, MappingDefinition> getMappings(SlingHttpServletRequest request) {
        HashMap<String, MappingDefinition> mappings = new HashMap<String, MappingDefinition>();
        String mappingsParam = request.getParameter("mappings");
        if (mappingsParam != null && !mappingsParam.equals("")) {
            for (String item : mappingsParam.split(":")) {
                String[] mapping = item.split("=");
                String[] mDef = mapping[1].split(",");
                mappings.put(mapping[0], new MappingDefinition(mDef[0], mDef[1]));
            }
        }
        return mappings;
    }

    protected void bindParser(HtmlParser htmlParser) {
        this.parser = htmlParser;
    }

    protected void unbindParser(HtmlParser htmlParser) {
        if (this.parser == htmlParser) {
            this.parser = null;
        }
    }
}