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    }