--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portal.kernel.search;\r
+\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.messaging.DestinationNames;\r
+import com.liferay.portal.kernel.security.pacl.permission.PortalRuntimePermission;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.PropsKeys;\r
+import com.liferay.portal.kernel.util.PropsUtil;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.security.permission.PermissionThreadLocal;\r
+\r
+import java.util.Collection;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+/**\r
+ * @author Bruno Farache\r
+ * @author Raymond Augé\r
+ * @author Michael C. Han\r
+ */\r
+public class SearchEngineUtil {\r
+\r
+ /**\r
+ * @deprecated {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}\r
+ */\r
+ public static final int ALL_POS = -1;\r
+\r
+ public static final String GENERIC_ENGINE_ID = "GENERIC_ENGINE";\r
+\r
+ public static final String SYSTEM_ENGINE_ID = "SYSTEM_ENGINE";\r
+\r
+ /**\r
+ * @deprecated {@link #addDocument(String, long, Document)}\r
+ */\r
+ public static void addDocument(long companyId, Document document)\r
+ throws SearchException {\r
+\r
+ addDocument(_getSearchEngineId(document), companyId, document);\r
+ }\r
+\r
+ public static void addDocument(\r
+ String searchEngineId, long companyId, Document document)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly()) {\r
+ return;\r
+ }\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Add document " + document.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ _searchPermissionChecker.addPermissionFields(companyId, document);\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.addDocument(searchContext, document);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #addDocuments(String, long, Collection)}\r
+ */\r
+ public static void addDocuments(\r
+ long companyId, Collection<Document> documents)\r
+ throws SearchException {\r
+\r
+ addDocuments(_getSearchEngineId(documents), companyId, documents);\r
+ }\r
+\r
+ public static void addDocuments(\r
+ String searchEngineId, long companyId,\r
+ Collection<Document> documents)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly() || (documents == null) || documents.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ for (Document document : documents) {\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Add document " + document.toString());\r
+ }\r
+\r
+ _searchPermissionChecker.addPermissionFields(companyId, document);\r
+ }\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.addDocuments(searchContext, documents);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #setSearchEngine(String, SearchEngine)}\r
+ */\r
+ public static void addSearchEngine(SearchEngine searchEngine) {\r
+ String searchEngineId = getDefaultSearchEngineId();\r
+\r
+ PortalRuntimePermission.checkSearchEngine(searchEngineId);\r
+\r
+ _searchEngines.put(searchEngineId, searchEngine);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #deleteDocument(String, long, String)}\r
+ */\r
+ public static void deleteDocument(long companyId, String uid)\r
+ throws SearchException {\r
+\r
+ for (String searchEngineId : _searchEngines.keySet()) {\r
+ deleteDocument(searchEngineId, companyId, uid);\r
+ }\r
+ }\r
+\r
+ public static void deleteDocument(\r
+ String searchEngineId, long companyId, String uid)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly()) {\r
+ return;\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.deleteDocument(searchContext, uid);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #deleteDocuments(String, long, Collection)}\r
+ */\r
+ public static void deleteDocuments(long companyId, Collection<String> uids)\r
+ throws SearchException {\r
+\r
+ for (String searchEngineId : _searchEngines.keySet()) {\r
+ deleteDocuments(searchEngineId, companyId, uids);\r
+ }\r
+ }\r
+\r
+ public static void deleteDocuments(\r
+ String searchEngineId, long companyId, Collection<String> uids)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly() || (uids == null) || uids.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.deleteDocuments(searchContext, uids);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #deletePortletDocuments(String, long, String)}\r
+ */\r
+ public static void deletePortletDocuments(long companyId, String portletId)\r
+ throws SearchException {\r
+\r
+ for (String searchEngineId : _searchEngines.keySet()) {\r
+ deletePortletDocuments(searchEngineId, companyId, portletId);\r
+ }\r
+ }\r
+\r
+ public static void deletePortletDocuments(\r
+ String searchEngineId, long companyId, String portletId)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly()) {\r
+ return;\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ if (searchEngine == null) {\r
+ return;\r
+ }\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.deletePortletDocuments(searchContext, portletId);\r
+ }\r
+\r
+ public static String getDefaultSearchEngineId() {\r
+ if (_defaultSearchEngineId == null) {\r
+ return SYSTEM_ENGINE_ID;\r
+ }\r
+\r
+ return _defaultSearchEngineId;\r
+ }\r
+\r
+ public static String[] getEntryClassNames() {\r
+ Set<String> assetEntryClassNames = new HashSet<String>();\r
+\r
+ for (Indexer indexer : IndexerRegistryUtil.getIndexers()) {\r
+ for (String className : indexer.getClassNames()) {\r
+ if (!_excludedEntryClassNames.contains(className)) {\r
+ assetEntryClassNames.add(className);\r
+ }\r
+ }\r
+ }\r
+\r
+ return assetEntryClassNames.toArray(\r
+ new String[assetEntryClassNames.size()]);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #getSearchEngine(String)}\r
+ */\r
+ public static SearchEngine getSearchEngine() {\r
+ return getSearchEngine(getDefaultSearchEngineId());\r
+ }\r
+\r
+ public static SearchEngine getSearchEngine(String searchEngineId) {\r
+ PortalRuntimePermission.checkSearchEngine(searchEngineId);\r
+\r
+ SearchEngine searchEngine = _searchEngines.get(searchEngineId);\r
+\r
+ if (searchEngine == null) {\r
+ if (getDefaultSearchEngineId().equals(searchEngineId)) {\r
+ throw new IllegalStateException(\r
+ "There is no default search engine configured with ID " +\r
+ getDefaultSearchEngineId());\r
+ }\r
+\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn(\r
+ "There is no search engine configured with ID " +\r
+ searchEngineId);\r
+ }\r
+ }\r
+\r
+ return searchEngine;\r
+ }\r
+\r
+ public static Set<String> getSearchEngineIds() {\r
+ PortalRuntimePermission.checkGetBeanProperty(\r
+ SearchEngineUtil.class, "searchEngineIds");\r
+\r
+ return _searchEngines.keySet();\r
+ }\r
+\r
+ public static SearchEngine getSearchEngineSilent(String searchEngineId) {\r
+ PortalRuntimePermission.checkSearchEngine(searchEngineId);\r
+\r
+ return _searchEngines.get(searchEngineId);\r
+ }\r
+\r
+ public static SearchPermissionChecker getSearchPermissionChecker() {\r
+ PortalRuntimePermission.checkGetBeanProperty(\r
+ SearchEngineUtil.class, "searchPermissionChecker");\r
+\r
+ return _searchPermissionChecker;\r
+ }\r
+\r
+ public static String getSearchReaderDestinationName(String searchEngineId) {\r
+ return DestinationNames.SEARCH_READER.concat(StringPool.SLASH).concat(\r
+ searchEngineId);\r
+ }\r
+\r
+ public static String getSearchWriterDestinationName(String searchEngineId) {\r
+ return DestinationNames.SEARCH_WRITER.concat(StringPool.SLASH).concat(\r
+ searchEngineId);\r
+ }\r
+\r
+ public static boolean isIndexReadOnly() {\r
+ PortalRuntimePermission.checkGetBeanProperty(\r
+ SearchEngineUtil.class, "indexReadOnly");\r
+\r
+ return _indexReadOnly;\r
+ }\r
+\r
+ public static SearchEngine removeSearchEngine(String searchEngineId) {\r
+ PortalRuntimePermission.checkSearchEngine(searchEngineId);\r
+\r
+ return _searchEngines.remove(searchEngineId);\r
+ }\r
+\r
+ /**\r
+ * @deprecated\r
+ */\r
+ public static Hits search(\r
+ long companyId, long[] groupIds, long userId, String className,\r
+ Query query, int start, int end)\r
+ throws SearchException {\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setSearchEngineId(getDefaultSearchEngineId());\r
+\r
+ if (userId > 0) {\r
+ query = _searchPermissionChecker.getPermissionQuery(\r
+ companyId, groupIds, userId, className, query, searchContext);\r
+ }\r
+\r
+ return search(\r
+ companyId, query, SortFactoryUtil.getDefaultSorts(), start, end);\r
+ }\r
+\r
+ /**\r
+ * @deprecated\r
+ */\r
+ public static Hits search(\r
+ long companyId, long[] groupIds, long userId, String className,\r
+ Query query, Sort sort, int start, int end)\r
+ throws SearchException {\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setSearchEngineId(getDefaultSearchEngineId());\r
+\r
+ if (userId > 0) {\r
+ query = _searchPermissionChecker.getPermissionQuery(\r
+ companyId, groupIds, userId, className, query, searchContext);\r
+ }\r
+\r
+ return search(companyId, query, sort, start, end);\r
+ }\r
+\r
+ /**\r
+ * @deprecated\r
+ */\r
+ public static Hits search(\r
+ long companyId, long[] groupIds, long userId, String className,\r
+ Query query, Sort[] sorts, int start, int end)\r
+ throws SearchException {\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setSearchEngineId(getDefaultSearchEngineId());\r
+\r
+ if (userId > 0) {\r
+ query = _searchPermissionChecker.getPermissionQuery(\r
+ companyId, groupIds, userId, className, query, searchContext);\r
+ }\r
+\r
+ return search(companyId, query, sorts, start, end);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #search(String, long, Query, int, int)}\r
+ */\r
+ public static Hits search(long companyId, Query query, int start, int end)\r
+ throws SearchException {\r
+\r
+ return search(getDefaultSearchEngineId(), companyId, query, start, end);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #search(String, long, Query, Sort, int, int)}\r
+ */\r
+ public static Hits search(\r
+ long companyId, Query query, Sort sort, int start, int end)\r
+ throws SearchException {\r
+\r
+ return search(\r
+ getDefaultSearchEngineId(), companyId, query, sort, start, end);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #search(String, long, Query, Sort[], int, int)}\r
+ */\r
+ public static Hits search(\r
+ long companyId, Query query, Sort[] sorts, int start, int end)\r
+ throws SearchException {\r
+\r
+ return search(\r
+ getDefaultSearchEngineId(), companyId, query, sorts, start, end);\r
+ }\r
+\r
+ public static Hits search(SearchContext searchContext, Query query)\r
+ throws SearchException {\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Search query " + query.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(\r
+ searchContext.getSearchEngineId());\r
+\r
+ IndexSearcher indexSearcher = searchEngine.getIndexSearcher();\r
+\r
+ return indexSearcher.search(searchContext, query);\r
+ }\r
+\r
+ public static Hits search(\r
+ String searchEngineId, long companyId, Query query, int start,\r
+ int end)\r
+ throws SearchException {\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Search query " + query.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexSearcher indexSearcher = searchEngine.getIndexSearcher();\r
+\r
+ return indexSearcher.search(\r
+ searchEngineId, companyId, query, SortFactoryUtil.getDefaultSorts(),\r
+ start, end);\r
+ }\r
+ \r
+ public static Hits search(\r
+ String searchEngineId, long companyId, Query query, List<String> filters, int start,\r
+ int end)\r
+ throws SearchException {\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Search query " + query.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexSearcher indexSearcher = searchEngine.getIndexSearcher();\r
+\r
+ return indexSearcher.search(\r
+ searchEngineId, companyId, query, SortFactoryUtil.getDefaultSorts(), filters,\r
+ start, end);\r
+ }\r
+\r
+ public static Hits search(\r
+ String searchEngineId, long companyId, Query query, Sort sort,\r
+ int start, int end)\r
+ throws SearchException {\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Search query " + query.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexSearcher indexSearcher = searchEngine.getIndexSearcher();\r
+\r
+ return indexSearcher.search(\r
+ searchEngineId, companyId, query, new Sort[] {sort}, start, end);\r
+ }\r
+\r
+ public static Hits search(\r
+ String searchEngineId, long companyId, Query query, Sort[] sorts,\r
+ int start, int end)\r
+ throws SearchException {\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Search query " + query.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexSearcher indexSearcher = searchEngine.getIndexSearcher();\r
+\r
+ return indexSearcher.search(\r
+ searchEngineId, companyId, query, sorts, start, end);\r
+ }\r
+\r
+ public static void setDefaultSearchEngineId(String defaultSearchEngineId) {\r
+ PortalRuntimePermission.checkSetBeanProperty(\r
+ SearchEngineUtil.class, "defaultSearchEngineId");\r
+\r
+ _defaultSearchEngineId = defaultSearchEngineId;\r
+ }\r
+\r
+ public static void setIndexReadOnly(boolean indexReadOnly) {\r
+ PortalRuntimePermission.checkSetBeanProperty(\r
+ SearchEngineUtil.class, "indexReadOnly");\r
+\r
+ _indexReadOnly = indexReadOnly;\r
+ }\r
+\r
+ public static void setSearchEngine(\r
+ String searchEngineId, SearchEngine searchEngine) {\r
+\r
+ PortalRuntimePermission.checkSearchEngine(searchEngineId);\r
+\r
+ _searchEngines.put(searchEngineId, searchEngine);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #updateDocument(String, long, Document)}\r
+ */\r
+ public static void updateDocument(long companyId, Document document)\r
+ throws SearchException {\r
+\r
+ updateDocument(_getSearchEngineId(document), companyId, document);\r
+ }\r
+\r
+ public static void updateDocument(\r
+ String searchEngineId, long companyId, Document document)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly()) {\r
+ return;\r
+ }\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Document " + document.toString());\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ _searchPermissionChecker.addPermissionFields(companyId, document);\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.updateDocument(searchContext, document);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #updateDocuments(String, long, Collection)}\r
+ */\r
+ public static void updateDocuments(\r
+ long companyId, Collection<Document> documents)\r
+ throws SearchException {\r
+\r
+ updateDocuments(_getSearchEngineId(documents), companyId, documents);\r
+ }\r
+\r
+ public static void updateDocuments(\r
+ String searchEngineId, long companyId,\r
+ Collection<Document> documents)\r
+ throws SearchException {\r
+\r
+ if (isIndexReadOnly() || (documents == null) || documents.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ SearchEngine searchEngine = getSearchEngine(searchEngineId);\r
+\r
+ IndexWriter indexWriter = searchEngine.getIndexWriter();\r
+\r
+ for (Document document : documents) {\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Document " + document.toString());\r
+ }\r
+\r
+ _searchPermissionChecker.addPermissionFields(companyId, document);\r
+ }\r
+\r
+ SearchContext searchContext = new SearchContext();\r
+\r
+ searchContext.setCompanyId(companyId);\r
+ searchContext.setSearchEngineId(searchEngineId);\r
+\r
+ indexWriter.updateDocuments(searchContext, documents);\r
+ }\r
+\r
+ public static void updatePermissionFields(long resourceId) {\r
+ if (isIndexReadOnly() || !PermissionThreadLocal.isFlushEnabled()) {\r
+ return;\r
+ }\r
+\r
+ _searchPermissionChecker.updatePermissionFields(resourceId);\r
+ }\r
+\r
+ public static void updatePermissionFields(String name, String primKey) {\r
+ if (isIndexReadOnly() || !PermissionThreadLocal.isFlushEnabled()) {\r
+ return;\r
+ }\r
+\r
+ _searchPermissionChecker.updatePermissionFields(name, primKey);\r
+ }\r
+\r
+ public void setExcludedEntryClassNames(\r
+ List<String> excludedEntryClassNames) {\r
+\r
+ PortalRuntimePermission.checkSetBeanProperty(\r
+ getClass(), "excludedEntryClassNames");\r
+\r
+ _excludedEntryClassNames.addAll(excludedEntryClassNames);\r
+ }\r
+\r
+ /**\r
+ * @deprecated {@link #setSearchEngine(String, SearchEngine)}\r
+ */\r
+ public void setSearchEngine(SearchEngine searchEngine) {\r
+ String searchEngineId = getDefaultSearchEngineId();\r
+\r
+ PortalRuntimePermission.checkSearchEngine(searchEngineId);\r
+\r
+ _searchEngines.put(searchEngineId, searchEngine);\r
+ }\r
+\r
+ public void setSearchPermissionChecker(\r
+ SearchPermissionChecker searchPermissionChecker) {\r
+\r
+ PortalRuntimePermission.checkSetBeanProperty(\r
+ getClass(), "searchPermissionChecker");\r
+\r
+ _searchPermissionChecker = searchPermissionChecker;\r
+ }\r
+\r
+ private static String _getSearchEngineId(Collection<Document> documents) {\r
+ if (!documents.isEmpty()) {\r
+ Document document = documents.iterator().next();\r
+\r
+ return _getSearchEngineId(document);\r
+ }\r
+\r
+ return getDefaultSearchEngineId();\r
+ }\r
+\r
+ private static String _getSearchEngineId(Document document) {\r
+ String entryClassName = document.get("entryClassName");\r
+\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(entryClassName);\r
+\r
+ String searchEngineId = indexer.getSearchEngineId();\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug(\r
+ "Search engine ID for " + indexer.getClass() + " is " +\r
+ searchEngineId);\r
+ }\r
+\r
+ return searchEngineId;\r
+ }\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(SearchEngineUtil.class);\r
+\r
+ private static String _defaultSearchEngineId;\r
+ private static Set<String> _excludedEntryClassNames = new HashSet<String>();\r
+ private static boolean _indexReadOnly = GetterUtil.getBoolean(\r
+ PropsUtil.get(PropsKeys.INDEX_READ_ONLY));\r
+ private static Map<String, SearchEngine> _searchEngines =\r
+ new ConcurrentHashMap<String, SearchEngine>();\r
+ private static SearchPermissionChecker _searchPermissionChecker;\r
+\r
+}
\ No newline at end of file