blob: 0624fa47e9add6ed95419c50b68cae37f7265af8 [file] [log] [blame]
/**
* 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.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.jsmpp.bean.AlertNotification;
import org.jsmpp.bean.Command;
import org.jsmpp.bean.DataSm;
import org.jsmpp.bean.DeliverSm;
import org.jsmpp.bean.DeliveryReceipt;
import org.jsmpp.bean.OptionalParameter;
import org.jsmpp.bean.OptionalParameter.OctetString;
import org.jsmpp.bean.OptionalParameters;
import org.jsmpp.bean.SubmitSm;
import org.jsmpp.util.AbsoluteTimeFormatter;
import org.jsmpp.util.TimeFormatter;
/**
* A Strategy used to convert between a Camel {@link Exchange} and
* {@link SmppMessage} to and from a SMPP {@link Command}
*
* @version
*/
public class SmppBinding {
public static final String SEQUENCE_NUMBER = "CamelSmppSequenceNumber";
public static final String SUBMITTED = "CamelSmppSubmitted";
public static final String SUBMIT_DATE = "CamelSmppSubmitDate";
public static final String ERROR = "CamelSmppError";
public static final String DONE_DATE = "CamelSmppDoneDate";
public static final String DELIVERED = "CamelSmppDelivered";
public static final String COMMAND_ID = "CamelSmppCommandId";
public static final String COMMAND_STATUS = "CamelSmppCommandStatus";
public static final String ID = "CamelSmppId";
public static final String REPLACE_IF_PRESENT_FLAG = "CamelSmppReplaceIfPresentFlag";
public static final String VALIDITY_PERIOD = "CamelSmppValidityPeriod";
public static final String SCHEDULE_DELIVERY_TIME = "CamelSmppScheduleDeliveryTime";
public static final String PRIORITY_FLAG = "CamelSmppPriorityFlag";
public static final String PROTOCOL_ID = "CamelSmppProtocolId";
public static final String REGISTERED_DELIVERY = "CamelSmppRegisteredDelivery";
public static final String SERVICE_TYPE = "CamelSmppServiceType";
public static final String SOURCE_ADDR_NPI = "CamelSmppSourceAddrNpi";
public static final String SOURCE_ADDR_TON = "CamelSmppSourceAddrTon";
public static final String SOURCE_ADDR = "CamelSmppSourceAddr";
public static final String DEST_ADDR_NPI = "CamelSmppDestAddrNpi";
public static final String DEST_ADDR_TON = "CamelSmppDestAddrTon";
public static final String DEST_ADDR = "CamelSmppDestAddr";
public static final String ESME_ADDR_NPI = "CamelSmppEsmeAddrNpi";
public static final String ESME_ADDR_TON = "CamelSmppEsmeAddrTon";
public static final String ESME_ADDR = "CamelSmppEsmeAddr";
public static final String FINAL_STATUS = "CamelSmppStatus";
public static final String DATA_CODING = "CamelSmppDataCoding";
public static final String MESSAGE_TYPE = "CamelSmppMessageType";
private static TimeFormatter timeFormatter = new AbsoluteTimeFormatter();
private SmppConfiguration configuration;
public SmppBinding() {
this.configuration = new SmppConfiguration();
}
public SmppBinding(SmppConfiguration configuration) {
this.configuration = configuration;
}
/**
* Create the SubmitSm object from the inbound exchange
*
* @throws UnsupportedEncodingException if the encoding is not supported
*/
public SubmitSm createSubmitSm(Exchange exchange) throws UnsupportedEncodingException {
Message in = exchange.getIn();
String body = exchange.getIn().getBody(String.class);
SubmitSm submitSm = new SubmitSm();
if (body != null) {
byte[] shortMessage = body.getBytes(configuration.getEncoding());
if (shortMessage.length < 255) {
submitSm.setShortMessage(shortMessage);
// To avoid the NPE error
submitSm.setOptionalParametes(new OptionalParameter[]{});
} else {
submitSm.setShortMessage(new byte[0]);
OptionalParameter messagePayloadTLV = OptionalParameters.deserialize(OptionalParameter.Tag.MESSAGE_PAYLOAD.code(), shortMessage);
submitSm.setOptionalParametes(messagePayloadTLV);
}
}
if (in.getHeaders().containsKey(DEST_ADDR)) {
submitSm.setDestAddress(in.getHeader(DEST_ADDR, String.class));
} else {
submitSm.setDestAddress(configuration.getDestAddr());
}
if (in.getHeaders().containsKey(DEST_ADDR_TON)) {
submitSm.setDestAddrTon(in.getHeader(DEST_ADDR_TON, Byte.class));
} else {
submitSm.setDestAddrTon(configuration.getDestAddrTon());
}
if (in.getHeaders().containsKey(DEST_ADDR_NPI)) {
submitSm.setDestAddrNpi(in.getHeader(DEST_ADDR_NPI, Byte.class));
} else {
submitSm.setDestAddrNpi(configuration.getDestAddrNpi());
}
if (in.getHeaders().containsKey(SOURCE_ADDR)) {
submitSm.setSourceAddr(in.getHeader(SOURCE_ADDR, String.class));
} else {
submitSm.setSourceAddr(configuration.getSourceAddr());
}
if (in.getHeaders().containsKey(SOURCE_ADDR_TON)) {
submitSm.setSourceAddrTon(in.getHeader(SOURCE_ADDR_TON, Byte.class));
} else {
submitSm.setSourceAddrTon(configuration.getSourceAddrTon());
}
if (in.getHeaders().containsKey(SOURCE_ADDR_NPI)) {
submitSm.setSourceAddrNpi(in.getHeader(SOURCE_ADDR_NPI, Byte.class));
} else {
submitSm.setSourceAddrNpi(configuration.getSourceAddrNpi());
}
if (in.getHeaders().containsKey(SERVICE_TYPE)) {
submitSm.setServiceType(in.getHeader(SERVICE_TYPE, String.class));
} else {
submitSm.setServiceType(configuration.getServiceType());
}
if (in.getHeaders().containsKey(REGISTERED_DELIVERY)) {
submitSm.setRegisteredDelivery(in.getHeader(REGISTERED_DELIVERY, Byte.class));
} else {
submitSm.setRegisteredDelivery(configuration.getRegisteredDelivery());
}
if (in.getHeaders().containsKey(PROTOCOL_ID)) {
submitSm.setProtocolId(in.getHeader(PROTOCOL_ID, Byte.class));
} else {
submitSm.setProtocolId(configuration.getProtocolId());
}
if (in.getHeaders().containsKey(PRIORITY_FLAG)) {
submitSm.setPriorityFlag(in.getHeader(PRIORITY_FLAG, Byte.class));
} else {
submitSm.setPriorityFlag(configuration.getPriorityFlag());
}
if (in.getHeaders().containsKey(SCHEDULE_DELIVERY_TIME)) {
submitSm.setScheduleDeliveryTime(timeFormatter.format(in.getHeader(SCHEDULE_DELIVERY_TIME, Date.class)));
}
if (in.getHeaders().containsKey(VALIDITY_PERIOD)) {
submitSm.setValidityPeriod(timeFormatter.format(in.getHeader(VALIDITY_PERIOD, Date.class)));
}
if (in.getHeaders().containsKey(REPLACE_IF_PRESENT_FLAG)) {
submitSm.setReplaceIfPresent(in.getHeader(REPLACE_IF_PRESENT_FLAG, Byte.class));
} else {
submitSm.setReplaceIfPresent(configuration.getReplaceIfPresentFlag());
}
if (in.getHeaders().containsKey(DATA_CODING)) {
submitSm.setDataCoding(in.getHeader(DATA_CODING, Byte.class));
} else {
submitSm.setDataCoding(configuration.getDataCoding());
}
return submitSm;
}
/**
* Create a new SmppMessage from the inbound alert notification
*/
public SmppMessage createSmppMessage(AlertNotification alertNotification) {
SmppMessage smppMessage = new SmppMessage(alertNotification, configuration);
smppMessage.setHeader(MESSAGE_TYPE, SmppMessageType.AlertNotification.toString());
smppMessage.setHeader(SEQUENCE_NUMBER, alertNotification.getSequenceNumber());
smppMessage.setHeader(COMMAND_ID, alertNotification.getCommandId());
smppMessage.setHeader(COMMAND_STATUS, alertNotification.getCommandStatus());
smppMessage.setHeader(SOURCE_ADDR, alertNotification.getSourceAddr());
smppMessage.setHeader(SOURCE_ADDR_NPI, alertNotification.getSourceAddrNpi());
smppMessage.setHeader(SOURCE_ADDR_TON, alertNotification.getSourceAddrTon());
smppMessage.setHeader(ESME_ADDR, alertNotification.getEsmeAddr());
smppMessage.setHeader(ESME_ADDR_NPI, alertNotification.getEsmeAddrNpi());
smppMessage.setHeader(ESME_ADDR_TON, alertNotification.getEsmeAddrTon());
return smppMessage;
}
/**
* Create a new SmppMessage from the inbound deliver sm or deliver receipt
*/
public SmppMessage createSmppMessage(DeliverSm deliverSm) throws Exception {
SmppMessage smppMessage = new SmppMessage(deliverSm, configuration);
if (deliverSm.isSmscDeliveryReceipt()) {
smppMessage.setHeader(MESSAGE_TYPE, SmppMessageType.DeliveryReceipt.toString());
DeliveryReceipt smscDeliveryReceipt = deliverSm.getShortMessageAsDeliveryReceipt();
smppMessage.setBody(smscDeliveryReceipt.getText());
smppMessage.setHeader(ID, smscDeliveryReceipt.getId());
smppMessage.setHeader(DELIVERED, smscDeliveryReceipt.getDelivered());
smppMessage.setHeader(DONE_DATE, smscDeliveryReceipt.getDoneDate());
if (!"000".equals(smscDeliveryReceipt.getError())) {
smppMessage.setHeader(ERROR, smscDeliveryReceipt.getError());
}
smppMessage.setHeader(SUBMIT_DATE, smscDeliveryReceipt.getSubmitDate());
smppMessage.setHeader(SUBMITTED, smscDeliveryReceipt.getSubmitted());
smppMessage.setHeader(FINAL_STATUS, smscDeliveryReceipt.getFinalStatus());
} else {
smppMessage.setHeader(MESSAGE_TYPE, SmppMessageType.DeliverSm.toString());
if (deliverSm.getShortMessage() != null) {
smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(),
configuration.getEncoding())));
} else if (deliverSm.getOptionalParametes() != null && deliverSm.getOptionalParametes().length > 0) {
List<OptionalParameter> oplist = Arrays.asList(deliverSm.getOptionalParametes());
for (OptionalParameter optPara : oplist) {
if (OptionalParameter.Tag.MESSAGE_PAYLOAD.code() == optPara.tag && OctetString.class.isInstance(optPara)) {
smppMessage.setBody(((OctetString) optPara).getValueAsString());
break;
}
}
}
smppMessage.setHeader(SEQUENCE_NUMBER, deliverSm.getSequenceNumber());
smppMessage.setHeader(COMMAND_ID, deliverSm.getCommandId());
smppMessage.setHeader(SOURCE_ADDR, deliverSm.getSourceAddr());
smppMessage.setHeader(DEST_ADDR, deliverSm.getDestAddress());
smppMessage.setHeader(SCHEDULE_DELIVERY_TIME, deliverSm.getScheduleDeliveryTime());
smppMessage.setHeader(VALIDITY_PERIOD, deliverSm.getValidityPeriod());
smppMessage.setHeader(SERVICE_TYPE, deliverSm.getServiceType());
}
return smppMessage;
}
public SmppMessage createSmppMessage(DataSm dataSm, String smppMessageId) {
SmppMessage smppMessage = new SmppMessage(dataSm, configuration);
smppMessage.setHeader(MESSAGE_TYPE, SmppMessageType.DataSm.toString());
smppMessage.setHeader(ID, smppMessageId);
smppMessage.setHeader(SEQUENCE_NUMBER, dataSm.getSequenceNumber());
smppMessage.setHeader(COMMAND_ID, dataSm.getCommandId());
smppMessage.setHeader(COMMAND_STATUS, dataSm.getCommandStatus());
smppMessage.setHeader(SOURCE_ADDR, dataSm.getSourceAddr());
smppMessage.setHeader(SOURCE_ADDR_NPI, dataSm.getSourceAddrNpi());
smppMessage.setHeader(SOURCE_ADDR_TON, dataSm.getSourceAddrTon());
smppMessage.setHeader(DEST_ADDR, dataSm.getDestAddress());
smppMessage.setHeader(DEST_ADDR_NPI, dataSm.getDestAddrNpi());
smppMessage.setHeader(DEST_ADDR_TON, dataSm.getDestAddrTon());
smppMessage.setHeader(SERVICE_TYPE, dataSm.getServiceType());
smppMessage.setHeader(REGISTERED_DELIVERY, dataSm.getRegisteredDelivery());
smppMessage.setHeader(DATA_CODING, dataSm.getDataCoding());
return smppMessage;
}
/**
* Returns the current date. Externalized for better test support.
*
* @return the current date
*/
Date getCurrentDate() {
return new Date();
}
/**
* Returns the smpp configuration
*
* @return the configuration
*/
public SmppConfiguration getConfiguration() {
return configuration;
}
/**
* Set the smpp configuration.
*
* @param configuration smppConfiguration
*/
public void setConfiguration(SmppConfiguration configuration) {
this.configuration = configuration;
}
}