ResourceResolverProvider.java 4.98 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.util.callbacks.Func1
 *  com.scene7.is.util.error.Unchecked
 *  javax.jcr.Credentials
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.SimpleCredentials
 *  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.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.jcr.api.SlingRepository
 */
package com.adobe.cq.dam.aod.replication.transport_config;

import com.adobe.cq.dam.aod.replication.Util;
import com.scene7.is.util.callbacks.Func1;
import com.scene7.is.util.error.Unchecked;
import java.util.HashMap;
import java.util.Map;
import javax.jcr.Credentials;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.jcr.api.SlingRepository;

@Service(value={ResourceResolverProvider.class})
@Component
public final class ResourceResolverProvider {
    @Reference
    private final ResourceResolverFactory resolverFactory;
    @Reference
    private final SlingRepository repository;

    public static ResourceResolverProvider resourceResolverProvider(ResourceResolverFactory resolverFactory, SlingRepository repository) {
        return new ResourceResolverProvider(resolverFactory, repository);
    }

    public <T> T withResolver(Func1<ResourceResolver, T> f) {
        ResourceResolver resolver = this.getServiceResourceResolver();
        return this.withResolver(resolver, f);
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public <T> T withResolver(String user, Func1<ResourceResolver, T> f) {
        Session userSession = this.getUserSession(user);
        try {
            ResourceResolver resolver = this.getResourceResolver(userSession);
            T t = this.withResolver(resolver, f);
            return t;
        }
        finally {
            if (userSession.isLive()) {
                userSession.logout();
            }
        }
    }

    public ResourceResolverProvider() {
        this.resolverFactory = (ResourceResolverFactory)Util.initRef();
        this.repository = (SlingRepository)Util.initRef();
    }

    private ResourceResolverProvider(ResourceResolverFactory resolverFactory, SlingRepository repository) {
        this.resolverFactory = resolverFactory;
        this.repository = repository;
    }

    private Session getUserSession(String user) {
        try {
            return this.repository.impersonateFromService("replicationService", (Credentials)new SimpleCredentials(user, new char[0]), null);
        }
        catch (RepositoryException e) {
            throw Unchecked.unchecked((Throwable)e);
        }
    }

    private ResourceResolver getResourceResolver(Session userSession) {
        HashMap<String, Session> map = new HashMap<String, Session>();
        map.put("user.jcr.session", userSession);
        try {
            return this.resolverFactory.getResourceResolver(map);
        }
        catch (LoginException e) {
            throw Unchecked.unchecked((Throwable)e);
        }
    }

    private ResourceResolver getServiceResourceResolver() {
        try {
            HashMap<String, String> props = new HashMap<String, String>();
            props.put("sling.service.subservice", "replicationService");
            return this.resolverFactory.getServiceResourceResolver(props);
        }
        catch (LoginException e) {
            throw Unchecked.unchecked((Throwable)e);
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    private <T> T withResolver(ResourceResolver resolver, Func1<ResourceResolver, T> f) {
        try {
            Object object = f.call((Object)resolver);
            return (T)object;
        }
        finally {
            if (resolver.isLive()) {
                resolver.close();
            }
        }
    }

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

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

    protected void bindRepository(SlingRepository slingRepository) {
        this.repository = slingRepository;
    }

    protected void unbindRepository(SlingRepository slingRepository) {
        if (this.repository == slingRepository) {
            this.repository = null;
        }
    }
}