package org.kie.dmn.core.util;
import org.kie.dmn.api.core.DMNMessage;
import org.kie.dmn.api.core.DMNMessageType;
import org.kie.dmn.api.feel.runtime.events.FEELEvent;
import org.kie.dmn.core.api.DMNMessageManager;
import org.kie.dmn.core.impl.DMNMessageImpl;
import org.kie.dmn.model.v1_1.DMNModelInstrumentedBase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class DefaultDMNMessagesManager
implements DMNMessageManager {
// should we use a sorted set instead?
private List<DMNMessage> messages;
public DefaultDMNMessagesManager() {
this.messages = new ArrayList<>();
}
@Override
public List<DMNMessage> getMessages() {
return messages;
}
@Override
public List<DMNMessage> getMessages(DMNMessage.Severity... sevs) {
List<DMNMessage.Severity> severities = Arrays.asList( sevs );
return messages.stream().filter( m -> severities.contains( m.getSeverity() ) ).collect( Collectors.toList() );
}
@Override
public boolean hasErrors() {
return messages.stream().anyMatch( m -> DMNMessage.Severity.ERROR.equals( m.getSeverity() ) );
}
@Override
public void addAll(List<DMNMessage> messages) {
for ( DMNMessage message : messages ) {
addMessage( message );
}
}
@Override
public DMNMessage addMessage(DMNMessage newMessage) {
for( DMNMessage existingMessage : messages ) {
if( isDuplicate( existingMessage, newMessage ) ) {
return existingMessage;
}
}
this.messages.add( newMessage );
return newMessage;
}
@Override
public DMNMessage addMessage(DMNMessage.Severity severity, String message, DMNMessageType messageType, DMNModelInstrumentedBase source) {
DMNMessageImpl msg = new DMNMessageImpl( severity, message, messageType, source );
return addMessage( msg );
}
@Override
public DMNMessage addMessage(DMNMessage.Severity severity, String message, DMNMessageType messageType, DMNModelInstrumentedBase source, Throwable exception) {
DMNMessageImpl msg = new DMNMessageImpl( severity, message, messageType, source, exception );
return addMessage( msg );
}
@Override
public DMNMessage addMessage(DMNMessage.Severity severity, String message, DMNMessageType messageType, DMNModelInstrumentedBase source, FEELEvent feelEvent) {
DMNMessageImpl msg = new DMNMessageImpl( severity, message, messageType, source, feelEvent );
return addMessage( msg );
}
private boolean isDuplicate(DMNMessage existingMsg, DMNMessage newMessage) {
return existingMsg.getMessageType().equals( newMessage.getMessageType() ) &&
existingMsg.getSourceReference() == newMessage.getSourceReference();
}
}