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    }