OAuthTokenProvider.java 6.24 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.auth.oauth.AccessTokenProvider
 *  com.adobe.granite.crypto.CryptoException
 *  com.day.cq.replication.AgentConfig
 *  com.scene7.is.util.callbacks.Func1
 *  com.scene7.is.util.callbacks.Option
 *  com.scene7.is.util.error.Unchecked
 *  org.apache.commons.lang.StringUtils
 *  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.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.commons.osgi.ServiceUtil
 *  org.jetbrains.annotations.NotNull
 */
package com.adobe.cq.dam.aod.replication.transport_config;

import com.adobe.cq.dam.aod.replication.Util;
import com.adobe.cq.dam.aod.replication.transport_config.ResourceResolverProvider;
import com.adobe.cq.dam.aod.replication.transport_config.TokenProviderImpl;
import com.adobe.granite.auth.oauth.AccessTokenProvider;
import com.adobe.granite.crypto.CryptoException;
import com.day.cq.replication.AgentConfig;
import com.scene7.is.util.callbacks.Func1;
import com.scene7.is.util.callbacks.Option;
import com.scene7.is.util.error.Unchecked;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentSkipListMap;
import org.apache.commons.lang.StringUtils;
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.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.commons.osgi.ServiceUtil;
import org.jetbrains.annotations.NotNull;

@Service(value={OAuthTokenProvider.class})
@Component(immediate=1)
@Reference(name="accessTokenProvider", referenceInterface=AccessTokenProvider.class, bind="bindAccessTokenProvider", unbind="unbindAccessTokenProvider", cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
public final class OAuthTokenProvider {
    static final String ACCESS_TOKEN_PROVIDER = "accessTokenProvider";
    private Map<String, Comparable<Object>> accessTokenProvidersProps = new ConcurrentSkipListMap(Collections.reverseOrder());
    private Map<Comparable<Object>, AccessTokenProvider> accessTokenProviders = new ConcurrentSkipListMap(Collections.reverseOrder());
    @Reference
    @NotNull
    private final ResourceResolverProvider resolverProvider;

    public static OAuthTokenProvider oAuthTokenProvider(ResourceResolverProvider resolverProvider) {
        return new OAuthTokenProvider(resolverProvider);
    }

    public Option<String> getToken(final AgentConfig config) {
        return (Option)this.resolverProvider.withResolver(config.getAgentUserId(), new Func1<ResourceResolver, Option<String>>(){

            public Option<String> call(ResourceResolver resolver) {
                return OAuthTokenProvider.this.getAccessToken(resolver, config);
            }
        });
    }

    @NotNull
    private Option<AccessTokenProvider> accessTokenProvider(AgentConfig config) {
        TokenProviderImpl accessTokenProvider = null;
        String providerPid = (String)config.getProperties().get("accessTokenProviderPid", String.class);
        if (!this.accessTokenProvidersProps.isEmpty() && !this.accessTokenProviders.isEmpty()) {
            if (StringUtils.isNotBlank((String)providerPid) && null != this.accessTokenProvidersProps.get(providerPid)) {
                this.accessTokenProviders.get(this.accessTokenProvidersProps.get(providerPid));
            }
            if (null == accessTokenProvider) {
                accessTokenProvider = (AccessTokenProvider)this.accessTokenProviders.values().toArray()[0];
            }
        }
        if (accessTokenProvider == null) {
            accessTokenProvider = new TokenProviderImpl();
        }
        return Option.some((Object)accessTokenProvider);
    }

    public OAuthTokenProvider() {
        this.resolverProvider = (ResourceResolverProvider)Util.initRef();
    }

    protected void bindAccessTokenProvider(AccessTokenProvider atp, Map<String, Object> properties) {
        String pid = (String)properties.get("service.pid");
        this.accessTokenProvidersProps.put(pid, ServiceUtil.getComparableForServiceRanking(properties));
        this.accessTokenProviders.put(ServiceUtil.getComparableForServiceRanking(properties), atp);
    }

    protected void unbindAccessTokenProvider(AccessTokenProvider atp, Map<String, Object> properties) {
        String pid = (String)properties.get("service.pid");
        this.accessTokenProviders.remove(this.accessTokenProvidersProps.get(pid));
        this.accessTokenProvidersProps.remove(pid);
    }

    private OAuthTokenProvider(@NotNull ResourceResolverProvider resolverProvider) {
        this.resolverProvider = resolverProvider;
    }

    private Option<String> getAccessToken(ResourceResolver resolver, AgentConfig config) {
        try {
            if (this.accessTokenProviders.isEmpty() && this.accessTokenProvidersProps.isEmpty()) {
                return Option.some((Object)TokenProviderImpl.getToken(config));
            }
            Iterator i$ = this.accessTokenProvider(config).iterator();
            if (i$.hasNext()) {
                AccessTokenProvider p = (AccessTokenProvider)i$.next();
                return Option.some((Object)p.getAccessToken(resolver, config.getAgentUserId(), null));
            }
            return Option.none();
        }
        catch (CryptoException | IOException e) {
            throw Unchecked.unchecked((Throwable)e);
        }
    }

    protected void bindResolverProvider(ResourceResolverProvider resourceResolverProvider) {
        this.resolverProvider = resourceResolverProvider;
    }

    protected void unbindResolverProvider(ResourceResolverProvider resourceResolverProvider) {
        if (this.resolverProvider == resourceResolverProvider) {
            this.resolverProvider = null;
        }
    }

}