TemplatedResourceImpl.java 8.29 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.wcm.api.Template
 *  com.day.cq.wcm.api.TemplatedResource
 *  org.apache.commons.lang.StringUtils
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.core.impl;

import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.Template;
import com.day.cq.wcm.api.TemplatedResource;
import com.day.cq.wcm.core.impl.BuilderResource;
import com.day.cq.wcm.core.impl.TemplateUtils;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TemplatedResourceImpl
extends BuilderResource
implements TemplatedResource {
    private static final Logger log = LoggerFactory.getLogger(TemplatedResourceImpl.class);
    private final Resource resource;
    private final Resource structureResource;
    private final Page page;

    private TemplatedResourceImpl(Resource resource, Page page) {
        super(resource.getResourceResolver(), resource.getPath(), resource.getResourceType());
        this.resource = resource;
        this.page = page;
        this.structureResource = TemplatedResourceImpl.getStructureResource(resource, page);
        this.setProperties();
        this.setChildren();
    }

    private void setProperties() {
        ValueMap vm = this.adaptTo(ValueMap.class);
        ValueMap mvm = (ValueMap)this.resource.adaptTo(ValueMap.class);
        if (mvm != null) {
            for (Map.Entry e : mvm.entrySet()) {
                String key = (String)e.getKey();
                if ("editable".equals(key)) continue;
                Object value = e.getValue();
                vm.put((Object)key, value);
            }
        }
        if ("cq:PageContent".equals(mvm.get("jcr:primaryType", String.class)) && (TemplateUtils.isTemplateInitialPage(this.page) || TemplateUtils.isPageAuthoredTemplated(this.page))) {
            ValueMap vmStructure = this.structureResource.getValueMap();
            for (Map.Entry e : vmStructure.entrySet()) {
                String key = (String)e.getKey();
                if (vm.containsKey((Object)key)) continue;
                Object value = e.getValue();
                vm.put((Object)key, value);
            }
        }
    }

    private void setChildren() {
        boolean isEditable = TemplatedResourceImpl.resourceIsEditable(this.structureResource);
        Resource parent = this.structureResource;
        if (isEditable) {
            parent = this.resource;
        }
        Iterator it = parent.listChildren();
        while (it.hasNext()) {
            Resource child = (Resource)it.next();
            try {
                String mergeEquivalentPath;
                Resource mergeEquivalent;
                if (isEditable) {
                    this.addChild(TemplatedResourceImpl.createTemplatedResource(child, this.page));
                    continue;
                }
                if ("jcr:content".equals(child.getName()) && TemplatedResourceImpl.resourceIsPageContentType(child)) {
                    mergeEquivalentPath = this.resource.getPath() + "/" + child.getName();
                    mergeEquivalent = this.getResourceResolver().getResource(mergeEquivalentPath);
                    if (mergeEquivalent != null) {
                        this.addChild(TemplatedResourceImpl.createTemplatedResource(mergeEquivalent, this.page));
                        continue;
                    }
                    this.addChild(TemplatedResourceImpl.createTemplatedResource(child, this.page));
                    continue;
                }
                mergeEquivalentPath = this.resource.getPath() + "/" + child.getName();
                mergeEquivalent = this.getResourceResolver().getResource(mergeEquivalentPath);
                Resource templatedResource = null;
                templatedResource = TemplatedResourceImpl.resourceIsEditable(child) && mergeEquivalent != null ? TemplatedResourceImpl.createTemplatedResource(mergeEquivalent, this.page) : TemplatedResourceImpl.createTemplatedResource(child, this.page);
                this.addChild(templatedResource);
            }
            catch (Exception e) {
                log.error("Could not get children: " + e);
            }
        }
    }

    public Resource getResource() {
        return this.resource;
    }

    public String getPath() {
        return this.resource.getPath();
    }

    public static Resource getStructureResource(Resource resource, Page page) {
        Template template;
        Resource structureResource = null;
        if (page != null && (template = page.getTemplate()) != null && template.hasStructureSupport()) {
            Resource structureRoot = ((Resource)template.adaptTo(Resource.class)).getChild("structure/jcr:content");
            if (resource.getPath().startsWith(structureRoot.getPath())) {
                structureResource = resource;
            } else if (resource.adaptTo(Page.class) != null) {
                structureResource = ((Resource)template.adaptTo(Resource.class)).getChild("structure");
            } else {
                String relativePath = StringUtils.removeStart((String)resource.getPath(), (String)page.getContentResource().getPath());
                if (relativePath.length() > 1) {
                    relativePath = relativePath.substring(1);
                }
                structureResource = structureRoot.getChild(relativePath);
            }
        }
        return structureResource;
    }

    public static boolean resourceIsEditable(Resource baseResource) {
        if (baseResource == null) {
            return true;
        }
        ValueMap vm = baseResource.getValueMap();
        return "true".equals(vm.get("editable", String.class));
    }

    public static boolean resourceIsPageContentType(Resource resource) {
        boolean isPageContent = false;
        if (resource != null) {
            ValueMap vm = resource.getValueMap();
            isPageContent = "cq:PageContent".equals(vm.get("jcr:primaryType", String.class));
        }
        return isPageContent;
    }

    public static Resource createTemplatedResource(Resource resource, Page currentPage) {
        boolean isPage;
        if (resource == null || currentPage == null) {
            throw new IllegalArgumentException("Either the resource or the page is null");
        }
        Resource structureResource = TemplatedResourceImpl.getStructureResource(resource, currentPage);
        boolean isEditable = TemplatedResourceImpl.resourceIsEditable(structureResource);
        boolean bl = isPage = resource.adaptTo(Page.class) != null;
        if (isEditable || TemplatedResourceImpl.resourceIsPageContentType(resource) || isPage) {
            String path = resource.getPath();
            if (isPage) {
                return new TemplatedResourceImpl(resource, currentPage);
            }
            ResourceResolver resourceResolver = resource.getResourceResolver();
            PageManager pageManager = (PageManager)resourceResolver.adaptTo(PageManager.class);
            Page sourcePage = pageManager.getContainingPage(resource);
            String relativePath = path.substring(sourcePage.getContentResource().getPath().length(), path.length());
            Resource pageResource = resourceResolver.getResource(currentPage.getContentResource().getPath() + relativePath);
            if (pageResource != null) {
                return new TemplatedResourceImpl(pageResource, currentPage);
            }
        } else if (structureResource != null) {
            return new TemplatedResourceImpl(structureResource, currentPage);
        }
        log.warn("Unable to create a templated resource for resource: " + resource.toString() + ", Page: " + currentPage.toString());
        return null;
    }

    @Override
    public <Type> Type adaptTo(Class<Type> type) {
        if (ValueMap.class.equals(type)) {
            return super.adaptTo(type);
        }
        return (Type)this.getResource().adaptTo(type);
    }
}