/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.configuration.admin.web.internal.search; import com.liferay.configuration.admin.web.internal.constants.ConfigurationAdminPortletKeys; import com.liferay.configuration.admin.web.internal.model.ConfigurationModel; import com.liferay.configuration.admin.web.internal.util.ConfigurationModelRetriever; import com.liferay.configuration.admin.web.internal.util.ResourceBundleLoaderProvider; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.model.CompanyConstants; import com.liferay.portal.kernel.search.BaseIndexer; import com.liferay.portal.kernel.search.BooleanClauseOccur; import com.liferay.portal.kernel.search.BooleanQuery; import com.liferay.portal.kernel.search.Document; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.search.Hits; import com.liferay.portal.kernel.search.IndexWriterHelper; import com.liferay.portal.kernel.search.Indexer; import com.liferay.portal.kernel.search.SearchContext; import com.liferay.portal.kernel.search.SearchException; import com.liferay.portal.kernel.search.Summary; import com.liferay.portal.kernel.search.filter.BooleanFilter; import com.liferay.portal.kernel.search.generic.BooleanQueryImpl; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.ResourceBundleLoader; import com.liferay.portal.kernel.util.ResourceBundleUtil; import com.liferay.portal.kernel.util.Validator; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.metatype.AttributeDefinition; import org.osgi.service.metatype.ObjectClassDefinition; /** * @author Michael C. Han */ @Component( immediate = true, property = {"index.on.startup=false"}, service = {ConfigurationModelIndexer.class, Indexer.class} ) public class ConfigurationModelIndexer extends BaseIndexer<ConfigurationModel> { @Override public String getClassName() { return ConfigurationModel.class.getName(); } @Override public BooleanQuery getFullQuery(SearchContext searchContext) throws SearchException { try { BooleanFilter fullQueryBooleanFilter = new BooleanFilter(); fullQueryBooleanFilter.addRequiredTerm( Field.ENTRY_CLASS_NAME, getClassName()); BooleanQuery fullQuery = createFullQuery( fullQueryBooleanFilter, searchContext); fullQuery.setQueryConfig(searchContext.getQueryConfig()); return fullQuery; } catch (SearchException se) { throw se; } catch (Exception e) { throw new SearchException(e); } } @Override public Hits search(SearchContext searchContext) throws SearchException { try { Hits hits = doSearch(searchContext); processHits(searchContext, hits); return hits; } catch (SearchException se) { throw se; } catch (Exception e) { throw new SearchException(e); } } @Activate protected void activate(BundleContext bundleContext) { setCommitImmediately(false); setDefaultSelectedFieldNames( Field.COMPANY_ID, Field.DESCRIPTION, Field.ENTRY_CLASS_NAME, Field.TITLE, Field.UID, FieldNames.CONFIGURATION_MODEL_ATTRIBUTE_DESCRIPTION, FieldNames.CONFIGURATION_MODEL_ATTRIBUTE_NAME, FieldNames.CONFIGURATION_MODEL_FACTORY_PID, FieldNames.CONFIGURATION_MODEL_ID); setFilterSearch(false); setPermissionAware(false); setSelectAllLocales(false); setStagingAware(false); } @Override protected BooleanQuery createFullQuery( BooleanFilter fullQueryBooleanFilter, SearchContext searchContext) throws Exception { BooleanQuery searchQuery = new BooleanQueryImpl(); addSearchLocalizedTerm( searchQuery, searchContext, Field.DESCRIPTION, false); addSearchLocalizedTerm(searchQuery, searchContext, Field.TITLE, false); addSearchTerm( searchQuery, searchContext, FieldNames.CONFIGURATION_MODEL_ATTRIBUTE_DESCRIPTION, false); addSearchTerm( searchQuery, searchContext, FieldNames.CONFIGURATION_MODEL_ATTRIBUTE_NAME, false); addSearchTerm( searchQuery, searchContext, FieldNames.CONFIGURATION_MODEL_FACTORY_PID, false); addSearchTerm( searchQuery, searchContext, FieldNames.CONFIGURATION_MODEL_ID, false); BooleanQuery fullBooleanQuery = new BooleanQueryImpl(); if (fullQueryBooleanFilter.hasClauses()) { fullBooleanQuery.setPreBooleanFilter(fullQueryBooleanFilter); } fullBooleanQuery.add(searchQuery, BooleanClauseOccur.MUST); return fullBooleanQuery; } @Override protected void doDelete(ConfigurationModel configurationModel) throws Exception { Document document = newDocument(); document.addUID( ConfigurationAdminPortletKeys.SYSTEM_SETTINGS, configurationModel.getFactoryPid()); _indexWriterHelper.deleteDocument( getSearchEngineId(), CompanyConstants.SYSTEM, document.get(Field.UID), isCommitImmediately()); } @Override protected Document doGetDocument(ConfigurationModel configurationModel) throws Exception { Document document = newDocument(); document.addUID( ConfigurationAdminPortletKeys.SYSTEM_SETTINGS, configurationModel.getID()); document.addKeyword( FieldNames.CONFIGURATION_MODEL_FACTORY_PID, configurationModel.getFactoryPid()); document.addKeyword( FieldNames.CONFIGURATION_MODEL_ID, configurationModel.getID()); document.addKeyword(Field.COMPANY_ID, CompanyConstants.SYSTEM); ResourceBundleLoader resourceBundleLoader = _resourceBundleLoaderProvider.getResourceBundleLoader( configurationModel.getBundleSymbolicName()); document.addLocalizedText( Field.DESCRIPTION, _translate( resourceBundleLoader, GetterUtil.getString(configurationModel.getDescription()))); document.addKeyword(Field.ENTRY_CLASS_NAME, getClassName()); AttributeDefinition[] requiredAttributeDefinitions = configurationModel.getAttributeDefinitions( ObjectClassDefinition.ALL); List<String> attributeNames = new ArrayList<>( requiredAttributeDefinitions.length); List<String> attributeDescriptions = new ArrayList<>( requiredAttributeDefinitions.length); for (AttributeDefinition attributeDefinition : requiredAttributeDefinitions) { attributeNames.add(attributeDefinition.getName()); attributeDescriptions.add(attributeDefinition.getDescription()); } document.addKeyword( FieldNames.CONFIGURATION_MODEL_ATTRIBUTE_NAME, attributeNames.toArray(new String[attributeNames.size()])); document.addText( FieldNames.CONFIGURATION_MODEL_ATTRIBUTE_DESCRIPTION, attributeDescriptions.toArray( new String[attributeDescriptions.size()])); document.addLocalizedText( Field.TITLE, _translate( resourceBundleLoader, GetterUtil.getString(configurationModel.getName()))); return document; } @Override protected Summary doGetSummary( Document document, Locale locale, String snippet, PortletRequest portletRequest, PortletResponse portletResponse) throws Exception { Summary summary = createSummary( document, Field.TITLE, Field.DESCRIPTION); summary.setMaxContentLength(200); return summary; } @Override protected void doReindex(ConfigurationModel configurationModel) throws Exception { Document document = getDocument(configurationModel); _indexWriterHelper.updateDocument( getSearchEngineId(), CompanyConstants.SYSTEM, document, isCommitImmediately()); } @Override protected void doReindex(String className, long classPK) throws Exception { } @Override protected void doReindex(String[] ids) throws Exception { Map<String, ConfigurationModel> configurationModels = _configurationModelRetriever.getConfigurationModels(); for (ConfigurationModel configurationModel : configurationModels.values()) { doReindex(configurationModel); } } private Map<Locale, String> _translate( ResourceBundleLoader resourceBundleLoader, String key) { Map<Locale, String> values = new HashMap<>(); ResourceBundle defaultResourceBundle = resourceBundleLoader.loadResourceBundle(LocaleUtil.getDefault()); for (Locale locale : LanguageUtil.getAvailableLocales()) { ResourceBundle resourceBundle = resourceBundleLoader.loadResourceBundle(locale); if (resourceBundle != null) { String value = ResourceBundleUtil.getString( resourceBundle, key); if (Validator.isNotNull(value)) { values.put(locale, value); } } else if (defaultResourceBundle != null) { String value = ResourceBundleUtil.getString( defaultResourceBundle, key); if (Validator.isNotNull(value)) { values.put(locale, value); } } } return values; } @Reference private ConfigurationModelRetriever _configurationModelRetriever; @Reference private IndexWriterHelper _indexWriterHelper; @Reference private ResourceBundleLoaderProvider _resourceBundleLoaderProvider; }