package com.github.kpavlov.jreactive8583;
import com.github.kpavlov.jreactive8583.netty.pipeline.CompositeIsoMessageHandler;
import com.github.kpavlov.jreactive8583.netty.pipeline.EchoMessageListener;
import com.github.kpavlov.jreactive8583.netty.pipeline.IsoMessageLoggingHandler;
public abstract class ConnectorConfiguration {
/**
* Default read/write idle timeout in seconds (ping interval) = 30 sec.
*
* @see #setIdleTimeout(int)
*/
public static final int DEFAULT_IDLE_TIMEOUT_SECONDS = 30;
/**
* Default {@link #maxFrameLength} (max message length) = 8192
*
* @see #setMaxFrameLength(int)
*/
public static final int DEFAULT_MAX_FRAME_LENGTH = 8192;
private final boolean addEchoMessageListener;
private int maxFrameLength = DEFAULT_MAX_FRAME_LENGTH;
private int idleTimeout = DEFAULT_IDLE_TIMEOUT_SECONDS;
private boolean replyOnError = false;
private boolean addLoggingHandler = true;
private boolean logSensitiveData = true;
private boolean logFieldDescription = true;
private int[] sensitiveDataFields;
protected ConnectorConfiguration(Builder builder) {
addLoggingHandler = builder.addLoggingHandler;
idleTimeout = builder.idleTimeout;
logFieldDescription = builder.logFieldDescription;
logSensitiveData = builder.logSensitiveData;
maxFrameLength = builder.maxFrameLength;
replyOnError = builder.replyOnError;
sensitiveDataFields = builder.sensitiveDataFields;
this.addEchoMessageListener = builder.addEchoMessageListener;
}
/**
* Allows to add default echo message listener to {@link AbstractIso8583Connector}.
*
* @return true if {@link EchoMessageListener} should be added to {@link CompositeIsoMessageHandler}
*/
public boolean shouldAddEchoMessageListener() {
return addEchoMessageListener;
}
/**
* Channel read/write idle timeout in seconds.
* <p>
* If no message was received/sent during specified time interval then `Echo` message will be sent.</p>
*
* @return timeout in seconds
*/
public int getIdleTimeout() {
return idleTimeout;
}
/**
* Set Idle Timeout in seconds
*
* @param idleTimeoutSeconds Idle timeout in seconds
* @deprecated Use {@link Builder}
*/
@Deprecated
public void setIdleTimeout(int idleTimeoutSeconds) {
this.idleTimeout = idleTimeoutSeconds;
}
public int getMaxFrameLength() {
return maxFrameLength;
}
/**
* @param maxFrameLength the maximum length of the frame.
* @deprecated Use {@link Builder}
*/
@Deprecated
public void setMaxFrameLength(int maxFrameLength) {
this.maxFrameLength = maxFrameLength;
}
/**
* @deprecated Use {@link Builder}
* @param addLoggingHandler should logging handler be added to pipeline
*/
@Deprecated
public void setAddLoggingHandler(boolean addLoggingHandler) {
this.addLoggingHandler = addLoggingHandler;
}
/**
* Returns true is {@link IsoMessageLoggingHandler}
* <p>Allows to disable adding default logging handler to {@link io.netty.channel.ChannelPipeline}.</p>
*
* @return true if {@link IsoMessageLoggingHandler} should be added.
*/
public boolean addLoggingHandler() {
return addLoggingHandler;
}
/**
* Whether to reply with administrative message in case of message syntax errors. Default value is <code>false.</code>
*
* @return true if reply message should be sent in case of error parsing the message.
*/
public boolean replyOnError() {
return replyOnError;
}
/**
* @param replyOnError should reply on error
* @deprecated Use {@link Builder}
*/
@Deprecated
public void setReplyOnError(boolean replyOnError) {
this.replyOnError = replyOnError;
}
/**
* Returns <code>true</code> if sensitive information like PAN, CVV/CVV2, and Track2 should be printed to log.
* <p>
* Default value is <code>true</code> (sensitive data is printed).
* </p>
*
* @return <code>true</code> if sensitive data should be printed to log
*/
public boolean logSensitiveData() {
return logSensitiveData;
}
/**
* @param logSensitiveData should log sensitive data
* @deprecated Use {@link Builder}
*/
@Deprecated
public void setLogSensitiveData(boolean logSensitiveData) {
this.logSensitiveData = logSensitiveData;
}
public boolean logFieldDescription() {
return logFieldDescription;
}
/**
* @deprecated Use {@link Builder}
* @param logFieldDescription Should field descriptions be printed in log. Useful for when testing system integration.
*/
@Deprecated
public void setLogFieldDescription(boolean logFieldDescription) {
this.logFieldDescription = logFieldDescription;
}
/**
* Returns field numbers to be treated as sensitive data.
* Use <code>null</code> to use default ones
*
* @return array of ISO8583 sensitive field numbers to be masked, or <code>null</code> to use default fields.
* @see IsoMessageLoggingHandler
* @see IsoMessageLoggingHandler#DEFAULT_MASKED_FIELDS
*/
public int[] getSensitiveDataFields() {
return sensitiveDataFields;
}
/**
* @param sensitiveDataFields which fields may contain sensitive data
* @deprecated Use {@link Builder}
*/
@Deprecated
public void setSensitiveDataFields(int[] sensitiveDataFields) {
this.sensitiveDataFields = sensitiveDataFields;
}
@SuppressWarnings({"unchecked", "unused"})
protected abstract static class Builder<B extends Builder> {
private int maxFrameLength = DEFAULT_MAX_FRAME_LENGTH;
private int idleTimeout = DEFAULT_IDLE_TIMEOUT_SECONDS;
private boolean replyOnError = false;
private boolean addLoggingHandler = true;
private boolean logSensitiveData = true;
private boolean logFieldDescription = true;
private int[] sensitiveDataFields;
private boolean addEchoMessageListener;
public B withEchoMessageListener(boolean shouldAddEchoMessageListener) {
this.addEchoMessageListener = shouldAddEchoMessageListener;
return (B) this;
}
public B withMaxFrameLength(int maxFrameLength) {
this.maxFrameLength = maxFrameLength;
return (B) this;
}
public B withIdleTimeout(int idleTimeout) {
this.idleTimeout = idleTimeout;
return (B) this;
}
public B withReplyOnError(boolean replyOnError) {
this.replyOnError = replyOnError;
return (B) this;
}
public B withAddLoggingHandler(boolean addLoggingHandler) {
this.addLoggingHandler = addLoggingHandler;
return (B) this;
}
public B withLogSensitiveData(boolean logSensitiveData) {
this.logSensitiveData = logSensitiveData;
return (B) this;
}
public B withLogFieldDescription(boolean logFieldDescription) {
this.logFieldDescription = logFieldDescription;
return (B) this;
}
public B withSensitiveDataFields(int... sensitiveDataFields) {
this.sensitiveDataFields = sensitiveDataFields;
return (B) this;
}
}
}