/**
* 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.portlet.action;
import com.liferay.dynamic.data.lists.form.web.constants.DDLFormPortletKeys;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldType;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker;
import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderingContext;
import com.liferay.dynamic.data.mapping.form.renderer.DDMFormTemplateContextFactory;
import com.liferay.dynamic.data.mapping.io.DDMFormJSONDeserializer;
import com.liferay.dynamic.data.mapping.model.DDMDataProviderInstance;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldOptions;
import com.liferay.dynamic.data.mapping.model.DDMFormLayout;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.model.UnlocalizedValue;
import com.liferay.dynamic.data.mapping.model.Value;
import com.liferay.dynamic.data.mapping.service.DDMDataProviderInstanceLocalService;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.util.DDMFormFactory;
import com.liferay.dynamic.data.mapping.util.DDMFormLayoutFactory;
import com.liferay.dynamic.data.mapping.util.comparator.DataProviderInstanceNameComparator;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.json.JSONSerializer;
import com.liferay.portal.kernel.portlet.PortletResponseUtil;
import com.liferay.portal.kernel.portlet.bridges.mvc.BaseMVCResourceCommand;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCResourceCommand;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.WebKeys;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Marcellus Tavares
*/
@Component(
immediate = true,
property = {
"javax.portlet.name=" + DDLFormPortletKeys.DYNAMIC_DATA_LISTS_FORM_ADMIN,
"mvc.command.name=getFieldSettingsDDMFormContext"
},
service = MVCResourceCommand.class
)
public class GetFieldSettingsDDMFormContextMVCResourceCommand
extends BaseMVCResourceCommand {
protected void addDataProviderDDMFormFieldOptionLabels(
ResourceRequest resourceRequest,
DDMFormFieldOptions ddmFormFieldOptions, ThemeDisplay themeDisplay)
throws PortalException {
Locale locale = themeDisplay.getLocale();
long[] groupIds = _portal.getCurrentAndAncestorSiteGroupIds(
themeDisplay.getScopeGroupId());
int start = ParamUtil.getInteger(
resourceRequest, "start", QueryUtil.ALL_POS);
int end = ParamUtil.getInteger(
resourceRequest, "end", QueryUtil.ALL_POS);
DataProviderInstanceNameComparator dataProviderInstanceNameComparator =
new DataProviderInstanceNameComparator(true);
List<DDMDataProviderInstance> ddmDataProviderInstances =
_ddmDataProviderInstanceLocalService.getDataProviderInstances(
groupIds, start, end, dataProviderInstanceNameComparator);
for (DDMDataProviderInstance ddmDataProviderInstance :
ddmDataProviderInstances) {
long value = ddmDataProviderInstance.getDataProviderInstanceId();
String label = ddmDataProviderInstance.getName(locale);
ddmFormFieldOptions.addOptionLabel(
String.valueOf(value), locale, label);
}
}
protected DDMFormFieldOptions createDataProviderDDMFormFieldOptions(
ResourceRequest resourceRequest, ThemeDisplay themeDisplay)
throws PortalException {
DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
ddmFormFieldOptions.setDefaultLocale(themeDisplay.getLocale());
addDataProviderDDMFormFieldOptionLabels(
resourceRequest, ddmFormFieldOptions, themeDisplay);
return ddmFormFieldOptions;
}
protected DDMFormFieldValue createDDMFormFieldTypeSettingsDDMFormFieldValue(
Object property, DDMFormField ddmFormFieldTypeSetting, Locale locale) {
DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();
ddmFormFieldValue.setName(ddmFormFieldTypeSetting.getName());
Value value = new UnlocalizedValue(String.valueOf(property));
if (ddmFormFieldTypeSetting.isLocalizable()) {
LocalizedValue localizedValue = (LocalizedValue)property;
value.addString(locale, localizedValue.getString(locale));
}
ddmFormFieldValue.setValue(value);
return ddmFormFieldValue;
}
protected DDMFormValues createDDMFormFieldTypeSettingsDDMFormValues(
ResourceRequest resourceRequest, DDMFormField ddmFormField,
DDMForm ddmFormFieldTypeSettingsDDMForm, Locale locale) {
DDMFormValues ddmFormValues = new DDMFormValues(
ddmFormFieldTypeSettingsDDMForm);
ddmFormValues.addAvailableLocale(resourceRequest.getLocale());
ddmFormValues.setDefaultLocale(resourceRequest.getLocale());
for (DDMFormField ddmFormFieldTypeSetting :
ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) {
Object property = ddmFormField.getProperty(
ddmFormFieldTypeSetting.getName());
ddmFormValues.addDDMFormFieldValue(
createDDMFormFieldTypeSettingsDDMFormFieldValue(
property, ddmFormFieldTypeSetting, locale));
}
return ddmFormValues;
}
@Override
protected void doServeResource(
ResourceRequest resourceRequest, ResourceResponse resourceResponse)
throws Exception {
ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute(
WebKeys.THEME_DISPLAY);
String type = ParamUtil.getString(resourceRequest, "type");
Class<?> ddmFormFieldTypeSettings = getDDMFormFieldTypeSettings(type);
DDMForm ddmFormFieldTypeSettingsDDMForm = DDMFormFactory.create(
ddmFormFieldTypeSettings);
Map<String, DDMFormField> ddmFormFieldTypeSettingsDDMFormFieldsMap =
ddmFormFieldTypeSettingsDDMForm.getDDMFormFieldsMap(false);
DDMFormField ddmFormField =
ddmFormFieldTypeSettingsDDMFormFieldsMap.get(
"ddmDataProviderInstanceId");
if (ddmFormField != null) {
DDMFormFieldOptions ddmFormFieldOptions =
createDataProviderDDMFormFieldOptions(
resourceRequest, themeDisplay);
ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
}
DDMFormLayout ddmFormFieldTypeSettingsDDMFormLayout =
DDMFormLayoutFactory.create(ddmFormFieldTypeSettings);
DDMFormRenderingContext ddmFormRenderingContext =
new DDMFormRenderingContext();
ddmFormRenderingContext.setHttpServletRequest(
_portal.getHttpServletRequest(resourceRequest));
ddmFormRenderingContext.setHttpServletResponse(
_portal.getHttpServletResponse(resourceResponse));
ddmFormRenderingContext.setContainerId("settings");
ddmFormRenderingContext.setLocale(themeDisplay.getLocale());
ddmFormRenderingContext.setPortletNamespace(
resourceResponse.getNamespace());
Map<String, Object> templateContext =
_ddmFormTemplateContextFactory.create(
ddmFormFieldTypeSettingsDDMForm,
ddmFormFieldTypeSettingsDDMFormLayout, ddmFormRenderingContext);
resourceResponse.setContentType(ContentTypes.APPLICATION_JSON);
JSONSerializer jsonSerializer = _jsonFactory.createJSONSerializer();
PortletResponseUtil.write(
resourceResponse, jsonSerializer.serializeDeep(templateContext));
resourceResponse.flushBuffer();
}
protected Class<?> getDDMFormFieldTypeSettings(String type) {
DDMFormFieldType ddmFormFieldType =
_ddmFormFieldTypeServicesTracker.getDDMFormFieldType(type);
return ddmFormFieldType.getDDMFormFieldTypeSettings();
}
@Reference
private DDMDataProviderInstanceLocalService
_ddmDataProviderInstanceLocalService;
@Reference
private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker;
@Reference
private DDMFormJSONDeserializer _ddmFormJSONDeserializer;
@Reference
private DDMFormTemplateContextFactory _ddmFormTemplateContextFactory;
@Reference
private JSONFactory _jsonFactory;
@Reference
private Portal _portal;
}