/** * 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.servlet; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluator; 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.internal.DDMFormPagesTemplateContextFactory; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormLayout; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.json.JSONFactory; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.json.JSONSerializer; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.servlet.ServletResponseUtil; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.kernel.util.LocaleThreadLocal; import com.liferay.portal.kernel.util.ParamUtil; import java.io.IOException; import java.util.List; import java.util.Locale; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Marcellus Tavares */ @Component( immediate = true, property = { "osgi.http.whiteboard.context.path=/dynamic-data-mapping-form-context-provider", "osgi.http.whiteboard.servlet.name=com.liferay.dynamic.data.mapping.form.renderer.internal.servlet.DDMFormContextProviderServlet", "osgi.http.whiteboard.servlet.pattern=/dynamic-data-mapping-form-context-provider/*" }, service = Servlet.class ) public class DDMFormContextProviderServlet extends HttpServlet { protected List<Object> createDDMFormPagesTemplateContext( HttpServletRequest request, HttpServletResponse response, String portletNamespace) { try { DDMFormRenderingContext ddmFormRenderingContext = createDDMFormRenderingContext( request, response, Locale.US, portletNamespace); DDMFormTemplateContextProcessor ddmFormTemplateContextProcessor = createDDMFormTemplateContextProcessor(request); DDMFormValues ddmFormValues = ddmFormTemplateContextProcessor.getDDMFormValues(); ddmFormRenderingContext.setDDMFormValues(ddmFormValues); _prepareThreadLocal(Locale.US); DDMForm ddmForm = ddmFormTemplateContextProcessor.getDDMForm(); DDMFormLayout ddmFormLayout = ddmFormTemplateContextProcessor.getDDMFormLayout(); DDMFormPagesTemplateContextFactory ddmFormPagesTemplateContextFactory = new DDMFormPagesTemplateContextFactory( ddmForm, ddmFormLayout, ddmFormRenderingContext); ddmFormPagesTemplateContextFactory.setDDMFormEvaluator( _ddmFormEvaluator); ddmFormPagesTemplateContextFactory. setDDMFormFieldTypeServicesTracker( _ddmFormFieldTypeServicesTracker); return ddmFormPagesTemplateContextFactory.create(); } catch (Exception e) { if (_log.isDebugEnabled()) { _log.debug(e, e); } } return null; } protected DDMFormRenderingContext createDDMFormRenderingContext( HttpServletRequest request, HttpServletResponse response, Locale locale, String portletNamespace) { DDMFormRenderingContext ddmFormRenderingContext = new DDMFormRenderingContext(); ddmFormRenderingContext.setHttpServletRequest(request); ddmFormRenderingContext.setHttpServletResponse(response); ddmFormRenderingContext.setLocale(locale); ddmFormRenderingContext.setPortletNamespace(portletNamespace); return ddmFormRenderingContext; } protected DDMFormTemplateContextProcessor createDDMFormTemplateContextProcessor(HttpServletRequest request) throws Exception { String serializedFormContext = ParamUtil.getString( request, "serializedFormContext"); JSONObject jsonObject = _jsonFactory.createJSONObject( serializedFormContext); return new DDMFormTemplateContextProcessor(jsonObject); } @Override protected void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String portletNamespace = ParamUtil.getString( request, "portletNamespace"); List<Object> ddmFormPagesTemplateContext = createDDMFormPagesTemplateContext( request, response, portletNamespace); if (ddmFormPagesTemplateContext == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } JSONSerializer jsonSerializer = _jsonFactory.createJSONSerializer(); response.setContentType(ContentTypes.APPLICATION_JSON); response.setStatus(HttpServletResponse.SC_OK); ServletResponseUtil.write( response, jsonSerializer.serializeDeep(ddmFormPagesTemplateContext)); } private void _prepareThreadLocal(Locale locale) throws Exception, PortalException { LocaleThreadLocal.setThemeDisplayLocale(locale); } private static final Log _log = LogFactoryUtil.getLog( DDMFormContextProviderServlet.class); private static final long serialVersionUID = 1L; @Reference private DDMFormEvaluator _ddmFormEvaluator; @Reference private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker; @Reference private JSONFactory _jsonFactory; }