CanvasBuilderImpl.java 13.8 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.dam.indd.PageBuilder
 *  com.day.cq.dam.indd.PageBuilderFactory
 *  com.day.cq.dam.indd.PageComponent
 *  javax.jcr.Node
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  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.Service
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.commons.osgi.OsgiUtil
 *  org.osgi.framework.BundleContext
 *  org.osgi.framework.ServiceRegistration
 *  org.osgi.service.component.ComponentContext
 *  org.osgi.service.event.Event
 *  org.osgi.service.event.EventAdmin
 *  org.osgi.service.event.EventHandler
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.designimporter.impl;

import com.day.cq.dam.indd.PageBuilder;
import com.day.cq.dam.indd.PageBuilderFactory;
import com.day.cq.dam.indd.PageComponent;
import com.day.cq.wcm.designimporter.CanvasBuildOptions;
import com.day.cq.wcm.designimporter.DesignImportException;
import com.day.cq.wcm.designimporter.DesignImporterContext;
import com.day.cq.wcm.designimporter.api.CanvasBuilder;
import com.day.cq.wcm.designimporter.api.TagHandlerProvider;
import com.day.cq.wcm.designimporter.impl.CanvasBuilderHelper;
import com.day.cq.wcm.designimporter.impl.common.PathSchemeHelper;
import com.day.cq.wcm.designimporter.parser.DesignImporterHTMLParser;
import com.day.cq.wcm.designimporter.parser.HTMLContent;
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.parser.taghandlers.CanvasComponentBuilder;
import com.day.cq.wcm.designimporter.parser.taghandlers.ClientLibsBuilderImpl;
import com.day.cq.wcm.designimporter.util.ComponentUtil;
import com.day.cq.wcm.designimporter.util.ImporterUtil;
import com.day.cq.wcm.designimporter.util.TagUtils;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
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.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.commons.osgi.OsgiUtil;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=1)
@Service
@Properties(value={@Property(name="filepattern", value={"(?i)index\\.html?"}), @Property(name="service.ranking", intValue={5100})})
public class CanvasBuilderImpl
implements CanvasBuilder {
    public static final String INDEX_HTML_FILE_PATTERN = "(?i)index\\.html?";
    @Property(boolValue={1})
    private static final String BUILD_PAGE_NODES = "build.page.nodes";
    @Property(boolValue={1})
    private static final String BUILD_CLIENT_LIBS = "build.client.libs";
    @Property(boolValue={1})
    private static final String BUILD_CANVAS_COMPONENT = "build.canvas.component";
    private static final String CLIENTLIB_NAME_SUFFIX = "clientlibs";
    private CanvasBuildOptions defaultPageBuildOptions;
    @Reference
    protected PageBuilderFactory pageBuilderFactory;
    @Reference
    protected TagHandlerProvider tagHandlerProvider;
    @Reference
    protected EventAdmin eventAdmin;
    protected Logger logger = LoggerFactory.getLogger(CanvasBuilderImpl.class);

    @Override
    public void build(InputStream htmlStream, DesignImporterContext designImporterContext) throws RepositoryException, DesignImportException {
        this.build(htmlStream, designImporterContext, null);
    }

    @Override
    public void build(InputStream htmlStream, DesignImporterContext designImporterContext, CanvasBuildOptions buildOptions) throws RepositoryException, DesignImportException {
        if (buildOptions == null) {
            buildOptions = this.defaultPageBuildOptions;
        }
        designImporterContext.setAttribute("buildOptions", buildOptions);
        designImporterContext.setAttribute("timestamp", new Date().getTime());
        this.decideAndSetNames(designImporterContext);
        Hashtable<String, Object> eventProperties = new Hashtable<String, Object>();
        eventProperties.put("designImporterContext", designImporterContext);
        this.eventAdmin.sendEvent(new Event("com/day/cq/wcm/designimporter/CanvasPageBuilder/STARTING", eventProperties));
        ParseResult parseResult = this.parse(htmlStream, designImporterContext);
        eventProperties.put("parseResult", parseResult);
        this.eventAdmin.sendEvent(new Event("com/day/cq/wcm/designimporter/CanvasPageBuilder/PARSE_COMPLETE", eventProperties));
        if (buildOptions.isBuildPageNodes()) {
            Resource canvas = this.buildComponentTree(designImporterContext, parseResult);
            eventProperties.put("canvas", (Object)canvas);
            this.eventAdmin.sendEvent(new Event("com/day/cq/wcm/designimporter/CanvasPageBuilder/COMPONENT_TREE_BUILT", eventProperties));
        }
        if (buildOptions.isBuildCanvasComponent()) {
            this.buildCanvasComponentScript(designImporterContext, parseResult);
            this.eventAdmin.sendEvent(new Event("com/day/cq/wcm/designimporter/CanvasPageBuilder/CANVAS_SCRIPT_BUILT", eventProperties));
        }
        if (buildOptions.isBuildClientLibs()) {
            this.buildClientLibs(designImporterContext, parseResult);
            this.eventAdmin.sendEvent(new Event("com/day/cq/wcm/designimporter/CanvasPageBuilder/CLIENTLIBS_BUILT", eventProperties));
        }
        this.eventAdmin.sendEvent(new Event("com/day/cq/wcm/designimporter/CanvasPageBuilder/COMPLETE", eventProperties));
    }

    protected ParseResult parse(InputStream htmlStream, DesignImporterContext designImporterContext) throws DesignImportException {
        DesignImporterHTMLParser designImporterHTMLParser = new DesignImporterHTMLParser();
        designImporterHTMLParser.setTagHandlerProvider(this.tagHandlerProvider);
        designImporterHTMLParser.setDesignImporterContext(designImporterContext);
        designImporterHTMLParser.setCanvasResourceType((String)designImporterContext.getAttribute("canvasResourceType"));
        Resource resource = designImporterContext.getImporter();
        PageBuilder pageBuilder = this.pageBuilderFactory.getPageBuilder(resource.getResourceResolver());
        return designImporterHTMLParser.parse(htmlStream, pageBuilder);
    }

    protected Resource buildComponentTree(DesignImporterContext designImporterContext, ParseResult parseResult) throws RepositoryException {
        List<PageComponent> components = parseResult.getComponents();
        Resource resource = designImporterContext.getImporter();
        Node resourceNode = (Node)resource.adaptTo(Node.class);
        Session session = resourceNode.getSession();
        for (PageComponent component : components) {
            ComponentUtil.writeComponent(component, resourceNode, session);
        }
        return ImporterUtil.getCanvas(resource);
    }

    protected void buildCanvasComponentScript(DesignImporterContext designImporterContext, ParseResult parseResult) throws RepositoryException {
        Session session = designImporterContext.designNode.getSession();
        String canvasResourceType = (String)designImporterContext.getAttribute("canvasResourceType");
        String clientLibCategory = (String)designImporterContext.getAttribute("clientLibCategory");
        CanvasComponentBuilder canvasComponentBuilder = new CanvasComponentBuilder();
        canvasComponentBuilder.setResourceType(canvasResourceType);
        canvasComponentBuilder.setSession(session);
        canvasComponentBuilder.appendScriptContent((String)parseResult.getHeadHtmlContent().get(HTMLContentType.MARKUP));
        String headClientLibCategory = "head" + clientLibCategory;
        canvasComponentBuilder.appendScriptContent("\n");
        canvasComponentBuilder.appendScriptContent("\n" + TagUtils.getClientLibIncludeTag(headClientLibCategory));
        canvasComponentBuilder.appendScriptContent("\n");
        canvasComponentBuilder.appendScriptContent((String)parseResult.getBodyHtmlContent().get(HTMLContentType.MARKUP));
        canvasComponentBuilder.appendScriptContent("\n");
        canvasComponentBuilder.appendScriptContent("\n" + TagUtils.getClientLibIncludeTag(clientLibCategory) + "\n");
        canvasComponentBuilder.appendScriptContent("\n");
        canvasComponentBuilder.build();
    }

    protected void buildClientLibs(DesignImporterContext designImporterContext, ParseResult parseResult) throws RepositoryException {
        CanvasBuildOptions canvasBuildOptions = (CanvasBuildOptions)designImporterContext.getAttribute("buildOptions");
        String htmlName = designImporterContext.htmlName;
        long timestamp = (Long)designImporterContext.getAttribute("timestamp");
        String clientLibName = htmlName + "clientlibs";
        String clientLibCategoryName = "canvaspage.canvas." + htmlName + timestamp;
        ArrayList<String> potentialReferences = designImporterContext.getExtractedResources();
        if (canvasBuildOptions.isBuildHeadClientLibs()) {
            ClientLibsBuilderImpl headClientLibsBuilder = new ClientLibsBuilderImpl();
            headClientLibsBuilder.setCategoryName("head" + clientLibCategoryName);
            headClientLibsBuilder.setDesignRoot(designImporterContext.designNode);
            headClientLibsBuilder.setFolderName("head" + clientLibName);
            headClientLibsBuilder.setHtmlContent(parseResult.getHeadHtmlContent());
            headClientLibsBuilder.setInlineScriptsFileName("pageheadscripts.js");
            headClientLibsBuilder.setInlineStylesFileName("pageheadstyles.css");
            headClientLibsBuilder.setPotentialReferences(potentialReferences);
            headClientLibsBuilder.build();
        }
        if (canvasBuildOptions.isBuildBodyClientLibs()) {
            ClientLibsBuilderImpl bodyClientLibsBuilder = new ClientLibsBuilderImpl();
            bodyClientLibsBuilder.setCategoryName(clientLibCategoryName);
            bodyClientLibsBuilder.setDesignRoot(designImporterContext.designNode);
            bodyClientLibsBuilder.setFolderName(clientLibName);
            bodyClientLibsBuilder.setHtmlContent(parseResult.getBodyHtmlContent());
            bodyClientLibsBuilder.setInlineScriptsFileName("pagescripts.js");
            bodyClientLibsBuilder.setInlineStylesFileName("pagestyles.css");
            bodyClientLibsBuilder.setPotentialReferences(potentialReferences);
            bodyClientLibsBuilder.build();
        }
    }

    private void decideAndSetNames(DesignImporterContext designImporterContext) {
        Resource resource = designImporterContext.getImporter();
        String canvasResourceType = PathSchemeHelper.getCanvasResourceType(resource);
        long timestamp = (Long)designImporterContext.getAttribute("timestamp");
        String clientLibCategory = "canvaspage.canvas." + designImporterContext.htmlName + "" + timestamp;
        designImporterContext.setAttribute("canvasResourceType", canvasResourceType);
        designImporterContext.setAttribute("clientLibCategory", clientLibCategory);
    }

    protected void activate(ComponentContext componentContext) {
        Dictionary config = componentContext.getProperties();
        boolean buildPageNodes = OsgiUtil.toBoolean(config.get("build.page.nodes"), (boolean)true);
        boolean buildClientLibs = OsgiUtil.toBoolean(config.get("build.client.libs"), (boolean)true);
        boolean buildCanvasComponent = OsgiUtil.toBoolean(config.get("build.canvas.component"), (boolean)true);
        this.defaultPageBuildOptions = new CanvasBuildOptions();
        this.defaultPageBuildOptions.setBuildPageNodes(buildPageNodes);
        this.defaultPageBuildOptions.setBuildClientLibs(buildClientLibs);
        this.defaultPageBuildOptions.setBuildCanvasComponent(buildCanvasComponent);
        String[] topics = new String[]{"com/day/cq/wcm/designimporter/CanvasPageBuilder/PARSE_COMPLETE", "com/day/cq/wcm/designimporter/CanvasPageBuilder/COMPONENT_TREE_BUILT", "com/day/cq/wcm/designimporter/CanvasPageBuilder/COMPLETE"};
        Hashtable<String, String[]> props = new Hashtable<String, String[]>();
        props.put("event.topics", topics);
        componentContext.getBundleContext().registerService(EventHandler.class.getName(), (Object)new CanvasBuilderHelper(), props);
    }

    protected void bindPageBuilderFactory(PageBuilderFactory pageBuilderFactory) {
        this.pageBuilderFactory = pageBuilderFactory;
    }

    protected void unbindPageBuilderFactory(PageBuilderFactory pageBuilderFactory) {
        if (this.pageBuilderFactory == pageBuilderFactory) {
            this.pageBuilderFactory = null;
        }
    }

    protected void bindTagHandlerProvider(TagHandlerProvider tagHandlerProvider) {
        this.tagHandlerProvider = tagHandlerProvider;
    }

    protected void unbindTagHandlerProvider(TagHandlerProvider tagHandlerProvider) {
        if (this.tagHandlerProvider == tagHandlerProvider) {
            this.tagHandlerProvider = null;
        }
    }

    protected void bindEventAdmin(EventAdmin eventAdmin) {
        this.eventAdmin = eventAdmin;
    }

    protected void unbindEventAdmin(EventAdmin eventAdmin) {
        if (this.eventAdmin == eventAdmin) {
            this.eventAdmin = null;
        }
    }
}