2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portal.kernel.search;
\r
17 import com.liferay.portal.kernel.log.Log;
\r
18 import com.liferay.portal.kernel.log.LogFactoryUtil;
\r
19 import com.liferay.portal.kernel.messaging.DestinationNames;
\r
20 import com.liferay.portal.kernel.security.pacl.permission.PortalRuntimePermission;
\r
21 import com.liferay.portal.kernel.util.GetterUtil;
\r
22 import com.liferay.portal.kernel.util.PropsKeys;
\r
23 import com.liferay.portal.kernel.util.PropsUtil;
\r
24 import com.liferay.portal.kernel.util.StringPool;
\r
25 import com.liferay.portal.security.permission.PermissionThreadLocal;
\r
27 import java.util.Collection;
\r
28 import java.util.HashSet;
\r
29 import java.util.List;
\r
30 import java.util.Map;
\r
31 import java.util.Set;
\r
32 import java.util.concurrent.ConcurrentHashMap;
\r
35 * @author Bruno Farache
\r
36 * @author Raymond Augé
\r
37 * @author Michael C. Han
\r
39 public class SearchEngineUtil {
\r
42 * @deprecated {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}
\r
44 public static final int ALL_POS = -1;
\r
46 public static final String GENERIC_ENGINE_ID = "GENERIC_ENGINE";
\r
48 public static final String SYSTEM_ENGINE_ID = "SYSTEM_ENGINE";
\r
51 * @deprecated {@link #addDocument(String, long, Document)}
\r
53 public static void addDocument(long companyId, Document document)
\r
54 throws SearchException {
\r
56 addDocument(_getSearchEngineId(document), companyId, document);
\r
59 public static void addDocument(
\r
60 String searchEngineId, long companyId, Document document)
\r
61 throws SearchException {
\r
63 if (isIndexReadOnly()) {
\r
67 if (_log.isDebugEnabled()) {
\r
68 _log.debug("Add document " + document.toString());
\r
71 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
73 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
75 _searchPermissionChecker.addPermissionFields(companyId, document);
\r
77 SearchContext searchContext = new SearchContext();
\r
79 searchContext.setCompanyId(companyId);
\r
80 searchContext.setSearchEngineId(searchEngineId);
\r
82 indexWriter.addDocument(searchContext, document);
\r
86 * @deprecated {@link #addDocuments(String, long, Collection)}
\r
88 public static void addDocuments(
\r
89 long companyId, Collection<Document> documents)
\r
90 throws SearchException {
\r
92 addDocuments(_getSearchEngineId(documents), companyId, documents);
\r
95 public static void addDocuments(
\r
96 String searchEngineId, long companyId,
\r
97 Collection<Document> documents)
\r
98 throws SearchException {
\r
100 if (isIndexReadOnly() || (documents == null) || documents.isEmpty()) {
\r
104 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
106 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
108 for (Document document : documents) {
\r
109 if (_log.isDebugEnabled()) {
\r
110 _log.debug("Add document " + document.toString());
\r
113 _searchPermissionChecker.addPermissionFields(companyId, document);
\r
116 SearchContext searchContext = new SearchContext();
\r
118 searchContext.setCompanyId(companyId);
\r
119 searchContext.setSearchEngineId(searchEngineId);
\r
121 indexWriter.addDocuments(searchContext, documents);
\r
125 * @deprecated {@link #setSearchEngine(String, SearchEngine)}
\r
127 public static void addSearchEngine(SearchEngine searchEngine) {
\r
128 String searchEngineId = getDefaultSearchEngineId();
\r
130 PortalRuntimePermission.checkSearchEngine(searchEngineId);
\r
132 _searchEngines.put(searchEngineId, searchEngine);
\r
136 * @deprecated {@link #deleteDocument(String, long, String)}
\r
138 public static void deleteDocument(long companyId, String uid)
\r
139 throws SearchException {
\r
141 for (String searchEngineId : _searchEngines.keySet()) {
\r
142 deleteDocument(searchEngineId, companyId, uid);
\r
146 public static void deleteDocument(
\r
147 String searchEngineId, long companyId, String uid)
\r
148 throws SearchException {
\r
150 if (isIndexReadOnly()) {
\r
154 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
156 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
158 SearchContext searchContext = new SearchContext();
\r
160 searchContext.setCompanyId(companyId);
\r
161 searchContext.setSearchEngineId(searchEngineId);
\r
163 indexWriter.deleteDocument(searchContext, uid);
\r
167 * @deprecated {@link #deleteDocuments(String, long, Collection)}
\r
169 public static void deleteDocuments(long companyId, Collection<String> uids)
\r
170 throws SearchException {
\r
172 for (String searchEngineId : _searchEngines.keySet()) {
\r
173 deleteDocuments(searchEngineId, companyId, uids);
\r
177 public static void deleteDocuments(
\r
178 String searchEngineId, long companyId, Collection<String> uids)
\r
179 throws SearchException {
\r
181 if (isIndexReadOnly() || (uids == null) || uids.isEmpty()) {
\r
185 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
187 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
189 SearchContext searchContext = new SearchContext();
\r
191 searchContext.setCompanyId(companyId);
\r
192 searchContext.setSearchEngineId(searchEngineId);
\r
194 indexWriter.deleteDocuments(searchContext, uids);
\r
198 * @deprecated {@link #deletePortletDocuments(String, long, String)}
\r
200 public static void deletePortletDocuments(long companyId, String portletId)
\r
201 throws SearchException {
\r
203 for (String searchEngineId : _searchEngines.keySet()) {
\r
204 deletePortletDocuments(searchEngineId, companyId, portletId);
\r
208 public static void deletePortletDocuments(
\r
209 String searchEngineId, long companyId, String portletId)
\r
210 throws SearchException {
\r
212 if (isIndexReadOnly()) {
\r
216 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
218 if (searchEngine == null) {
\r
222 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
224 SearchContext searchContext = new SearchContext();
\r
226 searchContext.setCompanyId(companyId);
\r
227 searchContext.setSearchEngineId(searchEngineId);
\r
229 indexWriter.deletePortletDocuments(searchContext, portletId);
\r
232 public static String getDefaultSearchEngineId() {
\r
233 if (_defaultSearchEngineId == null) {
\r
234 return SYSTEM_ENGINE_ID;
\r
237 return _defaultSearchEngineId;
\r
240 public static String[] getEntryClassNames() {
\r
241 Set<String> assetEntryClassNames = new HashSet<String>();
\r
243 for (Indexer indexer : IndexerRegistryUtil.getIndexers()) {
\r
244 for (String className : indexer.getClassNames()) {
\r
245 if (!_excludedEntryClassNames.contains(className)) {
\r
246 assetEntryClassNames.add(className);
\r
251 return assetEntryClassNames.toArray(
\r
252 new String[assetEntryClassNames.size()]);
\r
256 * @deprecated {@link #getSearchEngine(String)}
\r
258 public static SearchEngine getSearchEngine() {
\r
259 return getSearchEngine(getDefaultSearchEngineId());
\r
262 public static SearchEngine getSearchEngine(String searchEngineId) {
\r
263 PortalRuntimePermission.checkSearchEngine(searchEngineId);
\r
265 SearchEngine searchEngine = _searchEngines.get(searchEngineId);
\r
267 if (searchEngine == null) {
\r
268 if (getDefaultSearchEngineId().equals(searchEngineId)) {
\r
269 throw new IllegalStateException(
\r
270 "There is no default search engine configured with ID " +
\r
271 getDefaultSearchEngineId());
\r
274 if (_log.isWarnEnabled()) {
\r
276 "There is no search engine configured with ID " +
\r
281 return searchEngine;
\r
284 public static Set<String> getSearchEngineIds() {
\r
285 PortalRuntimePermission.checkGetBeanProperty(
\r
286 SearchEngineUtil.class, "searchEngineIds");
\r
288 return _searchEngines.keySet();
\r
291 public static SearchEngine getSearchEngineSilent(String searchEngineId) {
\r
292 PortalRuntimePermission.checkSearchEngine(searchEngineId);
\r
294 return _searchEngines.get(searchEngineId);
\r
297 public static SearchPermissionChecker getSearchPermissionChecker() {
\r
298 PortalRuntimePermission.checkGetBeanProperty(
\r
299 SearchEngineUtil.class, "searchPermissionChecker");
\r
301 return _searchPermissionChecker;
\r
304 public static String getSearchReaderDestinationName(String searchEngineId) {
\r
305 return DestinationNames.SEARCH_READER.concat(StringPool.SLASH).concat(
\r
309 public static String getSearchWriterDestinationName(String searchEngineId) {
\r
310 return DestinationNames.SEARCH_WRITER.concat(StringPool.SLASH).concat(
\r
314 public static boolean isIndexReadOnly() {
\r
315 PortalRuntimePermission.checkGetBeanProperty(
\r
316 SearchEngineUtil.class, "indexReadOnly");
\r
318 return _indexReadOnly;
\r
321 public static SearchEngine removeSearchEngine(String searchEngineId) {
\r
322 PortalRuntimePermission.checkSearchEngine(searchEngineId);
\r
324 return _searchEngines.remove(searchEngineId);
\r
330 public static Hits search(
\r
331 long companyId, long[] groupIds, long userId, String className,
\r
332 Query query, int start, int end)
\r
333 throws SearchException {
\r
335 SearchContext searchContext = new SearchContext();
\r
337 searchContext.setSearchEngineId(getDefaultSearchEngineId());
\r
340 query = _searchPermissionChecker.getPermissionQuery(
\r
341 companyId, groupIds, userId, className, query, searchContext);
\r
345 companyId, query, SortFactoryUtil.getDefaultSorts(), start, end);
\r
351 public static Hits search(
\r
352 long companyId, long[] groupIds, long userId, String className,
\r
353 Query query, Sort sort, int start, int end)
\r
354 throws SearchException {
\r
356 SearchContext searchContext = new SearchContext();
\r
358 searchContext.setSearchEngineId(getDefaultSearchEngineId());
\r
361 query = _searchPermissionChecker.getPermissionQuery(
\r
362 companyId, groupIds, userId, className, query, searchContext);
\r
365 return search(companyId, query, sort, start, end);
\r
371 public static Hits search(
\r
372 long companyId, long[] groupIds, long userId, String className,
\r
373 Query query, Sort[] sorts, int start, int end)
\r
374 throws SearchException {
\r
376 SearchContext searchContext = new SearchContext();
\r
378 searchContext.setSearchEngineId(getDefaultSearchEngineId());
\r
381 query = _searchPermissionChecker.getPermissionQuery(
\r
382 companyId, groupIds, userId, className, query, searchContext);
\r
385 return search(companyId, query, sorts, start, end);
\r
389 * @deprecated {@link #search(String, long, Query, int, int)}
\r
391 public static Hits search(long companyId, Query query, int start, int end)
\r
392 throws SearchException {
\r
394 return search(getDefaultSearchEngineId(), companyId, query, start, end);
\r
398 * @deprecated {@link #search(String, long, Query, Sort, int, int)}
\r
400 public static Hits search(
\r
401 long companyId, Query query, Sort sort, int start, int end)
\r
402 throws SearchException {
\r
405 getDefaultSearchEngineId(), companyId, query, sort, start, end);
\r
409 * @deprecated {@link #search(String, long, Query, Sort[], int, int)}
\r
411 public static Hits search(
\r
412 long companyId, Query query, Sort[] sorts, int start, int end)
\r
413 throws SearchException {
\r
416 getDefaultSearchEngineId(), companyId, query, sorts, start, end);
\r
419 public static Hits search(SearchContext searchContext, Query query)
\r
420 throws SearchException {
\r
422 if (_log.isDebugEnabled()) {
\r
423 _log.debug("Search query " + query.toString());
\r
426 SearchEngine searchEngine = getSearchEngine(
\r
427 searchContext.getSearchEngineId());
\r
429 IndexSearcher indexSearcher = searchEngine.getIndexSearcher();
\r
431 return indexSearcher.search(searchContext, query);
\r
434 public static Hits search(
\r
435 String searchEngineId, long companyId, Query query, int start,
\r
437 throws SearchException {
\r
439 if (_log.isDebugEnabled()) {
\r
440 _log.debug("Search query " + query.toString());
\r
443 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
445 IndexSearcher indexSearcher = searchEngine.getIndexSearcher();
\r
447 return indexSearcher.search(
\r
448 searchEngineId, companyId, query, SortFactoryUtil.getDefaultSorts(),
\r
452 public static Hits search(
\r
453 String searchEngineId, long companyId, Query query, List<String> filters, int start,
\r
455 throws SearchException {
\r
457 if (_log.isDebugEnabled()) {
\r
458 _log.debug("Search query " + query.toString());
\r
461 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
463 IndexSearcher indexSearcher = searchEngine.getIndexSearcher();
\r
465 return indexSearcher.search(
\r
466 searchEngineId, companyId, query, SortFactoryUtil.getDefaultSorts(), filters,
\r
470 public static Hits search(
\r
471 String searchEngineId, long companyId, Query query, Sort sort,
\r
472 int start, int end)
\r
473 throws SearchException {
\r
475 if (_log.isDebugEnabled()) {
\r
476 _log.debug("Search query " + query.toString());
\r
479 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
481 IndexSearcher indexSearcher = searchEngine.getIndexSearcher();
\r
483 return indexSearcher.search(
\r
484 searchEngineId, companyId, query, new Sort[] {sort}, start, end);
\r
487 public static Hits search(
\r
488 String searchEngineId, long companyId, Query query, Sort[] sorts,
\r
489 int start, int end)
\r
490 throws SearchException {
\r
492 if (_log.isDebugEnabled()) {
\r
493 _log.debug("Search query " + query.toString());
\r
496 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
498 IndexSearcher indexSearcher = searchEngine.getIndexSearcher();
\r
500 return indexSearcher.search(
\r
501 searchEngineId, companyId, query, sorts, start, end);
\r
504 public static void setDefaultSearchEngineId(String defaultSearchEngineId) {
\r
505 PortalRuntimePermission.checkSetBeanProperty(
\r
506 SearchEngineUtil.class, "defaultSearchEngineId");
\r
508 _defaultSearchEngineId = defaultSearchEngineId;
\r
511 public static void setIndexReadOnly(boolean indexReadOnly) {
\r
512 PortalRuntimePermission.checkSetBeanProperty(
\r
513 SearchEngineUtil.class, "indexReadOnly");
\r
515 _indexReadOnly = indexReadOnly;
\r
518 public static void setSearchEngine(
\r
519 String searchEngineId, SearchEngine searchEngine) {
\r
521 PortalRuntimePermission.checkSearchEngine(searchEngineId);
\r
523 _searchEngines.put(searchEngineId, searchEngine);
\r
527 * @deprecated {@link #updateDocument(String, long, Document)}
\r
529 public static void updateDocument(long companyId, Document document)
\r
530 throws SearchException {
\r
532 updateDocument(_getSearchEngineId(document), companyId, document);
\r
535 public static void updateDocument(
\r
536 String searchEngineId, long companyId, Document document)
\r
537 throws SearchException {
\r
539 if (isIndexReadOnly()) {
\r
543 if (_log.isDebugEnabled()) {
\r
544 _log.debug("Document " + document.toString());
\r
547 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
549 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
551 _searchPermissionChecker.addPermissionFields(companyId, document);
\r
553 SearchContext searchContext = new SearchContext();
\r
555 searchContext.setCompanyId(companyId);
\r
556 searchContext.setSearchEngineId(searchEngineId);
\r
558 indexWriter.updateDocument(searchContext, document);
\r
562 * @deprecated {@link #updateDocuments(String, long, Collection)}
\r
564 public static void updateDocuments(
\r
565 long companyId, Collection<Document> documents)
\r
566 throws SearchException {
\r
568 updateDocuments(_getSearchEngineId(documents), companyId, documents);
\r
571 public static void updateDocuments(
\r
572 String searchEngineId, long companyId,
\r
573 Collection<Document> documents)
\r
574 throws SearchException {
\r
576 if (isIndexReadOnly() || (documents == null) || documents.isEmpty()) {
\r
580 SearchEngine searchEngine = getSearchEngine(searchEngineId);
\r
582 IndexWriter indexWriter = searchEngine.getIndexWriter();
\r
584 for (Document document : documents) {
\r
585 if (_log.isDebugEnabled()) {
\r
586 _log.debug("Document " + document.toString());
\r
589 _searchPermissionChecker.addPermissionFields(companyId, document);
\r
592 SearchContext searchContext = new SearchContext();
\r
594 searchContext.setCompanyId(companyId);
\r
595 searchContext.setSearchEngineId(searchEngineId);
\r
597 indexWriter.updateDocuments(searchContext, documents);
\r
600 public static void updatePermissionFields(long resourceId) {
\r
601 if (isIndexReadOnly() || !PermissionThreadLocal.isFlushEnabled()) {
\r
605 _searchPermissionChecker.updatePermissionFields(resourceId);
\r
608 public static void updatePermissionFields(String name, String primKey) {
\r
609 if (isIndexReadOnly() || !PermissionThreadLocal.isFlushEnabled()) {
\r
613 _searchPermissionChecker.updatePermissionFields(name, primKey);
\r
616 public void setExcludedEntryClassNames(
\r
617 List<String> excludedEntryClassNames) {
\r
619 PortalRuntimePermission.checkSetBeanProperty(
\r
620 getClass(), "excludedEntryClassNames");
\r
622 _excludedEntryClassNames.addAll(excludedEntryClassNames);
\r
626 * @deprecated {@link #setSearchEngine(String, SearchEngine)}
\r
628 public void setSearchEngine(SearchEngine searchEngine) {
\r
629 String searchEngineId = getDefaultSearchEngineId();
\r
631 PortalRuntimePermission.checkSearchEngine(searchEngineId);
\r
633 _searchEngines.put(searchEngineId, searchEngine);
\r
636 public void setSearchPermissionChecker(
\r
637 SearchPermissionChecker searchPermissionChecker) {
\r
639 PortalRuntimePermission.checkSetBeanProperty(
\r
640 getClass(), "searchPermissionChecker");
\r
642 _searchPermissionChecker = searchPermissionChecker;
\r
645 private static String _getSearchEngineId(Collection<Document> documents) {
\r
646 if (!documents.isEmpty()) {
\r
647 Document document = documents.iterator().next();
\r
649 return _getSearchEngineId(document);
\r
652 return getDefaultSearchEngineId();
\r
655 private static String _getSearchEngineId(Document document) {
\r
656 String entryClassName = document.get("entryClassName");
\r
658 Indexer indexer = IndexerRegistryUtil.getIndexer(entryClassName);
\r
660 String searchEngineId = indexer.getSearchEngineId();
\r
662 if (_log.isDebugEnabled()) {
\r
664 "Search engine ID for " + indexer.getClass() + " is " +
\r
668 return searchEngineId;
\r
671 private static Log _log = LogFactoryUtil.getLog(SearchEngineUtil.class);
\r
673 private static String _defaultSearchEngineId;
\r
674 private static Set<String> _excludedEntryClassNames = new HashSet<String>();
\r
675 private static boolean _indexReadOnly = GetterUtil.getBoolean(
\r
676 PropsUtil.get(PropsKeys.INDEX_READ_ONLY));
\r
677 private static Map<String, SearchEngine> _searchEngines =
\r
678 new ConcurrentHashMap<String, SearchEngine>();
\r
679 private static SearchPermissionChecker _searchPermissionChecker;
\r