All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fi.evolver.basics.spring.messaging.sender.TriggerSender Maven / Gradle / Ivy

package fi.evolver.basics.spring.messaging.sender;

import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import fi.evolver.basics.spring.job.ResultState;
import fi.evolver.basics.spring.log.MessageLogService;
import fi.evolver.basics.spring.log.entity.MessageLog.Direction;
import fi.evolver.basics.spring.messaging.SendResult;
import fi.evolver.basics.spring.messaging.entity.Message;
import fi.evolver.basics.spring.messaging.util.SendUtils;
import fi.evolver.basics.spring.triggerable.TriggerService;
import fi.evolver.basics.spring.triggerable.TriggerableException;
import fi.evolver.utils.GzipUtils;
import fi.evolver.utils.arg.Arg;


@Component
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class TriggerSender implements Sender {
	private static final String PROPERTY_BODY_PARAMETER_NAME = "BodyParameterName";


	private final MessageLogService messageLogService;
	private final TriggerService triggerService;


	@Autowired
	public TriggerSender(MessageLogService messageLogService, TriggerService triggerService) {
		this.messageLogService = messageLogService;
		this.triggerService = triggerService;
	}


	@Override
	public SendResult send(Message message, URI uri) {
		LocalDateTime start = LocalDateTime.now();
		String className = uri.toString().replaceAll("^trigger:(//)?", "").replaceAll("\\?.*", "").replaceAll("#.*", "");
		ResultState state = null;
		String body = null;
		try {
			body = GzipUtils.unzip(message.getCompressedData(), StandardCharsets.UTF_8);

			String bodyParameterName = message.getMessageTargetConfig().getProperty(PROPERTY_BODY_PARAMETER_NAME).orElse("Input");

			Map parameters = new LinkedHashMap<>();
			parameters.putAll(SendUtils.replaceTags(message.getMessageTargetConfig().getPrefixedProperties(""), message));
			parameters.putAll(message.getMetadata());
			parameters.put(bodyParameterName, body);

			Map args = Arg.parseStringValues(triggerService.getArgs(className), parameters);
			state = triggerService.trigger(className, args);
			return SendResult.success();
		}
		catch (TriggerableException e) {
			return SendResult.error("Running %s failed: %s", className, e.getMessage());
		}
		finally {
			messageLogService.logZippedMessage(
					start,
					message.getMessageType(),
					"trigger",
					uri.toString(),
					messageLogService.getApplicationName(),
					message.getTargetSystem(),
					Direction.OUTBOUND,
					body != null ? body.length() : 0,
					message.getCompressedData(),
					Collections.emptyMap(),
					0,
					null,
					Collections.emptyMap(),
					state != null && state.getState() != null && state.getState().isSuccess() ? "OK" : "FAILED",
					state != null ? state.getMessage() : null,
					SendUtils.mapMetadata(message.getMetadata()));
		}
	}


	@Override
	public Set getSupportedProtocols() {
		return Set.of("trigger");
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy