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 }