001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.component.smpp;
018
019 import java.io.UnsupportedEncodingException;
020 import java.util.Date;
021
022 import org.apache.camel.Exchange;
023 import org.apache.camel.Message;
024 import org.jsmpp.bean.AlertNotification;
025 import org.jsmpp.bean.Command;
026 import org.jsmpp.bean.DeliverSm;
027 import org.jsmpp.bean.DeliveryReceipt;
028 import org.jsmpp.bean.SubmitSm;
029 import org.jsmpp.util.AbsoluteTimeFormatter;
030 import org.jsmpp.util.TimeFormatter;
031
032 /**
033 * A Strategy used to convert between a Camel {@link Exchange} and
034 * {@link SmppMessage} to and from a SMPP {@link Command}
035 *
036 * @version $Revision: 945982 $
037 * @author muellerc
038 */
039 public class SmppBinding {
040
041 public static final String SEQUENCE_NUMBER = "CamelSmppSequenceNumber";
042 public static final String SUBMITTED = "CamelSmppSubmitted";
043 public static final String SUBMIT_DATE = "CamelSmppSubmitDate";
044 public static final String ERROR = "CamelSmppError";
045 public static final String DONE_DATE = "CamelSmppDoneDate";
046 public static final String DELIVERED = "CamelSmppDelivered";
047 public static final String COMMAND_ID = "CamelSmppCommandId";
048 public static final String COMMAND_STATUS = "CamelSmppCommandStatus";
049 public static final String ID = "CamelSmppId";
050 public static final String REPLACE_IF_PRESENT_FLAG = "CamelSmppReplaceIfPresentFlag";
051 public static final String VALIDITY_PERIOD = "CamelSmppValidityPeriod";
052 public static final String SCHEDULE_DELIVERY_TIME = "CamelSmppScheduleDeliveryTime";
053 public static final String PRIORITY_FLAG = "CamelSmppPriorityFlag";
054 public static final String PROTOCOL_ID = "CamelSmppProtocolId";
055 public static final String REGISTERED_DELIVERY = "CamelSmppRegisteredDelivery";
056 public static final String SERVICE_TYPE = "CamelSmppServiceType";
057 public static final String SOURCE_ADDR_NPI = "CamelSmppSourceAddrNpi";
058 public static final String SOURCE_ADDR_TON = "CamelSmppSourceAddrTon";
059 public static final String SOURCE_ADDR = "CamelSmppSourceAddr";
060 public static final String DEST_ADDR_NPI = "CamelSmppDestAddrNpi";
061 public static final String DEST_ADDR_TON = "CamelSmppDestAddrTon";
062 public static final String DEST_ADDR = "CamelSmppDestAddr";
063 public static final String ESME_ADDR_NPI = "CamelSmppEsmeAddrNpi";
064 public static final String ESME_ADDR_TON = "CamelSmppEsmeAddrTon";
065 public static final String ESME_ADDR = "CamelSmppEsmeAddr";
066 public static final String FINAL_STATUS = "CamelSmppStatus";
067
068 private static TimeFormatter timeFormatter = new AbsoluteTimeFormatter();
069
070 private SmppConfiguration configuration;
071
072 public SmppBinding() {
073 this.configuration = new SmppConfiguration();
074 }
075
076 public SmppBinding(SmppConfiguration configuration) {
077 this.configuration = configuration;
078 }
079
080 /**
081 * Create the SubmitSm object from the inbound exchange
082 *
083 * @throws UnsupportedEncodingException if the encoding is not supported
084 */
085 public SubmitSm createSubmitSm(Exchange exchange) throws UnsupportedEncodingException {
086 Message in = exchange.getIn();
087
088 SubmitSm submitSm = new SubmitSm();
089 submitSm.setShortMessage(exchange.getIn().getBody(String.class).getBytes(configuration.getEncoding()));
090
091 if (in.getHeaders().containsKey(DEST_ADDR)) {
092 submitSm.setDestAddress((String) in.getHeader(DEST_ADDR));
093 } else {
094 submitSm.setDestAddress(configuration.getDestAddr());
095 }
096
097 if (in.getHeaders().containsKey(DEST_ADDR_TON)) {
098 submitSm.setDestAddrTon((Byte) in.getHeader(DEST_ADDR_TON));
099 } else {
100 submitSm.setDestAddrTon(configuration.getDestAddrTon());
101 }
102
103 if (in.getHeaders().containsKey(DEST_ADDR_NPI)) {
104 submitSm.setDestAddrNpi((Byte) in.getHeader(DEST_ADDR_NPI));
105 } else {
106 submitSm.setDestAddrNpi(configuration.getDestAddrNpi());
107 }
108
109 if (in.getHeaders().containsKey(SOURCE_ADDR)) {
110 submitSm.setSourceAddr((String) in.getHeader(SOURCE_ADDR));
111 } else {
112 submitSm.setSourceAddr(configuration.getSourceAddr());
113 }
114
115 if (in.getHeaders().containsKey(SOURCE_ADDR_TON)) {
116 submitSm.setSourceAddrTon((Byte) in.getHeader(SOURCE_ADDR_TON));
117 } else {
118 submitSm.setSourceAddrTon(configuration.getSourceAddrTon());
119 }
120
121 if (in.getHeaders().containsKey(SOURCE_ADDR_NPI)) {
122 submitSm.setSourceAddrNpi((Byte) in.getHeader(SOURCE_ADDR_NPI));
123 } else {
124 submitSm.setSourceAddrNpi(configuration.getDestAddrNpi());
125 }
126
127 if (in.getHeaders().containsKey(SERVICE_TYPE)) {
128 submitSm.setServiceType((String) in.getHeader(SERVICE_TYPE));
129 } else {
130 submitSm.setServiceType(configuration.getServiceType());
131 }
132
133 if (in.getHeaders().containsKey(REGISTERED_DELIVERY)) {
134 submitSm.setRegisteredDelivery((Byte) in.getHeader(REGISTERED_DELIVERY));
135 } else {
136 submitSm.setRegisteredDelivery(configuration.getRegisteredDelivery());
137 }
138
139 if (in.getHeaders().containsKey(PROTOCOL_ID)) {
140 submitSm.setProtocolId((Byte) in.getHeader(PROTOCOL_ID));
141 } else {
142 submitSm.setProtocolId(configuration.getProtocolId());
143 }
144
145 if (in.getHeaders().containsKey(PRIORITY_FLAG)) {
146 submitSm.setPriorityFlag((Byte) in.getHeader(PRIORITY_FLAG));
147 } else {
148 submitSm.setPriorityFlag(configuration.getPriorityFlag());
149 }
150
151 if (in.getHeaders().containsKey(SCHEDULE_DELIVERY_TIME)) {
152 submitSm.setScheduleDeliveryTime(timeFormatter.format((Date) in.getHeader(SCHEDULE_DELIVERY_TIME)));
153 }
154
155 if (in.getHeaders().containsKey(VALIDITY_PERIOD)) {
156 submitSm.setValidityPeriod(timeFormatter.format((Date) in.getHeader(VALIDITY_PERIOD)));
157 }
158
159 if (in.getHeaders().containsKey(REPLACE_IF_PRESENT_FLAG)) {
160 submitSm.setReplaceIfPresent((Byte) in.getHeader(REPLACE_IF_PRESENT_FLAG));
161 } else {
162 submitSm.setReplaceIfPresent(configuration.getReplaceIfPresentFlag());
163 }
164
165 return submitSm;
166 }
167
168 /**
169 * Create a new SmppMessage from the inbound alert notification
170 */
171 public SmppMessage createSmppMessage(AlertNotification alertNotification) {
172 SmppMessage smppMessage = new SmppMessage(alertNotification, configuration);
173
174 smppMessage.setHeader(SEQUENCE_NUMBER, alertNotification.getSequenceNumber());
175 smppMessage.setHeader(COMMAND_ID, alertNotification.getCommandId());
176 smppMessage.setHeader(COMMAND_STATUS, alertNotification.getCommandStatus());
177 smppMessage.setHeader(SOURCE_ADDR, alertNotification.getSourceAddr());
178 smppMessage.setHeader(SOURCE_ADDR_NPI, alertNotification.getSourceAddrNpi());
179 smppMessage.setHeader(SOURCE_ADDR_TON, alertNotification.getSourceAddrNpi());
180 smppMessage.setHeader(ESME_ADDR, alertNotification.getEsmeAddr());
181 smppMessage.setHeader(ESME_ADDR_NPI, alertNotification.getEsmeAddrNpi());
182 smppMessage.setHeader(ESME_ADDR_TON, alertNotification.getEsmeAddrNpi());
183
184 return smppMessage;
185 }
186
187 /**
188 * Create a new SmppMessage from the inbound deliver sm or deliver receipt
189 */
190 public SmppMessage createSmppMessage(DeliverSm deliverSm) throws Exception {
191 SmppMessage smppMessage = new SmppMessage(deliverSm, configuration);
192
193 if (deliverSm.isSmscDeliveryReceipt()) {
194 DeliveryReceipt smscDeliveryReceipt = deliverSm.getShortMessageAsDeliveryReceipt();
195 smppMessage.setBody(smscDeliveryReceipt.getText());
196
197 smppMessage.setHeader(ID, smscDeliveryReceipt.getId());
198 smppMessage.setHeader(DELIVERED, smscDeliveryReceipt.getDelivered());
199 smppMessage.setHeader(DONE_DATE, smscDeliveryReceipt.getDoneDate());
200 if (!"000".equals(smscDeliveryReceipt.getError())) {
201 smppMessage.setHeader(ERROR, smscDeliveryReceipt.getError());
202 }
203 smppMessage.setHeader(SUBMIT_DATE, smscDeliveryReceipt.getSubmitDate());
204 smppMessage.setHeader(SUBMITTED, smscDeliveryReceipt.getSubmitted());
205 smppMessage.setHeader(FINAL_STATUS, smscDeliveryReceipt.getFinalStatus());
206 } else {
207 smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(),
208 configuration.getEncoding())));
209
210 smppMessage.setHeader(SEQUENCE_NUMBER, deliverSm.getSequenceNumber());
211 smppMessage.setHeader(COMMAND_ID, deliverSm.getCommandId());
212 smppMessage.setHeader(SOURCE_ADDR, deliverSm.getSourceAddr());
213 smppMessage.setHeader(DEST_ADDR, deliverSm.getDestAddress());
214 smppMessage.setHeader(SCHEDULE_DELIVERY_TIME, deliverSm.getScheduleDeliveryTime());
215 smppMessage.setHeader(VALIDITY_PERIOD, deliverSm.getValidityPeriod());
216 }
217
218 return smppMessage;
219 }
220
221 /**
222 * Returns the current date. Externalized for better test support.
223 *
224 * @return the current date
225 */
226 Date getCurrentDate() {
227 return new Date();
228 }
229
230 /**
231 * Returns the smpp configuration
232 *
233 * @return the configuration
234 */
235 public SmppConfiguration getConfiguration() {
236 return configuration;
237 }
238
239 /**
240 * Set the smpp configuration.
241 *
242 * @param configuration smppConfiguration
243 */
244 public void setConfiguration(SmppConfiguration configuration) {
245 this.configuration = configuration;
246 }
247 }