use of com.evolveum.midpoint.schema.expression.VariablesMap in project midpoint by Evolveum.
the class TestExpressionSpec method evaluate.
private PrismValueDeltaSetTriple<PrismPropertyValue<String>> evaluate(File expressionFile, Collection<Source<?, ?>> sources, VariablesStyle variablesStyle) throws Exception {
ExpressionType expression = parseExpression(expressionFile);
VariablesMap variables = prepareVariables(variablesStyle);
Task task = getTestTask();
ExpressionEvaluationContext expressionContext = new ExpressionEvaluationContext(sources, variables, getTestNameShort(), task);
return evaluatePropertyExpression(expression, PrimitiveType.STRING, expressionContext, task.getResult());
}
use of com.evolveum.midpoint.schema.expression.VariablesMap in project midpoint by Evolveum.
the class LegacyCustomTransport method getDefaultVariables.
protected VariablesMap getDefaultVariables(Message message, Event event) throws UnsupportedEncodingException {
VariablesMap variables = new VariablesMap();
variables.put(ExpressionConstants.VAR_MESSAGE, message, Message.class);
variables.put(ExpressionConstants.VAR_EVENT, event, Event.class);
return variables;
}
use of com.evolveum.midpoint.schema.expression.VariablesMap in project midpoint by Evolveum.
the class SmsMessageTransport method evaluateExpression.
// A little hack: for single-value cases we always return single-item list (even if the returned value is null)
@NotNull
private List<String> evaluateExpression(ExpressionType expressionType, VariablesMap VariablesMap, boolean multipleValues, String shortDesc, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException {
if (expressionType == null) {
return multipleValues ? emptyList() : singletonList(null);
}
QName resultName = new QName(SchemaConstants.NS_C, "result");
MutablePrismPropertyDefinition<String> resultDef = transportSupport.prismContext().definitionFactory().createPropertyDefinition(resultName, DOMUtil.XSD_STRING);
if (multipleValues) {
resultDef.setMaxOccurs(-1);
}
Expression<PrismPropertyValue<String>, PrismPropertyDefinition<String>> expression = transportSupport.expressionFactory().makeExpression(expressionType, resultDef, MiscSchemaUtil.getExpressionProfile(), shortDesc, task, result);
ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, VariablesMap, shortDesc, task);
PrismValueDeltaSetTriple<PrismPropertyValue<String>> exprResult = ModelExpressionThreadLocalHolder.evaluateExpressionInContext(expression, params, task, result);
if (!multipleValues) {
if (exprResult.getZeroSet().size() > 1) {
throw new SystemException("Invalid number of return values (" + exprResult.getZeroSet().size() + "), expected at most 1.");
} else if (exprResult.getZeroSet().isEmpty()) {
return singletonList(null);
} else {
// single-valued response is treated below
}
}
return exprResult.getZeroSet().stream().map(ppv -> ppv.getValue()).collect(Collectors.toList());
}
use of com.evolveum.midpoint.schema.expression.VariablesMap in project midpoint by Evolveum.
the class SmsMessageTransport method send.
@Override
public void send(Message message, String transportName, Event event, Task task, OperationResult parentResult) {
OperationResult result = parentResult.createSubresult(DOT_CLASS + "send");
result.addArbitraryObjectCollectionAsParam("message recipient(s)", message.getTo());
result.addParam("message subject", message.getSubject());
String logToFile = configuration.getLogToFile();
if (logToFile != null) {
TransportUtil.logToFile(logToFile, TransportUtil.formatToFileNew(message, transportName), LOGGER);
}
String file = configuration.getRedirectToFile();
int optionsForFilteringRecipient = TransportUtil.optionsForFilteringRecipient(configuration);
List<String> allowedRecipientTo = new ArrayList<>();
List<String> forbiddenRecipientTo = new ArrayList<>();
if (optionsForFilteringRecipient != 0) {
TransportUtil.validateRecipient(allowedRecipientTo, forbiddenRecipientTo, message.getTo(), configuration, task, result, transportSupport.expressionFactory(), MiscSchemaUtil.getExpressionProfile(), LOGGER);
if (file != null) {
if (!forbiddenRecipientTo.isEmpty()) {
message.setTo(forbiddenRecipientTo);
writeToFile(message, file, null, emptyList(), null, result);
}
message.setTo(allowedRecipientTo);
}
} else if (file != null) {
writeToFile(message, file, null, emptyList(), null, result);
return;
}
if (configuration.getGateway().isEmpty()) {
String msg = "SMS gateway(s) are not defined, notification to " + message.getTo() + " will not be sent.";
LOGGER.warn(msg);
result.recordWarning(msg);
return;
}
String from;
if (message.getFrom() != null) {
from = message.getFrom();
} else if (configuration.getDefaultFrom() != null) {
from = configuration.getDefaultFrom();
} else {
from = "";
}
if (message.getTo().isEmpty()) {
if (optionsForFilteringRecipient != 0) {
String msg = "After recipient validation there is no recipient to send the notification to.";
LOGGER.debug(msg);
result.recordSuccess();
} else {
String msg = "There is no recipient to send the notification to.";
LOGGER.warn(msg);
result.recordWarning(msg);
}
return;
}
List<String> to = message.getTo();
assert to.size() > 0;
for (SmsGatewayConfigurationType smsGatewayConfigurationType : configuration.getGateway()) {
OperationResult resultForGateway = result.createSubresult(DOT_CLASS + "send.forGateway");
resultForGateway.addContext("gateway name", smsGatewayConfigurationType.getName());
try {
VariablesMap variables = getDefaultVariables(from, to, message);
HttpMethodType method = defaultIfNull(smsGatewayConfigurationType.getMethod(), HttpMethodType.GET);
ExpressionType urlExpression = defaultIfNull(smsGatewayConfigurationType.getUrlExpression(), null);
String url = evaluateExpressionChecked(urlExpression, variables, "sms gateway request url", task, result);
String proxyHost = smsGatewayConfigurationType.getProxyHost();
String proxyPort = smsGatewayConfigurationType.getProxyPort();
LOGGER.debug("Sending SMS to URL {} via proxy host {} and port {} (method {})", url, proxyHost, proxyPort, method);
if (url == null) {
throw new IllegalArgumentException("No URL specified");
}
List<String> headersList = evaluateExpressionsChecked(smsGatewayConfigurationType.getHeadersExpression(), variables, "sms gateway request headers", task, result);
LOGGER.debug("Using request headers:\n{}", headersList);
String encoding = defaultIfNull(smsGatewayConfigurationType.getBodyEncoding(), StandardCharsets.ISO_8859_1.name());
String body = evaluateExpressionChecked(smsGatewayConfigurationType.getBodyExpression(), variables, "sms gateway request body", task, result);
LOGGER.debug("Using request body text (encoding: {}):\n{}", encoding, body);
if (smsGatewayConfigurationType.getLogToFile() != null) {
TransportUtil.logToFile(smsGatewayConfigurationType.getLogToFile(), formatToFile(message, url, headersList, body), LOGGER);
}
if (smsGatewayConfigurationType.getRedirectToFile() != null) {
writeToFile(message, smsGatewayConfigurationType.getRedirectToFile(), url, headersList, body, resultForGateway);
result.computeStatus();
return;
} else {
HttpClientBuilder builder = HttpClientBuilder.create();
String username = smsGatewayConfigurationType.getUsername();
ProtectedStringType password = smsGatewayConfigurationType.getPassword();
CredentialsProvider provider = new BasicCredentialsProvider();
if (username != null) {
String plainPassword = password != null ? transportSupport.protector().decryptString(password) : null;
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, plainPassword);
provider.setCredentials(AuthScope.ANY, credentials);
builder = builder.setDefaultCredentialsProvider(provider);
}
String proxyUsername = smsGatewayConfigurationType.getProxyUsername();
ProtectedStringType proxyPassword = smsGatewayConfigurationType.getProxyPassword();
if (StringUtils.isNotBlank(proxyHost)) {
HttpHost proxy;
if (StringUtils.isNotBlank(proxyPort) && isInteger(proxyPort)) {
int port = Integer.parseInt(proxyPort);
proxy = new HttpHost(proxyHost, port);
} else {
proxy = new HttpHost(proxyHost);
}
if (StringUtils.isNotBlank(proxyUsername)) {
String plainProxyPassword = proxyPassword != null ? transportSupport.protector().decryptString(proxyPassword) : null;
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(proxyUsername, plainProxyPassword);
provider.setCredentials(new AuthScope(proxy), credentials);
}
builder = builder.setDefaultCredentialsProvider(provider);
builder = builder.setProxy(proxy);
}
HttpClient client = builder.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(client);
ClientHttpRequest request = requestFactory.createRequest(new URI(url), HttpUtil.toHttpMethod(method));
setHeaders(request, headersList);
if (body != null) {
request.getBody().write(body.getBytes(encoding));
}
ClientHttpResponse response = request.execute();
LOGGER.debug("Result: " + response.getStatusCode() + "/" + response.getStatusText());
if (response.getStatusCode().series() != HttpStatus.Series.SUCCESSFUL) {
throw new SystemException("SMS gateway communication failed: " + response.getStatusCode() + ": " + response.getStatusText());
}
LOGGER.debug("Message sent successfully to {} via gateway {}.", message.getTo(), smsGatewayConfigurationType.getName());
resultForGateway.recordSuccess();
result.recordSuccess();
return;
}
} catch (Throwable t) {
String msg = "Couldn't send SMS to " + message.getTo() + " via " + smsGatewayConfigurationType.getName() + ", trying another gateway, if there is any";
LoggingUtils.logException(LOGGER, msg, t);
resultForGateway.recordFatalError(msg, t);
}
}
LOGGER.warn("No more SMS gateways to try, notification to " + message.getTo() + " will not be sent.");
result.recordWarning("Notification to " + message.getTo() + " could not be sent.");
}
use of com.evolveum.midpoint.schema.expression.VariablesMap in project midpoint by Evolveum.
the class NotificationExpressionHelper method getDefaultVariables.
public VariablesMap getDefaultVariables(Event event, OperationResult result) {
VariablesMap variables = new VariablesMap();
((BaseEventImpl) event).createVariablesMap(variables, result);
variables.put(ExpressionConstants.VAR_TEXT_FORMATTER, textFormatter, TextFormatter.class);
variables.put(ExpressionConstants.VAR_NOTIFICATION_FUNCTIONS, notificationFunctions, NotificationFunctions.class);
PrismObject<SystemConfigurationType> systemConfiguration = getSystemConfiguration(result);
variables.put(ExpressionConstants.VAR_CONFIGURATION, systemConfiguration, systemConfiguration.getDefinition());
return variables;
}
Aggregations