package com.github.kpavlov.jreactive8583.netty.pipeline;
import com.solab.iso8583.IsoMessage;
import com.solab.iso8583.IsoType;
import com.solab.iso8583.MessageFactory;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.text.ParseException;
/**
* Handles {@link ParseException}s and responds with administrative message
*
* @see <a href="http://stackoverflow.com/questions/28275677/how-to-answer-an-invalid-iso8583-message">StackOverflow: How to answer an invalid ISO8583 message</a>
*/
public class ParseExceptionHandler extends ChannelInboundHandlerAdapter {
private final MessageFactory isoMessageFactory;
private final boolean includeErrorDetails;
public ParseExceptionHandler(MessageFactory isoMessageFactory, boolean includeErrorDetails) {
this.isoMessageFactory = isoMessageFactory;
this.includeErrorDetails = includeErrorDetails;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
if (cause instanceof ParseException) {
final IsoMessage message = createErrorResponseMessage((ParseException)cause);
ctx.writeAndFlush(message);
}
super.exceptionCaught(ctx, cause);
}
protected IsoMessage createErrorResponseMessage(ParseException cause) {
final IsoMessage message = isoMessageFactory.newMessage(0x1644);
message.setValue(24, 650, IsoType.NUMERIC, 3); //650 (Unable to parse message)
if (includeErrorDetails) {
String details = cause.getMessage();
if (details.length() > 25) {
details = details.substring(0, 22) + "...";
}
message.setValue(44, details, IsoType.LLVAR, 25);
}
return message;
}
}