/** * 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.portal.search.web.internal.facet.display.builder; import com.liferay.asset.kernel.AssetRendererFactoryRegistryUtil; import com.liferay.asset.kernel.model.AssetRendererFactory; import com.liferay.portal.kernel.search.facet.Facet; import com.liferay.portal.kernel.search.facet.collector.FacetCollector; import com.liferay.portal.kernel.search.facet.collector.TermCollector; import com.liferay.portal.kernel.security.permission.comparator.ModelResourceComparator; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.SortedArrayList; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.search.web.internal.facet.display.context.AssetEntriesSearchFacetDisplayContext; import com.liferay.portal.search.web.internal.facet.display.context.AssetEntriesSearchFacetTermDisplayContext; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Objects; /** * @author Lino Alves */ public class AssetEntriesSearchFacetDisplayBuilder implements Serializable { public AssetEntriesSearchFacetDisplayContext build() { List<AssetEntriesSearchFacetTermDisplayContext> termDisplayContexts = buildTermDisplayContexts(); AssetEntriesSearchFacetDisplayContext assetEntriesSearchFacetDisplayContext = new AssetEntriesSearchFacetDisplayContext(); assetEntriesSearchFacetDisplayContext.setNothingSelected( isNothingSelected()); assetEntriesSearchFacetDisplayContext.setParameterName(_parameterName); assetEntriesSearchFacetDisplayContext.setParameterValue( getFirstParameterValue()); assetEntriesSearchFacetDisplayContext.setParameterValues( _parameterValues); assetEntriesSearchFacetDisplayContext.setRenderNothing( ListUtil.isEmpty(termDisplayContexts)); assetEntriesSearchFacetDisplayContext.setTermDisplayContexts( termDisplayContexts); return assetEntriesSearchFacetDisplayContext; } public AssetEntriesSearchFacetTermDisplayContext buildTermDisplay( String typeName, boolean selected, String assetType, int frequency) { AssetEntriesSearchFacetTermDisplayContext assetEntriesSearchFacetFieldDisplayContext = new AssetEntriesSearchFacetTermDisplayContext(); assetEntriesSearchFacetFieldDisplayContext.setAssetType(assetType); assetEntriesSearchFacetFieldDisplayContext.setFrequency(frequency); assetEntriesSearchFacetFieldDisplayContext.setFrequencyVisible( _frequenciesVisible); assetEntriesSearchFacetFieldDisplayContext.setSelected(selected); assetEntriesSearchFacetFieldDisplayContext.setTypeName(typeName); return assetEntriesSearchFacetFieldDisplayContext; } public List<AssetEntriesSearchFacetTermDisplayContext> buildTermDisplayContexts() { FacetCollector facetCollector = _facet.getFacetCollector(); if (facetCollector == null) { return Collections.emptyList(); } List<AssetEntriesSearchFacetTermDisplayContext> assetEntriesSearchFacetFieldDisplayContexts = new ArrayList<>(); List<String> assetTypes = new SortedArrayList<>( new ModelResourceComparator(_locale)); for (String className : _classNames) { if (assetTypes.contains(className) || !ArrayUtil.contains(_classNames, className)) { continue; } assetTypes.add(className); } for (String assetType : assetTypes) { TermCollector termCollector = facetCollector.getTermCollector( assetType); int frequency = 0; if (termCollector != null) { frequency = termCollector.getFrequency(); } if (_frequencyThreshold > frequency) { continue; } AssetRendererFactory<?> assetRendererFactory = AssetRendererFactoryRegistryUtil. getAssetRendererFactoryByClassName(assetType); boolean selected = _parameterValues.contains( termCollector.getTerm()); AssetEntriesSearchFacetTermDisplayContext assetEntriesSearchFacetFieldDisplayContext = buildTermDisplay( assetRendererFactory.getTypeName(_locale), selected, assetType, termCollector.getFrequency()); assetEntriesSearchFacetFieldDisplayContexts.add( assetEntriesSearchFacetFieldDisplayContext); } return assetEntriesSearchFacetFieldDisplayContexts; } public int getPopularity( int frequency, int maxCount, int minCount, double multiplier) { int popularity = maxCount - (maxCount - (frequency - minCount)); return (int)(1 + (popularity * multiplier)); } public boolean isNothingSelected() { if (_parameterValues.isEmpty()) { return true; } return false; } public void setClassNames(String[] classNames) { _classNames = classNames; } public void setFacet(Facet facet) { _facet = facet; } public void setFrequenciesVisible(boolean frequenciesVisible) { _frequenciesVisible = frequenciesVisible; } public void setFrequencyThreshold(int frequencyThreshold) { _frequencyThreshold = frequencyThreshold; } public void setLocale(Locale locale) { _locale = locale; } public void setParameterName(String parameterName) { _parameterName = parameterName; } public void setParameterValue(String parameterValue) { parameterValue = StringUtil.trim( Objects.requireNonNull(parameterValue)); if (parameterValue.isEmpty()) { return; } _parameterValues = Collections.singletonList(parameterValue); } public void setParameterValues(List<String> paramValues) { _parameterValues = paramValues; } protected String getFirstParameterValue() { if (_parameterValues.isEmpty()) { return StringPool.BLANK; } return _parameterValues.get(0); } private String[] _classNames; private Facet _facet; private boolean _frequenciesVisible; private int _frequencyThreshold; private Locale _locale; private String _parameterName; private List<String> _parameterValues = Collections.emptyList(); }