/**
* 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.mapping.form.renderer.internal;
import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluator;
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.DDMFormFieldTypesJSONSerializer;
import com.liferay.dynamic.data.mapping.io.DDMFormJSONSerializer;
import com.liferay.dynamic.data.mapping.io.DDMFormLayoutJSONSerializer;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormLayout;
import com.liferay.dynamic.data.mapping.service.DDMDataProviderInstanceService;
import com.liferay.dynamic.data.mapping.util.DDM;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.util.AggregateResourceBundle;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.LocaleThreadLocal;
import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
import com.liferay.portal.kernel.util.ResourceBundleUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.ResourceBundle;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Marcellus Tavares
*/
@Component(immediate = true)
public class DDMFormTemplateContextFactoryImpl
implements DDMFormTemplateContextFactory {
@Activate
public void activate() {
_ddmFormTemplateContextFactoryHelper =
new DDMFormTemplateContextFactoryHelper(
_ddmDataProviderInstanceService);
}
@Override
public Map<String, Object> create(
DDMForm ddmForm, DDMFormLayout ddmFormLayout,
DDMFormRenderingContext ddmFormRenderingContext)
throws PortalException {
return doCreate(ddmForm, ddmFormLayout, ddmFormRenderingContext);
}
@Override
public Map<String, Object> create(
DDMForm ddmForm, DDMFormRenderingContext ddmFormRenderingContext)
throws PortalException {
return doCreate(
ddmForm, _ddm.getDefaultDDMFormLayout(ddmForm),
ddmFormRenderingContext);
}
protected void collectResourceBundles(
Class<?> clazz, List<ResourceBundle> resourceBundles, Locale locale) {
for (Class<?> interfaceClass : clazz.getInterfaces()) {
collectResourceBundles(interfaceClass, resourceBundles, locale);
}
ResourceBundle resourceBundle = ResourceBundleUtil.getBundle(
"content.Language", locale, clazz.getClassLoader());
if (resourceBundle != null) {
resourceBundles.add(resourceBundle);
}
}
protected Map<String, Object> doCreate(
DDMForm ddmForm, DDMFormLayout ddmFormLayout,
DDMFormRenderingContext ddmFormRenderingContext)
throws PortalException {
Map<String, Object> templateContext = new HashMap<>();
String containerId = ddmFormRenderingContext.getContainerId();
if (Validator.isNull(containerId)) {
containerId = StringUtil.randomId();
}
templateContext.put("containerId", containerId);
templateContext.put(
"dataProviderSettings",
_ddmFormTemplateContextFactoryHelper.getDataProviderSettings(
ddmForm));
setDDMFormFieldsEvaluableProperty(ddmForm);
templateContext.put(
"evaluatorURL", getDDMFormContextProviderServletURL());
List<DDMFormFieldType> ddmFormFieldTypes =
_ddmFormFieldTypeServicesTracker.getDDMFormFieldTypes();
templateContext.put(
"fieldTypes",
_ddmFormFieldTypesJSONSerializer.serialize(ddmFormFieldTypes));
List<Object> pages = getPages(
ddmForm, ddmFormLayout, ddmFormRenderingContext);
templateContext.put("pages", pages);
templateContext.put(
"portletNamespace", ddmFormRenderingContext.getPortletNamespace());
templateContext.put("readOnly", ddmFormRenderingContext.isReadOnly());
Locale locale = ddmFormRenderingContext.getLocale();
if (locale == null) {
locale = LocaleThreadLocal.getSiteDefaultLocale();
}
ResourceBundle resourceBundle = getResourceBundle(locale);
templateContext.put(
"requiredFieldsWarningMessageHTML",
getRequiredFieldsWarningMessageHTML(resourceBundle));
templateContext.put("rules", ddmForm.getDDMFormRules());
templateContext.put(
"showRequiredFieldsWarning",
ddmFormRenderingContext.isShowRequiredFieldsWarning());
boolean showSubmitButton = ddmFormRenderingContext.isShowSubmitButton();
if (ddmFormRenderingContext.isReadOnly()) {
showSubmitButton = false;
}
templateContext.put("showSubmitButton", showSubmitButton);
templateContext.put("strings", getLanguageStringsMap(resourceBundle));
String submitLabel = GetterUtil.getString(
ddmFormRenderingContext.getSubmitLabel(),
LanguageUtil.get(locale, "submit"));
templateContext.put("submitLabel", submitLabel);
templateContext.put(
"templateNamespace", getTemplateNamespace(ddmFormLayout));
return templateContext;
}
protected String getDDMFormContextProviderServletURL() {
String servletContextPath = getServletContextPath();
return servletContextPath.concat(
"/dynamic-data-mapping-form-context-provider/");
}
protected Map<String, String> getLanguageStringsMap(
ResourceBundle resourceBundle) {
Map<String, String> stringsMap = new HashMap<>();
stringsMap.put("next", LanguageUtil.get(resourceBundle, "next"));
stringsMap.put(
"previous", LanguageUtil.get(resourceBundle, "previous"));
return stringsMap;
}
protected List<Object> getPages(
DDMForm ddmForm, DDMFormLayout ddmFormLayout,
DDMFormRenderingContext ddmFormRenderingContext) {
DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory =
new DDMFormPagesTemplateContextFactory(
ddmForm, ddmFormLayout, ddmFormRenderingContext);
ddmFormPagesTemplateContextFactory.setDDMFormEvaluator(
_ddmFormEvaluator);
ddmFormPagesTemplateContextFactory.setDDMFormFieldTypeServicesTracker(
_ddmFormFieldTypeServicesTracker);
return ddmFormPagesTemplateContextFactory.create();
}
protected String getRequiredFieldsWarningMessageHTML(
ResourceBundle resourceBundle) {
StringBundler sb = new StringBundler(3);
sb.append("<label class=\"required-warning\">");
sb.append(
LanguageUtil.format(
resourceBundle, "all-fields-marked-with-x-are-required",
"<i class=\"icon-asterisk text-warning\"></i>", false));
sb.append("</label>");
return sb.toString();
}
protected ResourceBundle getResourceBundle(Locale locale) {
List<ResourceBundle> resourceBundles = new ArrayList<>();
ResourceBundle portalResourceBundle = ResourceBundleUtil.getBundle(
"content.Language", locale, PortalClassLoaderUtil.getClassLoader());
resourceBundles.add(portalResourceBundle);
collectResourceBundles(getClass(), resourceBundles, locale);
ResourceBundle[] resourceBundlesArray = resourceBundles.toArray(
new ResourceBundle[resourceBundles.size()]);
return new AggregateResourceBundle(resourceBundlesArray);
}
protected String getServletContextPath() {
ServletConfig servletConfig =
_ddmFormContextProviderServlet.getServletConfig();
ServletContext servletContext = servletConfig.getServletContext();
return servletContext.getContextPath();
}
protected String getTemplateNamespace(DDMFormLayout ddmFormLayout) {
String paginationMode = ddmFormLayout.getPaginationMode();
if (Objects.equals(paginationMode, DDMFormLayout.SETTINGS_MODE)) {
return "ddm.settings_form";
}
if (Objects.equals(paginationMode, DDMFormLayout.SINGLE_PAGE_MODE)) {
return "ddm.simple_form";
}
else if (Objects.equals(paginationMode, DDMFormLayout.TABBED_MODE)) {
return "ddm.tabbed_form";
}
else if (Objects.equals(paginationMode, DDMFormLayout.WIZARD_MODE)) {
return "ddm.wizard_form";
}
return "ddm.paginated_form";
}
protected void setDDMFormFieldsEvaluableProperty(DDMForm ddmForm) {
Map<String, DDMFormField> ddmFormFieldsMap =
ddmForm.getDDMFormFieldsMap(true);
for (String evaluableDDMFormFieldName :
_ddmFormTemplateContextFactoryHelper.
getEvaluableDDMFormFieldNames(ddmForm)) {
DDMFormField ddmFormField = ddmFormFieldsMap.get(
evaluableDDMFormFieldName);
ddmFormField.setProperty("evaluable", true);
}
}
@Reference
private DDM _ddm;
@Reference
private DDMDataProviderInstanceService _ddmDataProviderInstanceService;
@Reference(
target = "(osgi.http.whiteboard.servlet.name=com.liferay.dynamic.data.mapping.form.renderer.internal.servlet.DDMFormContextProviderServlet)"
)
private Servlet _ddmFormContextProviderServlet;
@Reference
private DDMFormEvaluator _ddmFormEvaluator;
@Reference
private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker;
@Reference
private DDMFormFieldTypesJSONSerializer _ddmFormFieldTypesJSONSerializer;
@Reference
private DDMFormJSONSerializer _ddmFormJSONSerializer;
@Reference
private DDMFormLayoutJSONSerializer _ddmFormLayoutJSONSerializer;
private DDMFormTemplateContextFactoryHelper
_ddmFormTemplateContextFactoryHelper;
@Reference
private JSONFactory _jsonFactory;
}