unified translation of events and event-related emails

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-01-16 23:37:35 +01:00
parent 30651af62f
commit 5c36ab23bf
14 changed files with 94 additions and 74 deletions

View File

@@ -5,10 +5,10 @@ import static de.srsoftware.tools.PathHandler.CONTENT_TYPE;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.constants.Constants.UTF8;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingConfig;
import static de.srsoftware.umbrella.core.model.Translatable.t;
import static de.srsoftware.umbrella.message.Constants.*;
import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
import static java.lang.System.Logger.Level.*;
import static java.text.MessageFormat.format;
import de.srsoftware.configuration.Configuration;
import de.srsoftware.umbrella.core.ModuleRegistry;
@@ -21,7 +21,7 @@ import de.srsoftware.umbrella.message.model.CombinedMessage;
import de.srsoftware.umbrella.messagebus.EventListener;
import de.srsoftware.umbrella.messagebus.events.Event;
import jakarta.activation.DataHandler;
import jakarta.mail.Message;
import jakarta.mail.Message.RecipientType;
import jakarta.mail.MessagingException;
import jakarta.mail.Session;
import jakarta.mail.Transport;
@@ -31,7 +31,6 @@ import jakarta.mail.internet.MimeMultipart;
import jakarta.mail.util.ByteArrayDataSource;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiFunction;
public class MessageSystem implements PostBox, EventListener {
public static final System.Logger LOG = System.getLogger(MessageSystem.class.getSimpleName());
@@ -95,14 +94,8 @@ public class MessageSystem implements PostBox, EventListener {
@Override
public void onEvent(Event<?> event) {
for (var user : event.audience()){
if (!"s.richter@srsoftware.de".equals(user.email().toString())) continue;
var verb = switch (event.eventType()){
case UPDATE -> "updated";
case CREATE -> "created";
case DELETE -> "deleted";
};
var title = format("{0} {1} {2} {3}",event.initiator().name(),verb,event.module(), event.payload());
var message = new de.srsoftware.umbrella.core.model.Message(event.initiator(),title,event.describe(),null,null);
if (debugAddress != null && !debugAddress.equals(user.email().toString())) continue;
var message = new de.srsoftware.umbrella.core.model.Message(event.initiator(),event.subject(),event.describe(),null);
var envelope = new Envelope(message,user);
send(envelope);
}
@@ -135,14 +128,12 @@ public class MessageSystem implements PostBox, EventListener {
var date = new Date();
for (var receiver : dueRecipients){
BiFunction<String,Map<String,String>,String> translateFunction = (text,fills) -> ModuleRegistry.translator().translate(receiver.language(),text,fills);
var combined = new CombinedMessage("Collected messages",translateFunction);
var combined = new CombinedMessage(t("Collected messages"),receiver);
var envelopes = queue.stream().filter(env -> env.isFor(receiver)).toList();
for (var envelope : envelopes) combined.merge(envelope.message());
try {
send(combined,receiver,date);
send(combined,date);
for (var envelope : envelopes){
var audience = envelope.receivers();
audience.remove(receiver);
@@ -176,7 +167,8 @@ public class MessageSystem implements PostBox, EventListener {
}
private void send(CombinedMessage message, User receiver, Date date) throws MessagingException {
private void send(CombinedMessage message, Date date) throws MessagingException {
var receiver = message.receiver();
LOG.log(TRACE,"Sending combined message to {0}…",receiver);
session = session();
MimeMessage msg = new MimeMessage(session);
@@ -187,7 +179,7 @@ public class MessageSystem implements PostBox, EventListener {
msg.setSubject(message.subject(), UTF8);
msg.setSentDate(date);
var toEmail = debugAddress != null ? debugAddress : receiver.email().toString();
msg.setRecipients(Message.RecipientType.TO, toEmail);
msg.setRecipients(RecipientType.TO, toEmail);
if (message.attachments().isEmpty()){
msg.setText(message.body(), UTF8);

View File

@@ -5,33 +5,31 @@ import static java.lang.System.Logger.Level.DEBUG;
import static java.lang.System.Logger.Level.TRACE;
import static java.text.MessageFormat.format;
import de.srsoftware.umbrella.core.model.Attachment;
import de.srsoftware.umbrella.core.model.Message;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.core.model.*;
import java.util.*;
import java.util.function.BiFunction;
public class CombinedMessage {
private static final System.Logger LOG = System.getLogger(CombinedMessage.class.getSimpleName());
private final Set<Attachment> attachments = new HashSet<>();
private final StringBuilder combinedBody = new StringBuilder();
private final User receiver;
private String combinedSubject = null;
private final List<Message> mergedMessages = new ArrayList<>();
private final String subjectForCombinedMessage;
private final BiFunction<String,Map<String,String>,String> translate;
private final Translatable subjectForCombinedMessage;
private UmbrellaUser sender = null;
public CombinedMessage(String subjectForCombinedMessage, BiFunction<String, Map<String,String>,String> translateFunction){
public CombinedMessage(Translatable subjectForCombinedMessage, User receiver){
LOG.log(DEBUG,"Creating combined message…");
this.subjectForCombinedMessage = subjectForCombinedMessage;
translate = translateFunction;
this.receiver = receiver;
}
public void merge(Message message) {
LOG.log(TRACE,"Merging {0} into combined message…",message);
var body = translate.apply(message.body(),message.fills());
var subject = translate.apply(message.subject(),message.fills());
var lang = receiver.language();
var body = message.body().translate(lang);
var subject = message.subject().translate(lang);
switch (mergedMessages.size()){
case 0:
combinedBody.append(body);
@@ -40,7 +38,7 @@ public class CombinedMessage {
break;
case 1:
combinedBody.insert(0,format("# {0}:\n# {1}:\n\n",sender,subject)); // insert sender and subject of first message right before the body of the first message
combinedSubject = subjectForCombinedMessage;
combinedSubject = subjectForCombinedMessage.translate(lang);
// no break here, we need to append the subject and content
default:
combinedBody.append("\n\n# ").append(message.sender()).append(":\n");
@@ -59,6 +57,14 @@ public class CombinedMessage {
return combinedBody.toString();
}
public List<Message> messages() {
return mergedMessages;
}
public User receiver(){
return receiver;
}
public UmbrellaUser sender() {
return sender;
}
@@ -67,7 +73,10 @@ public class CombinedMessage {
return combinedSubject;
}
public List<Message> messages() {
return mergedMessages;
@Override
public String toString() {
var body = body();
if (body.length()>100) body = body.substring(0,99)+"";
return format("{0} for {1} ({2}): {3}",getClass().getSimpleName(),receiver.email(),subject(),body);
}
}