JcrResourceAccessor.java 6.42 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.dam.api.Asset
 *  com.day.cq.dam.api.Rendition
 *  com.scene7.is.ps.provider.ResourceAccessor
 *  com.scene7.is.ps.provider.ResourceAccessor$
 *  com.scene7.is.ps.provider.ResourceAccessor$AbstractResource
 *  com.scene7.is.ps.provider.ResourceAccessor$LookupResult
 *  com.scene7.is.ps.provider.ResourceAccessor$NotFound
 *  com.scene7.is.ps.provider.ResourceAccessor$Resource
 *  com.scene7.is.ps.provider.ResourceAccessor$Success
 *  com.scene7.is.scalautil.FailFastDynamicVar
 *  com.scene7.is.scalautil.javautil.OptionUtil
 *  com.scene7.is.util.callbacks.Functions
 *  com.scene7.is.util.callbacks.Funx0
 *  com.scene7.is.util.callbacks.Option
 *  javax.jcr.RepositoryException
 *  org.apache.sling.api.adapter.Adaptable
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  scala.Function0
 *  scala.Option
 */
package com.adobe.cq.dam.s7imaging.impl.ps;

import com.adobe.cq.dam.s7imaging.impl.catalog.JcrUtil;
import com.adobe.cq.dam.s7imaging.impl.jcr.props.JcrProps;
import com.adobe.cq.dam.s7imaging.impl.jcr.props.PropExtractor;
import com.adobe.cq.dam.s7imaging.impl.jcr.props.PropKey;
import com.adobe.cq.dam.s7imaging.impl.jcr.props.StandardExtractors;
import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.Rendition;
import com.scene7.is.ps.provider.ResourceAccessor;
import com.scene7.is.scalautil.FailFastDynamicVar;
import com.scene7.is.scalautil.javautil.OptionUtil;
import com.scene7.is.util.callbacks.Functions;
import com.scene7.is.util.callbacks.Funx0;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import javax.jcr.RepositoryException;
import org.apache.sling.api.adapter.Adaptable;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import scala.Function0;
import scala.Option;

final class JcrResourceAccessor
implements ResourceAccessor {
    private static final PropKey<com.scene7.is.util.callbacks.Option<String>> PROXY_URL = PropKey.optional("proxyUrl", StandardExtractors.toString);
    private final String rootPath;
    private final String pathPrefix;
    private FailFastDynamicVar<ResourceResolver> context = FailFastDynamicVar.apply();

    JcrResourceAccessor(String rootPath) {
        this.rootPath = rootPath;
        this.pathPrefix = JcrResourceAccessor.removeTrailingSlashes(JcrResourceAccessor.addLeadingSlash(rootPath));
    }

    public ResourceAccessor.LookupResult getResource(String path) {
        try {
            for (Resource r : this.get(path)) {
                Iterator i$ = JcrUtil.adaptTo(Asset.class, (Adaptable)r).iterator();
                if (i$.hasNext()) {
                    Asset asset = (Asset)i$.next();
                    return ResourceAccessor..MODULE$.success((ResourceAccessor.Resource)new JcrResource(asset));
                }
                for (Resource child : JcrUtil.getChild(r, "jcr:content")) {
                    Iterator i$2 = JcrProps.jcrProps(child).get(PROXY_URL).iterator();
                    if (!i$2.hasNext()) continue;
                    String p = (String)i$2.next();
                    return ResourceAccessor..MODULE$.success((ResourceAccessor.Resource)new JcrProxyRendition(p));
                }
            }
            return ResourceAccessor..MODULE$.notFound(path, new String[]{this.rootPath});
        }
        catch (RepositoryException e) {
            throw new AssertionError(e.getMessage(), (Throwable)e);
        }
    }

    public <T, X extends Exception> T withContext(ResourceResolver resolver, Funx0<T, X> code) {
        return (T)this.context.withValue((Object)resolver, Functions.scalaFunc(code));
    }

    private com.scene7.is.util.callbacks.Option<Resource> get(String path) {
        String absPath = JcrResourceAccessor.isAbsolute(path) ? path : this.pathPrefix + '/' + path;
        return JcrUtil.getResource((ResourceResolver)this.context.value(), absPath);
    }

    private static String addLeadingSlash(String str) {
        if (str.isEmpty()) {
            return str;
        }
        if (str.charAt(0) != '/') {
            return "" + '/' + str;
        }
        return str;
    }

    private static String removeTrailingSlashes(String str) {
        if (str.isEmpty()) {
            return str;
        }
        for (int i = str.length() - 1; i >= 0; --i) {
            if (str.charAt(i) == '/') continue;
            return str.substring(0, i + 1);
        }
        return "";
    }

    private static boolean isAbsolute(String path) {
        return path.startsWith("/");
    }

    public static JcrResourceAccessor apply() {
        return JcrResourceAccessor.apply("/");
    }

    public static JcrResourceAccessor apply(String rootPath) {
        return new JcrResourceAccessor(rootPath);
    }

    private static final class JcrProxyRendition
    extends ResourceAccessor.AbstractResource {
        private final String proxyUrl;

        private JcrProxyRendition(String proxyUrl) {
            this.proxyUrl = proxyUrl;
        }

        public String path() {
            return this.proxyUrl;
        }

        public long size() {
            return -1;
        }

        public Option<String> mimeType() {
            return OptionUtil.none();
        }

        public long lastModified() {
            return 0;
        }

        public InputStream getInput() {
            try {
                return new ByteArrayInputStream(this.proxyUrl.getBytes("UTF-8"));
            }
            catch (UnsupportedEncodingException e) {
                throw new AssertionError(e);
            }
        }
    }

    private static final class JcrResource
    extends ResourceAccessor.AbstractResource {
        private final Asset asset;
        private final Rendition rendition;

        JcrResource(Asset asset) {
            this.asset = asset;
            this.rendition = asset.getOriginal();
        }

        public String path() {
            return this.rendition.getPath();
        }

        public long size() {
            return this.rendition.getSize();
        }

        public Option<String> mimeType() {
            return OptionUtil.fromNullable((Object)this.rendition.getMimeType());
        }

        public long lastModified() {
            return this.asset.getLastModified();
        }

        public InputStream getInput() {
            return this.rendition.getStream();
        }
    }

}