/**
* 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.dynamic.data.lists.form.web.internal.display.context;
import com.liferay.dynamic.data.lists.form.web.constants.DDLFormPortletKeys;
import com.liferay.dynamic.data.lists.form.web.internal.search.RecordSearch;
import com.liferay.dynamic.data.lists.model.DDLRecord;
import com.liferay.dynamic.data.lists.model.DDLRecordSet;
import com.liferay.dynamic.data.lists.model.DDLRecordVersion;
import com.liferay.dynamic.data.lists.service.DDLRecordLocalService;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldValueRenderer;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.storage.StorageEngine;
import com.liferay.portal.kernel.dao.search.DisplayTerms;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.portlet.PortalPreferences;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.portlet.PortletURLUtil;
import com.liferay.portal.kernel.search.BaseModelSearchResult;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchContextFactory;
import com.liferay.portal.kernel.theme.PortletDisplay;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.Function;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import java.util.ArrayList;
import java.util.List;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
/**
* @author Leonardo Barros
*/
public class DDLFormViewRecordsDisplayContext {
public DDLFormViewRecordsDisplayContext(
RenderRequest renderRequest, RenderResponse renderResponse,
DDLRecordSet ddlRecordSet,
DDLRecordLocalService ddlRecordLocalService,
DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker,
StorageEngine storageEngine)
throws PortalException {
_renderRequest = renderRequest;
_renderResponse = renderResponse;
_ddlRecordSet = ddlRecordSet;
_ddlRecordLocalService = ddlRecordLocalService;
_ddmFormFieldTypeServicesTracker = ddmFormFieldTypeServicesTracker;
_storageEngine = storageEngine;
ThemeDisplay themeDisplay = (ThemeDisplay)_renderRequest.getAttribute(
WebKeys.THEME_DISPLAY);
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
portletDisplay.setShowBackIcon(true);
portletDisplay.setURLBack(
ParamUtil.getString(_renderRequest, "redirect"));
createRecordSearchContainer(ddlRecordSet.getDDMStructure());
}
public String getColumnName(DDMFormField ddmFormField) {
LocalizedValue label = ddmFormField.getLabel();
return label.getString(_renderRequest.getLocale());
}
public String getColumnValue(
DDMFormField ddmFormField, List<DDMFormFieldValue> ddmFormFieldValues) {
if (ddmFormFieldValues == null) {
return StringPool.BLANK;
}
final DDMFormFieldValueRenderer ddmFieldValueRenderer =
_ddmFormFieldTypeServicesTracker.getDDMFormFieldValueRenderer(
ddmFormField.getType());
List<String> renderedDDMFormFielValues = ListUtil.toList(
ddmFormFieldValues,
new Function<DDMFormFieldValue, String>() {
@Override
public String apply(DDMFormFieldValue ddmFormFieldValue) {
return ddmFieldValueRenderer.render(
ddmFormFieldValue, _renderRequest.getLocale());
}
});
return StringUtil.merge(
renderedDDMFormFielValues, StringPool.COMMA_AND_SPACE);
}
public DDLRecordSet getDDLRecordSet() {
return _ddlRecordSet;
}
public List<DDMFormField> getDDMFormFields() {
return _ddmFormFields;
}
public DDMFormValues getDDMFormValues(DDLRecord ddlRecord)
throws PortalException {
DDLRecordVersion recordVersion = ddlRecord.getRecordVersion();
return _storageEngine.getDDMFormValues(recordVersion.getDDMStorageId());
}
public String getDisplayStyle() {
return "list";
}
public String getOrderByCol() {
PortalPreferences portalPreferences =
PortletPreferencesFactoryUtil.getPortalPreferences(_renderRequest);
String orderByCol = ParamUtil.getString(_renderRequest, "orderByCol");
if (Validator.isNull(orderByCol)) {
orderByCol = portalPreferences.getValue(
DDLFormPortletKeys.DYNAMIC_DATA_LISTS_FORM_ADMIN,
"view-entries-order-by-col", "modified-date");
}
else {
portalPreferences.setValue(
DDLFormPortletKeys.DYNAMIC_DATA_LISTS_FORM_ADMIN,
"view-entries-order-by-col", orderByCol);
}
return orderByCol;
}
public String getOrderByType() {
PortalPreferences portalPreferences =
PortletPreferencesFactoryUtil.getPortalPreferences(_renderRequest);
String orderByType = ParamUtil.getString(_renderRequest, "orderByType");
if (Validator.isNull(orderByType)) {
orderByType = portalPreferences.getValue(
DDLFormPortletKeys.DYNAMIC_DATA_LISTS_FORM_ADMIN,
"view-entries-order-by-type", "asc");
}
else {
portalPreferences.setValue(
DDLFormPortletKeys.DYNAMIC_DATA_LISTS_FORM_ADMIN,
"view-entries-order-by-type", orderByType);
}
return orderByType;
}
public RecordSearch getRecordSearchContainer() {
return _recordSearchContainer;
}
public int getStatus(DDLRecord ddlRecord) throws PortalException {
DDLRecordVersion recordVersion = ddlRecord.getRecordVersion();
return recordVersion.getStatus();
}
protected void createRecordSearchContainer(DDMStructure ddmStructure) {
List<String> headerNames = new ArrayList<>();
List<DDMFormField> ddmFormfields = getNontransientDDMFormFields(
ddmStructure.getDDMForm());
int totalColumns = _MAX_COLUMNS;
if (ddmFormfields.size() < totalColumns) {
totalColumns = ddmFormfields.size();
}
for (int i = 0; i < totalColumns; i++) {
DDMFormField ddmFormField = ddmFormfields.get(i);
_ddmFormFields.add(ddmFormField);
LocalizedValue label = ddmFormField.getLabel();
headerNames.add(label.getString(_renderRequest.getLocale()));
}
PortletURL portletURL = PortletURLUtil.getCurrent(
_renderRequest, _renderResponse);
_recordSearchContainer = new RecordSearch(
_renderRequest, portletURL, headerNames);
OrderByComparator<DDLRecord> orderByComparator =
RecordSearch.getRecordOrderByComparator(
getOrderByCol(), getOrderByType());
_recordSearchContainer.setOrderByCol(getOrderByCol());
_recordSearchContainer.setOrderByComparator(orderByComparator);
_recordSearchContainer.setOrderByType(getOrderByType());
updateSearchContainerResults();
}
protected List<DDMFormField> getNontransientDDMFormFields(DDMForm ddmForm) {
List<DDMFormField> ddmFormfields = new ArrayList<>();
for (DDMFormField ddmFormField : ddmForm.getDDMFormFields()) {
if (ddmFormField.isTransient()) {
continue;
}
ddmFormfields.add(ddmFormField);
}
return ddmFormfields;
}
protected void updateSearchContainerResults() {
List<DDLRecord> results = null;
int total = 0;
DisplayTerms displayTerms = _recordSearchContainer.getDisplayTerms();
int status = WorkflowConstants.STATUS_ANY;
if (Validator.isNull(displayTerms.getKeywords())) {
results = _ddlRecordLocalService.getRecords(
_ddlRecordSet.getRecordSetId(), status,
_recordSearchContainer.getStart(),
_recordSearchContainer.getEnd(),
_recordSearchContainer.getOrderByComparator());
total = _ddlRecordLocalService.getRecordsCount(
_ddlRecordSet.getRecordSetId(), status);
}
else {
SearchContext searchContext = SearchContextFactory.getInstance(
PortalUtil.getHttpServletRequest(_renderRequest));
searchContext.setAttribute(Field.STATUS, status);
searchContext.setAttribute(
"recordSetId", _ddlRecordSet.getRecordSetId());
searchContext.setAttribute(
"recordSetScope", _ddlRecordSet.getScope());
searchContext.setEnd(_recordSearchContainer.getEnd());
searchContext.setKeywords(displayTerms.getKeywords());
searchContext.setStart(_recordSearchContainer.getStart());
BaseModelSearchResult<DDLRecord> baseModelSearchResult =
_ddlRecordLocalService.searchDDLRecords(searchContext);
results = baseModelSearchResult.getBaseModels();
total = baseModelSearchResult.getLength();
}
_recordSearchContainer.setResults(results);
_recordSearchContainer.setTotal(total);
}
private static final int _MAX_COLUMNS = 5;
private final DDLRecordLocalService _ddlRecordLocalService;
private final DDLRecordSet _ddlRecordSet;
private final List<DDMFormField> _ddmFormFields = new ArrayList<>();
private final DDMFormFieldTypeServicesTracker
_ddmFormFieldTypeServicesTracker;
private RecordSearch _recordSearchContainer;
private final RenderRequest _renderRequest;
private final RenderResponse _renderResponse;
private final StorageEngine _storageEngine;
}