AuthorizableOmniSearchHandler.java 5.31 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.i18n.I18n
 *  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.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Value
 *  javax.jcr.ValueFactory
 *  javax.jcr.Workspace
 *  javax.jcr.query.Query
 *  javax.jcr.query.QueryManager
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.omnisearch.impl.security;

import com.adobe.granite.omnisearch.api.suggestion.PredicateSuggestion;
import com.adobe.granite.omnisearch.spi.core.OmniSearchHandler;
import com.day.cq.i18n.I18n;
import com.day.cq.search.Predicate;
import com.day.cq.search.PredicateConverter;
import com.day.cq.search.PredicateGroup;
import com.day.cq.search.QueryBuilder;
import com.day.cq.search.result.SearchResult;
import java.util.List;
import java.util.Map;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.jcr.Workspace;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class AuthorizableOmniSearchHandler
implements OmniSearchHandler {
    private static final Logger LOG = LoggerFactory.getLogger(AuthorizableOmniSearchHandler.class);
    private static final String METADATA_PATH = "/libs/granite/omnisearch/content/metadata";
    private static final String NODE_TYPE_PROPERTY = "nodeType";

    @Override
    public Query getSuggestionQuery(ResourceResolver resourceResolver, String searchTerm) {
        try {
            Resource metadata = this.getModuleConfig(resourceResolver);
            if (metadata != null) {
                Map metadataProps = (Map)metadata.adaptTo(ValueMap.class);
                String nodeType = (String)metadataProps.get("nodeType");
                String queryStr = "SELECT [rep:suggest()] FROM [" + nodeType + "] as s WHERE [jcr:path] = '/' AND SUGGEST($term)";
                Session session = (Session)resourceResolver.adaptTo(Session.class);
                QueryManager queryManager = session.getWorkspace().getQueryManager();
                Query query = queryManager.createQuery(queryStr, "JCR-SQL2");
                ValueFactory vf = session.getValueFactory();
                query.bindValue("term", vf.createValue(searchTerm));
                return query;
            }
        }
        catch (RepositoryException e) {
            LOG.error("Error while creating Suggestion query", (Throwable)e);
        }
        return null;
    }

    @Override
    public List<PredicateSuggestion> getPredicateSuggestions(ResourceResolver resourceResolver, I18n i18n, String s) {
        return null;
    }

    @Override
    public Query getSpellCheckQuery(ResourceResolver resourceResolver, String s) {
        return null;
    }

    @Override
    public Resource getModuleConfig(ResourceResolver resourceResolver) {
        Resource metadata = resourceResolver.getResource("/libs/granite/omnisearch/content/metadata");
        if (metadata != null) {
            return resourceResolver.getResource(metadata, this.getID());
        }
        return null;
    }

    public SearchResult getResults(QueryBuilder queryBuilder, ResourceResolver resolver, Map predicateParameters, long limit, long offset) {
        String[] keywordParams = (String[])predicateParameters.get("fulltext");
        predicateParameters.remove("fulltext");
        String keyword = keywordParams[0];
        String wildcardKeyword = keyword + "*";
        Resource metadata = this.getModuleConfig(resolver);
        ValueMap metadataProps = (ValueMap)metadata.adaptTo(ValueMap.class);
        String nodeType = (String)metadataProps.get("nodeType", (Object)"rep:Authorizable");
        PredicateGroup authorizablePredicateGroup = new PredicateGroup();
        authorizablePredicateGroup.add(new Predicate("type").set("type", nodeType));
        PredicateGroup fulltextPredicateGroup = new PredicateGroup();
        fulltextPredicateGroup.setAllRequired(false);
        Predicate predicateKeywoard = new Predicate("fulltext");
        predicateKeywoard.set("fulltext", keyword);
        fulltextPredicateGroup.add(predicateKeywoard);
        Predicate predicateWildcardKeyword = new Predicate("fulltext");
        predicateWildcardKeyword.set("fulltext", wildcardKeyword);
        fulltextPredicateGroup.add(predicateWildcardKeyword);
        authorizablePredicateGroup.add((Predicate)fulltextPredicateGroup);
        predicateParameters.putAll(PredicateConverter.createMap((PredicateGroup)authorizablePredicateGroup));
        com.day.cq.search.Query query = queryBuilder.createQuery(PredicateConverter.createPredicates((Map)predicateParameters), (Session)resolver.adaptTo(Session.class));
        if (limit != 0) {
            query.setHitsPerPage(limit);
        }
        if (offset != 0) {
            query.setStart(offset);
        }
        return query.getResult();
    }
}