/**
* 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.evaluator.internal.functions;
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.dynamic.data.mapping.form.evaluator.DDMFormFieldEvaluationResult;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.KeyValuePair;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
/**
* @author Leonardo Barros
*/
public class CallFunction extends BaseDDMFormRuleFunction {
public CallFunction(
DDMDataProviderInvoker ddmDataProviderInvoker,
Map<String, List<DDMFormFieldEvaluationResult>>
ddmFormFieldEvaluationResults,
HttpServletRequest httpServletRequest, JSONFactory jsonFactory) {
super(ddmFormFieldEvaluationResults);
_ddmDataProviderInvoker = ddmDataProviderInvoker;
_ddmFormFieldEvaluationResults = ddmFormFieldEvaluationResults;
_httpServletRequest = httpServletRequest;
_jsonFactory = jsonFactory;
}
@Override
public Object evaluate(Object... parameters) {
if (parameters.length < 3) {
throw new IllegalArgumentException(
String.format(
"Expected 3 parameters, received %d", parameters.length));
}
String ddmDataProviderInstanceUUID = String.valueOf(parameters[0]);
String paramsExpression = String.valueOf(parameters[1]);
String resultMapExpression = String.valueOf(parameters[2]);
try {
DDMDataProviderRequest ddmDataProviderRequest =
new DDMDataProviderRequest(
ddmDataProviderInstanceUUID, _httpServletRequest);
addDDMDataProviderRequestParameters(
ddmDataProviderRequest, paramsExpression);
DDMDataProviderResponse ddmDataProviderResponse =
_ddmDataProviderInvoker.invoke(ddmDataProviderRequest);
Map<String, String> resultMap = extractResults(resultMapExpression);
setDDMFormFieldValues(ddmDataProviderResponse, resultMap);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(
"Error evaluating expression: " +
ArrayUtil.toString(parameters, (String)null),
e);
}
}
return true;
}
protected void addDDMDataProviderRequestParameters(
DDMDataProviderRequest ddmDataProviderRequest,
String paramsExpression) {
Map<String, String> parameters = extractParameters(paramsExpression);
if (!parameters.isEmpty()) {
ddmDataProviderRequest.queryString(parameters);
}
}
protected void extractDDMFormFieldValue(
String expression, Map<String, String> parameters) {
String[] tokens = StringUtil.split(expression, CharPool.EQUAL);
if (_ddmFormFieldEvaluationResults.containsKey(tokens[1])) {
String ddmFormFieldValue = getDDMFormFieldValue(tokens[1]);
parameters.put(tokens[0], ddmFormFieldValue);
}
else {
parameters.put(tokens[0], tokens[1]);
}
}
protected Map<String, String> extractParameters(String expression) {
if (Validator.isNull(expression)) {
return Collections.emptyMap();
}
Map<String, String> parameters = new HashMap<>();
String[] innerExpressions = StringUtil.split(
expression, CharPool.SEMICOLON);
if (innerExpressions.length == 0) {
extractDDMFormFieldValue(expression, parameters);
}
else {
for (String innerExpression : innerExpressions) {
extractDDMFormFieldValue(innerExpression, parameters);
}
}
return parameters;
}
protected Map<String, String> extractResults(String resultMapExpression) {
if (Validator.isNull(resultMapExpression)) {
return Collections.emptyMap();
}
Map<String, String> results = new HashMap<>();
String[] innerExpressions = StringUtil.split(
resultMapExpression, CharPool.SEMICOLON);
for (String innerExpression : innerExpressions) {
String[] tokens = StringUtil.split(innerExpression, CharPool.EQUAL);
results.put(tokens[0], tokens[1]);
}
return results;
}
protected DDMFormFieldEvaluationResult getDDMFormFieldEvaluationResult(
String ddmFormFieldName) {
if (!_ddmFormFieldEvaluationResults.containsKey(ddmFormFieldName)) {
return null;
}
List<DDMFormFieldEvaluationResult>
ddmFormFieldInstancesEvaluationResults =
_ddmFormFieldEvaluationResults.get(ddmFormFieldName);
return ddmFormFieldInstancesEvaluationResults.get(0);
}
protected String getDDMFormFieldValue(String ddmFormFieldName) {
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult =
getDDMFormFieldEvaluationResult(ddmFormFieldName);
if (ddmFormFieldEvaluationResult == null) {
return StringPool.BLANK;
}
Object value = ddmFormFieldEvaluationResult.getProperty("value");
if (Validator.isNull(value)) {
return StringPool.BLANK;
}
return String.valueOf(value);
}
protected void setDDMFormFieldOptions(
String ddmFormFieldName, List<KeyValuePair> options) {
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult =
getDDMFormFieldEvaluationResult(ddmFormFieldName);
if (ddmFormFieldEvaluationResult == null) {
return;
}
ddmFormFieldEvaluationResult.setProperty("options", options);
if (options.size() == 1) {
KeyValuePair keyValuePair = options.get(0);
ddmFormFieldEvaluationResult.setValue(keyValuePair.getValue());
}
}
protected void setDDMFormFieldValue(String ddmFormFieldName, String value) {
DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult =
getDDMFormFieldEvaluationResult(ddmFormFieldName);
if (ddmFormFieldEvaluationResult != null) {
ddmFormFieldEvaluationResult.setValue(value);
}
}
protected void setDDMFormFieldValues(
DDMDataProviderResponse ddmDataProviderResponse,
Map<String, String> resultMap) {
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
String ddmFormFieldName = entry.getKey();
String outputName = entry.getValue();
DDMDataProviderResponseOutput ddmDataProviderResponseOutput =
ddmDataProviderResponse.get(outputName);
if (ddmDataProviderResponseOutput == null) {
continue;
}
if (Objects.equals(
ddmDataProviderResponseOutput.getType(), "list")) {
List<KeyValuePair> options =
ddmDataProviderResponseOutput.getValue(List.class);
setDDMFormFieldOptions(ddmFormFieldName, options);
}
else {
String value = ddmDataProviderResponseOutput.getValue(
String.class);
setDDMFormFieldValue(ddmFormFieldName, value);
}
}
}
private static final Log _log = LogFactoryUtil.getLog(CallFunction.class);
private final DDMDataProviderInvoker _ddmDataProviderInvoker;
private final Map<String, List<DDMFormFieldEvaluationResult>>
_ddmFormFieldEvaluationResults;
private final HttpServletRequest _httpServletRequest;
private final JSONFactory _jsonFactory;
}