/** * 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.kernel.search.facet; import com.liferay.portal.kernel.json.JSONArray; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.search.BooleanClause; import com.liferay.portal.kernel.search.BooleanClauseFactoryUtil; import com.liferay.portal.kernel.search.BooleanClauseOccur; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.search.SearchContext; import com.liferay.portal.kernel.search.facet.config.FacetConfiguration; import com.liferay.portal.kernel.search.filter.BooleanFilter; import com.liferay.portal.kernel.search.filter.Filter; import com.liferay.portal.kernel.search.filter.TermsFilter; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.Validator; import java.util.ArrayList; import java.util.List; /** * @author Raymond Augé */ public class ScopeFacet extends MultiValueFacet { public ScopeFacet(SearchContext searchContext) { super(searchContext); setFieldName(Field.GROUP_ID); } protected long[] addScopeGroup(long groupId) { try { List<Long> groupIds = new ArrayList<>(); groupIds.add(groupId); Group group = GroupLocalServiceUtil.getGroup(groupId); List<Group> groups = GroupLocalServiceUtil.getGroups( group.getCompanyId(), Layout.class.getName(), group.getGroupId()); for (Group scopeGroup : groups) { groupIds.add(scopeGroup.getGroupId()); } return ArrayUtil.toLongArray(groupIds); } catch (Exception e) { _log.error(e, e); } return new long[] {groupId}; } @Override protected BooleanClause<Filter> doGetFacetFilterBooleanClause() { SearchContext searchContext = getSearchContext(); long[] groupIds = getGroupIds(searchContext); if (ArrayUtil.isEmpty(groupIds) || ((groupIds.length == 1) && (groupIds[0] == 0))) { return null; } BooleanFilter facetBooleanFilter = new BooleanFilter(); long ownerUserId = searchContext.getOwnerUserId(); if (ownerUserId > 0) { facetBooleanFilter.addRequiredTerm(Field.USER_ID, ownerUserId); } TermsFilter groupIdsTermsFilter = new TermsFilter(Field.GROUP_ID); TermsFilter scopeGroupIdsTermsFilter = new TermsFilter( Field.SCOPE_GROUP_ID); for (int i = 0; i < groupIds.length; i++) { long groupId = groupIds[i]; if (groupId <= 0) { continue; } try { Group group = GroupLocalServiceUtil.getGroup(groupId); if (!GroupLocalServiceUtil.isLiveGroupActive(group)) { continue; } long parentGroupId = groupId; if (group.isLayout()) { parentGroupId = group.getParentGroupId(); } groupIdsTermsFilter.addValue(String.valueOf(parentGroupId)); groupIds[i] = parentGroupId; if (group.isLayout() || searchContext.isScopeStrict()) { scopeGroupIdsTermsFilter.addValue(String.valueOf(groupId)); } } catch (Exception e) { if (_log.isDebugEnabled()) { _log.debug(e, e); } } } searchContext.setGroupIds(groupIds); if (!groupIdsTermsFilter.isEmpty()) { facetBooleanFilter.add( groupIdsTermsFilter, BooleanClauseOccur.MUST); } if (!scopeGroupIdsTermsFilter.isEmpty()) { facetBooleanFilter.add( scopeGroupIdsTermsFilter, BooleanClauseOccur.MUST); } return BooleanClauseFactoryUtil.createFilter( searchContext, facetBooleanFilter, BooleanClauseOccur.MUST); } protected long[] getGroupIds(SearchContext searchContext) { long[] groupIds = getGroupIdsFromFacetConfiguration(); if (ArrayUtil.isEmpty(groupIds)) { groupIds = getGroupIdsFromSearchContext(searchContext); } if (ArrayUtil.isEmpty(groupIds)) { groupIds = searchContext.getGroupIds(); } return groupIds; } protected long[] getGroupIdsFromFacetConfiguration() { FacetConfiguration facetConfiguration = getFacetConfiguration(); JSONObject dataJSONObject = facetConfiguration.getData(); if (!dataJSONObject.has("values")) { return null; } JSONArray valuesJSONArray = dataJSONObject.getJSONArray("values"); long[] groupIds = new long[valuesJSONArray.length()]; for (int i = 0; i < valuesJSONArray.length(); i++) { groupIds[i] = valuesJSONArray.getLong(i); } return groupIds; } protected long[] getGroupIdsFromSearchContext(SearchContext searchContext) { String groupIdAttribute = GetterUtil.getString( searchContext.getAttribute("groupId")); if (Validator.isNull(groupIdAttribute)) { return null; } long groupId = GetterUtil.getLong(groupIdAttribute); if (groupId == 0) { return _GROUP_IDS_FROM_SEARCH_CONTEXT_DEFAULT; } return addScopeGroup(groupId); } private static final long[] _GROUP_IDS_FROM_SEARCH_CONTEXT_DEFAULT = new long[] {0}; private static final Log _log = LogFactoryUtil.getLog(ScopeFacet.class); }