AssetVersionManagerImpl.java 6.5 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.AssetVersion
 *  com.adobe.granite.asset.api.AssetVersionManager
 *  javax.jcr.Item
 *  javax.jcr.Node
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Workspace
 *  javax.jcr.version.Version
 *  javax.jcr.version.VersionHistory
 *  javax.jcr.version.VersionIterator
 *  javax.jcr.version.VersionManager
 *  org.apache.commons.lang.StringUtils
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  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.AssetVersion;
import com.adobe.granite.asset.api.AssetVersionManager;
import com.adobe.granite.asset.core.impl.AssetVersionImpl;
import java.util.ArrayList;
import java.util.Iterator;
import javax.jcr.Item;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import javax.jcr.version.VersionManager;
import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
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 AssetVersionManagerImpl
implements AssetVersionManager {
    private static final Logger log = LoggerFactory.getLogger(AssetVersionManagerImpl.class);
    private final ResourceResolver resolver;
    private final Session session;

    public AssetVersionManagerImpl(ResourceResolver resolver) {
        this.resolver = resolver;
        this.session = (Session)resolver.adaptTo(Session.class);
    }

    public AssetVersion createVersion(String assetPath, String label) {
        Node node = (Node)this.resolver.getResource(assetPath).adaptTo(Node.class);
        if (null != node) {
            try {
                if (this.session.hasPendingChanges()) {
                    throw new AssetException("Version cannot be created - current session has pending changes");
                }
                if (node.isLocked()) {
                    throw new AssetException("Asset at [ " + assetPath + " ] is locked, version can't be created.");
                }
                if (node.canAddMixin("mix:versionable")) {
                    node.addMixin("mix:versionable");
                    this.session.save();
                }
                VersionManager versionManager = this.session.getWorkspace().getVersionManager();
                Version version = versionManager.checkin(node.getPath());
                versionManager.checkout(node.getPath());
                if (StringUtils.isEmpty((String)label)) {
                    label = version.getName();
                }
                this.addVersionLabel(version, label);
                return new AssetVersionImpl(version, this.resolver);
            }
            catch (RepositoryException e) {
                try {
                    if (this.session.hasPendingChanges()) {
                        this.session.refresh(false);
                    }
                }
                catch (RepositoryException re) {
                    log.error("unable to revert changes after createVersion() failure for asset [{}]: ", (Object)assetPath, (Object)re);
                }
                throw new AssetException("Unable to create version for asset [ " + assetPath + " ]: ", (Throwable)e);
            }
        }
        throw new AssetException("Unable to create version for asset. [ " + assetPath + " ] is not an Asset");
    }

    public Asset restore(String versionId) {
        try {
            Version version = (Version)this.session.getNodeByIdentifier(versionId);
            String currentNodePath = this.session.getNodeByIdentifier(version.getContainingHistory().getVersionableIdentifier()).getPath();
            Node node = (Node)this.session.getItem(currentNodePath);
            VersionManager versionManager = node.getSession().getWorkspace().getVersionManager();
            versionManager.restore(version, true);
            versionManager.checkout(node.getPath());
            return (Asset)this.resolver.getResource(node.getPath()).adaptTo(Asset.class);
        }
        catch (RepositoryException e) {
            throw new AssetException("Failed to restore Asset version with ID [ " + versionId + " ]", (Throwable)e);
        }
    }

    public AssetVersion getVersion(String versionId) {
        try {
            Version version = (Version)this.session.getNodeByIdentifier(versionId);
            if (version == null) {
                return null;
            }
            return new AssetVersionImpl(version, this.resolver);
        }
        catch (RepositoryException e) {
            throw new AssetException("Failed to lookup Asset version with ID [ " + versionId + " ]", (Throwable)e);
        }
    }

    public Iterator<? extends AssetVersion> listVersions(String path) {
        ArrayList<AssetVersionImpl> versions = new ArrayList<AssetVersionImpl>();
        try {
            Node node = (Node)this.session.getItem(path);
            if (node.isNodeType("mix:versionable")) {
                VersionHistory history = this.session.getWorkspace().getVersionManager().getVersionHistory(node.getPath());
                Version root = history.getRootVersion();
                VersionIterator iter = history.getAllVersions();
                while (iter.hasNext()) {
                    Version version = iter.nextVersion();
                    AssetVersionImpl r = new AssetVersionImpl(version, this.resolver);
                    if (version.isSame((Item)root)) continue;
                    versions.add(r);
                }
            }
        }
        catch (RepositoryException e) {
            throw new AssetException("Failed to retrieve versions at Path [ " + path + " ]", (Throwable)e);
        }
        return versions.iterator();
    }

    private void addVersionLabel(Version version, String label) {
        try {
            version.getContainingHistory().addVersionLabel(version.getName(), label, true);
        }
        catch (RepositoryException e) {
            log.warn("Failed to add version label", (Throwable)e);
        }
    }
}