CanvasBuilderHelper.java 13.7 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.jcr.JcrUtil
 *  com.day.cq.dam.indd.PageComponent
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.wcm.api.designer.Designer
 *  javax.jcr.Node
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Value
 *  org.apache.commons.collections.map.CaseInsensitiveMap
 *  org.apache.commons.lang.StringUtils
 *  org.apache.jackrabbit.commons.JcrUtils
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.osgi.service.event.Event
 *  org.osgi.service.event.EventHandler
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.designimporter.impl;

import com.day.cq.commons.jcr.JcrUtil;
import com.day.cq.dam.indd.PageComponent;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.designer.Designer;
import com.day.cq.wcm.designimporter.DesignImporterContext;
import com.day.cq.wcm.designimporter.impl.common.PathSchemeHelper;
import com.day.cq.wcm.designimporter.parser.HTMLContentType;
import com.day.cq.wcm.designimporter.parser.ModifiableHTMLContent;
import com.day.cq.wcm.designimporter.parser.ParseResult;
import com.day.cq.wcm.designimporter.util.ImageMapExtractor;
import com.day.cq.wcm.designimporter.util.ImporterUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.apache.commons.lang.StringUtils;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CanvasBuilderHelper
implements EventHandler {
    private static final String ROBOTS_META_TAG = "robots";
    private static final String EVENTPROP_DESIGN_IMPORTER_CONTEXT = "designImporterContext";
    private static final String EVENTPROP_PARSE_RESULT = "parseResult";
    private static final String EVENTPROP_CANVAS = "canvas";
    private static final String IMAGE_MAP_PROPERTY = "imageMap";
    private static final String RESOURCE_TYPE_IMAGE = "foundation/components/image";
    private Logger logger = LoggerFactory.getLogger(CanvasBuilderHelper.class);

    public void handleEvent(Event event) {
        DesignImporterContext designImporterContext = (DesignImporterContext)event.getProperty("designImporterContext");
        ParseResult parseResult = (ParseResult)event.getProperty("parseResult");
        Resource canvas = (Resource)event.getProperty("canvas");
        Resource importer = designImporterContext.getImporter();
        if (event.getTopic().equals("com/day/cq/wcm/designimporter/CanvasPageBuilder/PARSE_COMPLETE")) {
            this.setPageComponentNameHints(parseResult.getComponents());
            this.setImagemapsProperty(parseResult, designImporterContext);
        }
        if (event.getTopic().equals("com/day/cq/wcm/designimporter/CanvasPageBuilder/COMPONENT_TREE_BUILT")) {
            this.updateScriptComponentNames(designImporterContext, parseResult);
            if (ImporterUtil.isImporterPage(importer)) {
                this.setPageProperties(designImporterContext, parseResult);
                this.addDesignViewComponents(designImporterContext, parseResult);
            }
        }
        if (event.getTopic().equals("com/day/cq/wcm/designimporter/CanvasPageBuilder/COMPLETE")) {
            this.resetCanvasArtifactsPendingDeactivate(designImporterContext);
            this.setOwnerCanvasPage(designImporterContext, canvas);
        }
    }

    private void setImagemapsProperty(ParseResult parseResult, DesignImporterContext designImporterContext) {
        String strHtml = (String)parseResult.getBodyHtmlContent().get(HTMLContentType.MARKUP);
        Map<String, String> metadataMap = ImageMapExtractor.getImagemapsMap(strHtml, designImporterContext);
        ArrayList<String> usedMaps = new ArrayList<String>();
        if (metadataMap != null) {
            PageComponent component = parseResult.getComponents().get(0);
            this.fillImageMap(component, metadataMap, usedMaps);
        }
        String updatedHtml = ImageMapExtractor.getFinalHtml(strHtml, usedMaps);
        parseResult.getBodyHtmlContent().set(HTMLContentType.MARKUP, updatedHtml);
    }

    private void fillImageMap(PageComponent component, Map<String, String> metadataMap, List<String> usedMaps) {
        ValueMap properties;
        List childComponents;
        if (component == null) {
            return;
        }
        if (component.getResourceType().equals("foundation/components/image") && (properties = component.getProperties()).containsKey((Object)"imageMap")) {
            String mapVal = metadataMap.get(properties.get((Object)"imageMap"));
            if (StringUtils.isEmpty((String)mapVal)) {
                properties.remove((Object)"imageMap");
            } else {
                usedMaps.add(properties.get((Object)"imageMap").toString());
                properties.put((Object)"imageMap", (Object)mapVal);
            }
        }
        if ((childComponents = component.getChildComponents()) != null) {
            for (PageComponent childComponent : childComponents) {
                this.fillImageMap(childComponent, metadataMap, usedMaps);
            }
        }
    }

    private void resetCanvasArtifactsPendingDeactivate(DesignImporterContext designImporterContext) {
        try {
            Page currentPage = designImporterContext.currentPage;
            String compPath = PathSchemeHelper.getCanvasComponentPath(designImporterContext);
            String desPath = PathSchemeHelper.getCanvasDesignPath(designImporterContext);
            Node contentNode = (Node)currentPage.getContentResource().adaptTo(Node.class);
            String prop = "cq:canvasArtifactsPendingDeactivate";
            if (contentNode.hasProperty(prop)) {
                Value[] values = contentNode.getProperty(prop).getValues();
                LinkedList<String> newValues = new LinkedList<String>();
                for (Value v : values) {
                    String strVal = v.getString();
                    if (strVal.equals(compPath) || strVal.equals(desPath)) continue;
                    newValues.add(strVal);
                }
                if (newValues.size() == 0) {
                    contentNode.getProperty(prop).remove();
                } else {
                    JcrUtil.setProperty((Node)contentNode, (String)prop, (Object)newValues.toArray());
                }
                contentNode.getSession().save();
            }
        }
        catch (RepositoryException e) {
            e.printStackTrace();
        }
    }

    private void updateScriptComponentNames(DesignImporterContext designImporterContext, ParseResult parseResult) {
        Page currPage = designImporterContext.currentPage;
        ModifiableHTMLContent bodyHtmlContent = parseResult.getBodyHtmlContent();
        String componentHtml = (String)bodyHtmlContent.get(HTMLContentType.MARKUP);
        try {
            String updatedHtml = this.resetComponentName(currPage, componentHtml);
            bodyHtmlContent.set(HTMLContentType.MARKUP, updatedHtml);
        }
        catch (RepositoryException updatedHtml) {
            // empty catch block
        }
    }

    private void setPageComponentNameHints(List<PageComponent> components) {
        for (PageComponent pageComponent : components) {
            ValueMap properties = pageComponent.getProperties();
            if (pageComponent.getNameHint() != null) {
                properties.put((Object)"cq:importNameHint", (Object)pageComponent.getNameHint());
            }
            if (pageComponent.getChildComponents() == null || pageComponent.getChildComponents().isEmpty()) continue;
            this.setPageComponentNameHints(pageComponent.getChildComponents());
        }
    }

    private String resetComponentName(Page resultPage, String html) throws RepositoryException {
        Resource importer = ImporterUtil.findImporter((Resource)resultPage.adaptTo(Resource.class));
        Resource canvas = ImporterUtil.getCanvas(importer);
        String updatedHtml = html;
        if (canvas != null) {
            String cqNameHint = "cq:importNameHint";
            Iterator iterator = canvas.listChildren();
            while (iterator.hasNext()) {
                Resource child = (Resource)iterator.next();
                ValueMap properties = (ValueMap)child.adaptTo(ValueMap.class);
                if (!properties.containsKey((Object)"cq:importNameHint")) continue;
                String nameHint = (String)properties.get((Object)"cq:importNameHint");
                String includeTagString = "<sling:include path=\"" + nameHint + "\"";
                String replacementString = "<sling:include path=\"" + child.getName() + "\"";
                updatedHtml = updatedHtml.replace(includeTagString, replacementString);
            }
        }
        return updatedHtml;
    }

    private void setPageProperties(DesignImporterContext designImporterContext, ParseResult parseResult) {
        try {
            Page page = designImporterContext.currentPage;
            ModifiableHTMLContent headHtmlContent = parseResult.getHeadHtmlContent();
            if (headHtmlContent != null) {
                Resource pageContentResource;
                CaseInsensitiveMap metadata = new CaseInsensitiveMap((Map)headHtmlContent.get(HTMLContentType.META));
                if (metadata == null || metadata.containsKey("title")) {
                    // empty if block
                }
                if ((pageContentResource = page.getContentResource()) != null) {
                    Node pageNode = (Node)pageContentResource.adaptTo(Node.class);
                    JcrUtil.setProperty((Node)pageNode, (String)"jcr:description", metadata.get("description"));
                    JcrUtil.setProperty((Node)pageNode, (String)"jcr:language", (Object)parseResult.getLanguage());
                    if (metadata.get("robots") != null) {
                        JcrUtil.setProperty((Node)pageNode, (String)"robots", metadata.get("robots"));
                    }
                }
            }
        }
        catch (RepositoryException e) {
            this.logger.warn("An error occurred while setting page properties after design import", (Throwable)e);
        }
    }

    private void addDesignViewComponents(DesignImporterContext designImporterContext, ParseResult parseResult) {
        Resource resource = designImporterContext.getImporter();
        ResourceResolver resourceResolver = resource.getResourceResolver();
        Session session = (Session)resourceResolver.adaptTo(Session.class);
        PageManager pageManager = (PageManager)resourceResolver.adaptTo(PageManager.class);
        Page page = pageManager.getContainingPage(resource);
        Designer designer = (Designer)resourceResolver.adaptTo(Designer.class);
        String designPath = designer.getDesignPath(page);
        try {
            Node pageDesignNode = session.getNode(designPath);
            List<PageComponent> components = parseResult.getComponents();
            this.setupDesignRecursive(pageDesignNode, components);
        }
        catch (RepositoryException e) {
            this.logger.warn("An error occurred while adding page components to design view", (Throwable)e);
        }
    }

    private void setupDesignRecursive(Node designNode, List<PageComponent> components) throws RepositoryException {
        for (PageComponent component : components) {
            if (component.getResourceType().equals("foundation/components/parsys")) {
                String parName = component.getNameHint();
                Node designJcrContent = JcrUtils.getOrAddNode((Node)designNode, (String)"jcr:content");
                Node par = JcrUtil.createPath((Node)designJcrContent, (String)("page/importer/canvas/" + parName), (boolean)true, (String)"{http://www.jcp.org/jcr/nt/1.0}unstructured", (String)"{http://www.jcp.org/jcr/nt/1.0}unstructured", (Session)designNode.getSession(), (boolean)true);
                JcrUtil.setProperty((Node)par, (String)"components", (Object)new String[]{"group:General", "group:Call To Action", "group:Form", "group:CTA-Lead-Form"});
            }
            this.setupDesignRecursive(designNode, component.getChildComponents());
        }
    }

    private void setOwnerCanvasPage(DesignImporterContext designImporterContext, Resource canvas) {
        try {
            Node canvasDesign;
            Node designContentNode;
            String ownerPage = designImporterContext.currentPage.getPath();
            if (ImporterUtil.checkCanvasPrimary(canvas) && (designContentNode = (canvasDesign = designImporterContext.designNode).getNode("jcr:content")) != null) {
                JcrUtil.setProperty((Node)designContentNode, (String)"cq:ownerCanvasPage", (Object)ownerPage);
            }
            String canvasComponentPath = PathSchemeHelper.getCanvasComponentPath(canvas);
            Resource canvasComponent = canvas.getResourceResolver().resolve(canvasComponentPath);
            Node canvasComponentNode = (Node)canvasComponent.adaptTo(Node.class);
            JcrUtil.setProperty((Node)canvasComponentNode, (String)"cq:ownerCanvasPage", (Object)ownerPage);
        }
        catch (RepositoryException e) {
            this.logger.warn("An error occurred while setting the own canvas page", (Throwable)e);
        }
    }
}