/**
* 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.web.internal.display.context;
import com.liferay.dynamic.data.lists.constants.DDLActionKeys;
import com.liferay.dynamic.data.lists.constants.DDLPortletKeys;
import com.liferay.dynamic.data.lists.constants.DDLWebKeys;
import com.liferay.dynamic.data.lists.model.DDLRecord;
import com.liferay.dynamic.data.lists.model.DDLRecordSet;
import com.liferay.dynamic.data.lists.service.DDLRecordSetLocalService;
import com.liferay.dynamic.data.lists.service.permission.DDLPermission;
import com.liferay.dynamic.data.lists.service.permission.DDLRecordSetPermission;
import com.liferay.dynamic.data.lists.util.DDL;
import com.liferay.dynamic.data.lists.util.comparator.DDLRecordSetCreateDateComparator;
import com.liferay.dynamic.data.lists.util.comparator.DDLRecordSetModifiedDateComparator;
import com.liferay.dynamic.data.lists.util.comparator.DDLRecordSetNameComparator;
import com.liferay.dynamic.data.lists.web.configuration.DDLWebConfiguration;
import com.liferay.dynamic.data.lists.web.internal.display.context.util.DDLRequestHelper;
import com.liferay.dynamic.data.lists.web.internal.search.RecordSetSearch;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.service.DDMTemplateLocalService;
import com.liferay.dynamic.data.mapping.service.permission.DDMTemplatePermission;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.storage.StorageEngine;
import com.liferay.dynamic.data.mapping.util.DDMDisplay;
import com.liferay.dynamic.data.mapping.util.DDMDisplayRegistry;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.portlet.PortalPreferences;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.service.permission.PortletPermissionUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
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.PrefsParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import java.util.List;
import java.util.Locale;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.servlet.http.HttpServletRequest;
/**
* @author Marcellus Tavares
*/
public class DDLDisplayContext {
public DDLDisplayContext(
HttpServletRequest request, DDL ddl,
DDLRecordSetLocalService ddlRecordSetLocalService,
DDLWebConfiguration ddlWebConfiguration,
DDMDisplayRegistry ddmDisplayRegistry,
DDMTemplateLocalService ddmTemplateLocalService,
StorageEngine storageEngine) {
_ddl = ddl;
_ddlRecordSetLocalService = ddlRecordSetLocalService;
_ddlWebConfiguration = ddlWebConfiguration;
_ddmDisplayRegistry = ddmDisplayRegistry;
_ddmTemplateLocalService = ddmTemplateLocalService;
_storageEngine = storageEngine;
_ddlRequestHelper = new DDLRequestHelper(request);
if (Validator.isNotNull(getPortletResource())) {
return;
}
DDLRecordSet recordSet = getRecordSet();
if ((recordSet == null) || !hasViewPermission()) {
RenderRequest renderRequest = _ddlRequestHelper.getRenderRequest();
renderRequest.setAttribute(
WebKeys.PORTLET_CONFIGURATOR_VISIBILITY, Boolean.TRUE);
}
}
public boolean changeableDefaultLanguage() {
return _ddlWebConfiguration.changeableDefaultLanguage();
}
public String getAddDDMTemplateTitle() throws PortalException {
DDMDisplay ddmDisplay = getDDMDisplay();
return ddmDisplay.getEditTemplateTitle(
_recordSet.getDDMStructure(), null, getLocale());
}
public String getAddRecordLabel() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
String structureName = StringPool.BLANK;
if (recordSet != null) {
DDMStructure ddmStructure = recordSet.getDDMStructure();
structureName = ddmStructure.getName(_ddlRequestHelper.getLocale());
}
return LanguageUtil.format(
_ddlRequestHelper.getRequest(), "add-x",
HtmlUtil.escape(structureName), false);
}
public String getDDLRecordSetDisplayStyle() {
if (_ddlRecordDisplayStyle == null) {
PortalPreferences portalPreferences =
PortletPreferencesFactoryUtil.getPortalPreferences(
_ddlRequestHelper.getRenderRequest());
_ddlRecordDisplayStyle = ParamUtil.getString(
_ddlRequestHelper.getRenderRequest(), "displayStyle");
if (Validator.isNull(_ddlRecordDisplayStyle)) {
_ddlRecordDisplayStyle = portalPreferences.getValue(
DDLPortletKeys.DYNAMIC_DATA_LISTS, "display-style",
_ddlWebConfiguration.defaultDisplayView());
}
else if (ArrayUtil.contains(
getDDLRecordSetDisplayViews(),
_ddlRecordDisplayStyle)) {
portalPreferences.setValue(
DDLPortletKeys.DYNAMIC_DATA_LISTS, "display-style",
_ddlRecordDisplayStyle);
}
if (!ArrayUtil.contains(
getDDLRecordSetDisplayViews(), _ddlRecordDisplayStyle)) {
_ddlRecordDisplayStyle = getDDLRecordSetDisplayViews()[0];
}
}
return _ddlRecordDisplayStyle;
}
public String[] getDDLRecordSetDisplayViews() {
return _DISPLAY_VIEWS;
}
public OrderByComparator<DDLRecordSet> getDDLRecordSetOrderByComparator(
String orderByCol, String orderByType) {
boolean orderByAsc = false;
if (orderByType.equals("asc")) {
orderByAsc = true;
}
OrderByComparator<DDLRecordSet> orderByComparator = null;
if (orderByCol.equals("create-date")) {
orderByComparator = new DDLRecordSetCreateDateComparator(
orderByAsc);
}
else if (orderByCol.equals("modified-date")) {
orderByComparator = new DDLRecordSetModifiedDateComparator(
orderByAsc);
}
else if (orderByCol.equals("name")) {
orderByComparator = new DDLRecordSetNameComparator(orderByAsc);
}
return orderByComparator;
}
public DDMFormValues getDDMFormValues(long classPK) throws PortalException {
return _storageEngine.getDDMFormValues(classPK);
}
public long getDisplayDDMTemplateId() {
return PrefsParamUtil.getLong(
_ddlRequestHelper.getPortletPreferences(),
_ddlRequestHelper.getRenderRequest(), "displayDDMTemplateId");
}
public String getEditDisplayDDMTemplateTitle() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return StringPool.BLANK;
}
DDMDisplay ddmDisplay = getDDMDisplay();
return ddmDisplay.getEditTemplateTitle(
recordSet.getDDMStructure(), fetchDisplayDDMTemplate(),
getLocale());
}
public String getEditFormDDMTemplateTitle() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return LanguageUtil.get(getLocale(), "add-list");
}
DDMDisplay ddmDisplay = getDDMDisplay();
return ddmDisplay.getEditTemplateTitle(
recordSet.getDDMStructure(), fetchFormDDMTemplate(), getLocale());
}
public long getFormDDMTemplateId() {
return PrefsParamUtil.getLong(
_ddlRequestHelper.getPortletPreferences(),
_ddlRequestHelper.getRenderRequest(), "formDDMTemplateId");
}
public String getOrderByCol() {
String orderByCol = ParamUtil.getString(
_ddlRequestHelper.getRenderRequest(), "orderByCol",
"modified-date");
return orderByCol;
}
public String getOrderByType() {
String orderByType = ParamUtil.getString(
_ddlRequestHelper.getRenderRequest(), "orderByType", "asc");
return orderByType;
}
public DDLRecordSet getRecordSet() {
if (_recordSet != null) {
return _recordSet;
}
RenderRequest renderRequest = _ddlRequestHelper.getRenderRequest();
_recordSet = (DDLRecordSet)renderRequest.getAttribute(
DDLWebKeys.DYNAMIC_DATA_LISTS_RECORD_SET);
if (_recordSet != null) {
return _recordSet;
}
_recordSet = _ddlRecordSetLocalService.fetchDDLRecordSet(
getRecordSetId());
return _recordSet;
}
public long getRecordSetId() {
return PrefsParamUtil.getLong(
_ddlRequestHelper.getPortletPreferences(),
_ddlRequestHelper.getRenderRequest(), "recordSetId");
}
public JSONArray getRecordSetJSONArray(
DDLRecordSet recordSet, Locale locale)
throws Exception {
return _ddl.getRecordSetJSONArray(recordSet, locale);
}
public RecordSetSearch getRecordSetSearch(PortletURL portletURL) {
RecordSetSearch recordSetSearch = new RecordSetSearch(
_ddlRequestHelper.getRenderRequest(), portletURL);
String orderByCol = getOrderByCol();
String orderByType = getOrderByType();
OrderByComparator<DDLRecordSet> orderByComparator =
getDDLRecordSetOrderByComparator(orderByCol, orderByType);
recordSetSearch.setOrderByCol(orderByCol);
recordSetSearch.setOrderByComparator(orderByComparator);
recordSetSearch.setOrderByType(orderByType);
return recordSetSearch;
}
public JSONArray getRecordsJSONArray(
List<DDLRecord> records, boolean latestRecordVersion, Locale locale)
throws Exception {
return _ddl.getRecordsJSONArray(records, latestRecordVersion, locale);
}
public boolean isAdminPortlet() {
String portletName = getPortletName();
return portletName.equals(DDLPortletKeys.DYNAMIC_DATA_LISTS);
}
public boolean isDisplayPortlet() {
return !isAdminPortlet();
}
public boolean isEditable() {
if (isAdminPortlet()) {
return true;
}
return PrefsParamUtil.getBoolean(
_ddlRequestHelper.getPortletPreferences(),
_ddlRequestHelper.getRenderRequest(), "editable", true);
}
public boolean isFormView() {
return PrefsParamUtil.getBoolean(
_ddlRequestHelper.getPortletPreferences(),
_ddlRequestHelper.getRenderRequest(), "formView");
}
public boolean isShowAddDDMDisplayTemplateIcon() throws PortalException {
if (isShowAddDDMTemplateIcon() && !isFormView()) {
return true;
}
return false;
}
public boolean isShowAddDDMFormTemplateIcon() throws PortalException {
return isShowAddDDMTemplateIcon();
}
public boolean isShowAddRecordButton() {
if (isFormView() || isSpreadsheet()) {
return false;
}
if (isEditable() && hasAddRecordPermission()) {
return true;
}
return false;
}
public boolean isShowAddRecordSetIcon() {
if (_hasAddRecordSetPermission != null) {
return _hasAddRecordSetPermission;
}
_hasAddRecordSetPermission = DDLPermission.contains(
getPermissionChecker(), getScopeGroupId(), getPortletId(),
DDLActionKeys.ADD_RECORD_SET);
return _hasAddRecordSetPermission;
}
public boolean isShowCancelButton() {
if (isFormView()) {
return false;
}
return true;
}
public boolean isShowConfigurationIcon() throws PortalException {
if (_showConfigurationIcon != null) {
return _showConfigurationIcon;
}
_showConfigurationIcon = PortletPermissionUtil.contains(
getPermissionChecker(), getLayout(), getPortletId(),
ActionKeys.CONFIGURATION);
return _showConfigurationIcon;
}
public boolean isShowEditDisplayDDMTemplateIcon() throws PortalException {
if (_hasEditDisplayDDMTemplatePermission != null) {
return _hasEditDisplayDDMTemplatePermission;
}
_hasEditDisplayDDMTemplatePermission = Boolean.FALSE;
DDMTemplate displayDDMTemplate = fetchDisplayDDMTemplate();
if (displayDDMTemplate == null) {
return _hasEditDisplayDDMTemplatePermission;
}
_hasEditDisplayDDMTemplatePermission = DDMTemplatePermission.contains(
getPermissionChecker(), getScopeGroupId(),
getDisplayDDMTemplateId(), DDLPortletKeys.DYNAMIC_DATA_LISTS,
ActionKeys.UPDATE);
return _hasEditDisplayDDMTemplatePermission;
}
public boolean isShowEditFormDDMTemplateIcon() throws PortalException {
if (_hasEditFormDDMTemplatePermission != null) {
return _hasEditFormDDMTemplatePermission;
}
_hasEditFormDDMTemplatePermission = Boolean.FALSE;
if (getFormDDMTemplateId() == 0) {
return _hasEditFormDDMTemplatePermission;
}
_hasEditFormDDMTemplatePermission = DDMTemplatePermission.contains(
getPermissionChecker(), getScopeGroupId(), getFormDDMTemplateId(),
DDLPortletKeys.DYNAMIC_DATA_LISTS, ActionKeys.UPDATE);
return _hasEditFormDDMTemplatePermission;
}
public boolean isShowEditRecordSetIcon() {
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return false;
}
return DDLRecordSetPermission.contains(
getPermissionChecker(), recordSet, ActionKeys.UPDATE);
}
public boolean isShowIconsActions() throws PortalException {
if (isSpreadsheet()) {
return false;
}
if (_hasShowIconsActionPermission != null) {
return _hasShowIconsActionPermission;
}
_hasShowIconsActionPermission = Boolean.FALSE;
ThemeDisplay themeDisplay = getThemeDisplay();
if (!themeDisplay.isSignedIn()) {
return _hasShowIconsActionPermission;
}
Layout layout = themeDisplay.getLayout();
if (layout.isLayoutPrototypeLinkActive()) {
return _hasShowIconsActionPermission;
}
if (isShowConfigurationIcon() || isShowAddDDMDisplayTemplateIcon() ||
isShowAddDDMFormTemplateIcon() ||
isShowEditDisplayDDMTemplateIcon() ||
isShowEditFormDDMTemplateIcon()) {
_hasShowIconsActionPermission = Boolean.TRUE;
}
return _hasShowIconsActionPermission;
}
public boolean isShowPublishRecordButton() {
if (isEditable() && hasAddRecordPermission()) {
return true;
}
return false;
}
public boolean isShowSaveRecordButton() {
if (isFormView()) {
return false;
}
if (isEditable() && hasAddRecordPermission()) {
return true;
}
return false;
}
public boolean isSpreadsheet() {
return PrefsParamUtil.getBoolean(
_ddlRequestHelper.getPortletPreferences(),
_ddlRequestHelper.getRenderRequest(), "spreadsheet");
}
protected DDMTemplate fetchDisplayDDMTemplate() {
if (_displayDDMTemplate != null) {
return _displayDDMTemplate;
}
_displayDDMTemplate = _ddmTemplateLocalService.fetchDDMTemplate(
getDisplayDDMTemplateId());
return _displayDDMTemplate;
}
protected DDMTemplate fetchFormDDMTemplate() {
if (_formDDMTemplate != null) {
return _formDDMTemplate;
}
_formDDMTemplate = _ddmTemplateLocalService.fetchDDMTemplate(
getFormDDMTemplateId());
return _formDDMTemplate;
}
protected DDMDisplay getDDMDisplay() {
return _ddmDisplayRegistry.getDDMDisplay(
DDLPortletKeys.DYNAMIC_DATA_LISTS);
}
protected Layout getLayout() {
return _ddlRequestHelper.getLayout();
}
protected Locale getLocale() {
return _ddlRequestHelper.getLocale();
}
protected PermissionChecker getPermissionChecker() {
return _ddlRequestHelper.getPermissionChecker();
}
protected String getPortletId() {
return _ddlRequestHelper.getPortletId();
}
protected String getPortletName() {
return _ddlRequestHelper.getPortletName();
}
protected String getPortletResource() {
return _ddlRequestHelper.getPortletResource();
}
protected long getScopeGroupId() {
return _ddlRequestHelper.getScopeGroupId();
}
protected long getStructureTypeClassNameId() {
DDMDisplay ddmDisplay = getDDMDisplay();
return PortalUtil.getClassNameId(ddmDisplay.getStructureType());
}
protected ThemeDisplay getThemeDisplay() {
return _ddlRequestHelper.getThemeDisplay();
}
protected boolean hasAddRecordPermission() {
if (_hasAddRecordPermission != null) {
return _hasAddRecordPermission;
}
_hasAddRecordPermission = false;
if (_recordSet != null) {
_hasAddRecordPermission = DDLRecordSetPermission.contains(
getPermissionChecker(), _recordSet, DDLActionKeys.ADD_RECORD);
}
return _hasAddRecordPermission;
}
protected boolean hasViewPermission() {
if (_hasViewPermission != null) {
return _hasViewPermission;
}
_hasViewPermission = true;
if (_recordSet != null) {
_hasViewPermission = DDLRecordSetPermission.contains(
getPermissionChecker(), _recordSet, ActionKeys.VIEW);
}
return _hasViewPermission;
}
protected boolean isShowAddDDMTemplateIcon() throws PortalException {
if (_hasAddDDMTemplatePermission != null) {
return _hasAddDDMTemplatePermission;
}
_hasAddDDMTemplatePermission = Boolean.FALSE;
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return _hasAddDDMTemplatePermission;
}
_hasAddDDMTemplatePermission =
DDMTemplatePermission.containsAddTemplatePermission(
getPermissionChecker(), getScopeGroupId(),
getStructureTypeClassNameId(), getStructureTypeClassNameId());
return _hasAddDDMTemplatePermission;
}
private static final String[] _DISPLAY_VIEWS = {"descriptive", "list"};
private final DDL _ddl;
private String _ddlRecordDisplayStyle;
private final DDLRecordSetLocalService _ddlRecordSetLocalService;
private final DDLRequestHelper _ddlRequestHelper;
private final DDLWebConfiguration _ddlWebConfiguration;
private final DDMDisplayRegistry _ddmDisplayRegistry;
private final DDMTemplateLocalService _ddmTemplateLocalService;
private DDMTemplate _displayDDMTemplate;
private DDMTemplate _formDDMTemplate;
private Boolean _hasAddDDMTemplatePermission;
private Boolean _hasAddRecordPermission;
private Boolean _hasAddRecordSetPermission;
private Boolean _hasEditDisplayDDMTemplatePermission;
private Boolean _hasEditFormDDMTemplatePermission;
private Boolean _hasShowIconsActionPermission;
private Boolean _hasViewPermission;
private DDLRecordSet _recordSet;
private Boolean _showConfigurationIcon;
private final StorageEngine _storageEngine;
}