ConfigurationReferenceProvider.java 5.88 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.ui.components.ds.ValueMapResource
 *  com.day.cq.wcm.api.reference.Reference
 *  com.day.cq.wcm.api.reference.ReferenceProvider
 *  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.apache.sling.api.wrappers.ValueMapDecorator
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.webservicesupport.impl;

import com.adobe.granite.ui.components.ds.ValueMapResource;
import com.day.cq.wcm.api.reference.Reference;
import com.day.cq.wcm.api.reference.ReferenceProvider;
import com.day.cq.wcm.webservicesupport.Configuration;
import com.day.cq.wcm.webservicesupport.ConfigurationManager;
import com.day.cq.wcm.webservicesupport.ConfigurationManagerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
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.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.ValueMap;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service(value={ReferenceProvider.class})
public class ConfigurationReferenceProvider
implements ReferenceProvider {
    private static final String TYPE_CONFIGURATION = "config";
    private static final String SERVICE_REPLICATION = "replication";
    private final Logger log = LoggerFactory.getLogger(ConfigurationReferenceProvider.class);
    @org.apache.felix.scr.annotations.Reference
    private ConfigurationManagerFactory configurationManagerFactory;
    @org.apache.felix.scr.annotations.Reference
    private ResourceResolverFactory resolverFactory;
    private ResourceResolver serviceUserResolver;

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public List<Reference> findReferences(Resource resource) {
        try {
            Object configuration;
            try {
                this.serviceUserResolver = this.resolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", "replication"));
            }
            catch (LoginException e) {
                this.log.error("Could not obtain a resolver with service user: ", (Object)"replication");
            }
            Iterator<Configuration> it = this.configurationManagerFactory.getConfigurationManager(resource.getResourceResolver()).getConfigurations(resource);
            ArrayList<Reference> references = new ArrayList<Reference>();
            while (it.hasNext()) {
                configuration = it.next();
                references.add(this.buildReference((Configuration)configuration));
                Resource parentConfig = configuration.getParent();
                if (parentConfig == null || parentConfig.getChild("jcr:content").isResourceType("cq/cloudserviceconfigs/components/servicepage")) continue;
                references.add(this.buildReference((Configuration)parentConfig.adaptTo(Configuration.class)));
            }
            configuration = references;
            return configuration;
        }
        finally {
            if (this.serviceUserResolver != null) {
                this.serviceUserResolver.close();
            }
        }
    }

    private Reference buildReference(Configuration configuration) {
        Long lastModified;
        Resource configResource = configuration.getResource();
        ResourceResolver resolver = configResource.getResourceResolver();
        if ("public".equals(configuration.getName()) && this.serviceUserResolver != null) {
            Resource configResourceWithServiceUser = this.serviceUserResolver.getResource(configResource.getPath()).getParent();
            ValueMap originalProps = configResourceWithServiceUser.getValueMap();
            ValueMapDecorator rm = new ValueMapDecorator(new HashMap());
            rm.put((Object)"cq:lastReplicated", originalProps.get((Object)"cq:lastReplicated"));
            rm.put((Object)"cq:lastReplicationAction", originalProps.get((Object)"cq:lastReplicationAction"));
            ValueMapResource syntheticResource = new ValueMapResource(resolver, configResourceWithServiceUser.getPath(), configResourceWithServiceUser.getResourceType(), (ValueMap)rm);
            configResource = syntheticResource;
        }
        if ((lastModified = configuration.getLastModified()) == null || lastModified == 0) {
            lastModified = -1;
        }
        return new Reference("config", configuration.getName(), configResource, lastModified.longValue());
    }

    protected void bindConfigurationManagerFactory(ConfigurationManagerFactory configurationManagerFactory) {
        this.configurationManagerFactory = configurationManagerFactory;
    }

    protected void unbindConfigurationManagerFactory(ConfigurationManagerFactory configurationManagerFactory) {
        if (this.configurationManagerFactory == configurationManagerFactory) {
            this.configurationManagerFactory = null;
        }
    }

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

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