/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.smpp;
import java.util.Calendar;
import java.util.Date;
import org.jsmpp.bean.Alphabet;
import org.jsmpp.bean.DataSm;
import org.jsmpp.bean.SubmitMulti;
import org.jsmpp.bean.SubmitSm;
import org.jsmpp.util.AbsoluteTimeFormatter;
import org.jsmpp.util.TimeFormatter;
public final class SmppUtils {
/**
* See http://unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT
*/
public static final short[] ISO_GSM_0338 = {
64, 163, 36, 165, 232, 233, 249, 236,
242, 199, 10, 216, 248, 13, 197, 229,
0, 95, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 198, 230, 223, 201,
32, 33, 34, 35, 164, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63,
161, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87,
88, 89, 90, 196, 214, 209, 220, 167,
191, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 118, 119,
120, 121, 122, 228, 246, 241, 252, 224
};
/**
* See http://unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT
*/
public static final short[][] ISO_GSM_0338_EXT = {
{10, 12}, {20, 94}, {40, 123}, {41, 125}, {47, 92},
{60, 91}, {61, 126}, {62, 93}, {64, 124}, {101, 164}
};
private static final TimeFormatter TIME_FORMATTER = new AbsoluteTimeFormatter();
private SmppUtils() {
}
public static String formatTime(Date date) {
return TIME_FORMATTER.format(date);
}
/**
* YYMMDDhhmmSS 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>
* <li>SS = second (00-59)</li>
* </ul>
*
* Java format is (yyMMddHHmmSS).
*
* @param date in <tt>String</tt> format.
* @return the date
* @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.
*/
public static Date string2Date(String date) {
if (date == null) {
return null;
}
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));
int second = Integer.parseInt(date.substring(10, 12));
Calendar cal = Calendar.getInstance();
cal.set(convertTwoDigitYear(year), month - 1, day, hour, minute, second);
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;
}
}
public static boolean is8Bit(Alphabet alphabet) {
return alphabet == Alphabet.ALPHA_UNSPECIFIED_2 || alphabet == Alphabet.ALPHA_8_BIT;
}
/**
* Decides if the characters in the argument are GSM 3.38 encodeable.
* @param aMessage must be a set of characters encoded in ISO-8859-1
* or a compatible character set. In particular,
* UTF-8 encoded text should not be passed to this method.
* @return true if the characters can be represented in GSM 3.38
*/
public static boolean isGsm0338Encodeable(byte[] aMessage) {
outer:
for (int i = 0; i < aMessage.length; i++) {
for (int j = 0; j < ISO_GSM_0338.length; j++) {
if (ISO_GSM_0338[j] == aMessage[i]) {
continue outer;
}
}
for (int j = 0; j < ISO_GSM_0338_EXT.length; j++) {
if (ISO_GSM_0338_EXT[j][1] == aMessage[i]) {
continue outer;
}
}
return false;
}
return true;
}
public static SubmitSm copySubmitSm(SubmitSm src) {
SubmitSm dest = new SubmitSm();
dest.setCommandId(src.getCommandId());
dest.setCommandLength(src.getCommandLength());
dest.setCommandStatus(src.getCommandStatus());
dest.setDataCoding(src.getDataCoding());
dest.setDestAddress(src.getDestAddress());
dest.setDestAddrNpi(src.getDestAddrNpi());
dest.setDestAddrTon(src.getDestAddrTon());
dest.setEsmClass(src.getEsmClass());
dest.setOptionalParameters(src.getOptionalParameters());
dest.setPriorityFlag(src.getPriorityFlag());
dest.setProtocolId(src.getProtocolId());
dest.setRegisteredDelivery(src.getRegisteredDelivery());
dest.setReplaceIfPresent(src.getReplaceIfPresent());
dest.setScheduleDeliveryTime(src.getScheduleDeliveryTime());
dest.setSequenceNumber(src.getSequenceNumber());
dest.setServiceType(src.getServiceType());
dest.setShortMessage(src.getShortMessage());
dest.setSmDefaultMsgId(src.getSmDefaultMsgId());
dest.setSourceAddr(src.getSourceAddr());
dest.setSourceAddrNpi(src.getSourceAddrNpi());
dest.setSourceAddrTon(src.getSourceAddrTon());
dest.setValidityPeriod(src.getValidityPeriod());
if (src.isDatagramMode()) {
dest.setDatagramMode();
}
if (src.isDefaultMessageType()) {
dest.setDefaultMessageType();
}
if (src.isDefaultMode()) {
dest.setDefaultMode();
}
if (src.isEsmeDeliveryAcknowledgement()) {
dest.setEsmeDelivertAcknowledgement();
}
if (src.isEsmeManualAcknowledgement()) {
dest.setEsmeManualAcknowledgement();
}
if (src.isForwardMode()) {
dest.setForwardMode();
}
if (src.isReplyPath()) {
dest.setReplyPath();
}
if (src.isSmscDelReceiptFailureRequested()) {
dest.setSmscDelReceiptFailureRequested();
}
if (src.isSmscDelReceiptNotRequested()) {
dest.setSmscDelReceiptNotRequested();
}
if (src.isSmscDelReceiptSuccessAndFailureRequested()) {
dest.setSmscDelReceiptSuccessAndFailureRequested();
}
if (src.isStoreAndForwardMode()) {
dest.setStoreAndForwardMode();
}
if (src.isUdhi()) {
dest.setUdhi();
}
if (src.isUdhiAndReplyPath()) {
dest.setUdhiAndReplyPath();
}
return dest;
}
public static SubmitMulti copySubmitMulti(SubmitMulti src) {
SubmitMulti dest = new SubmitMulti();
dest.setCommandId(src.getCommandId());
dest.setCommandLength(src.getCommandLength());
dest.setCommandStatus(src.getCommandStatus());
dest.setDataCoding(src.getDataCoding());
dest.setDestAddresses(src.getDestAddresses());
dest.setEsmClass(src.getEsmClass());
dest.setOptionalParameters(src.getOptionalParameters());
dest.setPriorityFlag(src.getPriorityFlag());
dest.setProtocolId(src.getProtocolId());
dest.setRegisteredDelivery(src.getRegisteredDelivery());
dest.setReplaceIfPresentFlag(src.getReplaceIfPresentFlag());
dest.setScheduleDeliveryTime(src.getScheduleDeliveryTime());
dest.setSequenceNumber(src.getSequenceNumber());
dest.setServiceType(src.getServiceType());
dest.setShortMessage(src.getShortMessage());
dest.setSmDefaultMsgId(src.getSmDefaultMsgId());
dest.setSourceAddr(src.getSourceAddr());
dest.setSourceAddrNpi(src.getSourceAddrNpi());
dest.setSourceAddrTon(src.getSourceAddrTon());
dest.setValidityPeriod(src.getValidityPeriod());
return dest;
}
public static DataSm copyDataSm(DataSm src) {
DataSm dest = new DataSm();
dest.setCommandId(src.getCommandId());
dest.setCommandLength(src.getCommandLength());
dest.setCommandStatus(src.getCommandStatus());
dest.setDataCoding(src.getDataCoding());
dest.setDestAddress(src.getDestAddress());
dest.setDestAddrNpi(src.getDestAddrNpi());
dest.setDestAddrTon(src.getDestAddrTon());
dest.setEsmClass(src.getEsmClass());
dest.setOptionalParameters(src.getOptionalParameters());
dest.setRegisteredDelivery(src.getRegisteredDelivery());
dest.setSequenceNumber(src.getSequenceNumber());
dest.setServiceType(src.getServiceType());
dest.setSourceAddr(src.getSourceAddr());
dest.setSourceAddrNpi(src.getSourceAddrNpi());
dest.setSourceAddrTon(src.getSourceAddrTon());
if (src.isDefaultMessageType()) {
dest.setDefaultMessageType();
}
if (src.isReplyPath()) {
dest.setReplyPath();
}
if (src.isUdhi()) {
dest.setUdhi();
}
if (src.isUdhiAndReplyPath()) {
dest.setUdhiAndReplyPath();
}
return dest;
}
}