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.DataSm;
027 import org.jsmpp.bean.DeliverSm;
028 import org.jsmpp.bean.DeliveryReceipt;
029 import org.jsmpp.bean.SubmitSm;
030 import org.jsmpp.util.AbsoluteTimeFormatter;
031 import org.jsmpp.util.TimeFormatter;
032
033 /**
034 * A Strategy used to convert between a Camel {@link Exchange} and
035 * {@link SmppMessage} to and from a SMPP {@link Command}
036 *
037 * @version $Revision: 993126 $
038 * @author muellerc
039 */
040 public class SmppBinding {
041
042 public static final String SEQUENCE_NUMBER = "CamelSmppSequenceNumber";
043 public static final String SUBMITTED = "CamelSmppSubmitted";
044 public static final String SUBMIT_DATE = "CamelSmppSubmitDate";
045 public static final String ERROR = "CamelSmppError";
046 public static final String DONE_DATE = "CamelSmppDoneDate";
047 public static final String DELIVERED = "CamelSmppDelivered";
048 public static final String COMMAND_ID = "CamelSmppCommandId";
049 public static final String COMMAND_STATUS = "CamelSmppCommandStatus";
050 public static final String ID = "CamelSmppId";
051 public static final String REPLACE_IF_PRESENT_FLAG = "CamelSmppReplaceIfPresentFlag";
052 public static final String VALIDITY_PERIOD = "CamelSmppValidityPeriod";
053 public static final String SCHEDULE_DELIVERY_TIME = "CamelSmppScheduleDeliveryTime";
054 public static final String PRIORITY_FLAG = "CamelSmppPriorityFlag";
055 public static final String PROTOCOL_ID = "CamelSmppProtocolId";
056 public static final String REGISTERED_DELIVERY = "CamelSmppRegisteredDelivery";
057 public static final String SERVICE_TYPE = "CamelSmppServiceType";
058 public static final String SOURCE_ADDR_NPI = "CamelSmppSourceAddrNpi";
059 public static final String SOURCE_ADDR_TON = "CamelSmppSourceAddrTon";
060 public static final String SOURCE_ADDR = "CamelSmppSourceAddr";
061 public static final String DEST_ADDR_NPI = "CamelSmppDestAddrNpi";
062 public static final String DEST_ADDR_TON = "CamelSmppDestAddrTon";
063 public static final String DEST_ADDR = "CamelSmppDestAddr";
064 public static final String ESME_ADDR_NPI = "CamelSmppEsmeAddrNpi";
065 public static final String ESME_ADDR_TON = "CamelSmppEsmeAddrTon";
066 public static final String ESME_ADDR = "CamelSmppEsmeAddr";
067 public static final String FINAL_STATUS = "CamelSmppStatus";
068 public static final String DATA_CODING = "CamelSmppDataCoding";
069
070 private static TimeFormatter timeFormatter = new AbsoluteTimeFormatter();
071
072 private SmppConfiguration configuration;
073
074 public SmppBinding() {
075 this.configuration = new SmppConfiguration();
076 }
077
078 public SmppBinding(SmppConfiguration configuration) {
079 this.configuration = configuration;
080 }
081
082 /**
083 * Create the SubmitSm object from the inbound exchange
084 *
085 * @throws UnsupportedEncodingException if the encoding is not supported
086 */
087 public SubmitSm createSubmitSm(Exchange exchange) throws UnsupportedEncodingException {
088 Message in = exchange.getIn();
089
090 SubmitSm submitSm = new SubmitSm();
091 submitSm.setShortMessage(exchange.getIn().getBody(String.class).getBytes(configuration.getEncoding()));
092
093 if (in.getHeaders().containsKey(DEST_ADDR)) {
094 submitSm.setDestAddress((String) in.getHeader(DEST_ADDR));
095 } else {
096 submitSm.setDestAddress(configuration.getDestAddr());
097 }
098
099 if (in.getHeaders().containsKey(DEST_ADDR_TON)) {
100 submitSm.setDestAddrTon((Byte) in.getHeader(DEST_ADDR_TON));
101 } else {
102 submitSm.setDestAddrTon(configuration.getDestAddrTon());
103 }
104
105 if (in.getHeaders().containsKey(DEST_ADDR_NPI)) {
106 submitSm.setDestAddrNpi((Byte) in.getHeader(DEST_ADDR_NPI));
107 } else {
108 submitSm.setDestAddrNpi(configuration.getDestAddrNpi());
109 }
110
111 if (in.getHeaders().containsKey(SOURCE_ADDR)) {
112 submitSm.setSourceAddr((String) in.getHeader(SOURCE_ADDR));
113 } else {
114 submitSm.setSourceAddr(configuration.getSourceAddr());
115 }
116
117 if (in.getHeaders().containsKey(SOURCE_ADDR_TON)) {
118 submitSm.setSourceAddrTon((Byte) in.getHeader(SOURCE_ADDR_TON));
119 } else {
120 submitSm.setSourceAddrTon(configuration.getSourceAddrTon());
121 }
122
123 if (in.getHeaders().containsKey(SOURCE_ADDR_NPI)) {
124 submitSm.setSourceAddrNpi((Byte) in.getHeader(SOURCE_ADDR_NPI));
125 } else {
126 submitSm.setSourceAddrNpi(configuration.getSourceAddrNpi());
127 }
128
129 if (in.getHeaders().containsKey(SERVICE_TYPE)) {
130 submitSm.setServiceType((String) in.getHeader(SERVICE_TYPE));
131 } else {
132 submitSm.setServiceType(configuration.getServiceType());
133 }
134
135 if (in.getHeaders().containsKey(REGISTERED_DELIVERY)) {
136 submitSm.setRegisteredDelivery((Byte) in.getHeader(REGISTERED_DELIVERY));
137 } else {
138 submitSm.setRegisteredDelivery(configuration.getRegisteredDelivery());
139 }
140
141 if (in.getHeaders().containsKey(PROTOCOL_ID)) {
142 submitSm.setProtocolId((Byte) in.getHeader(PROTOCOL_ID));
143 } else {
144 submitSm.setProtocolId(configuration.getProtocolId());
145 }
146
147 if (in.getHeaders().containsKey(PRIORITY_FLAG)) {
148 submitSm.setPriorityFlag((Byte) in.getHeader(PRIORITY_FLAG));
149 } else {
150 submitSm.setPriorityFlag(configuration.getPriorityFlag());
151 }
152
153 if (in.getHeaders().containsKey(SCHEDULE_DELIVERY_TIME)) {
154 submitSm.setScheduleDeliveryTime(timeFormatter.format((Date) in.getHeader(SCHEDULE_DELIVERY_TIME)));
155 }
156
157 if (in.getHeaders().containsKey(VALIDITY_PERIOD)) {
158 submitSm.setValidityPeriod(timeFormatter.format((Date) in.getHeader(VALIDITY_PERIOD)));
159 }
160
161 if (in.getHeaders().containsKey(REPLACE_IF_PRESENT_FLAG)) {
162 submitSm.setReplaceIfPresent((Byte) in.getHeader(REPLACE_IF_PRESENT_FLAG));
163 } else {
164 submitSm.setReplaceIfPresent(configuration.getReplaceIfPresentFlag());
165 }
166
167 if (in.getHeaders().containsKey(DATA_CODING)) {
168 System.out.println("1");
169 submitSm.setDataCoding((Byte) in.getHeader(DATA_CODING));
170 } else {
171 System.out.println("2");
172 submitSm.setDataCoding(configuration.getDataCoding());
173 }
174
175 return submitSm;
176 }
177
178 /**
179 * Create a new SmppMessage from the inbound alert notification
180 */
181 public SmppMessage createSmppMessage(AlertNotification alertNotification) {
182 SmppMessage smppMessage = new SmppMessage(alertNotification, configuration);
183
184 smppMessage.setHeader(SEQUENCE_NUMBER, alertNotification.getSequenceNumber());
185 smppMessage.setHeader(COMMAND_ID, alertNotification.getCommandId());
186 smppMessage.setHeader(COMMAND_STATUS, alertNotification.getCommandStatus());
187 smppMessage.setHeader(SOURCE_ADDR, alertNotification.getSourceAddr());
188 smppMessage.setHeader(SOURCE_ADDR_NPI, alertNotification.getSourceAddrNpi());
189 smppMessage.setHeader(SOURCE_ADDR_TON, alertNotification.getSourceAddrTon());
190 smppMessage.setHeader(ESME_ADDR, alertNotification.getEsmeAddr());
191 smppMessage.setHeader(ESME_ADDR_NPI, alertNotification.getEsmeAddrNpi());
192 smppMessage.setHeader(ESME_ADDR_TON, alertNotification.getEsmeAddrTon());
193
194 return smppMessage;
195 }
196
197 /**
198 * Create a new SmppMessage from the inbound deliver sm or deliver receipt
199 */
200 public SmppMessage createSmppMessage(DeliverSm deliverSm) throws Exception {
201 SmppMessage smppMessage = new SmppMessage(deliverSm, configuration);
202
203 if (deliverSm.isSmscDeliveryReceipt()) {
204 DeliveryReceipt smscDeliveryReceipt = deliverSm.getShortMessageAsDeliveryReceipt();
205 smppMessage.setBody(smscDeliveryReceipt.getText());
206
207 smppMessage.setHeader(ID, smscDeliveryReceipt.getId());
208 smppMessage.setHeader(DELIVERED, smscDeliveryReceipt.getDelivered());
209 smppMessage.setHeader(DONE_DATE, smscDeliveryReceipt.getDoneDate());
210 if (!"000".equals(smscDeliveryReceipt.getError())) {
211 smppMessage.setHeader(ERROR, smscDeliveryReceipt.getError());
212 }
213 smppMessage.setHeader(SUBMIT_DATE, smscDeliveryReceipt.getSubmitDate());
214 smppMessage.setHeader(SUBMITTED, smscDeliveryReceipt.getSubmitted());
215 smppMessage.setHeader(FINAL_STATUS, smscDeliveryReceipt.getFinalStatus());
216 } else {
217 smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(),
218 configuration.getEncoding())));
219
220 smppMessage.setHeader(SEQUENCE_NUMBER, deliverSm.getSequenceNumber());
221 smppMessage.setHeader(COMMAND_ID, deliverSm.getCommandId());
222 smppMessage.setHeader(SOURCE_ADDR, deliverSm.getSourceAddr());
223 smppMessage.setHeader(DEST_ADDR, deliverSm.getDestAddress());
224 smppMessage.setHeader(SCHEDULE_DELIVERY_TIME, deliverSm.getScheduleDeliveryTime());
225 smppMessage.setHeader(VALIDITY_PERIOD, deliverSm.getValidityPeriod());
226 smppMessage.setHeader(SERVICE_TYPE, deliverSm.getServiceType());
227 }
228
229 return smppMessage;
230 }
231
232 public SmppMessage createSmppMessage(DataSm dataSm, String smppMessageId) {
233 SmppMessage smppMessage = new SmppMessage(dataSm, configuration);
234
235 smppMessage.setHeader(ID, smppMessageId);
236 smppMessage.setHeader(SEQUENCE_NUMBER, dataSm.getSequenceNumber());
237 smppMessage.setHeader(COMMAND_ID, dataSm.getCommandId());
238 smppMessage.setHeader(COMMAND_STATUS, dataSm.getCommandStatus());
239 smppMessage.setHeader(SOURCE_ADDR, dataSm.getSourceAddr());
240 smppMessage.setHeader(SOURCE_ADDR_NPI, dataSm.getSourceAddrNpi());
241 smppMessage.setHeader(SOURCE_ADDR_TON, dataSm.getSourceAddrTon());
242 smppMessage.setHeader(DEST_ADDR, dataSm.getDestAddress());
243 smppMessage.setHeader(DEST_ADDR_NPI, dataSm.getDestAddrNpi());
244 smppMessage.setHeader(DEST_ADDR_TON, dataSm.getDestAddrTon());
245 smppMessage.setHeader(SERVICE_TYPE, dataSm.getServiceType());
246 smppMessage.setHeader(REGISTERED_DELIVERY, dataSm.getRegisteredDelivery());
247 smppMessage.setHeader(DATA_CODING, dataSm.getDataCoding());
248
249 return smppMessage;
250 }
251
252 /**
253 * Returns the current date. Externalized for better test support.
254 *
255 * @return the current date
256 */
257 Date getCurrentDate() {
258 return new Date();
259 }
260
261 /**
262 * Returns the smpp configuration
263 *
264 * @return the configuration
265 */
266 public SmppConfiguration getConfiguration() {
267 return configuration;
268 }
269
270 /**
271 * Set the smpp configuration.
272 *
273 * @param configuration smppConfiguration
274 */
275 public void setConfiguration(SmppConfiguration configuration) {
276 this.configuration = configuration;
277 }
278 }