📄 defaultdecomposer.java
字号:
SequentialBytesReader reader = new SequentialBytesReader(b);
assignHeader(resp, reader);
// ignore the message_id, because it unused.
return resp;
}
/*
* (non-Javadoc)
*
* @see org.jsmpp.util.PDUDecomposer#deliveryReceipt(java.lang.String)
*/
public DeliveryReceipt deliveryReceipt(String data)
throws InvalidDeliveryReceiptException {
/*
* id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done
* date:YYMMDDhhmm stat:DDDDDDD err:E Text: ..........
*/
try {
DeliveryReceipt delRec = new DeliveryReceipt();
delRec.setId(getDeliveryReceiptValue(DeliveryReceipt.DELREC_ID,
data));
delRec.setSubmitted(Integer.parseInt(getDeliveryReceiptValue(
DeliveryReceipt.DELREC_SUB, data)));
delRec.setDelivered(Integer.parseInt(getDeliveryReceiptValue(
DeliveryReceipt.DELREC_DLVRD, data)));
delRec.setSubmitDate(string2Date(getDeliveryReceiptValue(
DeliveryReceipt.DELREC_SUBMIT_DATE, data)));
delRec.setDoneDate(string2Date(getDeliveryReceiptValue(
DeliveryReceipt.DELREC_DONE_DATE, data)));
delRec.setFinalStatus(DeliveryReceiptState
.getByName(getDeliveryReceiptValue(
DeliveryReceipt.DELREC_STAT, data)));
delRec.setError(getDeliveryReceiptValue(DeliveryReceipt.DELREC_ERR,
data));
delRec.setText(getDeliveryReceiptTextValue(data));
return delRec;
} catch (Exception e) {
throw new InvalidDeliveryReceiptException(
"There is an error found when parsing delivery receipt", e);
}
}
/*
* (non-Javadoc)
*
* @see org.jsmpp.util.PDUDecomposer#deliveryReceipt(byte[])
*/
public DeliveryReceipt deliveryReceipt(byte[] data)
throws InvalidDeliveryReceiptException {
return deliveryReceipt(new String(data));
}
public DataSm dataSm(byte[] data) throws PDUStringException {
DataSm req = new DataSm();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(req, reader);
req.setServiceType(reader.readCString());
StringValidator.validateString(req.getServiceType(),
StringParameter.SERVICE_TYPE);
req.setSourceAddrTon(reader.readByte());
req.setSourceAddrNpi(reader.readByte());
req.setSourceAddr(reader.readCString());
StringValidator.validateString(req.getSourceAddr(),
StringParameter.SOURCE_ADDR);
req.setDestAddrTon(reader.readByte());
req.setDestAddrNpi(reader.readByte());
req.setDestAddress(reader.readCString());
StringValidator.validateString(req.getDestAddress(),
StringParameter.DESTINATION_ADDR);
req.setEsmClass(reader.readByte());
req.setRegisteredDelivery(reader.readByte());
req.setDataCoding(reader.readByte());
req.setOptionalParametes(readOptionalParameters(reader));
return req;
}
public DataSmResp dataSmResp(byte[] data) throws PDUStringException {
DataSmResp resp = new DataSmResp();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(resp, reader);
if (resp.getCommandLength() > 16 && resp.getCommandStatus() == 0) {
resp.setMessageId(reader.readCString());
StringValidator.validateString(resp.getMessageId(),
StringParameter.MESSAGE_ID);
}
return resp;
}
public CancelSm cancelSm(byte[] data) throws PDUStringException {
CancelSm req = new CancelSm();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(req, reader);
req.setServiceType(reader.readCString());
StringValidator.validateString(req.getServiceType(),
StringParameter.SERVICE_TYPE);
req.setMessageId(reader.readCString());
StringValidator.validateString(req.getMessageId(),
StringParameter.MESSAGE_ID);
req.setSourceAddrTon(reader.readByte());
req.setSourceAddrNpi(reader.readByte());
req.setSourceAddr(reader.readCString());
StringValidator.validateString(req.getSourceAddr(),
StringParameter.SOURCE_ADDR);
req.setDestAddrTon(reader.readByte());
req.setDestAddrNpi(reader.readByte());
req.setDestinationAddress(reader.readCString());
StringValidator.validateString(req.getDestinationAddress(),
StringParameter.DESTINATION_ADDR);
return req;
}
public CancelSmResp cancelSmResp(byte[] data) {
CancelSmResp resp = new CancelSmResp();
assignHeader(resp, data);
return resp;
}
public SubmitMulti submitMulti(byte[] data) throws PDUStringException,
InvalidNumberOfDestinationsException {
SubmitMulti req = new SubmitMulti();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(req, reader);
req.setServiceType(reader.readCString());
StringValidator.validateString(req.getServiceType(),
StringParameter.SERVICE_TYPE);
req.setSourceAddrTon(reader.readByte());
req.setSourceAddrNpi(reader.readByte());
req.setSourceAddr(reader.readCString());
StringValidator.validateString(req.getSourceAddr(),
StringParameter.SOURCE_ADDR);
int totalDest = 0xff & reader.readByte();
if (totalDest > 255) {
throw new InvalidNumberOfDestinationsException(
"Number of destination is invalid. Should be no more than 255. Actual number is "
+ totalDest, totalDest);
}
DestinationAddress[] destAddresses = new DestinationAddress[totalDest];
for (int i = 0; i < totalDest; i++) {
byte flag = reader.readByte();
if (flag == Flag.SME_ADDRESS.getValue()) {
byte ton = reader.readByte();
byte npi = reader.readByte();
String addr = reader.readCString();
StringValidator.validateString(addr,
StringParameter.DESTINATION_ADDR);
Address destAddr = new Address(ton, npi, addr);
destAddresses[i] = destAddr;
} else if (flag == Flag.DISTRIBUTION_LIST.getValue()) {
destAddresses[i] = new DistributionList(reader.readCString());
} else {
logger.warn("Unknown destination address flag: " + flag);
}
}
req.setDestAddresses(destAddresses);
req.setEsmClass(reader.readByte());
req.setProtocolId(reader.readByte());
req.setPriorityFlag(reader.readByte());
req.setScheduleDeliveryTime(reader.readCString());
StringValidator.validateString(req.getScheduleDeliveryTime(),
StringParameter.SCHEDULE_DELIVERY_TIME);
req.setValidityPeriod(reader.readCString());
StringValidator.validateString(req.getValidityPeriod(),
StringParameter.VALIDITY_PERIOD);
req.setRegisteredDelivery(reader.readByte());
req.setReplaceIfPresentFlag(reader.readByte());
req.setDataCoding(reader.readByte());
req.setSmDefaultMsgId(reader.readByte());
byte smLength = reader.readByte();
req.setShortMessage(reader.readBytes(smLength));
StringValidator.validateString(req.getShortMessage(),
StringParameter.SHORT_MESSAGE);
req.setOptionalParameters(readOptionalParameters(reader));
return req;
}
public SubmitMultiResp submitMultiResp(byte[] data)
throws PDUStringException {
SubmitMultiResp resp = new SubmitMultiResp();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(resp, reader);
resp.setMessageId(reader.readCString());
StringValidator.validateString(resp.getMessageId(),
StringParameter.MESSAGE_ID);
int noUnsuccess = 0xff & reader.readByte();
UnsuccessDelivery[] unsuccessSmes = new UnsuccessDelivery[noUnsuccess];
for (int i = 0; i < noUnsuccess; i++) {
byte ton = reader.readByte();
byte npi = reader.readByte();
String addr = reader.readCString();
StringValidator.validateString(addr,
StringParameter.DESTINATION_ADDR);
int errorStatusCode = reader.readInt();
unsuccessSmes[i] = new UnsuccessDelivery(ton, npi, addr,
errorStatusCode);
}
resp.setUnsuccessSmes(unsuccessSmes);
return resp;
}
public ReplaceSm replaceSm(byte[] data) throws PDUStringException {
ReplaceSm req = new ReplaceSm();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(req, reader);
req.setMessageId(reader.readCString());
StringValidator.validateString(req.getMessageId(),
StringParameter.MESSAGE_ID);
req.setSourceAddrTon(reader.readByte());
req.setSourceAddrNpi(reader.readByte());
req.setSourceAddr(reader.readCString());
StringValidator.validateString(req.getSourceAddr(),
StringParameter.SOURCE_ADDR);
req.setScheduleDeliveryTime(reader.readCString());
StringValidator.validateString(req.getScheduleDeliveryTime(),
StringParameter.SCHEDULE_DELIVERY_TIME);
req.setValidityPeriod(reader.readCString());
StringValidator.validateString(req.getValidityPeriod(),
StringParameter.VALIDITY_PERIOD);
req.setSmDefaultMsgId(reader.readByte());
byte smLength = reader.readByte();
req.setShortMessage(reader.readBytes(smLength));
StringValidator.validateString(req.getShortMessage(),
StringParameter.SHORT_MESSAGE);
return req;
}
public ReplaceSmResp replaceSmResp(byte[] data) {
ReplaceSmResp resp = new ReplaceSmResp();
assignHeader(resp, data);
return resp;
}
public AlertNotification alertNotification(byte[] data) throws PDUStringException {
AlertNotification req = new AlertNotification();
SequentialBytesReader reader = new SequentialBytesReader(data);
assignHeader(req, reader);
req.setSourceAddrTon(reader.readByte());
req.setSourceAddrNpi(reader.readByte());
req.setSourceAddr(reader.readCString());
StringValidator.validateString(req.getSourceAddr(), StringParameter.SOURCE_ADDR);
req.setEsmeAddrTon(reader.readByte());
req.setEsmeAddrNpi(reader.readByte());
/*
* No validation on esme_addr.
* There is no response to alert_notificaion command, so error will be
* ignored.
*/
req.setEsmeAddr(reader.readCString());
req.setOptionalParameters(readOptionalParameters(reader));
return req;
}
private OptionalParameter[] readOptionalParameters(
SequentialBytesReader reader) {
if (!reader.hasMoreBytes())
return null;
List<OptionalParameter> params = new ArrayList<OptionalParameter>();
while (reader.hasMoreBytes()) {
short tag = reader.readShort();
short length = reader.readShort();
byte[] content = reader.readBytes(length);
params.add(OptionalParameters.deserialize(tag, content));
}
return params.toArray(new OptionalParameter[params.size()]);
}
/**
* YYMMDDhhmm where:
* <ul>
* <li>YY = last two digits of the year (00-99)</li>
* <li>MM = month (01-12)</li>
* <li>DD = day (01-31)</li>
* <li>hh = hour (00-23)</li>
* <li>mm = minute (00-59)</li>
* </ul>
*
* Java format is (yyMMddHHmm).
*
* @param date in <tt>String</tt> format.
* @return
* @throws NumberFormatException if there is contains non number on
* <code>date</code> parameter.
* @throws IndexOutOfBoundsException if the date length in <tt>String</tt>
* format is less than 10.
*/
private static Date string2Date(String date) {
int year = Integer.parseInt(date.substring(0, 2));
int month = Integer.parseInt(date.substring(2, 4));
int day = Integer.parseInt(date.substring(4, 6));
int hour = Integer.parseInt(date.substring(6, 8));
int minute = Integer.parseInt(date.substring(8, 10));
Calendar cal = Calendar.getInstance();
cal.set(convertTwoDigitYear(year), month - 1, day, hour, minute, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
private static int convertTwoDigitYear(int year) {
if (year >=0 && year <= 37) {
return 2000 + year;
} else if (year >= 38 && year <= 99) {
return 1900 + year;
} else {
// should never happen
return year;
}
}
/**
* Get the delivery receipt attribute value.
*
* @param attrName is the attribute name.
* @param source the original source id:IIIIIIIIII sub:SSS dlvrd:DDD submit
* date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E
* Text:....................
* @return the value of specified attribute.
* @throws IndexOutOfBoundsException
*/
private static String getDeliveryReceiptValue(String attrName, String source)
throws IndexOutOfBoundsException {
String tmpAttr = attrName + ":";
int startIndex = source.indexOf(tmpAttr);
if (startIndex < 0)
return null;
startIndex = startIndex + tmpAttr.length();
int endIndex = source.indexOf(" ", startIndex);
if (endIndex > 0)
return source.substring(startIndex, endIndex);
return source.substring(startIndex);
}
/**
* @param source
* @return
* @throws IndexOutOfBoundsException
*/
private static String getDeliveryReceiptTextValue(String source) {
String tmpAttr = DeliveryReceipt.DELREC_TEXT + ":";
int startIndex = source.indexOf(tmpAttr);
if (startIndex < 0) {
tmpAttr = DeliveryReceipt.DELREC_TEXT.toLowerCase() + ":";
startIndex = source.indexOf(tmpAttr);
}
if (startIndex < 0) {
return null;
}
startIndex = startIndex + tmpAttr.length();
return source.substring(startIndex);
}
private static void assignHeader(Command pdu,
SequentialBytesReader seqBytesReader) {
int commandLength = seqBytesReader.readInt();
if (seqBytesReader.getBytes().length != commandLength)
logger.error("SYSTEM BUGS, the command_length (" + commandLength
+ ") not equals with the byte array length ("
+ seqBytesReader.getBytes().length + ")");
pdu.setCommandLength(commandLength);
pdu.setCommandId(seqBytesReader.readInt());
pdu.setCommandStatus(seqBytesReader.readInt());
pdu.setSequenceNumber(seqBytesReader.readInt());
}
private static void assignHeader(Command pdu, byte[] bytes) {
assignHeader(pdu, new SequentialBytesReader(bytes));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -