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: 954209 $
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
069 private static TimeFormatter timeFormatter = new AbsoluteTimeFormatter();
070
071 private SmppConfiguration configuration;
072
073 public SmppBinding() {
074 this.configuration = new SmppConfiguration();
075 }
076
077 public SmppBinding(SmppConfiguration configuration) {
078 this.configuration = configuration;
079 }
080
081 /**
082 * Create the SubmitSm object from the inbound exchange
083 *
084 * @throws UnsupportedEncodingException if the encoding is not supported
085 */
086 public SubmitSm createSubmitSm(Exchange exchange) throws UnsupportedEncodingException {
087 Message in = exchange.getIn();
088
089 SubmitSm submitSm = new SubmitSm();
090 submitSm.setShortMessage(exchange.getIn().getBody(String.class).getBytes(configuration.getEncoding()));
091
092 if (in.getHeaders().containsKey(DEST_ADDR)) {
093 submitSm.setDestAddress((String) in.getHeader(DEST_ADDR));
094 } else {
095 submitSm.setDestAddress(configuration.getDestAddr());
096 }
097
098 if (in.getHeaders().containsKey(DEST_ADDR_TON)) {
099 submitSm.setDestAddrTon((Byte) in.getHeader(DEST_ADDR_TON));
100 } else {
101 submitSm.setDestAddrTon(configuration.getDestAddrTon());
102 }
103
104 if (in.getHeaders().containsKey(DEST_ADDR_NPI)) {
105 submitSm.setDestAddrNpi((Byte) in.getHeader(DEST_ADDR_NPI));
106 } else {
107 submitSm.setDestAddrNpi(configuration.getDestAddrNpi());
108 }
109
110 if (in.getHeaders().containsKey(SOURCE_ADDR)) {
111 submitSm.setSourceAddr((String) in.getHeader(SOURCE_ADDR));
112 } else {
113 submitSm.setSourceAddr(configuration.getSourceAddr());
114 }
115
116 if (in.getHeaders().containsKey(SOURCE_ADDR_TON)) {
117 submitSm.setSourceAddrTon((Byte) in.getHeader(SOURCE_ADDR_TON));
118 } else {
119 submitSm.setSourceAddrTon(configuration.getSourceAddrTon());
120 }
121
122 if (in.getHeaders().containsKey(SOURCE_ADDR_NPI)) {
123 submitSm.setSourceAddrNpi((Byte) in.getHeader(SOURCE_ADDR_NPI));
124 } else {
125 submitSm.setSourceAddrNpi(configuration.getDestAddrNpi());
126 }
127
128 if (in.getHeaders().containsKey(SERVICE_TYPE)) {
129 submitSm.setServiceType((String) in.getHeader(SERVICE_TYPE));
130 } else {
131 submitSm.setServiceType(configuration.getServiceType());
132 }
133
134 if (in.getHeaders().containsKey(REGISTERED_DELIVERY)) {
135 submitSm.setRegisteredDelivery((Byte) in.getHeader(REGISTERED_DELIVERY));
136 } else {
137 submitSm.setRegisteredDelivery(configuration.getRegisteredDelivery());
138 }
139
140 if (in.getHeaders().containsKey(PROTOCOL_ID)) {
141 submitSm.setProtocolId((Byte) in.getHeader(PROTOCOL_ID));
142 } else {
143 submitSm.setProtocolId(configuration.getProtocolId());
144 }
145
146 if (in.getHeaders().containsKey(PRIORITY_FLAG)) {
147 submitSm.setPriorityFlag((Byte) in.getHeader(PRIORITY_FLAG));
148 } else {
149 submitSm.setPriorityFlag(configuration.getPriorityFlag());
150 }
151
152 if (in.getHeaders().containsKey(SCHEDULE_DELIVERY_TIME)) {
153 submitSm.setScheduleDeliveryTime(timeFormatter.format((Date) in.getHeader(SCHEDULE_DELIVERY_TIME)));
154 }
155
156 if (in.getHeaders().containsKey(VALIDITY_PERIOD)) {
157 submitSm.setValidityPeriod(timeFormatter.format((Date) in.getHeader(VALIDITY_PERIOD)));
158 }
159
160 if (in.getHeaders().containsKey(REPLACE_IF_PRESENT_FLAG)) {
161 submitSm.setReplaceIfPresent((Byte) in.getHeader(REPLACE_IF_PRESENT_FLAG));
162 } else {
163 submitSm.setReplaceIfPresent(configuration.getReplaceIfPresentFlag());
164 }
165
166 return submitSm;
167 }
168
169 /**
170 * Create a new SmppMessage from the inbound alert notification
171 */
172 public SmppMessage createSmppMessage(AlertNotification alertNotification) {
173 SmppMessage smppMessage = new SmppMessage(alertNotification, configuration);
174
175 smppMessage.setHeader(SEQUENCE_NUMBER, alertNotification.getSequenceNumber());
176 smppMessage.setHeader(COMMAND_ID, alertNotification.getCommandId());
177 smppMessage.setHeader(COMMAND_STATUS, alertNotification.getCommandStatus());
178 smppMessage.setHeader(SOURCE_ADDR, alertNotification.getSourceAddr());
179 smppMessage.setHeader(SOURCE_ADDR_NPI, alertNotification.getSourceAddrNpi());
180 smppMessage.setHeader(SOURCE_ADDR_TON, alertNotification.getSourceAddrTon());
181 smppMessage.setHeader(ESME_ADDR, alertNotification.getEsmeAddr());
182 smppMessage.setHeader(ESME_ADDR_NPI, alertNotification.getEsmeAddrNpi());
183 smppMessage.setHeader(ESME_ADDR_TON, alertNotification.getEsmeAddrTon());
184
185 return smppMessage;
186 }
187
188 /**
189 * Create a new SmppMessage from the inbound deliver sm or deliver receipt
190 */
191 public SmppMessage createSmppMessage(DeliverSm deliverSm) throws Exception {
192 SmppMessage smppMessage = new SmppMessage(deliverSm, configuration);
193
194 if (deliverSm.isSmscDeliveryReceipt()) {
195 DeliveryReceipt smscDeliveryReceipt = deliverSm.getShortMessageAsDeliveryReceipt();
196 smppMessage.setBody(smscDeliveryReceipt.getText());
197
198 smppMessage.setHeader(ID, smscDeliveryReceipt.getId());
199 smppMessage.setHeader(DELIVERED, smscDeliveryReceipt.getDelivered());
200 smppMessage.setHeader(DONE_DATE, smscDeliveryReceipt.getDoneDate());
201 if (!"000".equals(smscDeliveryReceipt.getError())) {
202 smppMessage.setHeader(ERROR, smscDeliveryReceipt.getError());
203 }
204 smppMessage.setHeader(SUBMIT_DATE, smscDeliveryReceipt.getSubmitDate());
205 smppMessage.setHeader(SUBMITTED, smscDeliveryReceipt.getSubmitted());
206 smppMessage.setHeader(FINAL_STATUS, smscDeliveryReceipt.getFinalStatus());
207 } else {
208 smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(),
209 configuration.getEncoding())));
210
211 smppMessage.setHeader(SEQUENCE_NUMBER, deliverSm.getSequenceNumber());
212 smppMessage.setHeader(COMMAND_ID, deliverSm.getCommandId());
213 smppMessage.setHeader(SOURCE_ADDR, deliverSm.getSourceAddr());
214 smppMessage.setHeader(DEST_ADDR, deliverSm.getDestAddress());
215 smppMessage.setHeader(SCHEDULE_DELIVERY_TIME, deliverSm.getScheduleDeliveryTime());
216 smppMessage.setHeader(VALIDITY_PERIOD, deliverSm.getValidityPeriod());
217 smppMessage.setHeader(SERVICE_TYPE, deliverSm.getServiceType());
218 }
219
220 return smppMessage;
221 }
222
223 public SmppMessage createSmppMessage(DataSm dataSm, String smppMessageId) {
224 SmppMessage smppMessage = new SmppMessage(dataSm, configuration);
225
226 smppMessage.setHeader(ID, smppMessageId);
227 smppMessage.setHeader(SEQUENCE_NUMBER, dataSm.getSequenceNumber());
228 smppMessage.setHeader(COMMAND_ID, dataSm.getCommandId());
229 smppMessage.setHeader(COMMAND_STATUS, dataSm.getCommandStatus());
230 smppMessage.setHeader(SOURCE_ADDR, dataSm.getSourceAddr());
231 smppMessage.setHeader(SOURCE_ADDR_NPI, dataSm.getSourceAddrNpi());
232 smppMessage.setHeader(SOURCE_ADDR_TON, dataSm.getSourceAddrTon());
233 smppMessage.setHeader(DEST_ADDR, dataSm.getDestAddress());
234 smppMessage.setHeader(DEST_ADDR_NPI, dataSm.getDestAddrNpi());
235 smppMessage.setHeader(DEST_ADDR_TON, dataSm.getDestAddrTon());
236 smppMessage.setHeader(SERVICE_TYPE, dataSm.getServiceType());
237 smppMessage.setHeader(REGISTERED_DELIVERY, dataSm.getRegisteredDelivery());
238
239 return smppMessage;
240 }
241
242 /**
243 * Returns the current date. Externalized for better test support.
244 *
245 * @return the current date
246 */
247 Date getCurrentDate() {
248 return new Date();
249 }
250
251 /**
252 * Returns the smpp configuration
253 *
254 * @return the configuration
255 */
256 public SmppConfiguration getConfiguration() {
257 return configuration;
258 }
259
260 /**
261 * Set the smpp configuration.
262 *
263 * @param configuration smppConfiguration
264 */
265 public void setConfiguration(SmppConfiguration configuration) {
266 this.configuration = configuration;
267 }
268 }