001
014
015 package com.liferay.taglib.ui;
016
017 import com.liferay.portal.kernel.bean.BeanPropertiesUtil;
018 import com.liferay.portal.kernel.dao.search.ResultRow;
019 import com.liferay.portal.kernel.dao.search.SearchContainer;
020 import com.liferay.portal.kernel.repository.model.RepositoryModel;
021 import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
022 import com.liferay.portal.kernel.util.GetterUtil;
023 import com.liferay.portal.kernel.util.ServerDetector;
024 import com.liferay.portal.kernel.util.Validator;
025 import com.liferay.portal.model.BaseModel;
026 import com.liferay.taglib.util.ParamAndPropertyAncestorTagImpl;
027
028 import java.util.ArrayList;
029 import java.util.LinkedHashMap;
030 import java.util.List;
031 import java.util.Map;
032 import java.util.regex.Pattern;
033
034 import javax.servlet.jsp.JspException;
035 import javax.servlet.jsp.tagext.BodyTag;
036
037
040 public class SearchContainerRowTag<R>
041 extends ParamAndPropertyAncestorTagImpl implements BodyTag {
042
043 public static final String DEFAULT_INDEX_VAR = "index";
044
045 public static final String DEFAULT_MODEL_VAR = "model";
046
047 public static final String DEFAULT_ROW_VAR = "row";
048
049 @Override
050 public void addParam(String name, String value) {
051 if (name.equals("className")) {
052 _resultRow.setClassName(value);
053 }
054 else if (name.equals("classHoverName")) {
055 _resultRow.setClassHoverName(value);
056 }
057 else if (name.equals("restricted")) {
058 _resultRow.setRestricted(GetterUtil.getBoolean(value, false));
059 }
060 else {
061 Object obj = pageContext.getAttribute(value);
062
063 if (obj == null) {
064 obj = value;
065 }
066
067 _resultRow.setParameter(name, obj);
068 }
069 }
070
071 @Override
072 public int doAfterBody() {
073 if (!_headerNamesAssigned && (_headerNames != null) &&
074 !_headerNames.isEmpty()) {
075
076 SearchContainerTag<R> searchContainerTag =
077 (SearchContainerTag<R>)findAncestorWithClass(
078 this, SearchContainerTag.class);
079
080 SearchContainer<R> searchContainer =
081 searchContainerTag.getSearchContainer();
082
083 searchContainer.setHeaderNames(_headerNames);
084 searchContainer.setOrderableHeaders(_orderableHeaders);
085
086 _headerNamesAssigned = true;
087 }
088
089 if (!_resultRow.isSkip()) {
090 _resultRows.add(_resultRow);
091 }
092
093 _rowIndex++;
094
095 if (_rowIndex < _results.size()) {
096 processRow();
097
098 return EVAL_BODY_AGAIN;
099 }
100 else {
101 return SKIP_BODY;
102 }
103 }
104
105 @Override
106 public int doEndTag() {
107 _headerNames = null;
108 _headerNamesAssigned = false;
109 _resultRows = null;
110 _rowIndex = 0;
111 _resultRow = null;
112
113 if (!ServerDetector.isResin()) {
114 _bold = false;
115 _className = null;
116 _escapedModel = false;
117 _indexVar = DEFAULT_INDEX_VAR;
118 _keyProperty = null;
119 _modelVar = DEFAULT_MODEL_VAR;
120 _orderableHeaders = null;
121 _rowIdProperty = null;
122 _rowVar = DEFAULT_ROW_VAR;
123 _stringKey = false;
124 }
125
126 return EVAL_PAGE;
127 }
128
129 @Override
130 public int doStartTag() throws JspException {
131 SearchContainerTag<R> searchContainerTag =
132 (SearchContainerTag<R>)findAncestorWithClass(
133 this, SearchContainerTag.class);
134
135 if (searchContainerTag == null) {
136 throw new JspException("Requires liferay-ui:search-container");
137 }
138 else if (!searchContainerTag.isHasResults()) {
139 throw new JspException(
140 "Requires liferay-ui:search-container-results");
141 }
142
143 SearchContainer<R> searchContainer =
144 searchContainerTag.getSearchContainer();
145
146 searchContainer.setClassName(_className);
147
148 _resultRows = searchContainer.getResultRows();
149 _results = searchContainer.getResults();
150
151 if ((_results != null) && !_results.isEmpty()) {
152 processRow();
153
154 return EVAL_BODY_INCLUDE;
155 }
156 else {
157 return SKIP_BODY;
158 }
159 }
160
161 public String getClassName() {
162 return _className;
163 }
164
165 public List<String> getHeaderNames() {
166 if (_headerNames == null) {
167 _headerNames = new ArrayList<String>();
168 }
169
170 return _headerNames;
171 }
172
173 public String getIndexVar() {
174 return _indexVar;
175 }
176
177 public String getKeyProperty() {
178 return _keyProperty;
179 }
180
181 public String getModelVar() {
182 return _modelVar;
183 }
184
185 public Map<String, String> getOrderableHeaders() {
186 if (_orderableHeaders == null) {
187 _orderableHeaders = new LinkedHashMap<String, String>();
188 }
189
190 return _orderableHeaders;
191 }
192
193 public ResultRow getRow() {
194 return _resultRow;
195 }
196
197 public String getRowVar() {
198 return _rowVar;
199 }
200
201 public boolean isBold() {
202 return _bold;
203 }
204
205 public boolean isEscapedModel() {
206 return _escapedModel;
207 }
208
209 public boolean isHeaderNamesAssigned() {
210 return _headerNamesAssigned;
211 }
212
213 public boolean isStringKey() {
214 return _stringKey;
215 }
216
217 public void setBold(boolean bold) {
218 _bold = bold;
219 }
220
221 public void setClassName(String className) {
222 _className = className;
223 }
224
225 public void setEscapedModel(boolean escapedModel) {
226 _escapedModel = escapedModel;
227 }
228
229 public void setHeaderNames(List<String> headerNames) {
230 _headerNames = headerNames;
231 }
232
233 public void setHeaderNamesAssigned(boolean headerNamesAssigned) {
234 _headerNamesAssigned = headerNamesAssigned;
235 }
236
237 public void setIndexVar(String indexVar) {
238 _indexVar = indexVar;
239 }
240
241 public void setKeyProperty(String keyProperty) {
242 _keyProperty = keyProperty;
243 }
244
245 public void setModelVar(String var) {
246 _modelVar = var;
247 }
248
249 public void setOrderableHeaders(Map<String, String> orderableHeaders) {
250 _orderableHeaders = orderableHeaders;
251 }
252
253 public void setRow(ResultRow row) {
254 _resultRow = row;
255 }
256
257 public void setRowIdProperty(String rowIdProperty) {
258 _rowIdProperty = rowIdProperty;
259 }
260
261 public void setRowVar(String rowVar) {
262 _rowVar = rowVar;
263 }
264
265 public void setStringKey(boolean stringKey) {
266 _stringKey = stringKey;
267 }
268
269 protected void processRow() {
270 Object model = _results.get(_rowIndex);
271
272 if (isEscapedModel()) {
273 if (model instanceof BaseModel) {
274 BaseModel<?> baseModel = (BaseModel<?>)model;
275
276 model = baseModel.toEscapedModel();
277 }
278 else if (model instanceof RepositoryModel) {
279 RepositoryModel<?> repositoryModel = (RepositoryModel<?>)model;
280
281 model = repositoryModel.toEscapedModel();
282 }
283 }
284
285 String primaryKey = null;
286
287 if (Validator.isNull(_keyProperty)) {
288 primaryKey = String.valueOf(model);
289 }
290 else if (isStringKey()) {
291 primaryKey = BeanPropertiesUtil.getString(model, _keyProperty);
292 }
293 else {
294 Object primaryKeyObj = BeanPropertiesUtil.getObject(
295 model, _keyProperty);
296
297 primaryKey = String.valueOf(primaryKeyObj);
298 }
299
300 String rowId = null;
301
302 if (Validator.isNull(_rowIdProperty)) {
303 rowId = String.valueOf(_rowIndex + 1);
304 }
305 else {
306 Object rowIdObj = BeanPropertiesUtil.getObject(
307 model, _rowIdProperty);
308
309 if (Validator.isNull(rowIdObj)) {
310 rowId = String.valueOf(_rowIndex + 1);
311 }
312 else {
313 rowId = FriendlyURLNormalizerUtil.normalize(
314 String.valueOf(rowIdObj), _friendlyURLPattern);
315 }
316 }
317
318 _resultRow = new ResultRow(rowId, model, primaryKey, _rowIndex, _bold);
319
320 pageContext.setAttribute(_indexVar, _rowIndex);
321 pageContext.setAttribute(_modelVar, model);
322 pageContext.setAttribute(_rowVar, _resultRow);
323 }
324
325 private static Pattern _friendlyURLPattern = Pattern.compile("[^a-z0-9_-]");
326
327 private boolean _bold;
328 private String _className;
329 private boolean _escapedModel;
330 private List<String> _headerNames;
331 private boolean _headerNamesAssigned;
332 private String _indexVar = DEFAULT_INDEX_VAR;
333 private String _keyProperty;
334 private String _modelVar = DEFAULT_MODEL_VAR;
335 private Map<String, String> _orderableHeaders;
336 private ResultRow _resultRow;
337 private List<ResultRow> _resultRows;
338 private List<R> _results;
339 private String _rowIdProperty;
340 private int _rowIndex;
341 private String _rowVar = DEFAULT_ROW_VAR;
342 private boolean _stringKey;
343
344 }