com.liferay.configuration.admin.web.internal.search.ConfigurationModelIndexer.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.configuration.admin.web.internal.search.ConfigurationModelIndexer.java

Source

/**
 * 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.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;

}