001
014
015 package com.liferay.portal.kernel.search.facet;
016
017 import com.liferay.portal.kernel.json.JSONArray;
018 import com.liferay.portal.kernel.json.JSONObject;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.model.Group;
022 import com.liferay.portal.kernel.model.Layout;
023 import com.liferay.portal.kernel.search.BooleanClause;
024 import com.liferay.portal.kernel.search.BooleanClauseFactoryUtil;
025 import com.liferay.portal.kernel.search.BooleanClauseOccur;
026 import com.liferay.portal.kernel.search.Field;
027 import com.liferay.portal.kernel.search.SearchContext;
028 import com.liferay.portal.kernel.search.facet.config.FacetConfiguration;
029 import com.liferay.portal.kernel.search.filter.BooleanFilter;
030 import com.liferay.portal.kernel.search.filter.Filter;
031 import com.liferay.portal.kernel.search.filter.TermsFilter;
032 import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
033 import com.liferay.portal.kernel.util.ArrayUtil;
034 import com.liferay.portal.kernel.util.GetterUtil;
035 import com.liferay.portal.kernel.util.Validator;
036
037 import java.util.ArrayList;
038 import java.util.List;
039
040
043 public class ScopeFacet extends MultiValueFacet {
044
045 public ScopeFacet(SearchContext searchContext) {
046 super(searchContext);
047
048 setFieldName(Field.GROUP_ID);
049 }
050
051 protected long[] addScopeGroup(long groupId) {
052 try {
053 List<Long> groupIds = new ArrayList<>();
054
055 groupIds.add(groupId);
056
057 Group group = GroupLocalServiceUtil.getGroup(groupId);
058
059 List<Group> groups = GroupLocalServiceUtil.getGroups(
060 group.getCompanyId(), Layout.class.getName(),
061 group.getGroupId());
062
063 for (Group scopeGroup : groups) {
064 groupIds.add(scopeGroup.getGroupId());
065 }
066
067 return ArrayUtil.toLongArray(groupIds);
068 }
069 catch (Exception e) {
070 _log.error(e, e);
071 }
072
073 return new long[] {groupId};
074 }
075
076 @Override
077 protected BooleanClause<Filter> doGetFacetFilterBooleanClause() {
078 SearchContext searchContext = getSearchContext();
079
080 long[] groupIds = getGroupIds(searchContext);
081
082 if (ArrayUtil.isEmpty(groupIds) ||
083 ((groupIds.length == 1) && (groupIds[0] == 0))) {
084
085 return null;
086 }
087
088 BooleanFilter facetBooleanFilter = new BooleanFilter();
089
090 long ownerUserId = searchContext.getOwnerUserId();
091
092 if (ownerUserId > 0) {
093 facetBooleanFilter.addRequiredTerm(Field.USER_ID, ownerUserId);
094 }
095
096 TermsFilter groupIdsTermsFilter = new TermsFilter(Field.GROUP_ID);
097 TermsFilter scopeGroupIdsTermsFilter = new TermsFilter(
098 Field.SCOPE_GROUP_ID);
099
100 for (int i = 0; i < groupIds.length; i ++) {
101 long groupId = groupIds[i];
102
103 if (groupId <= 0) {
104 continue;
105 }
106
107 try {
108 Group group = GroupLocalServiceUtil.getGroup(groupId);
109
110 if (!group.isActive()) {
111 continue;
112 }
113
114 long parentGroupId = groupId;
115
116 if (group.isLayout()) {
117 parentGroupId = group.getParentGroupId();
118 }
119
120 groupIdsTermsFilter.addValue(String.valueOf(parentGroupId));
121
122 groupIds[i] = parentGroupId;
123
124 if (group.isLayout() || searchContext.isScopeStrict()) {
125 scopeGroupIdsTermsFilter.addValue(String.valueOf(groupId));
126 }
127 }
128 catch (Exception e) {
129 if (_log.isDebugEnabled()) {
130 _log.debug(e, e);
131 }
132 }
133 }
134
135 searchContext.setGroupIds(groupIds);
136
137 if (!groupIdsTermsFilter.isEmpty()) {
138 facetBooleanFilter.add(
139 groupIdsTermsFilter, BooleanClauseOccur.MUST);
140 }
141
142 if (!scopeGroupIdsTermsFilter.isEmpty()) {
143 facetBooleanFilter.add(
144 scopeGroupIdsTermsFilter, BooleanClauseOccur.MUST);
145 }
146
147 return BooleanClauseFactoryUtil.createFilter(
148 searchContext, facetBooleanFilter, BooleanClauseOccur.MUST);
149 }
150
151 protected long[] getGroupIds(SearchContext searchContext) {
152 long[] groupIds = getGroupIdsFromFacetConfiguration();
153
154 if (ArrayUtil.isEmpty(groupIds)) {
155 groupIds = getGroupIdsFromSearchContext(searchContext);
156 }
157
158 if (ArrayUtil.isEmpty(groupIds)) {
159 groupIds = searchContext.getGroupIds();
160 }
161
162 return groupIds;
163 }
164
165 protected long[] getGroupIdsFromFacetConfiguration() {
166 FacetConfiguration facetConfiguration = getFacetConfiguration();
167
168 JSONObject dataJSONObject = facetConfiguration.getData();
169
170 if (!dataJSONObject.has("values")) {
171 return null;
172 }
173
174 JSONArray valuesJSONArray = dataJSONObject.getJSONArray("values");
175
176 long[] groupIds = new long[valuesJSONArray.length()];
177
178 for (int i = 0; i < valuesJSONArray.length(); i++) {
179 groupIds[i] = valuesJSONArray.getLong(i);
180 }
181
182 return groupIds;
183 }
184
185 protected long[] getGroupIdsFromSearchContext(SearchContext searchContext) {
186 String groupIdAttribute = GetterUtil.getString(
187 searchContext.getAttribute("groupId"));
188
189 if (Validator.isNull(groupIdAttribute)) {
190 return null;
191 }
192
193 long groupId = GetterUtil.getLong(groupIdAttribute);
194
195 if (groupId == 0) {
196 return _GROUP_IDS_FROM_SEARCH_CONTEXT_DEFAULT;
197 }
198
199 return addScopeGroup(groupId);
200 }
201
202 private static final long[] _GROUP_IDS_FROM_SEARCH_CONTEXT_DEFAULT =
203 new long[] {0};
204
205 private static final Log _log = LogFactoryUtil.getLog(ScopeFacet.class);
206
207 }