MobileResourceLocatorImpl.java 6.04 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.Session
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.mobile.platform.impl;

import com.adobe.cq.mobile.platform.MobileResource;
import com.adobe.cq.mobile.platform.MobileResourceLocator;
import com.adobe.cq.mobile.platform.MobileResourceType;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.jcr.Session;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MobileResourceLocatorImpl
implements MobileResourceLocator {
    private static final Logger log = LoggerFactory.getLogger(MobileResourceLocatorImpl.class);
    private final ResourceResolver resolver;
    private final Session session;
    private final Set<String> excludeNodeNames;
    private final Set<String> appRootPaths;
    private final Set<String> containerTypes;

    public MobileResourceLocatorImpl(ResourceResolver resolver, Set<String> excludeNodeNames, Set<String> appRootPaths, Set<String> containerTypes) {
        if (appRootPaths == null) {
            appRootPaths = new HashSet<String>();
        }
        this.appRootPaths = appRootPaths;
        this.resolver = resolver;
        this.session = (Session)resolver.adaptTo(Session.class);
        this.excludeNodeNames = excludeNodeNames;
        this.containerTypes = containerTypes;
    }

    private boolean isAppRoot(Resource resource) {
        if (resource == null) {
            return false;
        }
        return this.appRootPaths.contains(resource.getPath());
    }

    @Override
    public Iterable<MobileResource> findResourcesByType(Resource resource, String type) {
        if (resource == null) {
            throw new IllegalArgumentException("The resource cannot be null");
        }
        ArrayList<MobileResource> allResources = new ArrayList<MobileResource>();
        Resource normalizedResource = this.normalizeResource(resource);
        this.collectResourcesByType(normalizedResource, type, allResources);
        if (this.isAppRoot(normalizedResource)) {
            for (String path : this.appRootPaths) {
                Resource extraResource;
                if (path.equals(resource.getPath()) || (extraResource = resource.getResourceResolver().getResource(path)) == null) continue;
                this.collectResourcesByType(extraResource, type, allResources);
            }
        }
        return allResources;
    }

    @Override
    public MobileResource getResourceByType(Resource resource, String type, boolean deep) {
        Iterator children = resource.listChildren();
        while (children.hasNext()) {
            MobileResource deepRes;
            Resource childRes = (Resource)children.next();
            if ("jcr:content".equals(childRes.getName())) continue;
            MobileResource mobileRes = (MobileResource)childRes.adaptTo(MobileResource.class);
            if (mobileRes.isA(type)) {
                return mobileRes;
            }
            if (!deep || (deepRes = this.getResourceByType((Resource)mobileRes.adaptTo(Resource.class), type, deep)) == null) continue;
            return deepRes;
        }
        return null;
    }

    @Override
    public /* varargs */ MobileResource findAncestorResourceByType(Resource resource, String type, String ... stopTypes) {
        if (resource == null) {
            throw new IllegalArgumentException("The resource cannot be null");
        }
        Resource normalizedResource = this.normalizeResource(resource);
        for (Resource parentRes = normalizedResource.getParent(); parentRes != null; parentRes = parentRes.getParent()) {
            MobileResource parentMobileRes = (MobileResource)parentRes.adaptTo(MobileResource.class);
            if (parentMobileRes.isA(type)) {
                return parentMobileRes;
            }
            if (parentMobileRes.isA(stopTypes)) break;
        }
        log.debug("Mobile ancestor resource cannot be found for type {}.", (Object)type);
        return null;
    }

    @Override
    public /* varargs */ MobileResource findClosestResourceByType(Resource resource, String type, String ... stopTypes) {
        if (resource == null) {
            throw new IllegalArgumentException("The resource cannot be null");
        }
        MobileResource mobileRes = (MobileResource)resource.adaptTo(MobileResource.class);
        if (mobileRes != null && mobileRes.isA(type)) {
            return mobileRes;
        }
        return this.findAncestorResourceByType(resource, type, stopTypes);
    }

    private Resource normalizeResource(Resource res) {
        if ("jcr:content".equals(res.getName())) {
            res = res.getParent();
        }
        return res;
    }

    private void collectResourcesByType(Resource resource, String type, List<MobileResource> allResources) {
        Iterator children = resource.listChildren();
        while (children.hasNext()) {
            Resource childResource = (Resource)children.next();
            if (this.excludeNodeNames.contains(childResource.getName())) continue;
            MobileResource mobileResource = (MobileResource)childResource.adaptTo(MobileResource.class);
            if (mobileResource.isA(type)) {
                allResources.add(mobileResource);
                continue;
            }
            if (!this.isContainer(childResource)) continue;
            this.collectResourcesByType(childResource, type, allResources);
        }
    }

    private boolean isContainer(Resource resource) {
        MobileResource mobileResource = (MobileResource)resource.adaptTo(MobileResource.class);
        if (mobileResource.isA(MobileResourceType.GROUP.getType())) {
            return true;
        }
        for (String containerType : this.containerTypes) {
            if (!resource.isResourceType(containerType)) continue;
            return true;
        }
        return false;
    }
}