ScreensOmniSearchHandler.java 7.28 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.confmgr.Conf
 *  com.adobe.granite.omnisearch.commons.AbstractOmniSearchHandler
 *  com.adobe.granite.omnisearch.spi.core.OmniSearchHandler
 *  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.SearchResult
 *  javax.jcr.Session
 *  javax.jcr.observation.EventIterator
 *  org.apache.felix.scr.annotations.Activate
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Deactivate
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.osgi.service.component.ComponentContext
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.screens.dcc.impl;

import com.adobe.granite.confmgr.Conf;
import com.adobe.granite.omnisearch.commons.AbstractOmniSearchHandler;
import com.adobe.granite.omnisearch.spi.core.OmniSearchHandler;
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 java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.Session;
import javax.jcr.observation.EventIterator;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate=1)
@Service(value={OmniSearchHandler.class})
public class ScreensOmniSearchHandler
extends AbstractOmniSearchHandler {
    private static final Logger log = LoggerFactory.getLogger(ScreensOmniSearchHandler.class);
    private static final String TYPE = "screens";
    private static final String TYPE_PREDICATE_PARAMETER = "type";
    private static final String PATH_PREDICATE_PARAMETER = "path";
    @Reference
    private QueryBuilder queryBuilder;
    @Reference
    private ResourceResolverFactory resolverFactory;

    public String getID() {
        return "screens";
    }

    public SearchResult getResults(ResourceResolver resolver, Map<String, Object> predicateParameters, long limit, long offset) {
        Resource moduleConfig = this.getModuleConfig(resolver);
        if (moduleConfig == null) {
            return null;
        }
        if (!predicateParameters.containsKey("path")) {
            predicateParameters.put("path", this.getDefaultSearchPath());
        }
        PredicateGroup predicates = PredicateConverter.createPredicates(predicateParameters);
        List predRT = new ArrayList<String>();
        ArrayList<Predicate> foundPredicates = new ArrayList<Predicate>();
        for (Predicate p : predicates) {
            if (!"property".equals(p.getType()) || !"sling:resourceType".equals(p.get("property"))) continue;
            Map params = p.getParameters();
            for (String k : params.keySet()) {
                if (!k.contains("_value")) continue;
                String val = (String)params.get(k);
                predRT.add(val);
            }
            foundPredicates.add(p);
        }
        if (foundPredicates.size() > 0) {
            predicates.removeAll(foundPredicates);
        }
        if (predRT.size() == 0) {
            predRT = Arrays.asList("screens/core/components/app", "screens/core/components/appchannel", "screens/core/components/appfolder", "screens/core/components/channel", "screens/core/components/channelfolder", "screens/core/components/device", "screens/core/components/devicefolder", "screens/core/components/deviceconfig", "screens/core/components/display", "screens/core/components/location", "screens/core/components/locationfolder", "screens/core/components/screen", "screens/core/components/sequencechannel", "screens/core/components/project");
        }
        PredicateGroup rtPG = new PredicateGroup();
        rtPG.setAllRequired(false);
        Iterator itPredRT = predRT.iterator();
        Predicate allRT = new Predicate("all_rt", "property").set("property", "sling:resourceType");
        Predicate allRST = new Predicate("all_rst", "property").set("property", "sling:resourceSuperType");
        int pNo = 1;
        while (itPredRT.hasNext()) {
            String pRT = (String)itPredRT.next();
            allRT.set(String.valueOf(pNo) + "_value", pRT);
            allRST.set(String.valueOf(pNo) + "_value", pRT);
            ++pNo;
        }
        rtPG.add(allRT);
        rtPG.add(allRST);
        predicates.add((Predicate)rtPG);
        Query query = this.queryBuilder.createQuery(predicates, (Session)resolver.adaptTo(Session.class));
        if (limit != 0) {
            query.setHitsPerPage(limit);
        }
        if (offset != 0) {
            query.setStart(offset);
        }
        return query.getResult();
    }

    protected Resource getPredicateRootResource(ResourceResolver resolver) {
        Conf conf = (Conf)resolver.getResource("/content/screens").adaptTo(Conf.class);
        return conf.getItemResource(this.getPredicatePath());
    }

    private ResourceResolver getResourceResolver() throws LoginException {
        HashMap<String, String> param = new HashMap<String, String>();
        param.put("sling.service.subservice", "omnisearch-service");
        return this.resolverFactory.getServiceResourceResolver(param);
    }

    public void onEvent(EventIterator eventIterator) {
        try {
            this.init(this.getResourceResolver());
        }
        catch (LoginException e) {
            log.error("Error during update", (Throwable)e);
        }
    }

    @Activate
    protected void activate(ComponentContext componentContext) throws LoginException {
        this.init(this.getResourceResolver());
    }

    @Deactivate
    protected void deactivate(ComponentContext componentContext) throws LoginException {
        this.destroy(this.getResourceResolver());
    }

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

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

    protected void bindResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        this.resolverFactory = resourceResolverFactory;
    }

    protected void unbindResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        if (this.resolverFactory == resourceResolverFactory) {
            this.resolverFactory = null;
        }
    }
}