Github user mmiklavc commented on a diff in the pull request:

    https://github.com/apache/metron/pull/1234#discussion_r224566471
  
    --- Diff: 
metron-platform/metron-parsers/src/main/java/org/apache/metron/parsers/syslog/Syslog5424Parser.java
 ---
    @@ -61,16 +67,37 @@ public void configure(Map<String, Object> config) {
       public void init() {
       }
     
    -  @Override
       @SuppressWarnings("unchecked")
    +  @Override
       public List<JSONObject> parse(byte[] rawMessage) {
    +    Optional<MessageParserResult<JSONObject>> resultOptional = 
parseOptionalResult(rawMessage);
    --- End diff --
    
    Just spitballing here, but maybe an option here is to create a decorator 
interface around the older implementation and provide defaults when someone 
implements the new interface? Old api doesn't change and we handle new 
implementations gracefully.
    
    ```java
    public interface MessageParser<T> extends Configurable {
      List<T> parse(byte[] rawMessage);
      Optional<List<T>> parseOptional(byte[] parseMessage);
    }
    public interface MultilineMessageParser<T> extends MessageParser {
      default List<T> parse(byte[] rawMessage) {
        throw new NotImplementedException();
      }
      default Optional<MessageParserResult<T>> parseOptionalResult(byte[] 
parseMessage) {
        List<T> list = new ArrayList<>();
          try {
            Optional<List<T>> optionalMessages = parseOptional(parseMessage);
            optionalMessages.ifPresent(list::addAll);
          } catch (Throwable t) {
            return Optional.of(new DefaultMessageParserResult<>(t));
          }
          return Optional.of(new DefaultMessageParserResult<T>(list));
      }
    }
    ```
    
    **ParserBolt:**
    ```java
    MultilineMessageParser mmp = null;
    if (!(parser instanceof MultilineMessageParser)) {
      mmp = new MultilineMessageParser<JSONObject>() {
    
        @Override
        public void configure(Map<String, Object> config) {
          parser.configure(config);
        }
    
        @Override
        public void init() {
          parser.init();
        }
    
        @Override
        public boolean validate(JSONObject message) {
          return parser.validate(message);
        }
      };
    } else {
      mmp = (MultilineMessageParser) parser;
    }
    
    Optional<MessageParserResult<JSONObject>> results = 
mmp.parseOptionalResult(rawMessage.getMessage());
    ```



---

Reply via email to