AssetWrapper.java 10.9 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.asset.api.Asset
 *  com.adobe.granite.asset.api.AssetException
 *  com.adobe.granite.asset.api.AssetRelation
 *  com.adobe.granite.asset.api.Rendition
 *  javax.jcr.Node
 *  javax.jcr.PathNotFoundException
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Value
 *  javax.jcr.nodetype.PropertyDefinition
 *  org.apache.sling.api.resource.ModifiableValueMap
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceUtil
 *  org.apache.sling.resource.collection.ResourceCollection
 *  org.apache.sling.resource.collection.ResourceCollectionManager
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.asset.core.impl;

import com.adobe.granite.asset.api.Asset;
import com.adobe.granite.asset.api.AssetException;
import com.adobe.granite.asset.api.AssetRelation;
import com.adobe.granite.asset.api.Rendition;
import com.adobe.granite.asset.core.impl.AssetImpl;
import com.adobe.granite.asset.core.impl.AssetRelationImpl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.nodetype.PropertyDefinition;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.resource.collection.ResourceCollection;
import org.apache.sling.resource.collection.ResourceCollectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
public class AssetWrapper {
    private static final Logger log = LoggerFactory.getLogger(AssetWrapper.class);
    private final Resource asset;
    private Resource contentResource;
    private Resource metadataResource;
    private Resource renditionsResource;
    private Resource relatedResource;

    public AssetWrapper(Resource asset) {
        this.asset = asset;
    }

    private ResourceResolver getResolver() {
        return this.asset.getResourceResolver();
    }

    private Session getSession() {
        return (Session)this.getResolver().adaptTo(Session.class);
    }

    private ResourceCollectionManager getResourceCollectionManager() {
        return (ResourceCollectionManager)this.getResolver().adaptTo(ResourceCollectionManager.class);
    }

    public ResourceCollection getCollection(Resource relationRes) {
        ResourceCollectionManager rcm = this.getResourceCollectionManager();
        return rcm.getCollection(relationRes);
    }

    public Resource getContentResource() {
        if (this.contentResource == null) {
            this.contentResource = this.getResolver().getResource(this.asset, "jcr:content");
        }
        return this.contentResource;
    }

    public Resource getOrCreateContentResource() throws RepositoryException {
        Resource content = this.getContentResource();
        if (content != null) {
            return content;
        }
        Node node = (Node)this.asset.adaptTo(Node.class);
        if (!node.hasNode("jcr:content")) {
            node.addNode("jcr:content", "dam:AssetContent");
        }
        return this.getContentResource();
    }

    public Resource getMetadataResource() {
        Resource contentResource;
        if (this.metadataResource == null && (contentResource = this.getContentResource()) != null) {
            this.metadataResource = contentResource.getChild("metadata");
        }
        return this.metadataResource;
    }

    public Resource getOrCreateMetadataResource() throws RepositoryException {
        Resource metadata = this.getMetadataResource();
        if (metadata != null) {
            return metadata;
        }
        Resource contentResource = this.getOrCreateContentResource();
        Node content = (Node)contentResource.adaptTo(Node.class);
        if (!content.hasNode("metadata")) {
            content.addNode("metadata", "nt:unstructured");
        }
        return this.getMetadataResource();
    }

    public Resource getRelatedResource() {
        Resource contentResource;
        if (this.relatedResource == null && (contentResource = this.getContentResource()) != null) {
            this.relatedResource = contentResource.getChild("related");
        }
        return this.relatedResource;
    }

    public Resource getOrCreateRelatedResource() throws RepositoryException {
        Resource related = this.getRelatedResource();
        if (related != null) {
            return related;
        }
        Resource contentResource = this.getOrCreateContentResource();
        Node content = (Node)contentResource.adaptTo(Node.class);
        if (!content.hasNode("related")) {
            content.addNode("related", "nt:unstructured");
        }
        return this.getRelatedResource();
    }

    public Resource getRenditionsResource() {
        Resource contentResource;
        if (this.renditionsResource == null && (contentResource = this.getContentResource()) != null) {
            this.renditionsResource = contentResource.getChild("renditions");
        }
        return this.renditionsResource;
    }

    public Resource getOrCreateRenditionsResource() throws RepositoryException {
        Resource renditions = this.getRenditionsResource();
        if (renditions != null) {
            return renditions;
        }
        Resource contentResource = this.getOrCreateContentResource();
        Node content = (Node)contentResource.adaptTo(Node.class);
        if (!content.hasNode("renditions")) {
            content.addNode("renditions", "nt:folder");
        }
        return this.getRenditionsResource();
    }

    public Rendition getRendition(String name) {
        Resource renditionsResource = this.getRenditionsResource();
        if (renditionsResource == null) {
            return null;
        }
        Resource r = renditionsResource.getChild(name);
        if (r == null) {
            return null;
        }
        return (Rendition)r.adaptTo(Rendition.class);
    }

    public Iterator<Rendition> listRenditions() {
        Resource renditionsResource = this.getRenditionsResource();
        if (renditionsResource == null) {
            return new ArrayList().iterator();
        }
        Iterator resources = this.getResolver().listChildren(renditionsResource);
        return ResourceUtil.adaptTo((Iterator)resources, Rendition.class);
    }

    public Iterator<Asset> listRelated(String name) {
        ArrayList<AssetImpl> assets = new ArrayList<AssetImpl>();
        Resource related = this.getRelatedResource();
        if (related == null) {
            return assets.iterator();
        }
        try {
            Resource relationRes = related.getChild(name);
            if (relationRes == null) {
                Property property = ((Node)related.adaptTo(Node.class)).getProperty(name);
                return this.getRelations(property).iterator();
            }
            ResourceCollection rc = this.getCollection(relationRes);
            Iterator resources = rc.getResources();
            while (resources.hasNext()) {
                assets.add(new AssetImpl((Resource)resources.next()));
            }
        }
        catch (PathNotFoundException e) {
            log.debug("No existing relation can be found with name [{}]", (Object)name);
        }
        catch (RepositoryException e) {
            throw new AssetException("Failed to get related Assets with name [ " + name + " ]", (Throwable)e);
        }
        return assets.iterator();
    }

    public Iterator<AssetRelation> listRelations(String name) {
        ArrayList<AssetRelationImpl> relations = new ArrayList<AssetRelationImpl>();
        Resource related = this.getRelatedResource();
        if (related == null) {
            return relations.iterator();
        }
        try {
            Resource relationRes = related.getChild(name);
            if (relationRes == null) {
                Property property = ((Node)related.adaptTo(Node.class)).getProperty(name);
                List<Asset> relatedAssets = this.getRelations(property);
                for (Asset relatedAsset : relatedAssets) {
                    relations.add(new AssetRelationImpl(name, relatedAsset));
                }
            } else {
                ResourceCollection rc = this.getCollection(relationRes);
                Iterator resources = rc.getResources();
                while (resources.hasNext()) {
                    Resource reference = (Resource)resources.next();
                    AssetImpl relatedAsset = new AssetImpl(reference);
                    ModifiableValueMap mvm = rc.getProperties(reference);
                    relations.add(new AssetRelationImpl(name, relatedAsset, mvm));
                }
            }
        }
        catch (PathNotFoundException e) {
            log.debug("No existing relation can be found with name [{}]", (Object)name);
        }
        catch (RepositoryException e) {
            throw new AssetException("Failed to get related Assets with name [ " + name + " ]", (Throwable)e);
        }
        return relations.iterator();
    }

    private List<Asset> getRelations(Property property) throws RepositoryException {
        ArrayList<Asset> namedRelations = new ArrayList<Asset>();
        if (property.getDefinition().isMultiple()) {
            for (Value v : property.getValues()) {
                if (v.getType() != 1) continue;
                this.addNamedAssetRelation(namedRelations, v.getString());
            }
        } else if (property.getType() == 1) {
            Value v = property.getValue();
            this.addNamedAssetRelation(namedRelations, v.getString());
        }
        return namedRelations;
    }

    private void addNamedAssetRelation(List<Asset> namedRelations, String assetPath) throws RepositoryException {
        Asset asset = this.getAssetByPath(assetPath);
        if (asset == null) {
            asset = this.getAssetByIdentifier(assetPath);
        }
        if (asset != null) {
            namedRelations.add(asset);
        }
    }

    private Asset getAssetByPath(String path) {
        Resource resource = this.getResolver().getResource(path);
        if (resource != null) {
            return (Asset)resource.adaptTo(Asset.class);
        }
        return null;
    }

    private Asset getAssetByIdentifier(String identifier) {
        try {
            Node assetNode = this.getSession().getNodeByIdentifier(identifier);
            Resource resource = this.getResolver().getResource(assetNode.getPath());
            return (Asset)resource.adaptTo(Asset.class);
        }
        catch (RepositoryException e) {
            log.warn("Failed to get Asset with identifier {}", (Object)identifier, (Object)e);
            return null;
        }
    }
}