/**
* 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.internal.util;
import com.liferay.document.library.kernel.service.DLAppLocalService;
import com.liferay.dynamic.data.lists.model.DDLRecord;
import com.liferay.dynamic.data.lists.model.DDLRecordConstants;
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.lists.service.DDLRecordService;
import com.liferay.dynamic.data.lists.service.DDLRecordSetLocalService;
import com.liferay.dynamic.data.lists.util.DDL;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldType;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.storage.Field;
import com.liferay.dynamic.data.mapping.storage.Fields;
import com.liferay.dynamic.data.mapping.storage.StorageEngine;
import com.liferay.dynamic.data.mapping.util.DDM;
import com.liferay.dynamic.data.mapping.util.DDMFormValuesToFieldsConverter;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.service.LayoutService;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.LocaleThreadLocal;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.portlet.PortletPreferences;
import javax.servlet.http.HttpServletRequest;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Marcellus Tavares
* @author Eduardo Lundgren
*/
@Component(immediate = true)
public class DDLImpl implements DDL {
/**
* @deprecated As of 1.1.0
*/
@Deprecated
@Override
@SuppressWarnings("deprecation")
public JSONObject getRecordJSONObject(DDLRecord record) throws Exception {
Locale locale = LocaleThreadLocal.getThemeDisplayLocale();
return getRecordJSONObject(record, false, locale);
}
@Override
public JSONObject getRecordJSONObject(
DDLRecord record, boolean latestRecordVersion, Locale locale)
throws Exception {
DDLRecordSet recordSet = record.getRecordSet();
DDMStructure ddmStructure = recordSet.getDDMStructure();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
for (String fieldName : ddmStructure.getFieldNames()) {
jsonObject.put(fieldName, StringPool.BLANK);
}
jsonObject.put("displayIndex", record.getDisplayIndex());
jsonObject.put("recordId", record.getRecordId());
DDLRecordVersion recordVersion = record.getRecordVersion();
if (latestRecordVersion) {
recordVersion = record.getLatestRecordVersion();
}
DDMFormValues ddmFormValues = _storageEngine.getDDMFormValues(
recordVersion.getDDMStorageId());
Fields fields = _ddmFormValuesToFieldsConverter.convert(
ddmStructure, ddmFormValues);
for (Field field : fields) {
String fieldName = field.getName();
String fieldType = field.getType();
Object fieldValue = field.getValue(locale);
if (fieldValue instanceof Date) {
jsonObject.put(fieldName, ((Date)fieldValue).getTime());
}
else if (fieldType.equals(DDMFormFieldType.DOCUMENT_LIBRARY) &&
Validator.isNotNull(fieldValue)) {
JSONObject fieldValueJSONObject =
JSONFactoryUtil.createJSONObject(
String.valueOf(fieldValue));
String uuid = fieldValueJSONObject.getString("uuid");
long groupId = fieldValueJSONObject.getLong("groupId");
fieldValueJSONObject.put(
"title", getFileEntryTitle(uuid, groupId));
jsonObject.put(fieldName, fieldValueJSONObject.toString());
}
else if (fieldType.equals(DDMFormFieldType.LINK_TO_PAGE) &&
Validator.isNotNull(fieldValue)) {
JSONObject fieldValueJSONObject =
JSONFactoryUtil.createJSONObject(
String.valueOf(fieldValue));
long groupId = fieldValueJSONObject.getLong("groupId");
boolean privateLayout = fieldValueJSONObject.getBoolean(
"privateLayout");
long layoutId = fieldValueJSONObject.getLong("layoutId");
String layoutName = getLayoutName(
groupId, privateLayout, layoutId,
LanguageUtil.getLanguageId(locale));
fieldValueJSONObject.put("name", layoutName);
jsonObject.put(fieldName, fieldValueJSONObject.toString());
}
else if ((fieldType.equals(DDMFormFieldType.RADIO) ||
fieldType.equals(DDMFormFieldType.SELECT)) &&
Validator.isNotNull(fieldValue)) {
fieldValue = JSONFactoryUtil.createJSONArray(
String.valueOf(fieldValue));
jsonObject.put(fieldName, (JSONArray)fieldValue);
}
else if (Validator.isNotNull(fieldValue)) {
jsonObject.put(fieldName, String.valueOf(fieldValue));
}
}
return jsonObject;
}
@Override
public JSONArray getRecordSetJSONArray(
DDLRecordSet recordSet, Locale locale)
throws Exception {
JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
DDMStructure ddmStructure = recordSet.getDDMStructure();
List<DDMFormField> ddmFormFields = ddmStructure.getDDMFormFields(false);
for (DDMFormField ddmFormField : ddmFormFields) {
String name = ddmFormField.getName();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
String dataType = ddmFormField.getDataType();
jsonObject.put("dataType", dataType);
boolean readOnly = ddmFormField.isReadOnly();
jsonObject.put("editable", !readOnly);
LocalizedValue label = ddmFormField.getLabel();
jsonObject.put("label", label.getString(locale));
jsonObject.put("name", name);
boolean required = ddmFormField.isRequired();
jsonObject.put("required", required);
jsonObject.put("sortable", true);
String type = ddmFormField.getType();
jsonObject.put("type", type);
jsonArray.put(jsonObject);
}
return jsonArray;
}
/**
* @deprecated As of 1.1.0
*/
@Deprecated
@Override
@SuppressWarnings("deprecation")
public JSONArray getRecordsJSONArray(DDLRecordSet recordSet)
throws Exception {
Locale locale = LocaleThreadLocal.getThemeDisplayLocale();
return getRecordsJSONArray(recordSet.getRecords(), false, locale);
}
/**
* @deprecated As of 1.1.0
*/
@Deprecated
@Override
@SuppressWarnings("deprecation")
public JSONArray getRecordsJSONArray(List<DDLRecord> records)
throws Exception {
JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
for (DDLRecord record : records) {
JSONObject jsonObject = getRecordJSONObject(record);
jsonArray.put(jsonObject);
}
return jsonArray;
}
@Override
public JSONArray getRecordsJSONArray(
List<DDLRecord> records, boolean latestRecordVersion, Locale locale)
throws Exception {
JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
for (DDLRecord record : records) {
JSONObject jsonObject = getRecordJSONObject(
record, latestRecordVersion, locale);
jsonArray.put(jsonObject);
}
return jsonArray;
}
/**
* @deprecated As of 1.1.0, with no direct replacement
*/
@Deprecated
@Override
@SuppressWarnings("deprecation")
public boolean isEditable(
HttpServletRequest request, String portletId, long groupId)
throws Exception {
return true;
}
/**
* @deprecated As of 1.1.0, with no direct replacement
*/
@Deprecated
@Override
@SuppressWarnings("deprecation")
public boolean isEditable(
PortletPreferences preferences, String portletId, long groupId)
throws Exception {
return true;
}
@Override
public DDLRecord updateRecord(
long recordId, long recordSetId, boolean mergeFields,
boolean checkPermission, ServiceContext serviceContext)
throws Exception {
DDLRecord record = _ddlRecordLocalService.fetchRecord(recordId);
boolean majorVersion = ParamUtil.getBoolean(
serviceContext, "majorVersion");
DDLRecordSet recordSet = _ddlRecordSetLocalService.getDDLRecordSet(
recordSetId);
DDMStructure ddmStructure = recordSet.getDDMStructure();
Fields fields = _ddm.getFields(
ddmStructure.getStructureId(), serviceContext);
if (record != null) {
if (checkPermission) {
record = _ddlRecordService.updateRecord(
recordId, majorVersion,
DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields,
mergeFields, serviceContext);
}
else {
record = _ddlRecordLocalService.updateRecord(
serviceContext.getUserId(), recordId, majorVersion,
DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields,
mergeFields, serviceContext);
}
}
else {
if (checkPermission) {
record = _ddlRecordService.addRecord(
serviceContext.getScopeGroupId(), recordSetId,
DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields,
serviceContext);
}
else {
record = _ddlRecordLocalService.addRecord(
serviceContext.getUserId(),
serviceContext.getScopeGroupId(), recordSetId,
DDLRecordConstants.DISPLAY_INDEX_DEFAULT, fields,
serviceContext);
}
}
return record;
}
/**
* @deprecated As of 1.1.0
*/
@Deprecated
@Override
@SuppressWarnings("deprecation")
public DDLRecord updateRecord(
long recordId, long recordSetId, boolean mergeFields,
ServiceContext serviceContext)
throws Exception {
return updateRecord(
recordId, recordSetId, mergeFields, true, serviceContext);
}
protected String getFileEntryTitle(String uuid, long groupId) {
try {
FileEntry fileEntry =
_dlAppLocalService.getFileEntryByUuidAndGroupId(uuid, groupId);
return fileEntry.getTitle();
}
catch (Exception e) {
return LanguageUtil.format(
LocaleUtil.getSiteDefault(), "is-temporarily-unavailable",
"content");
}
}
protected String getLayoutName(
long groupId, boolean privateLayout, long layoutId, String languageId) {
try {
return _layoutService.getLayoutName(
groupId, privateLayout, layoutId, languageId);
}
catch (Exception e) {
return LanguageUtil.format(
LocaleUtil.getSiteDefault(), "is-temporarily-unavailable",
"content");
}
}
@Reference(unbind = "-")
protected void setDDLRecordLocalService(
DDLRecordLocalService ddlRecordLocalService) {
_ddlRecordLocalService = ddlRecordLocalService;
}
@Reference(unbind = "-")
protected void setDDLRecordService(DDLRecordService ddlRecordService) {
_ddlRecordService = ddlRecordService;
}
@Reference(unbind = "-")
protected void setDDLRecordSetLocalService(
DDLRecordSetLocalService ddlRecordSetLocalService) {
_ddlRecordSetLocalService = ddlRecordSetLocalService;
}
@Reference(unbind = "-")
protected void setDDM(DDM ddm) {
_ddm = ddm;
}
@Reference(unbind = "-")
protected void setDDMFormValuesToFieldsConverter(
DDMFormValuesToFieldsConverter ddmFormValuesToFieldsConverter) {
_ddmFormValuesToFieldsConverter = ddmFormValuesToFieldsConverter;
}
@Reference(unbind = "-")
protected void setDLAppLocalService(DLAppLocalService dlAppLocalService) {
_dlAppLocalService = dlAppLocalService;
}
@Reference(unbind = "-")
protected void setLayoutService(LayoutService layoutService) {
_layoutService = layoutService;
}
@Reference(unbind = "-")
protected void setStorageEngine(StorageEngine storageEngine) {
_storageEngine = storageEngine;
}
private DDLRecordLocalService _ddlRecordLocalService;
private DDLRecordService _ddlRecordService;
private DDLRecordSetLocalService _ddlRecordSetLocalService;
private DDM _ddm;
private DDMFormValuesToFieldsConverter _ddmFormValuesToFieldsConverter;
private DLAppLocalService _dlAppLocalService;
private LayoutService _layoutService;
private StorageEngine _storageEngine;
}