AuthorizableOmniSearchHandler.java
5.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
* 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();
}
}