CollectionViewHandler.java 13.8 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.dam.commons.util.DamUtil
 *  com.day.cq.search.Predicate
 *  com.day.cq.search.PredicateConverter
 *  com.day.cq.search.PredicateGroup
 *  com.day.cq.search.Query
 *  com.day.cq.search.QueryBuilder
 *  com.day.cq.search.result.Hit
 *  com.day.cq.search.result.SearchResult
 *  com.day.cq.tagging.Tag
 *  com.day.cq.tagging.TagManager
 *  com.day.cq.wcm.core.contentfinder.Hit
 *  com.day.cq.wcm.core.contentfinder.ViewHandler
 *  com.day.cq.wcm.core.contentfinder.ViewQuery
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.api.security.user.Authorizable
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.request.RequestPathInfo
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.resource.collection.ResourceCollection
 *  org.apache.sling.xss.XSSAPI
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.dam.cfm.impl.servlets;

import com.day.cq.dam.commons.util.DamUtil;
import com.day.cq.search.Predicate;
import com.day.cq.search.PredicateConverter;
import com.day.cq.search.PredicateGroup;
import com.day.cq.search.Query;
import com.day.cq.search.QueryBuilder;
import com.day.cq.search.result.SearchResult;
import com.day.cq.tagging.Tag;
import com.day.cq.tagging.TagManager;
import com.day.cq.wcm.core.contentfinder.Hit;
import com.day.cq.wcm.core.contentfinder.ViewHandler;
import com.day.cq.wcm.core.contentfinder.ViewQuery;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.request.RequestPathInfo;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.resource.collection.ResourceCollection;
import org.apache.sling.xss.XSSAPI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service
@Properties(value={@Property(name="service.description", value={"Handles the display of the product collections tab in the content finder"}), @Property(name="sling.servlet.paths", value={"/bin/wcm/contentfinder/assoccollection/view"})})
public class CollectionViewHandler
extends ViewHandler {
    private static Logger log = LoggerFactory.getLogger(CollectionViewHandler.class);
    @Reference
    private XSSAPI xssAPI;
    @Reference(policy=ReferencePolicy.STATIC)
    private QueryBuilder queryBuilder;
    private static final String DEFAULT_START_PATH = "/content/dam/collections";
    public static final String PROPERTY_STEP = "*/";
    private static final String RESOURCE_TYPE = "sling:resourceType";
    private static final String COLLECTION_TYPE = "dam/collection";
    private static final String TAGS_PROP = "tags";
    private static final String CQ_TAGS_PROP = "cq:tags";
    private static final String LIGHTBOX_SUFFIX = "/lightbox";

    protected ViewQuery createQuery(SlingHttpServletRequest request, Session session, String queryString) throws RepositoryException {
        if (queryString != null) {
            queryString = this.preserveWildcards(queryString);
        }
        PredicateGroup gqlPredicateGroup = PredicateConverter.createPredicatesFromGQL((String)queryString);
        ResourceResolver resolver = request.getResourceResolver();
        TagManager tagManager = (TagManager)resolver.adaptTo(TagManager.class);
        Set<String> predicateSet = this.customizePredicateGroup(gqlPredicateGroup, tagManager);
        RequestPathInfo pathInfo = request.getRequestPathInfo();
        String startPath = pathInfo.getSuffix();
        String string = startPath = startPath != null && startPath.startsWith("/content/dam/collections") ? startPath : "/content/dam/collections";
        if (!predicateSet.contains("path")) {
            gqlPredicateGroup.add(new Predicate("path").set("path", startPath));
        }
        if (gqlPredicateGroup.get("limit") == null) {
            String limit = request.getParameter("limit");
            if (limit != null && !limit.equals("")) {
                int offset = Integer.parseInt(StringUtils.substringBefore((String)limit, (String)".."));
                int total = Integer.parseInt(StringUtils.substringAfter((String)limit, (String)".."));
                gqlPredicateGroup.set("limit", Long.toString(total - offset));
                gqlPredicateGroup.set("offset", Long.toString(offset));
            } else {
                gqlPredicateGroup.set("limit", Long.toString(20));
            }
        }
        this.addCollectionConstraint(gqlPredicateGroup);
        if (!predicateSet.contains("orderby")) {
            gqlPredicateGroup.add(new Predicate("orderby").set("orderby", "@jcr:lastModified").set("sort", "desc"));
        }
        Resource root = resolver.getResource(startPath);
        return new GQLViewQuery(resolver, this.xssAPI, this.queryBuilder, gqlPredicateGroup, root);
    }

    private Set<String> customizePredicateGroup(PredicateGroup predicateGroup, TagManager tagManager) {
        if (predicateGroup == null) {
            return new HashSet<String>();
        }
        HashSet<String> predicateSet = new HashSet<String>();
        for (int i = 0; i < predicateGroup.size(); ++i) {
            if (predicateGroup.get(i) instanceof PredicateGroup) {
                PredicateGroup optionalGrp = (PredicateGroup)predicateGroup.get(i);
                predicateSet.addAll(this.customizePredicateGroup(optionalGrp, tagManager));
                predicateGroup.set(i, (Predicate)optionalGrp);
                continue;
            }
            if (!(predicateGroup.get(i) instanceof Predicate)) continue;
            Predicate predicate = predicateGroup.get(i);
            predicateSet.add(predicate.getType());
            this.modifyPredicate(predicateGroup, predicate, i, tagManager);
        }
        return predicateSet;
    }

    private void modifyPredicate(PredicateGroup parentGroup, Predicate predicate, int index, TagManager tagManager) {
        String fulltext;
        String property = predicate.get("property");
        if ("property".equals(predicate.getType())) {
            String value = predicate.get("value");
            if (property.equals("tags") || property.equals("tag")) {
                Tag tag;
                predicate.set("property", "cq:tags");
                parentGroup.set(index, predicate);
                if (tagManager != null && (tag = tagManager.resolve(value)) == null) {
                    Predicate tagSearchPredicate = new Predicate("tagsearch");
                    tagSearchPredicate.set("property", "cq:tags");
                    tagSearchPredicate.set("tagsearch", value);
                    parentGroup.set(index, tagSearchPredicate);
                }
            } else {
                int depth = StringUtils.countMatches((String)(property = this.revertWildcards(property)), (String)"*/");
                if (depth > 0) {
                    predicate.set("property", property.replace("*/", ""));
                    predicate.set("depth", String.valueOf(depth));
                    parentGroup.set(index, predicate);
                }
            }
        } else if ("fulltext".equals(predicate.getType()) && (fulltext = predicate.get("fulltext", "")) != null) {
            if (fulltext != null) {
                fulltext = this.revertWildcards(fulltext);
            }
            predicate.set("fulltext", fulltext);
            Predicate tagSearchPredicate = new Predicate("tagsearch");
            tagSearchPredicate.set("property", "cq:tags");
            tagSearchPredicate.set("tagsearch", fulltext);
            PredicateGroup optionalGrp = new PredicateGroup();
            optionalGrp.setAllRequired(false);
            optionalGrp.add(predicate);
            optionalGrp.add(tagSearchPredicate);
            parentGroup.set(index, (Predicate)optionalGrp);
        }
    }

    private String preserveWildcards(String queryString) {
        if (queryString != null) {
            queryString = queryString.replace("*", "%");
        }
        return queryString;
    }

    private String revertWildcards(String queryString) {
        if (queryString != null) {
            queryString = queryString.replace("%", "*");
        }
        return queryString;
    }

    private void addCollectionConstraint(PredicateGroup gqlPredicateGroup) {
        Predicate predicate = new Predicate("property");
        predicate.set("property", "sling:resourceType");
        predicate.set("value", "dam/collection");
        predicate.set("operation", "equals");
        gqlPredicateGroup.add(predicate);
    }

    protected void bindXssAPI(XSSAPI xSSAPI) {
        this.xssAPI = xSSAPI;
    }

    protected void unbindXssAPI(XSSAPI xSSAPI) {
        if (this.xssAPI == xSSAPI) {
            this.xssAPI = null;
        }
    }

    protected void bindQueryBuilder(QueryBuilder queryBuilder) {
        this.queryBuilder = queryBuilder;
    }

    protected void unbindQueryBuilder(QueryBuilder queryBuilder) {
        if (this.queryBuilder == queryBuilder) {
            this.queryBuilder = null;
        }
    }

    private static class GQLViewQuery
    implements ViewQuery {
        Session session;
        ResourceResolver resolver;
        private final XSSAPI xssAPI;
        private final QueryBuilder qb;
        private final PredicateGroup predicateGroup;
        private final Resource root;

        public GQLViewQuery(ResourceResolver resolver, XSSAPI xssAPI, QueryBuilder qb, PredicateGroup predicateGroup, Resource root) {
            this.session = (Session)resolver.adaptTo(Session.class);
            this.resolver = resolver;
            this.xssAPI = xssAPI;
            this.predicateGroup = predicateGroup;
            this.qb = qb;
            this.root = root;
        }

        private Hit createHit(Resource collection, String excerpt, XSSAPI xssAPI) throws RepositoryException {
            Hit hit = new Hit();
            String path = collection.getPath();
            String name = path.substring(path.lastIndexOf("/") + 1);
            ValueMap props = (ValueMap)collection.adaptTo(ValueMap.class);
            String title = (String)props.get("jcr:title", (Object)"");
            if (title == null || title.length() == 0) {
                title = name;
            }
            hit.set("name", (Object)xssAPI.encodeForHTML(name));
            hit.set("path", (Object)path);
            hit.set("thumbnail", (Object)xssAPI.getValidHref(path + ".folderthumbnail.jpg?width=240&height=240"));
            hit.set("title", (Object)xssAPI.encodeForHTML(title));
            hit.set("excerpt", (Object)xssAPI.filterHTML(excerpt));
            return hit;
        }

        public Collection<Hit> execute() {
            ArrayList<Hit> hits = new ArrayList<Hit>();
            Query query = this.qb.createQuery(this.predicateGroup, this.session);
            Iterator searchHits = query.getResult().getHits().iterator();
            try {
                Authorizable user = (Authorizable)this.resolver.adaptTo(Authorizable.class);
                String userLightBox = null;
                if (user != null && this.root != null) {
                    String userHome = user.getPath();
                    String tenantUserHome = (String)DamUtil.getInheritedProperty((String)"dam:tenantUserHome", (Resource)this.root, (Object)"/home/users");
                    String damCollsHome = (String)DamUtil.getInheritedProperty((String)"dam:collectionHome", (Resource)this.root, (Object)"/content/dam/collections");
                    userHome = userHome.indexOf(tenantUserHome) == 0 ? StringUtils.substringAfter((String)userHome, (String)tenantUserHome) : userHome;
                    userLightBox = damCollsHome + userHome + "/lightbox";
                }
                while (searchHits.hasNext()) {
                    String excerpt;
                    com.day.cq.search.result.Hit searchHit = (com.day.cq.search.result.Hit)searchHits.next();
                    String path = searchHit.getPath();
                    Resource collectionRsc = this.resolver.getResource(path);
                    ResourceCollection collection = (ResourceCollection)collectionRsc.adaptTo(ResourceCollection.class);
                    if (collection == null) continue;
                    boolean isFiltered = false;
                    if (path.endsWith("/lightbox")) {
                        boolean bl = isFiltered = userLightBox == null || !userLightBox.equals(path);
                    }
                    if (isFiltered) continue;
                    try {
                        excerpt = searchHit.getExcerpt();
                    }
                    catch (Exception e) {
                        excerpt = "";
                    }
                    hits.add(this.createHit(collectionRsc, excerpt, this.xssAPI));
                }
            }
            catch (RepositoryException re) {
                log.error("A repository error occurred", (Throwable)re);
            }
            return hits;
        }
    }

}