ThumbnailProviderManagerImpl.java 6.93 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.Node
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.nodetype.NodeType
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferenceCardinality
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  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.ResourceUtil
 *  org.osgi.framework.ServiceReference
 *  org.osgi.service.component.ComponentContext
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.commons.impl;

import com.day.cq.commons.thumbnail.ThumbnailProvider;
import com.day.cq.commons.thumbnail.ThumbnailProviderManager;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
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.ResourceUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Reference(name="ThumbnailProvider", referenceInterface=ThumbnailProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
@Service(value={ThumbnailProviderManager.class})
public class ThumbnailProviderManagerImpl
implements ThumbnailProviderManager {
    private final Logger log = LoggerFactory.getLogger(ThumbnailProviderManagerImpl.class);
    private static String PRED_REF_NAME = "ThumbnailProvider";
    private static String THUMBNAIL_PROVIDER_NAME = "thumbnail.provider.name";
    @Reference
    private ResourceResolverFactory resolverFactory;
    private ComponentContext osgiComponentContext;
    private List<ServiceReference> delayedRefs;
    private Map<String, ThumbnailProvider> thumbnailProviders = new HashMap<String, ThumbnailProvider>();

    @Override
    public ThumbnailProvider getThumbnailProvider(Node node) {
        try {
            ThumbnailProvider provider = this.thumbnailProviders.get(node.getPrimaryNodeType().getName());
            if (provider == null && (provider = this.getResourceTypeProvider(node)) == null && node.hasNode("jcr:content")) {
                Node contentNode = node.getNode("jcr:content");
                provider = this.getResourceTypeProvider(contentNode);
            }
            return provider;
        }
        catch (RepositoryException e) {
            this.log.warn("No ThumbnailProvider found");
            this.log.debug("Choosing default thumbnail provider");
            return this.thumbnailProviders.get("*");
        }
    }

    protected void activate(ComponentContext componentContext) {
        this.osgiComponentContext = componentContext;
        if (this.osgiComponentContext != null && this.delayedRefs != null) {
            List<ServiceReference> list = this.delayedRefs;
            this.delayedRefs = null;
            for (ServiceReference ref : list) {
                this.initThumbnailProvider(ref);
            }
        }
        this.log.info("Thumbnail provider manager activated.");
    }

    protected void deactivate(ComponentContext componentContext) {
        this.log.info("Thumbnail provider manager deactivated.");
    }

    protected void bindThumbnailProvider(ServiceReference ref) {
        if (this.osgiComponentContext == null) {
            if (this.delayedRefs == null) {
                this.delayedRefs = new LinkedList<ServiceReference>();
            }
            this.delayedRefs.add(ref);
        } else {
            this.initThumbnailProvider(ref);
        }
    }

    protected void unbindThumbnailProvider(ServiceReference ref) {
        String name = (String)ref.getProperty(THUMBNAIL_PROVIDER_NAME);
        if (this.thumbnailProviders.remove(name) == null) {
            this.log.warn("removing unregistered thumbnail provider {}", (Object)name);
        } else {
            this.log.info("unregistering thumbnail provider {}", (Object)name);
        }
    }

    private void initThumbnailProvider(ServiceReference ref) {
        ThumbnailProvider tprovider = (ThumbnailProvider)this.osgiComponentContext.locateService(PRED_REF_NAME, ref);
        if (tprovider != null) {
            String name = (String)ref.getProperty(THUMBNAIL_PROVIDER_NAME);
            if (name == null) {
                this.log.error("initFilter: Missing name for thumbnail provider {}", (Object)ref);
                return;
            }
            this.log.info("registering thumbnail provider {}", (Object)name);
            this.thumbnailProviders.put(name, tprovider);
        }
    }

    private ThumbnailProvider getResourceTypeProvider(Node node) throws RepositoryException {
        if (node.hasProperty("sling:resourceType")) {
            String resourceType = node.getProperty("sling:resourceType").getString();
            if (this.thumbnailProviders.containsKey(resourceType)) {
                return this.thumbnailProviders.get(resourceType);
            }
            try {
                ResourceResolver resolver = this.resolverFactory.getResourceResolver(Collections.singletonMap("user.jcr.session", node.getSession()));
                Resource nodeRes = resolver.getResource(node.getPath());
                if (!ResourceUtil.isNonExistingResource((Resource)nodeRes)) {
                    for (String provider : this.thumbnailProviders.keySet()) {
                        if (!nodeRes.isResourceType(provider)) continue;
                        return this.thumbnailProviders.get(provider);
                    }
                }
            }
            catch (LoginException e) {
                this.log.warn("getResourceTypeProvider: Unable to obtain resource resolver");
            }
        }
        return null;
    }

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

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