2016년 10월 11일 화요일

Builder 시리즈 - Biz PPurio SMS Builder


서비스 제공업체들이 준 API들 쓰기가 너무 귀찮고 복잡해서
builder pattern으로 만들었다. 시리즈 첫번째.

android만 봐도 클래스에 옵션이 많다 싶으면 builder를 제공하는데, 몇개 안보긴 했지만 제대로 된 example이나 builder를 제공하는게 별로 없는 것 같다.

이번에 만든 것은 bizPurio builder 이다.

하나는 SMS message builder.
property 마다 주석 달아놔서 좀 읽기 쉬울거라고 생각한다.

다른 하나는 실제 메세지를 보내는 class builder.
인라인 주석으로 되어 있는거 보기가 싫어서 마찬가지로 builder pattern으로 작업.

작업하면서 method chaining이 되도록 하는 방법을 알게된게 소득이랄까.

EDIT:
...purio가 아니라 [ppurio 뿌리오]였구나. sms를 뿌리오? 이런건가 보다;;
/**
* BizPurio 메시지 전송 class build
* @author by dotkebi@gmail.com on 2016-10-11.
*/
public class BizSenderBuilder {
private BizSend bizSend;
private String ip;
private int port;
private String userId;
private String password;
/**
* Console 에서 로그를 확인할 경우 설정
*/
private boolean logged = false;
/**
* 전송할 파일 경로 설정
* ex. FAX, PHONE, MMS 등
*/
private String filePath;
/**
* 블랙리스트 파일 경로 설정
*/
private String blackListPath;
/**
* 수신번호, 메세지 내용을 암호화 여부
*/
private boolean encryptMessage = false;
/**
* 첨부 파일 암호화 여부
*/
private boolean encryptFile = false;
/**
* 첨부 파일 전송 후 삭제 여부
* (T : 삭제, F : 남김)
*/
private boolean deleteFileAfterSend = false;
private BizSenderBuilder() {}
public static BizSenderBuilder init(String ip, int port, String userId, String password) {
BizSenderBuilder builder = new BizSenderBuilder();
builder.ip = ip;
builder.port = port;
builder.userId = userId;
builder.password = password;
return builder;
}
public String send(SendMsgEntity sendMsgEntity) {
bizSend = new BizSend();
bizSend.doBegin(ip, port, userId, password);
bizSend.setLogEnabled(logged);
if (!isEmpty(filePath)) {
bizSend.setFilePath(filePath);
}
if (!isEmpty(blackListPath)) {
bizSend.setFilePath(blackListPath);
}
try {
return bizSend.sendMsg(sendMsgEntity, encryptMessage, encryptFile, deleteFileAfterSend);
} catch (Exception e) {
e.printStackTrace();
} finally {
bizSend.doEnd();
}
return "";
}
/**
* PING-PONG
* 장시간 연결하여 메시지를 전송할 경우 연결이 끊어지지 않기 위해 실행
* 이전 호출 시점으로부터 30초 이상 지난 경우에만 PING 을 전송하도록 함수내 정의되어 있음
* 실행하지 않아도 메시지 전송에는 영향을 미치지 않으나 안전한 연결을 위해 주기적으로 실행하길 권장
*/
public boolean sendPing() {
return bizSend != null && bizSend.sendPing();
}
/**
* 리포트 재요청
* msgid 에 해당하는 메시지의 리포트가 시간이 지나도 오지 않는 경우 실행
* @param msgId 다우기술의 서버에서 정의한 message id
*/
public boolean reconfirmRepost(String msgId) {
return bizSend != null && bizSend.reconfirmReport(msgId);
}
private boolean isEmpty(String message) {
return message == null || "".equals(message);
}
/**
* setters
*/
public BizSenderBuilder setLogged(boolean logged) {
this.logged = logged;
return this;
}
public BizSenderBuilder setFilePath(String filePath) {
this.filePath = filePath;
return this;
}
public BizSenderBuilder setBlackListPath(String blackListPath) {
this.blackListPath = blackListPath;
return this;
}
public BizSenderBuilder setEncryptMessage(boolean encryptMessage) {
this.encryptMessage = encryptMessage;
return this;
}
public BizSenderBuilder setEncryptFile(boolean encryptFile) {
this.encryptFile = encryptFile;
return this;
}
public BizSenderBuilder setDeleteFileAfterSend(boolean deleteFileAfterSend) {
this.deleteFileAfterSend = deleteFileAfterSend;
return this;
}
}
/**
* Biz Purio 메시지 Builder
* @author by dotkebi@gmail.com on 2016-10-11.
*/
public class SMSMessageBuilder {
public enum MessageType {
SMS, WAP, FAX, PHONE, SMS_INBOUND, MMS
}
/*******************
* 필수
******************/
/**
* 데이터 id
*/
private String cmid;
/**
* 데이터 타입
*/
private MessageType messageType;
/**
* 받는 사람 전화 번호
*/
private String destPhone;
/**
* 보내는 사람 전화 번호
*/
private String sendPhone;
/**
* 데이터 내용
*/
private String messageBody;
/**
* (FAX/PHONE) 재시도 회수 (5~10분 간격: 최대 3회)
*/
private int retryCount;
/*******************
* Optional
******************/
/**
* 발송 (예약) 시간 (Unix Time, 정의하지 않을 경우 즉시 발송)
*/
private String sendTime = "";
/**
* 받는 사람 이름
*/
private String destName = "";
/**
* 보내는 사람 이름
*/
private String sendName = "";
/**
* (FAX/MMS) 제목, (SMS_INBOUND) 데이터 내용
*/
private String subject = "";
/**
* (WAP) URL 주소
*/
private String url = "";
/**
* (FAX) 표지 발송 옵션
*/
private int coverFlag = 0;
/**
* (PHONE) PHONE 실패 시 문자 전송 옵션
*/
private int smsFlag = 0;
/**
* (PHONE) 응답 받기 선택
*/
private int replyFlag = 0;
/**
* (PHONE/FAX/MMS) 파일 전송시 파일 이름
*/
private String faxFile = "";
/**
* (PHONE) 음성 시나리오 파일 이름
*/
private String vxmlFile = "";
private SMSMessageBuilder() {}
public static SMSMessageBuilder init(String senderNumber, String callNo, String msg) {
SMSMessageBuilder builder = new SMSMessageBuilder();
builder.cmid = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "700";
builder.messageType = (msg.length() < 80) ? MessageType.SMS : MessageType.MMS;
builder.destPhone = callNo;
builder.sendPhone = senderNumber;
builder.messageBody = msg;
builder.retryCount = 0;
return builder;
}
public SendMsgEntity build() {
SendMsgEntity message = new SendMsgEntity();
message.setCMID(this.cmid);
message.setMSG_TYPE(this.messageType.ordinal());
message.setDEST_PHONE(this.destPhone);
message.setSEND_PHONE(this.sendPhone);
message.setMSG_BODY(this.messageBody);
message.setRETRY_CNT(this.retryCount);
if (!isEmpty(sendTime)) {
message.setSEND_TIME(sendTime);
}
if (!isEmpty(destName)) {
message.setDEST_NAME(destName);
}
if (!isEmpty(sendName)) {
message.setSEND_NAME(sendName);
}
if (!isEmpty(subject)) {
message.setSUBJECT(subject);
}
if (!isEmpty(url)) {
message.setWAP_URL(url);
}
if (!isEmpty(coverFlag)) {
message.setCOVER_FLAG(coverFlag);
}
if (!isEmpty(smsFlag)) {
message.setSMS_FLAG(smsFlag);
}
if (!isEmpty(replyFlag)) {
message.setREPLY_FLAG(replyFlag);
}
if (!isEmpty(faxFile)) {
message.setSEND_TIME(faxFile);
}
if (!isEmpty(vxmlFile)) {
message.setSEND_TIME(vxmlFile);
}
return message;
}
private boolean isEmpty(String message) {
return message == null || "".equals(message);
}
private boolean isEmpty(int message) {
return message == 0;
}
/**
* setters
*/
public SMSMessageBuilder setMessageType(MessageType messageType) {
this.messageType = messageType;
return this;
}
public SMSMessageBuilder setSendPhone(String sendPhone) {
this.sendPhone = sendPhone;
return this;
}
public SMSMessageBuilder setRetryCount(int retryCount) {
this.retryCount = retryCount;
return this;
}
public SMSMessageBuilder setSendTime(String sendTime) {
this.sendTime = sendTime;
return this;
}
public SMSMessageBuilder setDestName(String destName) {
this.destName = destName;
return this;
}
public SMSMessageBuilder setSendName(String sendName) {
this.sendName = sendName;
return this;
}
public SMSMessageBuilder setSubject(String subject) {
this.subject = subject;
return this;
}
public SMSMessageBuilder setUrl(String url) {
this.url = url;
return this;
}
public SMSMessageBuilder setCoverFlag(int coverFlag) {
this.coverFlag = coverFlag;
return this;
}
public SMSMessageBuilder setSmsFlag(int smsFlag) {
this.smsFlag = smsFlag;
return this;
}
public SMSMessageBuilder setReplyFlag(int replyFlag) {
this.replyFlag = replyFlag;
return this;
}
public SMSMessageBuilder setFaxFile(String faxFile) {
this.faxFile = faxFile;
return this;
}
public SMSMessageBuilder setVxmlFile(String vxmlFile) {
this.vxmlFile = vxmlFile;
return this;
}
}