/** * 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.data.provider.internal.servlet; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderInvoker; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderRequest; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderResponse; import com.liferay.dynamic.data.mapping.data.provider.DDMDataProviderResponseOutput; import com.liferay.portal.kernel.json.JSONException; 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.KeyValuePair; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.Validator; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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 Rafael Praxedes */ @Component( immediate = true, property = { "osgi.http.whiteboard.context.path=/dynamic-data-mapping-data-provider-paginator", "osgi.http.whiteboard.servlet.name=com.liferay.dynamic.data.mapping.data.provider.internal.servlet.DDMDataProviderPaginatorServlet", "osgi.http.whiteboard.servlet.pattern=/dynamic-data-mapping-data-provider-paginator/*" }, service = {DDMDataProviderPaginatorServlet.class, Servlet.class} ) public class DDMDataProviderPaginatorServlet extends HttpServlet { protected void addParametersFromRequest( DDMDataProviderRequest ddmDataProviderRequest, HttpServletRequest request) throws Exception { JSONObject inputParametersJSONObject = getInputParametersJSONObject( request); inputParametersJSONObject.keys().forEachRemaining( inputParameterName -> { ddmDataProviderRequest.queryString( inputParameterName, inputParametersJSONObject.getString(inputParameterName)); }); } @Override protected void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { List<Map<String, String>> dataProviderResult = executeDataProvider( request, response); if (dataProviderResult == 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(dataProviderResult)); } protected List<Map<String, String>> executeDataProvider( HttpServletRequest request, HttpServletResponse response) { String dataProviderInstanceUUID = ParamUtil.getString( request, "dataProviderInstanceUUID"); String outputParameterName = ParamUtil.getString( request, "outputParameterName"); int start = ParamUtil.getInteger(request, "start"); int end = ParamUtil.getInteger(request, "end"); if (Validator.isNull(dataProviderInstanceUUID) || Validator.isNull(outputParameterName) || (start < 0) || (end < 0) || (end < start) || (start == end)) { return null; } List<Map<String, String>> dataProviderResult = new ArrayList<>(); try { DDMDataProviderRequest ddmDataProviderRequest = new DDMDataProviderRequest(dataProviderInstanceUUID, request); addParametersFromRequest(ddmDataProviderRequest, request); ddmDataProviderRequest.queryString( "paginationStart", String.valueOf(start)); ddmDataProviderRequest.queryString( "paginationEnd", String.valueOf(end)); DDMDataProviderResponse ddmDataProviderResponse = _ddmDataProviderInvoker.invoke(ddmDataProviderRequest); DDMDataProviderResponseOutput ddDataProviderResponseOutput = ddmDataProviderResponse.get(outputParameterName); if (ddDataProviderResponseOutput == null) { return dataProviderResult; } List<KeyValuePair> keyValuePairs = ddDataProviderResponseOutput.getValue(List.class); for (KeyValuePair keyValuePair : keyValuePairs) { Map<String, String> result = new HashMap<>(); result.put("label", keyValuePair.getValue()); result.put("value", keyValuePair.getKey()); dataProviderResult.add(result); } } catch (Exception e) { if (_log.isDebugEnabled()) { _log.debug(e, e); } } return dataProviderResult; } protected JSONObject getInputParametersJSONObject( HttpServletRequest request) throws JSONException { String inputParameters = ParamUtil.getString( request, "inputParameters"); if (Validator.isNull(inputParameters)) { return _jsonFactory.createJSONObject(); } return _jsonFactory.createJSONObject(inputParameters); } private static final Log _log = LogFactoryUtil.getLog( DDMDataProviderPaginatorServlet.class); private static final long serialVersionUID = 1L; @Reference private DDMDataProviderInvoker _ddmDataProviderInvoker; @Reference private JSONFactory _jsonFactory; }