=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsSender.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsSender.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsSender.java 2016-03-07 13:15:24 +0000 @@ -45,4 +45,6 @@ throws SmsServiceException; String sendMessage( String subject, String text, User sender, List users, boolean forceSend ); + + boolean sendAyncMessages( OutboundSms sms ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsService.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsService.java 2016-03-07 13:15:24 +0000 @@ -30,6 +30,8 @@ import java.util.List; +import org.smslib.OutboundMessage; + public interface OutboundSmsService { String ID = OutboundSmsService.class.getName(); @@ -49,4 +51,6 @@ List getOutboundSms( OutboundSmsStatus status, Integer min, Integer max ); OutboundSms getOutboundSms( int id ); + + OutboundSms convertToOutboundSms (OutboundMessage sms); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsTransportService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsTransportService.java 2016-01-07 15:15:30 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsTransportService.java 2016-03-07 13:15:24 +0000 @@ -71,4 +71,6 @@ String sendMessage( OutboundSms sms, String gatewayId ) throws SmsServiceException; + + boolean sendAyncMessages(OutboundSms sms, String gatewayId); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DefaultSmsSender.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DefaultSmsSender.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DefaultSmsSender.java 2016-03-07 13:15:24 +0000 @@ -203,6 +203,19 @@ return message; } + @Transactional + @Override + public boolean sendAyncMessages( OutboundSms sms ) + throws SmsServiceException + { + if ( transportService == null || !transportService.isEnabled() ) + { + throw new SmsServiceNotEnabledException(); + } + + return transportService.sendAyncMessages( sms, transportService.getDefaultGateway() ); + } + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- === added file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundNotification.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundNotification.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundNotification.java 2016-03-07 13:15:24 +0000 @@ -0,0 +1,82 @@ +package org.hisp.dhis.sms.outbound; + +/* + * Copyright (c) 2004-2016, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.smslib.AGateway; +import org.smslib.IOutboundMessageNotification; +import org.smslib.OutboundMessage; +import org.smslib.OutboundMessage.MessageStatuses; +import org.springframework.beans.factory.annotation.Autowired; + +public class DefaultOutboundNotification + implements IOutboundMessageNotification +{ + + private static final Log log = LogFactory.getLog( DefaultOutboundNotification.class ); + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired + private OutboundSmsService outboundSmsService; + + private OutboundSms outboundSms; + + public void setOutboundSms( OutboundSms outboundSms ) + { + this.outboundSms = outboundSms; + } + + // ------------------------------------------------------------------------- + // Implementation + // ------------------------------------------------------------------------- + + @Override + public void process( AGateway gateway, OutboundMessage msg ) + { + log.info( "SENDING via " + gateway.getGatewayId() + " " ); + + outboundSms = outboundSmsService.convertToOutboundSms( msg ); + outboundSmsService.saveOutboundSms( outboundSms ); + + if ( msg.getMessageStatus() == MessageStatuses.SENT ) + { + log.info( "SENT To ::: " + msg.getRecipient() ); + } + else + { + log.info( "FAILED To ::: " + msg.getRecipient() ); + } + + } + +} === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsService.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsService.java 2016-03-07 13:15:24 +0000 @@ -1,5 +1,7 @@ package org.hisp.dhis.sms.outbound; +import java.util.HashSet; + /* * Copyright (c) 2004-2016, University of Oslo * All rights reserved. @@ -29,7 +31,10 @@ */ import java.util.List; +import java.util.Set; +import org.smslib.OutboundMessage; +import org.smslib.OutboundMessage.MessageStatuses; import org.springframework.transaction.annotation.Transactional; /** @@ -104,4 +109,33 @@ { return outboundSmsStore.getAllOutboundSms( min, max ); } + + @Override + public OutboundSms convertToOutboundSms( OutboundMessage sms ) + { + if ( sms == null ) + { + return null; + } + + Set recipients = new HashSet(); + recipients.add( sms.getRecipient() ); + + OutboundSms outboundSms = new OutboundSms(); + outboundSms.setMessage( sms.getText() ); + outboundSms.setRecipients( recipients ); + outboundSms.setDate( sms.getDate() ); + + if ( sms.getMessageStatus() == MessageStatuses.SENT ) + { + outboundSms.setStatus( OutboundSmsStatus.SENT ); + } + else + { + outboundSms.setStatus( OutboundSmsStatus.ERROR ); + } + + return outboundSms; + } + } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsTransportService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsTransportService.java 2016-01-07 15:15:30 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsTransportService.java 2016-03-07 13:15:24 +0000 @@ -79,6 +79,13 @@ { this.smppInboundMessageNotification = smppInboundMessageNotification; } + + private IOutboundMessageNotification outboundMessageNotification; + + public void setOutboundMessageNotification( IOutboundMessageNotification outboundMessageNotification ) + { + this.outboundMessageNotification = outboundMessageNotification; + } private OutboundSmsService outboundSmsService; @@ -463,13 +470,6 @@ log.warn( "Unable to send message: " + sms, e ); message = "Unable to send message: " + sms + " " + e.getCause().getMessage(); } - finally - { - if ( recipients.size() > 1 ) - { - removeGroup( recipient ); - } - } if ( outboundMessage.getMessageStatus() == MessageStatuses.SENT ) { @@ -496,6 +496,57 @@ return message; } + @Override + public boolean sendAyncMessages( OutboundSms sms, String gatewayId ) + { + + String recipient = null; + + Set recipients = sms.getRecipients(); + + if ( recipients.size() == 1 ) + { + recipient = recipients.iterator().next(); + } + else + { + recipient = createTmpGroup( recipients ); + } + + OutboundMessage outboundMessage = new OutboundMessage( recipient, sms.getMessage() ); + + for ( char each : sms.getMessage().toCharArray() ) + { + if ( !Character.UnicodeBlock.of( each ).equals( UnicodeBlock.BASIC_LATIN ) ) + { + outboundMessage.setEncoding( MessageEncodings.ENCUCS2 ); + break; + } + } + + outboundMessage.setStatusReport( true ); + + String longNumber = config.getLongNumber(); + + if ( longNumber != null && !longNumber.isEmpty() ) + { + outboundMessage.setFrom( longNumber ); + } + + try + { + getService().setOutboundMessageNotification( outboundMessageNotification ); + getService().queueMessage( outboundMessage, gatewayId ); + return true; + } + catch ( Exception e ) + { + log.warn( "ASYNC Message sending failed ", e ); + } + + return false; + } + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- @@ -517,21 +568,17 @@ private String createTmpGroup( Set recipients ) { - String groupName = Thread.currentThread().getName(); - - getService().createGroup( groupName ); - - for ( String recepient : recipients ) + String recipientList = ""; + + for ( String recipient : recipients ) { - getService().addToGroup( groupName, recepient ); + recipientList += recipient; + recipientList += ","; } - return groupName; - } + recipientList = recipientList.substring( 0, recipientList.length() - 1 ); - private void removeGroup( String groupName ) - { - getService().removeGroup( groupName ); + return recipientList; } @Override === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2016-02-24 04:25:21 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2016-03-07 13:15:24 +0000 @@ -1115,13 +1115,16 @@ - + + + - + + === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/sms/SmsController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/sms/SmsController.java 2016-02-01 07:36:06 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/sms/SmsController.java 2016-03-07 13:15:24 +0000 @@ -105,20 +105,32 @@ @PreAuthorize( "hasRole('ALL') or hasRole(' F_MOBILE_SENDSMS')" ) @RequestMapping( value = "/outbound", method = RequestMethod.POST, consumes = "application/json" ) - public void sendSMSMessage( HttpServletResponse response, HttpServletRequest request ) - throws WebMessageException, IOException + public void sendSMSMessage( @RequestParam( required = false ) boolean async, HttpServletResponse response, + HttpServletRequest request) + throws WebMessageException, IOException { OutboundSms sms = renderService.fromJson( request.getInputStream(), OutboundSms.class ); - String result = smsSender.sendMessage( sms ); - - if ( result.equals( "success" ) ) + if ( async ) { - webMessageService.send( WebMessageUtils.ok( "Message sent" ), response, request ); + smsSender.sendAyncMessages( sms ); + + webMessageService.send( WebMessageUtils.ok( "Message Sent asynchronously" ), response, request ); + } else { - webMessageService.send( WebMessageUtils.error( "Message sending failed" ), response, request ); + String result = smsSender.sendMessage( sms ); + + if ( result.equals( "success" ) ) + { + webMessageService.send( WebMessageUtils.ok( "Message sent" ), response, request ); + } + else + { + throw new WebMessageException( WebMessageUtils.error( "Message seding failed" ) ); + } + } }