ServiceLibFinderImpl.java 6.48 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.webservicesupport.impl;

import com.day.cq.wcm.webservicesupport.ConfigurationManager;
import com.day.cq.wcm.webservicesupport.Service;
import com.day.cq.wcm.webservicesupport.ServiceLibFinder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@org.apache.felix.scr.annotations.Service
public class ServiceLibFinderImpl
implements ServiceLibFinder {
    private static final Object SERVICE_SERVICELIBFINDER = "servicelibfinder";
    private final Logger log = LoggerFactory.getLogger(ServiceLibFinderImpl.class);
    @Reference
    private ResourceResolverFactory resolverFactory;

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    @Override
    public List<String> getScriptPaths(String[] servicePaths) {
        ArrayList<String> libsScripts;
        libsScripts = new ArrayList<String>();
        if (servicePaths.length > 0) {
            ResourceResolver serviceResolver = null;
            try {
                serviceResolver = this.getServiceResolver();
                ConfigurationManager cfgMgr = (ConfigurationManager)serviceResolver.adaptTo(ConfigurationManager.class);
                Iterator<Service> services = cfgMgr.getServices(servicePaths, new Comparator<Service>(){

                    @Override
                    public int compare(Service s1, Service s2) {
                        return s1.getInclusionRank().compareTo(s2.getInclusionRank());
                    }
                });
                while (services.hasNext()) {
                    Service service = services.next();
                    this.log.debug("Looking up scripts for service {}", (Object)service.getName());
                    ValueMap props = service.getProperties();
                    String libsScript = (String)props.get("libsScript", null);
                    if (libsScript != null) {
                        libsScripts.add(libsScript);
                        this.log.debug("Found libsScript value {} to be added for service {}", (Object)libsScript, (Object)service.getName());
                        continue;
                    }
                    String defaultScript = this.getDefaultScript(serviceResolver, service.getComponentReference());
                    if (defaultScript == null) continue;
                    libsScripts.add(defaultScript);
                    this.log.debug("Found defaultscript {} to be added for service {}", (Object)defaultScript, (Object)service.getName());
                }
            }
            catch (LoginException e) {
                this.log.error("Cannot retrieve libsScripts for inclusion", (Throwable)e);
            }
            finally {
                this.closeResolver(serviceResolver);
            }
        }
        return libsScripts;
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    @Override
    public List<String> getComponentReferences(String[] servicePaths) {
        ArrayList<String> componentReferences;
        if (servicePaths.length == 0) {
            return Collections.emptyList();
        }
        ResourceResolver serviceResolver = null;
        componentReferences = new ArrayList<String>(servicePaths.length);
        try {
            serviceResolver = this.getServiceResolver();
            ConfigurationManager cfgMgr = (ConfigurationManager)serviceResolver.adaptTo(ConfigurationManager.class);
            Iterator<Service> services = cfgMgr.getServices(servicePaths, new Comparator<Service>(){

                @Override
                public int compare(Service s1, Service s2) {
                    return s2.getInclusionRank().compareTo(s1.getInclusionRank());
                }
            });
            while (services.hasNext()) {
                Service service = services.next();
                String componentReference = service.getComponentReference();
                if (componentReference == null) continue;
                componentReferences.add(componentReference);
            }
        }
        catch (LoginException e) {
            this.log.error("Cannot retrieve component references for inclusion", (Throwable)e);
        }
        finally {
            this.closeResolver(serviceResolver);
        }
        return componentReferences;
    }

    private String getDefaultScript(ResourceResolver resolver, String componentPath) {
        Resource compRes;
        if (componentPath != null && (compRes = resolver.getResource(componentPath)) != null) {
            Iterator it = resolver.listChildren(compRes);
            while (it.hasNext()) {
                Resource script = (Resource)it.next();
                if (!"headlibs.jsp".equalsIgnoreCase(script.getName())) continue;
                return script.getPath();
            }
        }
        return null;
    }

    private ResourceResolver getServiceResolver() throws LoginException {
        return this.resolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", SERVICE_SERVICELIBFINDER));
    }

    private void closeResolver(ResourceResolver resolver) {
        if (resolver != null) {
            resolver.close();
        }
    }

    protected void bindResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        this.resolverFactory = resourceResolverFactory;
    }

    protected void unbindResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        if (this.resolverFactory == resourceResolverFactory) {
            this.resolverFactory = null;
        }
    }

}