ResourceManagerImpl.java 4.42 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.rest.RequestException
 *  com.adobe.granite.rest.ResourceManager
 *  com.adobe.granite.rest.RestException
 *  javax.jcr.Node
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Workspace
 *  javax.jcr.query.Query
 *  javax.jcr.query.QueryManager
 *  javax.jcr.query.QueryResult
 *  javax.jcr.query.Row
 *  javax.jcr.query.RowIterator
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.rest.content.impl;

import com.adobe.cq.rest.content.impl.PageQueryTransformer;
import com.adobe.cq.rest.content.impl.PageResource;
import com.adobe.cq.rest.content.impl.PageResourceProviderFactory;
import com.adobe.granite.rest.RequestException;
import com.adobe.granite.rest.ResourceManager;
import com.adobe.granite.rest.RestException;
import java.util.LinkedList;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.query.Row;
import javax.jcr.query.RowIterator;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ResourceManagerImpl
implements ResourceManager {
    private Logger logger;
    private PageQueryTransformer queryTransformer;
    private PageResourceProviderFactory apiResourceProviderFactory;

    public ResourceManagerImpl(PageResourceProviderFactory apiResourceProviderFactory) {
        this.logger = LoggerFactory.getLogger(this.getClass());
        this.queryTransformer = new PageQueryTransformer();
        this.apiResourceProviderFactory = apiResourceProviderFactory;
    }

    public boolean copy(Resource resource, String destinationUri, int depth) throws UnsupportedOperationException, RequestException, RestException {
        throw new UnsupportedOperationException("Copy is not supported for this Resource");
    }

    public boolean move(Resource resource, String destinationUri) throws UnsupportedOperationException, RequestException, RestException {
        throw new UnsupportedOperationException("Move is not supported for this Resource");
    }

    public List<Resource> find(Resource resource, String query) throws UnsupportedOperationException, RequestException, RestException {
        this.logger.debug("finding resources for query={}", (Object)query);
        if (!(resource instanceof PageResource)) {
            throw new IllegalArgumentException("Resource is not a PageResource");
        }
        if (!query.toLowerCase().startsWith("select ")) {
            query = "SELECT * FROM page WHERE CONTAINS(page.*, '" + query.replaceAll("'", "''") + "')";
        }
        ResourceResolver resolver = resource.getResourceResolver();
        LinkedList<Resource> results = new LinkedList<Resource>();
        String transformedQuery = this.queryTransformer.transform(resource, query);
        this.logger.debug("Transformed query {} to {}", (Object)query, (Object)transformedQuery);
        if (transformedQuery != null) {
            String apiContextPath = resource.getPath().replaceFirst("^(/.*?/.*?)(/.*)", "$1");
            try {
                Session session = (Session)resolver.adaptTo(Session.class);
                QueryManager queryMgr = session.getWorkspace().getQueryManager();
                Query jcrQuery = queryMgr.createQuery(transformedQuery, "JCR-SQL2");
                QueryResult queryResults = jcrQuery.execute();
                String selector = this.queryTransformer.getSelectorName(resource, query);
                RowIterator it = queryResults.getRows();
                while (it.hasNext()) {
                    Row row = it.nextRow();
                    Node node = row.getNode(selector);
                    String path = this.apiResourceProviderFactory.map(apiContextPath, node.getPath());
                    Resource result = resolver.getResource(path);
                    if (result == null || !(result instanceof PageResource)) continue;
                    results.add(result);
                }
            }
            catch (RepositoryException e) {
                throw new RestException(e.getMessage(), (Throwable)e);
            }
        }
        return results;
    }
}