=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsConsumer.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsConsumer.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsConsumer.java 2015-12-14 10:17:29 +0000 @@ -31,5 +31,6 @@ public interface SmsConsumer { void start(); + void stop(); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsServiceNotEnabledException.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsServiceNotEnabledException.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/SmsServiceNotEnabledException.java 2015-12-14 10:17:29 +0000 @@ -33,7 +33,7 @@ { private static final long serialVersionUID = -1484667419558937721L; - public SmsServiceNotEnabledException( ) + public SmsServiceNotEnabledException() { super( "Sms service is not enabled" ); } === added directory 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command' === renamed file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommand.java' => 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command/SMSCommand.java' === renamed file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSSpecialCharacter.java' => 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command/SMSSpecialCharacter.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSSpecialCharacter.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command/SMSSpecialCharacter.java 2015-12-14 10:17:29 +0000 @@ -1,32 +1,32 @@ package org.hisp.dhis.sms.command; - /* - * Copyright (c) 2004-2015, 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. - */ +/* +* Copyright (c) 2004-2015, 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. +*/ /** * @author Nguyen Kim Lai @@ -36,15 +36,15 @@ public class SMSSpecialCharacter { private int id; - + private String name; - + private String value; public SMSSpecialCharacter() { } - + public SMSSpecialCharacter( String name, String value ) { this.name = name; === added directory 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command/code' === renamed file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/code/SMSCode.java' => 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command/code/SMSCode.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/code/SMSCode.java 2015-06-23 15:59:19 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/command/code/SMSCode.java 2015-12-14 10:17:29 +0000 @@ -38,11 +38,11 @@ private String code; private DataElement dataElement; - + private TrackedEntityAttribute trackedEntityAttribute; private int optionId; - + private String formula; public SMSCode( String code, DataElement dataElement, int optionId ) @@ -51,8 +51,8 @@ this.dataElement = dataElement; this.optionId = optionId; } - - public SMSCode( String code, TrackedEntityAttribute trackedEntityAttribute) + + public SMSCode( String code, TrackedEntityAttribute trackedEntityAttribute ) { this.code = code; this.trackedEntityAttribute = trackedEntityAttribute; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/BulkSmsGatewayConfig.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/BulkSmsGatewayConfig.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/BulkSmsGatewayConfig.java 2015-12-14 10:17:29 +0000 @@ -36,7 +36,7 @@ private String username; private String password; - + private String region; public String getUsername() @@ -58,7 +58,7 @@ { this.password = password; } - + public String getRegion() { return region; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/ModemGatewayConfig.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/ModemGatewayConfig.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/ModemGatewayConfig.java 2015-12-14 10:17:29 +0000 @@ -44,7 +44,7 @@ private String pin; private String simMemLocation; - + private Integer pollingInterval; private boolean inbound; === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SMSGatewayStatus.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SMSGatewayStatus.java 2015-11-24 13:14:24 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SMSGatewayStatus.java 2015-12-14 10:17:29 +0000 @@ -33,6 +33,6 @@ */ public enum SMSGatewayStatus { - STOPPED,STOPPING, STARTING, STARTED, UNDEFINED + STOPPED, STOPPING, STARTING, STARTED, UNDEFINED } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfigurable.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfigurable.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfigurable.java 2015-12-14 10:17:29 +0000 @@ -36,8 +36,8 @@ public interface SmsConfigurable { /** - * Initialize the service with the provided configuration. Services - * implementing this interface are also expected to be able to reinitialize + * Initialize the service with the provided configuration. Services + * implementing this interface are also expected to be able to reinitialize * based on these setting in a safe way when running. * * @param smsConfiguration The SMS configuration === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfiguration.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfiguration.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfiguration.java 2015-12-14 10:17:29 +0000 @@ -97,7 +97,7 @@ @XmlElements( { @XmlElement( name = "bulksms", type = BulkSmsGatewayConfig.class ), @XmlElement( name = "clickatell", type = ClickatellGatewayConfig.class ), @XmlElement( name = "http", type = GenericHttpGatewayConfig.class ), - @XmlElement( name = "modem", type = ModemGatewayConfig.class ) } ) + @XmlElement( name = "modem", type = ModemGatewayConfig.class ) }) public List getGateways() { return gateways; @@ -117,17 +117,17 @@ { this.pollingInterval = pollingInterval; } - + public SmsGatewayConfig getDefaultGateway() { for ( SmsGatewayConfig gw : gateways ) - { + { if ( gw.isDefault() ) { return gw; } } - + return null; } } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfigurationManager.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfigurationManager.java 2015-11-24 13:14:24 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/config/SmsConfigurationManager.java 2015-12-14 10:17:29 +0000 @@ -36,14 +36,14 @@ SmsConfiguration getSmsConfiguration(); void updateSmsConfiguration( SmsConfiguration config ); - + SmsGatewayConfig checkInstanceOfGateway( Class clazz ); - - boolean setDefaultSMSGateway(String gatewayId); - - boolean gatewayExists (String gatewayId); - - boolean removeSMSGatewayById(String gatewayId); - + + boolean setDefaultSMSGateway( String gatewayId ); + + boolean gatewayExists( String gatewayId ); + + boolean removeSMSGatewayById( String gatewayId ); + String addSMSGateway(); } \ No newline at end of file === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSms.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSms.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSms.java 2015-12-14 10:17:29 +0000 @@ -33,7 +33,7 @@ public class IncomingSms implements Serializable -{ +{ private static final long serialVersionUID = 3954710607630454226L; private Integer id; @@ -61,7 +61,7 @@ private SmsMessageStatus status = SmsMessageStatus.INCOMING; private String statusMessage; - + private boolean parsed = false; /** @@ -143,7 +143,7 @@ { if ( bytes != null ) { - throw new IllegalArgumentException("Text and bytes cannot both be set on incoming sms"); + throw new IllegalArgumentException( "Text and bytes cannot both be set on incoming sms" ); } this.text = text; } @@ -157,7 +157,7 @@ { if ( text != null ) { - throw new IllegalArgumentException("Text and bytes cannot both be set on incoming sms"); + throw new IllegalArgumentException( "Text and bytes cannot both be set on incoming sms" ); } this.bytes = bytes; } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsListener.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsListener.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsListener.java 2015-12-14 10:17:29 +0000 @@ -34,7 +34,7 @@ { @Transactional boolean accept( IncomingSms sms ); - + @Transactional void receive( IncomingSms sms ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsService.java 2015-11-24 10:16:34 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsService.java 2015-12-14 13:35:40 +0000 @@ -29,6 +29,7 @@ */ import java.util.List; +import java.util.Date; import org.hisp.dhis.sms.MessageQueue; import org.smslib.InboundMessage; @@ -61,9 +62,9 @@ List getMsgList(); - void save( IncomingSms sms ); + int save( IncomingSms sms ); - void save( String message, String originator, String gateway ); + int save( String message, String originator, String gateway, Date receivedTime ); void setIncomingSmsQueue( MessageQueue incomingSmsQueue ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsStore.java 2015-09-16 14:49:50 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/incoming/IncomingSmsStore.java 2015-12-14 10:17:29 +0000 @@ -30,21 +30,21 @@ import java.util.List; -/** +/** * Store for incoming SMS messages. */ public interface IncomingSmsStore { String ID = IncomingSmsStore.class.getName(); - + int save( IncomingSms incomingSms ); - - void update ( IncomingSms incomingSms ); + + void update( IncomingSms incomingSms ); IncomingSms get( int id ); List getSmsByStatus( SmsMessageStatus status, String keyword ); - + List getSmsByStatus( SmsMessageStatus status, String keyword, Integer min, Integer max ); List getSmsByOriginator( String originator ); @@ -52,8 +52,8 @@ long getSmsCount(); List getAllSmses(); - - void delete( IncomingSms incomingSms); - + + void delete( IncomingSms incomingSms ); + List getAllUnparsedSmses(); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSms.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSms.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSms.java 2015-12-14 10:17:29 +0000 @@ -35,13 +35,13 @@ import org.hisp.dhis.common.BaseIdentifiableObject; -public class OutboundSms +public class OutboundSms extends BaseIdentifiableObject { public static final String DHIS_SYSTEM_SENDER = "DHIS-System"; private String sender; - + private Set recipients; private Date date; === 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 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsService.java 2015-12-08 16:52:53 +0000 @@ -30,15 +30,12 @@ import java.util.List; -/** - * OutboundSmsService provides support for sending SMSes. - */ public interface OutboundSmsService { String ID = OutboundSmsService.class.getName(); List getAllOutboundSms(); - + List getAllOutboundSms( Integer min, Integer max ); int saveOutboundSms( OutboundSms sms ); @@ -48,8 +45,8 @@ void deleteById( Integer outboundSmsId ); List getOutboundSms( OutboundSmsStatus status ); - + List getOutboundSms( OutboundSmsStatus status, Integer min, Integer max ); - + OutboundSms getOutboundSms( int id ); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsStore.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsStore.java 2015-12-08 16:52:53 +0000 @@ -33,18 +33,18 @@ public interface OutboundSmsStore { int saveOutboundSms( OutboundSms sms ); - + List getAllOutboundSms(); - + List getAllOutboundSms( Integer min, Integer max ); OutboundSms getOutboundSmsbyId( int id ); - + List get( OutboundSmsStatus status ); - + List get( OutboundSmsStatus status, Integer min, Integer max ); - + void updateOutboundSms( OutboundSms sms ); - + void deleteOutboundSms( OutboundSms 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 2015-11-24 13:14:24 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/outbound/OutboundSmsTransportService.java 2015-12-14 10:17:29 +0000 @@ -39,9 +39,9 @@ * Marker interface for {@code OutboundSmsService outbound sms services} * providing actual SMS sending. */ -public interface OutboundSmsTransportService +public interface OutboundSmsTransportService extends SmsConfigurable -{ +{ Map getGatewayMap(); void stopService(); @@ -56,9 +56,9 @@ String getMessageStatus(); String getDefaultGateway(); - + SMSServiceStatus getServiceStatusEnum(); - + SMSGatewayStatus getGatewayStatus(); boolean isEnabled(); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/parse/ParserType.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/parse/ParserType.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/parse/ParserType.java 2015-12-14 10:17:29 +0000 @@ -30,11 +30,5 @@ public enum ParserType { - KEY_VALUE_PARSER, - J2ME_PARSER, - ALERT_PARSER, - UNREGISTERED_PARSER, - ANONYMOUS_PROGRAM_PARSER, - TRACKED_ENTITY_REGISTRATION_PARSER, - PROGRAM_STAGE_DATAENTRY_PARSER + KEY_VALUE_PARSER, J2ME_PARSER, ALERT_PARSER, UNREGISTERED_PARSER, ANONYMOUS_PROGRAM_PARSER, TRACKED_ENTITY_REGISTRATION_PARSER, PROGRAM_STAGE_DATAENTRY_PARSER } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java 2015-10-19 11:25:31 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java 2015-12-11 11:21:38 +0000 @@ -93,7 +93,7 @@ } private EmailService emailService; - + public void setEmailService( EmailService emailService ) { this.emailService = emailService; @@ -129,7 +129,7 @@ log.info( "Found the following message senders: " + messageSenders ); } - + // ------------------------------------------------------------------------- // MessageService implementation // ------------------------------------------------------------------------- @@ -141,8 +141,8 @@ } @Override - public int sendMessage( String subject, String text, String metaData, Set users_, - User sender, boolean includeFeedbackRecipients, boolean forceNotifications ) + public int sendMessage( String subject, String text, String metaData, Set users_, User sender, + boolean includeFeedbackRecipients, boolean forceNotifications ) { Set users = new HashSet<>( users_ ); @@ -163,7 +163,7 @@ if ( sender == null ) { sender = currentUserService.getCurrentUser(); - + if ( sender != null ) { users.add( sender ); @@ -205,12 +205,12 @@ { return sendMessage( subject, text, metaData, new HashSet(), null, true, false ); } - + @Override public int sendSystemNotification( String subject, String text ) { emailService.sendSystemEmail( new Email( subject, text ) ); - + return sendFeedback( subject, text, null ); } @@ -225,7 +225,8 @@ updateMessageConversation( conversation ); - invokeMessageSenders( conversation.getSubject(), text, null, sender, new HashSet<>( conversation.getUsers() ), false ); + invokeMessageSenders( conversation.getSubject(), text, null, sender, new HashSet<>( conversation.getUsers() ), + false ); } @Override @@ -273,8 +274,9 @@ if ( !conversation.getUserMessages().isEmpty() ) { int id = saveMessageConversation( conversation ); - - invokeMessageSenders( COMPLETE_SUBJECT, text, null, sender, new HashSet<>( conversation.getUsers() ), false ); + + invokeMessageSenders( COMPLETE_SUBJECT, text, null, sender, new HashSet<>( conversation.getUsers() ), + false ); return id; } @@ -333,7 +335,8 @@ @Override public List getMessageConversations() { - return messageConversationStore.getMessageConversations( currentUserService.getCurrentUser(), false, false, null, null ); + return messageConversationStore.getMessageConversations( currentUserService.getCurrentUser(), false, false, + null, null ); } @Override @@ -354,7 +357,8 @@ @Override public List getMessageConversations( User user, String[] messageConversationUids ) { - List conversations = messageConversationStore.getMessageConversations( messageConversationUids ); + List conversations = messageConversationStore + .getMessageConversations( messageConversationUids ); // Set transient properties @@ -370,7 +374,8 @@ @Override public int getMessageConversationCount() { - return messageConversationStore.getMessageConversationCount( currentUserService.getCurrentUser(), false, false ); + return messageConversationStore.getMessageConversationCount( currentUserService.getCurrentUser(), false, + false ); } @Override @@ -393,35 +398,40 @@ { return messageConversationStore.getLastRecipients( currentUserService.getCurrentUser(), first, max ); } - + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- - private void invokeMessageSenders( String subject, String text, String footer, User sender, Set users, boolean forceSend ) + private void invokeMessageSenders( String subject, String text, String footer, User sender, Set users, + boolean forceSend ) { for ( MessageSender messageSender : messageSenders ) { log.debug( "Invoking message sender: " + messageSender.getClass().getSimpleName() ); - + messageSender.sendMessage( subject, text, footer, sender, new HashSet<>( users ), forceSend ); } } - private String getMessageFooter( MessageConversation conversation ) { + private String getMessageFooter( MessageConversation conversation ) + { HashMap values = new HashMap<>( 2 ); String baseUrl = systemSettingManager.getInstanceBaseUrl(); if ( baseUrl == null ) { - return ""; // No base url is configured for this instance. Cannot create a reply link. + return ""; // No base url is configured for this instance. Cannot + // create a reply link. } - values.put( "responseUrl", baseUrl + "/dhis-web-dashboard-integration/readMessage.action?id=" + conversation.getUid() ); + values.put( "responseUrl", + baseUrl + "/dhis-web-dashboard-integration/readMessage.action?id=" + conversation.getUid() ); - Locale locale = (Locale) userSettingService.getUserSetting( UserSettingService.KEY_UI_LOCALE, LocaleManager.DEFAULT_LOCALE, conversation.getUser() ); + Locale locale = (Locale) userSettingService.getUserSetting( UserSettingService.KEY_UI_LOCALE, + LocaleManager.DEFAULT_LOCALE, conversation.getUser() ); values.put( "i18n", i18nManager.getI18n( locale ) ); - return new VelocityManager().render( values , MESSAGE_EMAIL_FOOTER_TEMPLATE ); + return new VelocityManager().render( values, MESSAGE_EMAIL_FOOTER_TEMPLATE ); } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DatabaseSupportedInternalMemoryMessageQueue.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DatabaseSupportedInternalMemoryMessageQueue.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DatabaseSupportedInternalMemoryMessageQueue.java 2015-12-14 13:35:40 +0000 @@ -34,6 +34,7 @@ import org.hisp.dhis.sms.incoming.IncomingSms; import org.hisp.dhis.sms.incoming.IncomingSmsStore; +import org.springframework.beans.factory.annotation.Autowired; public class DatabaseSupportedInternalMemoryMessageQueue implements MessageQueue @@ -44,6 +45,7 @@ // Dependencies // ------------------------------------------------------------------------- + @Autowired private IncomingSmsStore smsStore; // ------------------------------------------------------------------------- @@ -63,7 +65,7 @@ { return queue.get( 0 ); } - + return null; } @@ -79,15 +81,10 @@ public void initialize() { Collection messages = smsStore.getAllUnparsedSmses(); - + if ( messages != null ) { queue.addAll( messages ); } } - - public void setSmsStore( IncomingSmsStore smsStore ) - { - this.smsStore = smsStore; - } } === 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 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/DefaultSmsSender.java 2015-12-21 16:44:02 +0000 @@ -30,7 +30,6 @@ import java.lang.Character.UnicodeBlock; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Set; @@ -40,9 +39,9 @@ import org.hisp.dhis.sms.outbound.OutboundSms; import org.hisp.dhis.sms.outbound.OutboundSmsService; import org.hisp.dhis.sms.outbound.OutboundSmsTransportService; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; -import org.hisp.dhis.user.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -57,27 +56,12 @@ // Dependencies // ------------------------------------------------------------------------- + @Autowired private CurrentUserService currentUserService; - public void setCurrentUserService( CurrentUserService currentUserService ) - { - this.currentUserService = currentUserService; - } - - private UserService userService; - - public void setUserService( UserService userService ) - { - this.userService = userService; - } - + @Autowired private OutboundSmsService outboundSmsService; - public void setOutboundSmsService( OutboundSmsService outboundSmsService ) - { - this.outboundSmsService = outboundSmsService; - } - @Autowired private OutboundSmsTransportService transportService; @@ -117,7 +101,7 @@ throw new SmsServiceNotEnabledException(); } - message = createMessage( null, message, currentUserService.getCurrentUser() ); + message = SmsUtils.createMessage( null, message, currentUserService.getCurrentUser() ); OutboundSms sms = new OutboundSms( message, phoneNumber ); return sendMessage( sms ); } @@ -163,16 +147,17 @@ } int maxChar = MAX_CHAR; - + Set phoneNumbers = null; if ( transportService != null && transportService.isEnabled() ) { - phoneNumbers = getRecipientsPhoneNumber( toSendList ); - - text = createMessage( subject, text, sender ); - - // Bulk is limited in sending long SMS, need to cut into small pieces + phoneNumbers = SmsUtils.getRecipientsPhoneNumber( toSendList ); + + text = SmsUtils.createMessage( subject, text, sender ); + + // Bulk is limited in sending long SMS, need to cut into small + // pieces if ( DefaultOutboundSmsTransportService.GATEWAY_MAP.get( "bulk_gw" ) != null && DefaultOutboundSmsTransportService.GATEWAY_MAP.get( "bulk_gw" ).equals( gatewayId ) ) { @@ -188,7 +173,7 @@ if ( text.length() > maxChar ) { List splitTextList = new ArrayList<>(); - splitTextList = splitLongUnicodeString( text, splitTextList ); + splitTextList = SmsUtils.splitLongUnicodeString( text, splitTextList ); for ( String each : splitTextList ) { if ( !phoneNumbers.isEmpty() && phoneNumbers.size() > 0 ) @@ -222,47 +207,6 @@ // Supportive methods // ------------------------------------------------------------------------- - private String createMessage( String subject, String text, User sender ) - { - String name = "DHIS"; - - if ( sender != null ) - { - name = sender.getUsername(); - } - - if ( subject == null || subject.isEmpty() ) - { - subject = ""; - } - else - { - subject = " - " + subject; - } - - text = name + subject + ": " + text; - - int length = text.length(); // Simplistic cut off 160 characters - - return (length > 160) ? text.substring( 0, 157 ) + "..." : text; - } - - private Set getRecipientsPhoneNumber( List users ) - { - Set recipients = new HashSet<>(); - - for ( User user : users ) - { - String phoneNumber = user.getPhoneNumber(); - - if ( phoneNumber != null && !phoneNumber.trim().isEmpty() ) - { - recipients.add( phoneNumber ); - } - } - return recipients; - } - private String sendMessage( String text, Set recipients, String gateWayId ) { String message = null; @@ -283,37 +227,10 @@ return message; } - public List splitLongUnicodeString( String message, List result ) - { - String firstTempString = null; - String secondTempString = null; - int indexToCut = 0; - - firstTempString = message.substring( 0, MAX_CHAR ); - - indexToCut = firstTempString.lastIndexOf( " " ); - - firstTempString = firstTempString.substring( 0, indexToCut ); - - result.add( firstTempString ); - - secondTempString = message.substring( indexToCut + 1, message.length() ); - - if ( secondTempString.length() <= MAX_CHAR ) - { - result.add( secondTempString ); - return result; - } - else - { - return splitLongUnicodeString( secondTempString, result ); - } - } - public String isWastedSMS( OutboundSms sms ) { List listOfRecentOutboundSms = outboundSmsService.getAllOutboundSms( 0, 10 ); - + for ( OutboundSms each : listOfRecentOutboundSms ) { if ( each.getRecipients().equals( sms.getRecipients() ) @@ -322,17 +239,7 @@ return "system is trying to send out wasted SMS"; } } - + return null; } - - public CurrentUserService getCurrentUserService() - { - return currentUserService; - } - - public UserService getUserService() - { - return userService; - } } === added file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsConsumerThread.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsConsumerThread.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsConsumerThread.java 2015-12-13 22:32:18 +0000 @@ -0,0 +1,72 @@ +package org.hisp.dhis.sms; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hisp.dhis.sms.incoming.IncomingSms; +import org.hisp.dhis.sms.incoming.IncomingSmsListener; +import org.hisp.dhis.sms.incoming.SmsMessageStatus; +import org.springframework.beans.factory.annotation.Autowired; + +public class SmsConsumerThread +{ + private static final Log log = LogFactory.getLog( SmsConsumerThread.class ); + + private List listeners; + + @Autowired + private MessageQueue messageQueue; + + @Autowired + private SmsSender smsSender; + + public SmsConsumerThread() + { + } + + public void spawnSmsConsumer() + { + IncomingSms message = messageQueue.get(); + + while ( message != null ) + { + log.info( "Received SMS: " + message.getText() ); + try + { + for ( IncomingSmsListener listener : listeners ) + { + if ( listener.accept( message ) ) + { + listener.receive( message ); + messageQueue.remove( message ); + return; + } + } + + smsSender.sendMessage( "No command found", message.getOriginator() ); + message.setStatus( SmsMessageStatus.UNHANDLED ); + } + catch ( Exception e ) + { + log.error( e ); + e.printStackTrace(); + smsSender.sendMessage( e.getMessage(), message.getOriginator() ); + message.setStatus( SmsMessageStatus.FAILED ); + } + finally + { + messageQueue.remove( message ); + message = messageQueue.get(); + } + } + } + + @Autowired + public void setListeners( List listeners ) + { + this.listeners = listeners; + log.info( "Listeners registered are " + listeners ); + } + +} === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsMessageSender.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsMessageSender.java 2015-10-14 09:35:22 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsMessageSender.java 2015-12-18 11:04:05 +0000 @@ -41,6 +41,7 @@ import org.hisp.dhis.message.MessageSender; import org.hisp.dhis.sms.outbound.OutboundSms; import org.hisp.dhis.sms.outbound.OutboundSmsTransportService; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserSettingService; @@ -73,9 +74,9 @@ @Autowired private OutboundSmsTransportService outboundSmsTransportService; - // @Async @Override - public String sendMessage( String subject, String text, String footer, User sender, Set users, boolean forceSend ) + public String sendMessage( String subject, String text, String footer, User sender, Set users, + boolean forceSend ) { String message = null; @@ -83,11 +84,11 @@ { return "No gateway"; } - + Map gatewayMap = outboundSmsTransportService.getGatewayMap(); String gatewayId = StringUtils.trimToNull( outboundSmsTransportService.getDefaultGateway() ); - + boolean gatewayEnabled = outboundSmsTransportService.isEnabled(); if ( gatewayMap == null || gatewayId == null || !gatewayEnabled ) @@ -119,9 +120,9 @@ Set phoneNumbers = null; - phoneNumbers = getRecipientsPhoneNumber( toSendList ); + phoneNumbers = SmsUtils.getRecipientsPhoneNumber( toSendList ); - text = createMessage( subject, text, sender ); + text = SmsUtils.createMessage( subject, text, sender ); // Bulk is limited in sending long SMS, need to split in pieces @@ -140,7 +141,7 @@ if ( text.length() > MAX_CHAR ) { List splitTextList = new ArrayList<>(); - splitTextList = splitLongUnicodeString( text, splitTextList ); + splitTextList = SmsUtils.splitLongUnicodeString( text, splitTextList ); for ( String each : splitTextList ) { @@ -182,53 +183,13 @@ else // Receiver is user { - Serializable userSetting = userSettingService.getUserSetting( UserSettingService.KEY_MESSAGE_SMS_NOTIFICATION, null, user ); + Serializable userSetting = userSettingService + .getUserSetting( UserSettingService.KEY_MESSAGE_SMS_NOTIFICATION, null, user ); return userSetting != null ? (Boolean) userSetting : false; } } - private String createMessage( String subject, String text, User sender ) - { - String name = "DHIS"; - - if ( sender != null ) - { - name = sender.getUsername(); - } - - if ( subject == null || subject.isEmpty() ) - { - subject = ""; - } - else - { - subject = " - " + subject; - } - - text = name + subject + ": " + text; - - int length = text.length(); // Simplistic cut off 160 characters - - return (length > 160) ? text.substring( 0, 157 ) + "..." : text; - } - - private Set getRecipientsPhoneNumber( Set users ) - { - Set recipients = new HashSet<>(); - - for ( User user : users ) - { - String phoneNumber = user.getPhoneNumber(); - - if ( StringUtils.trimToNull( phoneNumber ) != null ) - { - recipients.add( phoneNumber ); - } - } - return recipients; - } - private String sendMessage( String text, Set recipients, String gateWayId ) { String message = null; @@ -250,32 +211,4 @@ return message; } - - public List splitLongUnicodeString( String message, List result ) - { - String firstTempString = null; - String secondTempString = null; - int indexToCut = 0; - - firstTempString = message.substring( 0, MAX_CHAR ); - - indexToCut = firstTempString.lastIndexOf( " " ); - - firstTempString = firstTempString.substring( 0, indexToCut ); - - result.add( firstTempString ); - - secondTempString = message.substring( indexToCut + 1, message.length() ); - - if ( secondTempString.length() <= MAX_CHAR ) - { - result.add( secondTempString ); - - return result; - } - else - { - return splitLongUnicodeString( secondTempString, result ); - } - } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsPublisher.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsPublisher.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/SmsPublisher.java 2015-12-21 16:44:02 +0000 @@ -28,148 +28,54 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hisp.dhis.sms.incoming.IncomingSms; -import org.hisp.dhis.sms.incoming.IncomingSmsListener; -import org.hisp.dhis.sms.incoming.SmsMessageStatus; import org.springframework.beans.factory.annotation.Autowired; public class SmsPublisher { private static final Log log = LogFactory.getLog( SmsPublisher.class ); - private List listeners; - + @Autowired private MessageQueue messageQueue; - private SMSConsumerThread thread; - - private SmsSender smsSender; + @Autowired + private SmsConsumerThread smsConsumer; + + private Thread thread; + + private boolean stop = false; public void start() { messageQueue.initialize(); - if ( thread == null ) + thread = new Thread() { - thread = new SMSConsumerThread(); - thread.start(); - } + public void run() + { + while ( !stop ) + { + smsConsumer.spawnSmsConsumer(); + + try + { + Thread.sleep( 1000 ); + } + catch ( Exception e ) + { + } + } + } + }; + + thread.start(); + + log.info( "SMS Consumer Started" ); } public void stop() { - if ( thread != null ) - { - thread.stopFetching(); - } - - thread = null; - } - - private class SMSConsumerThread - extends Thread - { - private boolean stop; - - public SMSConsumerThread() - { - } - - @Override - public void run() - { - while ( !stop ) - { - try - { - fetchAndParseSMS(); - } - catch ( Exception ex ) - { - log.error( ex.getMessage() ); - } - - try - { - Thread.sleep( 10000 ); - } - catch ( InterruptedException e ) - { - e.printStackTrace(); - } - } - } - - private void fetchAndParseSMS() - { - IncomingSms message = messageQueue.get(); - - while ( message != null ) - { - log.info( "Received SMS: " + message.getText() ); - try - { - for ( IncomingSmsListener listener : listeners ) - { - if ( listener.accept( message ) ) - { - listener.receive( message ); - messageQueue.remove( message ); - return; - } - } - - smsSender.sendMessage( "No command found", message.getOriginator() ); - message.setStatus( SmsMessageStatus.UNHANDLED ); - } - catch ( Exception e ) - { - log.error( e ); - e.printStackTrace(); - smsSender.sendMessage( e.getMessage(), message.getOriginator() ); - message.setStatus( SmsMessageStatus.FAILED ); - } - finally - { - messageQueue.remove( message ); - message = messageQueue.get(); - } - } - } - - public void stopFetching() - { - this.stop = true; - } - } - - public void setMessageQueue( MessageQueue messageQueue ) - { - this.messageQueue = messageQueue; - } - - public List getListeners() - { - return listeners; - } - - @Autowired(required=false) - public void setListeners( List listeners ) - { - this.listeners = listeners; - } - - public SmsSender getSmsSender() - { - return smsSender; - } - - public void setSmsSender( SmsSender smsSender ) - { - this.smsSender = smsSender; + this.stop = true; } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/DefaultSMSCommandService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/DefaultSMSCommandService.java 2015-06-23 15:59:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/DefaultSMSCommandService.java 2015-12-14 10:17:29 +0000 @@ -75,7 +75,7 @@ { return smsCommandStore.getSMSCommand( name ); } - + @Override public void save( Set codes ) { @@ -109,18 +109,18 @@ @Override public void deleteCodeSet( Set codes ) { - smsCommandStore.deleteCodeSet( codes ); + smsCommandStore.deleteCodeSet( codes ); } @Override public int countDataSetSmsCommands( DataSet dataSet ) { - return smsCommandStore.countDataSetSmsCommands(dataSet); + return smsCommandStore.countDataSetSmsCommands( dataSet ); } @Override public void deleteSpecialCharacterSet( Set specialCharacters ) { - smsCommandStore.deleteSpecialCharacterSet( specialCharacters ); + smsCommandStore.deleteSpecialCharacterSet( specialCharacters ); } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommandDeletionHandler.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommandDeletionHandler.java 2015-06-23 15:59:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommandDeletionHandler.java 2015-12-14 10:17:29 +0000 @@ -35,7 +35,8 @@ /** * @author Morten Olav Hansen */ -public class SMSCommandDeletionHandler extends DeletionHandler +public class SMSCommandDeletionHandler + extends DeletionHandler { @Autowired private SMSCommandService smsCommandService; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommandService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommandService.java 2015-06-23 15:59:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/SMSCommandService.java 2015-12-14 10:17:29 +0000 @@ -48,18 +48,18 @@ void save( Set codes ); void delete( SMSCommand cmd ); - + List getJ2MESMSCommands(); - + SMSCommand getSMSCommand( String commandName, ParserType parserType ); - + void saveSpecialCharacterSet( Set specialCharacters ); - + void deleteSpecialCharacterSet( Set specialCharacters ); - + void deleteCodeSet( Set codes ); int countDataSetSmsCommands( DataSet dataSet ); - + SMSCommand getSMSCommand( String name ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/code/SMSCodesDeletionHandler.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/code/SMSCodesDeletionHandler.java 2015-06-23 15:59:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/code/SMSCodesDeletionHandler.java 2015-12-14 10:17:29 +0000 @@ -36,7 +36,8 @@ /** * @author Morten Olav Hansen */ -public class SMSCodesDeletionHandler extends DeletionHandler +public class SMSCodesDeletionHandler + extends DeletionHandler { private JdbcTemplate jdbcTemplate; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/hibernate/HibernateSMSCommandStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/hibernate/HibernateSMSCommandStore.java 2015-09-13 21:12:28 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/hibernate/HibernateSMSCommandStore.java 2015-12-10 17:19:22 +0000 @@ -56,7 +56,7 @@ this.sessionFactory = sessionFactory; } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) @Override public List getSMSCommands() { @@ -113,7 +113,7 @@ return null; } - + @Override @Transactional public void delete( SMSCommand cmd ) @@ -133,7 +133,7 @@ session.delete( cmd ); } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) @Override public List getJ2MESMSCommands() { @@ -168,7 +168,6 @@ } } - @Override public void deleteCodeSet( Set codes ) { @@ -185,8 +184,8 @@ { Query query = getQuery( "select count(distinct c) from SMSCommand c where c.dataset=:dataSet", true ); query.setEntity( "dataSet", dataSet ); - //TODO rename dataset prop - + // TODO rename dataset prop + return ((Long) query.uniqueResult()).intValue(); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/hibernate/SMSCommandStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/hibernate/SMSCommandStore.java 2015-06-23 15:59:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/command/hibernate/SMSCommandStore.java 2015-12-14 10:17:29 +0000 @@ -48,15 +48,15 @@ void delete( SMSCommand cmd ); void save( Set codes ); - + List getJ2MESMSCommands(); - + SMSCommand getSMSCommand( String commandName, ParserType parserType ); - + void saveSpecialCharacterSet( Set specialCharacters ); - + void deleteSpecialCharacterSet( Set specialCharacters ); - + void deleteCodeSet( Set codes ); int countDataSetSmsCommands( DataSet dataSet ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/AdvanceHttpPostGateWay.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/AdvanceHttpPostGateWay.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/AdvanceHttpPostGateWay.java 2015-12-14 10:17:29 +0000 @@ -51,7 +51,7 @@ extends AGateway { private static final Log log = LogFactory.getLog( AdvanceHttpPostGateWay.class ); - + private static final String SENDER = "sender"; private static final String RECIPIENT = "recipient"; @@ -74,22 +74,22 @@ throws TimeoutException, GatewayException, IOException, InterruptedException { Map requestParameters = new HashMap<>( parameters ); - + for ( OutboundMessage outboundMessage : outboundMessages ) { requestParameters.put( RECIPIENT, outboundMessage.getRecipient() ); requestParameters.put( MESSAGE, outboundMessage.getText() ); String sender = outboundMessage.getFrom(); - + if ( sender != null ) { log.debug( "Adding sender " + sender + " " + getGatewayId() ); requestParameters.put( SENDER, sender ); } - + String urlString = urlTemplate; - + for ( String key : requestParameters.keySet() ) { if ( requestParameters.get( key ) != null ) @@ -98,25 +98,25 @@ URLEncoder.encode( requestParameters.get( key ), "UTF-8" ) ); } } - + log.info( "RequestURL: " + urlString + " " + getGatewayId() ); - + String line, response = ""; BufferedReader reader = null; - + try { - URL requestURL = new URL( urlString ); - URLConnection conn = requestURL.openConnection(); + URL requestURL = new URL( urlString ); + URLConnection conn = requestURL.openConnection(); reader = new BufferedReader( new InputStreamReader( conn.getInputStream() ) ); - + while ( (line = reader.readLine()) != null ) { response += line; } - + HttpURLConnection httpConnection = (HttpURLConnection) conn; - + if ( httpConnection.getResponseCode() != HttpURLConnection.HTTP_OK ) { log.warn( "Couldn't send message, got response " + response + " " + getGatewayId() ); @@ -135,7 +135,7 @@ return 1; } - + return super.sendMessages( outboundMessages ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/DefaultSmsConfigurationManager.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/DefaultSmsConfigurationManager.java 2015-12-08 19:33:06 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/DefaultSmsConfigurationManager.java 2015-12-14 10:17:29 +0000 @@ -121,7 +121,7 @@ SmsConfiguration smsConfig = new SmsConfiguration( true ); updateSmsConfiguration( smsConfig ); } - + for ( SmsGatewayConfig gateway : getSmsConfiguration().getGateways() ) { if ( gateway.getClass().equals( clazz ) ) @@ -129,7 +129,7 @@ return gateway; } } - + return null; } @@ -137,15 +137,15 @@ public boolean setDefaultSMSGateway( String gatewayId ) { boolean result = false; - + SmsConfiguration config = getSmsConfiguration(); - + if ( config == null ) { return result; } - - List smsGatewayList = config.getGateways(); + + List smsGatewayList = config.getGateways(); for ( SmsGatewayConfig gw : smsGatewayList ) { @@ -163,7 +163,7 @@ } updateSmsConfiguration( config ); - + return result; } @@ -172,7 +172,7 @@ { SmsConfiguration config = getSmsConfiguration(); List gatewayList = config.getGateways(); - + for ( SmsGatewayConfig gw : gatewayList ) { if ( gw.getName().equals( gatewayId ) ) @@ -194,5 +194,5 @@ public String addSMSGateway() { throw new NotImplementedException(); - } + } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/GateWayFactory.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/GateWayFactory.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/GateWayFactory.java 2015-12-14 10:17:29 +0000 @@ -147,8 +147,8 @@ public AGateway createSimplisticHttpGetGateway( GenericHttpGatewayConfig c ) { - SimplisticHttpGetGateWay gateway = new SimplisticHttpGetGateWay( - c.getName(), c.getUrlTemplate(), c.getParameters() ); + SimplisticHttpGetGateWay gateway = new SimplisticHttpGetGateWay( c.getName(), c.getUrlTemplate(), + c.getParameters() ); gateway.setOutbound( true ); gateway.setInbound( false ); return gateway; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/SimplisticHttpGetGateWay.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/SimplisticHttpGetGateWay.java 2015-11-24 13:14:24 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/config/SimplisticHttpGetGateWay.java 2015-12-14 10:17:29 +0000 @@ -76,7 +76,7 @@ extends AGateway { private static final Log log = LogFactory.getLog( SimplisticHttpGetGateWay.class ); - + private static final String SENDER = "sender"; private static final String RECIPIENT = "recipient"; @@ -125,15 +125,15 @@ requestParameters.put( MESSAGE, msg.getText() ); String sender = msg.getFrom(); - + if ( sender != null ) { log.debug( "Adding sender " + sender + " " + getGatewayId() ); requestParameters.put( SENDER, sender ); } - + String urlString = urlTemplate; - + for ( String key : requestParameters.keySet() ) { if ( requestParameters.get( key ) != null ) @@ -142,25 +142,25 @@ URLEncoder.encode( requestParameters.get( key ), "UTF-8" ) ); } } - + log.info( "RequestURL: " + urlString + " " + getGatewayId() ); String line, response = ""; BufferedReader reader = null; - + try { URL requestURL = new URL( urlString ); URLConnection conn = requestURL.openConnection(); reader = new BufferedReader( new InputStreamReader( conn.getInputStream() ) ); - + while ( (line = reader.readLine()) != null ) { response += line; } HttpURLConnection httpConnection = (HttpURLConnection) conn; - + if ( httpConnection.getResponseCode() != HttpURLConnection.HTTP_OK ) { log.warn( "Couldn't send message, got response " + response + " " + getGatewayId() ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/hibernate/HibernateIncomingSmsStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/hibernate/HibernateIncomingSmsStore.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/hibernate/HibernateIncomingSmsStore.java 2015-12-14 10:17:29 +0000 @@ -63,7 +63,7 @@ @Override public int save( IncomingSms sms ) { - return (Integer) sessionFactory.getCurrentSession().save( sms ); + return (Integer) sessionFactory.getCurrentSession().save( sms ); } @Override @@ -105,7 +105,7 @@ } @Override - public long getSmsCount() + public long getSmsCount() { Session session = sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria( IncomingSms.class ); @@ -141,18 +141,18 @@ { Session session = sessionFactory.getCurrentSession(); Criteria criteria = session.createCriteria( IncomingSms.class ).addOrder( Order.desc( "sentDate" ) ); - + if ( status != null ) { criteria.add( Restrictions.eq( "status", status ) ); } criteria.add( Restrictions.ilike( "originator", "%" + keyword + "%" ) ); - + if ( min != null && max != null ) { criteria.setFirstResult( min ).setMaxResults( max ); } - + return criteria.list(); } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/hibernate/HibernateOutboundSmsStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/hibernate/HibernateOutboundSmsStore.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/hibernate/HibernateOutboundSmsStore.java 2015-12-14 10:17:29 +0000 @@ -85,9 +85,9 @@ public List get( OutboundSmsStatus status ) { Session session = sessionFactory.getCurrentSession(); - + Criteria criteria = session.createCriteria( OutboundSms.class ).addOrder( Order.desc( "date" ) ); - + if ( status != null ) { criteria.add( Restrictions.eq( "status", status ) ); @@ -112,15 +112,15 @@ public List get( OutboundSmsStatus status, Integer min, Integer max ) { Session session = sessionFactory.getCurrentSession(); - + Criteria criteria = session.createCriteria( OutboundSms.class ).addOrder( Order.desc( "date" ) ); - + if ( status != null ) { criteria.add( Restrictions.eq( "status", status ) ); } - - if ( min != null && max != null) + + if ( min != null && max != null ) { criteria.setFirstResult( min ).setMaxResults( max ); } @@ -132,10 +132,10 @@ public List getAllOutboundSms( Integer min, Integer max ) { Session session = sessionFactory.getCurrentSession(); - + Criteria criteria = session.createCriteria( OutboundSms.class ).addOrder( Order.desc( "date" ) ); - - if ( min != null && max != null) + + if ( min != null && max != null ) { criteria.setFirstResult( min ).setMaxResults( max ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/incoming/DefaultIncomingSmsService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/incoming/DefaultIncomingSmsService.java 2015-11-24 13:14:24 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/incoming/DefaultIncomingSmsService.java 2015-12-21 16:44:02 +0000 @@ -52,7 +52,6 @@ private MessageQueue incomingSmsQueue; - @Override public void setIncomingSmsQueue( MessageQueue incomingSmsQueue ) { this.incomingSmsQueue = incomingSmsQueue; @@ -124,25 +123,35 @@ } @Override - public void save( IncomingSms incomingSms ) + public int save( IncomingSms incomingSms ) { - incomingSmsStore.save( incomingSms ); + int smsId = incomingSmsStore.save( incomingSms ); incomingSmsQueue.put( incomingSms ); + return smsId; } @Override - public void save( String message, String originator, String gateway ) + public int save( String message, String originator, String gateway, Date receivedTime ) { + IncomingSms sms = new IncomingSms(); sms.setText( message ); sms.setOriginator( originator ); sms.setGatewayId( gateway ); - sms.setSentDate( new Date() ); + + if ( receivedTime != null ) + { + sms.setSentDate( receivedTime ); + } + else + { + sms.setSentDate( new Date() ); + + } sms.setReceivedDate( new Date() ); sms.setEncoding( SmsMessageEncoding.ENC7BIT ); sms.setStatus( SmsMessageStatus.INCOMING ); - save( sms ); - + return save( sms ); } @Override @@ -201,7 +210,6 @@ public IncomingSms convertToIncomingSms( InboundMessage message ) { IncomingSms incomingSms = new IncomingSms(); - incomingSms.setOriginator( message.getOriginator() ); incomingSms.setEncoding( SmsMessageEncoding.ENC7BIT ); incomingSms.setSentDate( message.getDate() ); @@ -210,7 +218,6 @@ incomingSms.setGatewayId( message.getGatewayId() ); incomingSms.setStatus( SmsMessageStatus.PROCESSED ); incomingSms.setStatusMessage( "imported" ); - return incomingSms; } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/incoming/SMPPInboundNotification.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/incoming/SMPPInboundNotification.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/incoming/SMPPInboundNotification.java 2015-12-14 13:35:40 +0000 @@ -32,21 +32,18 @@ import org.smslib.IInboundMessageNotification; import org.smslib.InboundMessage; import org.smslib.Message.MessageTypes; +import org.springframework.beans.factory.annotation.Autowired; public class SMPPInboundNotification implements IInboundMessageNotification -{ +{ // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- + @Autowired private IncomingSmsService incomingSmsService; - public void setIncomingSmsService( IncomingSmsService incomingSmsService ) - { - this.incomingSmsService = incomingSmsService; - } - // ------------------------------------------------------------------------- // Implementation // ------------------------------------------------------------------------- @@ -55,7 +52,7 @@ public void process( AGateway gateway, MessageTypes msgType, InboundMessage message ) { IncomingSms incomingSms = incomingSmsService.convertToIncomingSms( message ); - + incomingSmsService.save( incomingSms ); } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/DHISMessageAlertListener.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/DHISMessageAlertListener.java 2015-11-23 16:24:04 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/DHISMessageAlertListener.java 2015-12-11 11:21:38 +0000 @@ -44,68 +44,41 @@ import org.hisp.dhis.sms.incoming.SmsMessageStatus; import org.hisp.dhis.sms.parse.ParserType; import org.hisp.dhis.sms.parse.SMSParserException; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserGroup; import org.hisp.dhis.user.UserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; public class DHISMessageAlertListener implements IncomingSmsListener { + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired private SMSCommandService smsCommandService; - public void setSmsCommandService( SMSCommandService smsCommandService ) - { - this.smsCommandService = smsCommandService; - } - + @Autowired private UserService userService; - public void setUserService( UserService userService ) - { - this.userService = userService; - } - + @Autowired private MessageService messageService; - public void setMessageService( MessageService messageService ) - { - this.messageService = messageService; - } - + @Autowired private SmsMessageSender smsMessageSender; - public void setSmsMessageSender( SmsMessageSender smsMessageSender ) - { - this.smsMessageSender = smsMessageSender; - } - + @Autowired private IncomingSmsService incomingSmsService; - public void setIncomingSmsService( IncomingSmsService incomingSmsService ) - { - this.incomingSmsService = incomingSmsService; - } - @Transactional @Override public boolean accept( IncomingSms sms ) { - String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - return smsCommandService.getSMSCommand( commandString, ParserType.ALERT_PARSER ) != null; + return smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), ParserType.ALERT_PARSER ) != null; } @Transactional @@ -113,20 +86,8 @@ public void receive( IncomingSms sms ) { String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - SMSCommand smsCommand = smsCommandService.getSMSCommand( commandString, ParserType.ALERT_PARSER ); + SMSCommand smsCommand = smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.ALERT_PARSER ); UserGroup userGroup = smsCommand.getUserGroup(); String senderPhoneNumber = StringUtils.replace( sms.getOriginator(), "+", "" ); @@ -157,11 +118,8 @@ User sender = users.iterator().next(); Set receivers = new HashSet<>( userGroup.getMembers() ); - - // forward to user group by SMS,Dhis2 message, Email messageService.sendMessage( smsCommand.getName(), message, null, receivers, sender, false, false ); - // confirm SMS was received and forwarded completely Set feedbackList = new HashSet<>(); feedbackList.add( sender ); @@ -185,4 +143,4 @@ } } } -} +} \ No newline at end of file === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/DataValueSMSListener.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/DataValueSMSListener.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/DataValueSMSListener.java 2015-12-11 11:21:38 +0000 @@ -30,7 +30,6 @@ import org.apache.commons.lang3.StringUtils; import org.hisp.dhis.common.ValueType; -import org.hisp.dhis.commons.util.TextUtils; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementCategoryService; @@ -55,18 +54,16 @@ import org.hisp.dhis.sms.incoming.SmsMessageStatus; import org.hisp.dhis.sms.parse.ParserType; import org.hisp.dhis.sms.parse.SMSParserException; -import org.hisp.dhis.user.User; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.user.UserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -79,69 +76,37 @@ { private static final String defaultPattern = "([a-zA-Z]+)\\s*(\\d+)"; + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired private CompleteDataSetRegistrationService registrationService; - public void setRegistrationService( CompleteDataSetRegistrationService registrationService ) - { - this.registrationService = registrationService; - } - + @Autowired private DataValueService dataValueService; - public void setDataValueService( DataValueService dataValueService ) - { - this.dataValueService = dataValueService; - } - + @Autowired private SmsSender smsSender; - public void setSmsSender( SmsSender smsSender ) - { - this.smsSender = smsSender; - } - + @Autowired private DataElementCategoryService dataElementCategoryService; - public void setDataElementCategoryService( DataElementCategoryService dataElementCategoryService ) - { - this.dataElementCategoryService = dataElementCategoryService; - } - + @Autowired private SMSCommandService smsCommandService; - public void setSmsCommandService( SMSCommandService smsCommandService ) - { - this.smsCommandService = smsCommandService; - } - + @Autowired private UserService userService; - public void setUserService( UserService userService ) - { - this.userService = userService; - } - + @Autowired private DataSetService dataSetService; - public void setDataSetService( DataSetService dataSetService ) - { - this.dataSetService = dataSetService; - } - + @Autowired private IncomingSmsService incomingSmsService; - public void setIncomingSmsService( IncomingSmsService incomingSmsService ) - { - this.incomingSmsService = incomingSmsService; - } - + @Autowired private DataElementService dataElementService; - public void setDataElementService( DataElementService dataElementService ) - { - this.dataElementService = dataElementService; - } - // ------------------------------------------------------------------------- // IncomingSmsListener implementation // ------------------------------------------------------------------------- @@ -150,22 +115,7 @@ @Override public boolean accept( IncomingSms sms ) { - String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - return smsCommandService.getSMSCommand( commandString, ParserType.KEY_VALUE_PARSER ) != null; + return smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), ParserType.KEY_VALUE_PARSER ) != null; } @Transactional @@ -173,25 +123,14 @@ public void receive( IncomingSms sms ) { String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - SMSCommand smsCommand = smsCommandService.getSMSCommand( commandString, ParserType.KEY_VALUE_PARSER ); + SMSCommand smsCommand = smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.KEY_VALUE_PARSER ); Map parsedMessage = this.parse( message, smsCommand ); - Date date = lookForDate( message ); + Date date = SmsUtils.lookForDate( message ); String senderPhoneNumber = StringUtils.replace( sms.getOriginator(), "+", "" ); - Collection orgUnits = getOrganisationUnitsByPhoneNumber( senderPhoneNumber ); + Collection orgUnits = SmsUtils.getOrganisationUnitsByPhoneNumber( senderPhoneNumber, + userService.getUsersByPhoneNumber( senderPhoneNumber ) ); if ( orgUnits == null || orgUnits.size() == 0 ) { @@ -205,13 +144,13 @@ } } - OrganisationUnit orgUnit = this.selectOrganisationUnit( orgUnits, parsedMessage, smsCommand ); + OrganisationUnit orgUnit = SmsUtils.selectOrganisationUnit( orgUnits, parsedMessage, smsCommand ); Period period = getPeriod( smsCommand, date ); if ( dataSetService.isLocked( smsCommand.getDataset(), period, orgUnit, null, null ) ) { - throw new SMSParserException( "Dataset is locked for the period " + period.getStartDate() + " - " - + period.getEndDate() ); + throw new SMSParserException( + "Dataset is locked for the period " + period.getStartDate() + " - " + period.getEndDate() ); } boolean valueStored = false; @@ -263,13 +202,12 @@ if ( !StringUtils.isBlank( smsCommand.getSeparator() ) ) { - String x = "([^\\s|" + smsCommand.getSeparator().trim() + "]+)\\s*\\" + smsCommand.getSeparator().trim() + "\\s*([\\w ]+)\\s*(\\" - + smsCommand.getSeparator().trim() + "|$)*\\s*"; + String x = "([^\\s|" + smsCommand.getSeparator().trim() + "]+)\\s*\\" + smsCommand.getSeparator().trim() + + "\\s*([\\w ]+)\\s*(\\" + smsCommand.getSeparator().trim() + "|$)*\\s*"; pattern = Pattern.compile( x ); } Matcher matcher = pattern.matcher( sms ); - while ( matcher.find() ) { String key = matcher.group( 1 ); @@ -284,98 +222,6 @@ return output; } - private Date lookForDate( String message ) - { - if ( !message.contains( " " ) ) - { - return null; - } - - Date date = null; - String dateString = message.trim().split( " " )[0]; - SimpleDateFormat format = new SimpleDateFormat( "ddMM" ); - - try - { - Calendar cal = Calendar.getInstance(); - date = format.parse( dateString ); - cal.setTime( date ); - int year = Calendar.getInstance().get( Calendar.YEAR ); - int month = Calendar.getInstance().get( Calendar.MONTH ); - - if ( cal.get( Calendar.MONTH ) < month ) - { - cal.set( Calendar.YEAR, year ); - } - else - { - cal.set( Calendar.YEAR, year - 1 ); - } - - date = cal.getTime(); - } - catch ( Exception e ) - { - // no date found - } - - return date; - } - - private Collection getOrganisationUnitsByPhoneNumber( String sender ) - { - Collection orgUnits = new ArrayList<>(); - Collection users = userService.getUsersByPhoneNumber( sender ); - for ( User u : users ) - { - if ( u.getOrganisationUnits() != null ) - { - orgUnits.addAll( u.getOrganisationUnits() ); - } - } - - return orgUnits; - } - - private OrganisationUnit selectOrganisationUnit( Collection orgUnits, - Map parsedMessage, SMSCommand smsCommand ) - { - OrganisationUnit orgUnit = null; - - for ( OrganisationUnit o : orgUnits ) - { - if ( orgUnits.size() == 1 ) - { - orgUnit = o; - } - if ( parsedMessage.containsKey( "ORG" ) && o.getCode().equals( parsedMessage.get( "ORG" ) ) ) - { - orgUnit = o; - break; - } - } - - if ( orgUnit == null && orgUnits.size() > 1 ) - { - String messageListingOrgUnits = smsCommand.getMoreThanOneOrgUnitMessage(); - - for ( Iterator i = orgUnits.iterator(); i.hasNext(); ) - { - OrganisationUnit o = i.next(); - messageListingOrgUnits += TextUtils.SPACE + o.getName() + ":" + o.getCode(); - - if ( i.hasNext() ) - { - messageListingOrgUnits += ","; - } - } - - throw new SMSParserException( messageListingOrgUnits ); - } - - return orgUnit; - } - private Period getPeriod( SMSCommand command, Date date ) { Period period = null; @@ -404,15 +250,16 @@ { String upperCaseCode = code.getCode().toUpperCase(); - String storedBy = getUser( sender, command ).getUsername(); + String storedBy = SmsUtils.getUser( sender, command, userService.getUsersByPhoneNumber( sender ) ) + .getUsername(); if ( StringUtils.isBlank( storedBy ) ) { storedBy = "[unknown] from [" + sender + "]"; } - DataElementCategoryOptionCombo optionCombo = dataElementCategoryService.getDataElementCategoryOptionCombo( code - .getOptionId() ); + DataElementCategoryOptionCombo optionCombo = dataElementCategoryService + .getDataElementCategoryOptionCombo( code.getOptionId() ); Period period = getPeriod( command, date ); @@ -434,7 +281,7 @@ if ( !StringUtils.isEmpty( value ) ) { boolean newDataValue = false; - + if ( dv == null ) { dv = new DataValue(); @@ -492,8 +339,8 @@ String targetDataElementId = formula.substring( 1, formula.length() ); String operation = String.valueOf( formula.charAt( 0 ) ); - DataElement targetDataElement = dataElementService.getDataElement( Integer - .parseInt( targetDataElementId ) ); + DataElement targetDataElement = dataElementService + .getDataElement( Integer.parseInt( targetDataElementId ) ); if ( targetDataElement == null ) { @@ -509,8 +356,8 @@ if ( targetDataValue == null ) { targetDataValue = new DataValue(); - targetDataValue.setCategoryOptionCombo( dataElementCategoryService - .getDefaultDataElementCategoryOptionCombo() ); + targetDataValue.setCategoryOptionCombo( + dataElementCategoryService.getDefaultDataElementCategoryOptionCombo() ); targetDataValue.setSource( orgunit ); targetDataValue.setDataElement( targetDataElement ); targetDataValue.setPeriod( period ); @@ -531,7 +378,6 @@ targetValue = targetValue - Integer.parseInt( value ); } - targetDataValue.setValue( String.valueOf( targetValue ) ); targetDataValue.setLastUpdated( new java.util.Date() ); targetDataValue.setStoredBy( storedBy ); @@ -556,51 +402,6 @@ return true; } - private User getUser( String sender, SMSCommand smsCommand ) - { - OrganisationUnit orgunit = null; - User user = null; - - // Need to be edited - for ( User u : userService.getUsersByPhoneNumber( sender ) ) - { - OrganisationUnit ou = u.getOrganisationUnit(); - - if ( ou != null ) - { - // Might be undefined if the user has more than one org units - if ( orgunit == null ) - { - orgunit = ou; - } - else if ( orgunit.getId() == ou.getId() ) - { - // Same org unit - } - else - { - if ( StringUtils.isEmpty( smsCommand.getMoreThanOneOrgUnitMessage() ) ) - { - throw new SMSParserException( SMSCommand.MORE_THAN_ONE_ORGUNIT_MESSAGE ); - } - else - { - throw new SMSParserException( smsCommand.getMoreThanOneOrgUnitMessage() ); - } - } - } - - user = u; - } - - if ( user == null ) - { - throw new SMSParserException( "User is not associated with any orgunit. Please contact your supervisor." ); - } - - return user; - } - private void markCompleteDataSet( String sender, OrganisationUnit orgunit, Map parsedMessage, SMSCommand command, Date date ) { @@ -643,7 +444,8 @@ } // Go through the complete process - String storedBy = getUser( sender, command ).getUsername(); + String storedBy = SmsUtils.getUser( sender, command, userService.getUsersByPhoneNumber( sender ) ) + .getUsername(); if ( StringUtils.isBlank( storedBy ) ) { @@ -655,8 +457,8 @@ registerCompleteDataSet( command.getDataset(), period, orgunit, storedBy ); } - protected void sendSuccessFeedback( String sender, SMSCommand command, Map parsedMessage, - Date date, OrganisationUnit orgunit ) + protected void sendSuccessFeedback( String sender, SMSCommand command, Map parsedMessage, Date date, + OrganisationUnit orgunit ) { String reportBack = "Thank you! Values entered: "; String notInReport = "Missing values for: "; @@ -732,7 +534,8 @@ DataElementCategoryOptionCombo optionCombo = dataElementCategoryService .getDefaultDataElementCategoryOptionCombo(); // TODO - if ( registrationService.getCompleteDataSetRegistration( dataSet, period, organisationUnit, optionCombo ) == null ) + if ( registrationService.getCompleteDataSetRegistration( dataSet, period, organisationUnit, + optionCombo ) == null ) { registration.setDataSet( dataSet ); registration.setPeriod( period ); @@ -757,4 +560,4 @@ registrationService.deleteCompleteDataSetRegistration( registration ); } } -} +} \ No newline at end of file === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/J2MEDataValueSMSListener.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/J2MEDataValueSMSListener.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/J2MEDataValueSMSListener.java 2015-12-11 11:21:38 +0000 @@ -30,7 +30,6 @@ import org.apache.commons.lang3.StringUtils; import org.hisp.dhis.common.ValueType; -import org.hisp.dhis.commons.util.TextUtils; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementCategoryService; import org.hisp.dhis.dataset.CompleteDataSetRegistration; @@ -54,67 +53,47 @@ import org.hisp.dhis.sms.incoming.IncomingSmsListener; import org.hisp.dhis.sms.parse.ParserType; import org.hisp.dhis.sms.parse.SMSParserException; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.system.util.ValidationUtils; -import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import java.util.regex.Pattern; public class J2MEDataValueSMSListener implements IncomingSmsListener { + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired private DataValueService dataValueService; - public void setDataValueService( DataValueService dataValueService ) - { - this.dataValueService = dataValueService; - } - + @Autowired private DataElementCategoryService dataElementCategoryService; - public void setDataElementCategoryService( DataElementCategoryService dataElementCategoryService ) - { - this.dataElementCategoryService = dataElementCategoryService; - } - + @Autowired private SMSCommandService smsCommandService; - public void setSmsCommandService( SMSCommandService smsCommandService ) - { - this.smsCommandService = smsCommandService; - } - + @Autowired private UserService userService; - public void setUserService( UserService userService ) - { - this.userService = userService; - } - + @Autowired private CompleteDataSetRegistrationService registrationService; - public void setRegistrationService( CompleteDataSetRegistrationService registrationService ) - { - this.registrationService = registrationService; - } - + @Autowired private SmsSender smsSender; - public void setSmsSender( SmsSender smsSender ) - { - this.smsSender = smsSender; - } - // ------------------------------------------------------------------------- // IncomingSmsListener implementation // ------------------------------------------------------------------------- @@ -123,20 +102,7 @@ @Override public boolean accept( IncomingSms sms ) { - String message = sms.getText(); - String commandString = null; - - if ( message.indexOf( TextUtils.SPACE ) > 0 ) - { - commandString = message.substring( 0, message.indexOf( " " ) ); - message = message.substring( commandString.length() ); - } - else - { - commandString = message; - } - - return smsCommandService.getSMSCommand( commandString, ParserType.J2ME_PARSER ) != null; + return smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), ParserType.J2ME_PARSER ) != null; } @Transactional @@ -144,22 +110,16 @@ public void receive( IncomingSms sms ) { String message = sms.getText(); - String commandString = null; - if ( message.indexOf( " " ) > 0 ) - { - commandString = message.substring( 0, message.indexOf( " " ) ); - message = message.substring( commandString.length() ); - } - else - { - commandString = message; - } - - SMSCommand smsCommand = smsCommandService.getSMSCommand( commandString, ParserType.J2ME_PARSER ); + + SMSCommand smsCommand = smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.J2ME_PARSER ); + String token[] = message.split( "!" ); Map parsedMessage = this.parse( token[1], smsCommand ); + String senderPhoneNumber = StringUtils.replace( sms.getOriginator(), "+", "" ); - Collection orgUnits = getOrganisationUnitsByPhoneNumber( senderPhoneNumber ); + Collection orgUnits = SmsUtils.getOrganisationUnitsByPhoneNumber( senderPhoneNumber, + userService.getUsersByPhoneNumber( senderPhoneNumber ) ); if ( orgUnits == null || orgUnits.size() == 0 ) { @@ -173,7 +133,7 @@ } } - OrganisationUnit orgUnit = this.selectOrganisationUnit( orgUnits, parsedMessage, smsCommand ); + OrganisationUnit orgUnit = SmsUtils.selectOrganisationUnit( orgUnits, parsedMessage, smsCommand ); Period period = this.getPeriod( token[0].trim(), smsCommand.getDataset().getPeriodType() ); boolean valueStored = false; @@ -233,15 +193,16 @@ { String upperCaseCode = code.getCode().toUpperCase(); - String storedBy = getUser( sender, command ).getUsername(); + String storedBy = SmsUtils.getUser( sender, command, userService.getUsersByPhoneNumber( sender ) ) + .getUsername(); if ( StringUtils.isBlank( storedBy ) ) { storedBy = "[unknown] from [" + sender + "]"; } - DataElementCategoryOptionCombo optionCombo = dataElementCategoryService.getDataElementCategoryOptionCombo( code - .getOptionId() ); + DataElementCategoryOptionCombo optionCombo = dataElementCategoryService + .getDataElementCategoryOptionCombo( code.getOptionId() ); DataValue dv = dataValueService.getDataValue( code.getDataElement(), period, orgUnit, optionCombo ); @@ -292,94 +253,6 @@ } } - private OrganisationUnit selectOrganisationUnit( Collection orgUnits, - Map parsedMessage, SMSCommand smsCommand ) - { - OrganisationUnit orgUnit = null; - - for ( OrganisationUnit o : orgUnits ) - { - if ( orgUnits.size() == 1 ) - { - orgUnit = o; - } - if ( parsedMessage.containsKey( "ORG" ) && o.getCode().equals( parsedMessage.get( "ORG" ) ) ) - { - orgUnit = o; - break; - } - } - - if ( orgUnit == null && orgUnits.size() > 1 ) - { - String messageListingOrgUnits = smsCommand.getMoreThanOneOrgUnitMessage(); - - for ( Iterator i = orgUnits.iterator(); i.hasNext(); ) - { - OrganisationUnit o = i.next(); - messageListingOrgUnits += " " + o.getName() + ":" + o.getCode(); - if ( i.hasNext() ) - { - messageListingOrgUnits += ","; - } - } - throw new SMSParserException( messageListingOrgUnits ); - } - - return orgUnit; - } - - private Collection getOrganisationUnitsByPhoneNumber( String sender ) - { - Collection orgUnits = new ArrayList<>(); - Collection users = userService.getUsersByPhoneNumber( sender ); - - for ( User u : users ) - { - if ( u.getOrganisationUnits() != null ) - { - orgUnits.addAll( u.getOrganisationUnits() ); - } - } - - return orgUnits; - } - - private User getUser( String sender, SMSCommand smsCommand ) - { - OrganisationUnit orgunit = null; - User user = null; - - for ( User u : userService.getUsersByPhoneNumber( sender ) ) - { - OrganisationUnit ou = u.getOrganisationUnit(); - - // Might be undefined if the user has more than one org.units - // "attached" - if ( orgunit == null ) - { - orgunit = ou; - } - else if ( orgunit.getId() == ou.getId() ) - { - // same orgunit, no problem... - } - else - { - if ( StringUtils.isEmpty( smsCommand.getMoreThanOneOrgUnitMessage() ) ) - { - throw new SMSParserException( SMSCommand.MORE_THAN_ONE_ORGUNIT_MESSAGE ); - } - else - { - throw new SMSParserException( smsCommand.getMoreThanOneOrgUnitMessage() ); - } - } - user = u; - } - return user; - } - private void registerCompleteDataSet( DataSet dataSet, Period period, OrganisationUnit organisationUnit, String storedBy ) { @@ -388,7 +261,8 @@ DataElementCategoryOptionCombo optionCombo = dataElementCategoryService .getDefaultDataElementCategoryOptionCombo(); // TODO - if ( registrationService.getCompleteDataSetRegistration( dataSet, period, organisationUnit, optionCombo ) == null ) + if ( registrationService.getCompleteDataSetRegistration( dataSet, period, organisationUnit, + optionCombo ) == null ) { registration.setDataSet( dataSet ); registration.setPeriod( period ); @@ -462,17 +336,17 @@ String pattern = "yyyy-MM-dd"; SimpleDateFormat formatter = new SimpleDateFormat( pattern ); Date date = null; - + try { date = formatter.parse( periodName ); } catch ( ParseException e ) { - throw new IllegalArgumentException( "Couldn't make a period of type " + periodType.getName() - + " and name " + periodName, e ); + throw new IllegalArgumentException( + "Couldn't make a period of type " + periodType.getName() + " and name " + periodName, e ); } - + return periodType.createPeriod( date ); } @@ -488,8 +362,8 @@ } catch ( ParseException e ) { - throw new IllegalArgumentException( "Couldn't make a period of type " + periodType.getName() - + " and name " + periodName, e ); + throw new IllegalArgumentException( + "Couldn't make a period of type " + periodType.getName() + " and name " + periodName, e ); } return periodType.createPeriod( date ); @@ -527,7 +401,7 @@ Calendar cal = Calendar.getInstance(); int month = 0; - + if ( periodName.substring( 0, periodName.indexOf( " " ) ).equals( "Jan" ) ) { month = 1; @@ -556,6 +430,7 @@ } } - throw new IllegalArgumentException( "Couldn't make a period of type " + periodType.getName() + " and name " + periodName ); + throw new IllegalArgumentException( + "Couldn't make a period of type " + periodType.getName() + " and name " + periodName ); } -} +} \ No newline at end of file === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/ProgramStageDataEntrySMSListener.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/ProgramStageDataEntrySMSListener.java 2015-10-11 18:48:57 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/ProgramStageDataEntrySMSListener.java 2015-12-21 16:44:02 +0000 @@ -28,11 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; @@ -46,28 +42,25 @@ import org.hisp.dhis.sms.incoming.IncomingSmsListener; import org.hisp.dhis.sms.parse.ParserType; import org.hisp.dhis.sms.parse.SMSParserException; -import org.hisp.dhis.user.User; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.user.UserService; +import org.springframework.beans.factory.annotation.Autowired; -public class ProgramStageDataEntrySMSListener +public class ProgramStageDataEntrySMSListener implements IncomingSmsListener -{ +{ private static final String defaultPattern = "([a-zA-Z]+)\\s*(\\d+)"; - + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired private SMSCommandService smsCommandService; - public void setSmsCommandService( SMSCommandService smsCommandService ) - { - this.smsCommandService = smsCommandService; - } - + @Autowired private UserService userService; - public void setUserService( UserService userService ) - { - this.userService = userService; - } - // ------------------------------------------------------------------------- // IncomingSmsListener implementation // ------------------------------------------------------------------------- @@ -75,51 +68,24 @@ @Override public boolean accept( IncomingSms sms ) { - String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - return smsCommandService.getSMSCommand( commandString, ParserType.PROGRAM_STAGE_DATAENTRY_PARSER ) != null; + return smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.PROGRAM_STAGE_DATAENTRY_PARSER ) != null; } @Override public void receive( IncomingSms sms ) { String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - SMSCommand smsCommand = smsCommandService.getSMSCommand( commandString, + SMSCommand smsCommand = smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), ParserType.TRACKED_ENTITY_REGISTRATION_PARSER ); - + this.parse( message, smsCommand ); - lookForDate( message ); - - //TODO what to do with the above? - + SmsUtils.lookForDate( message ); + String senderPhoneNumber = StringUtils.replace( sms.getOriginator(), "+", "" ); - Collection orgUnits = getOrganisationUnitsByPhoneNumber( senderPhoneNumber ); + Collection orgUnits = SmsUtils.getOrganisationUnitsByPhoneNumber( senderPhoneNumber, + userService.getUsersByPhoneNumber( senderPhoneNumber ) ); if ( orgUnits == null || orgUnits.size() == 0 ) { @@ -133,18 +99,21 @@ } } } - + private Map parse( String message, SMSCommand smsCommand ) { HashMap output = new HashMap<>(); Pattern pattern = Pattern.compile( defaultPattern ); + if ( !StringUtils.isBlank( smsCommand.getSeparator() ) ) { String x = "(\\w+)\\s*\\" + smsCommand.getSeparator().trim() + "\\s*([\\w ]+)\\s*(\\" + smsCommand.getSeparator().trim() + "|$)*\\s*"; pattern = Pattern.compile( x ); } + Matcher matcher = pattern.matcher( message ); + while ( matcher.find() ) { String key = matcher.group( 1 ); @@ -158,58 +127,4 @@ return output; } - - private Date lookForDate( String message ) - { - if ( !message.contains( " " ) ) - { - return null; - } - - Date date = null; - String dateString = message.trim().split( " " )[0]; - SimpleDateFormat format = new SimpleDateFormat( "ddMM" ); - - try - { - Calendar cal = Calendar.getInstance(); - date = format.parse( dateString ); - cal.setTime( date ); - int year = Calendar.getInstance().get( Calendar.YEAR ); - int month = Calendar.getInstance().get( Calendar.MONTH ); - - if ( cal.get( Calendar.MONTH ) < month ) - { - cal.set( Calendar.YEAR, year ); - } - else - { - cal.set( Calendar.YEAR, year - 1 ); - } - - date = cal.getTime(); - } - catch ( Exception e ) - { - // no date found - } - - return date; - } - - private Collection getOrganisationUnitsByPhoneNumber( String sender ) - { - Collection orgUnits = new ArrayList<>(); - Collection users = userService.getUsersByPhoneNumber( sender ); - - for ( User u : users ) - { - if ( u.getOrganisationUnits() != null ) - { - orgUnits.addAll( u.getOrganisationUnits() ); - } - } - - return orgUnits; - } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/TrackedEntityRegistrationSMSListener.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/TrackedEntityRegistrationSMSListener.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/TrackedEntityRegistrationSMSListener.java 2015-12-11 11:21:38 +0000 @@ -28,14 +28,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -52,61 +48,43 @@ import org.hisp.dhis.sms.incoming.IncomingSmsListener; import org.hisp.dhis.sms.parse.ParserType; import org.hisp.dhis.sms.parse.SMSParserException; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.trackedentity.TrackedEntityInstance; import org.hisp.dhis.trackedentity.TrackedEntityInstanceService; import org.hisp.dhis.trackedentity.TrackedEntityService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; -import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; +import org.springframework.beans.factory.annotation.Autowired; public class TrackedEntityRegistrationSMSListener implements IncomingSmsListener { + private static final String defaultPattern = "([a-zA-Z]+)\\s*(\\d+)"; - + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired private SMSCommandService smsCommandService; - public void setSmsCommandService( SMSCommandService smsCommandService ) - { - this.smsCommandService = smsCommandService; - } - + @Autowired private UserService userService; - public void setUserService( UserService userService ) - { - this.userService = userService; - } - + @Autowired private TrackedEntityService trackedEntityService; - public void setTrackedEntityService( TrackedEntityService trackedEntityService ) - { - this.trackedEntityService = trackedEntityService; - } - + @Autowired private TrackedEntityInstanceService trackedEntityInstanceService; - public void setTrackedEntityInstanceService( TrackedEntityInstanceService trackedEntityInstanceService ) - { - this.trackedEntityInstanceService = trackedEntityInstanceService; - } - + @Autowired private ProgramInstanceService programInstanceService; - public void setProgramInstanceService( ProgramInstanceService programInstanceService ) - { - this.programInstanceService = programInstanceService; - } - + @Autowired private SmsSender smsSender; - - public void setSmsSender( SmsSender smsSender ) - { - this.smsSender = smsSender; - } - + // ------------------------------------------------------------------------- // IncomingSmsListener implementation // ------------------------------------------------------------------------- @@ -114,48 +92,23 @@ @Override public boolean accept( IncomingSms sms ) { - String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - return smsCommandService.getSMSCommand( commandString, ParserType.TRACKED_ENTITY_REGISTRATION_PARSER ) != null; + return smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.TRACKED_ENTITY_REGISTRATION_PARSER ) != null; } @Override public void receive( IncomingSms sms ) { String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - SMSCommand smsCommand = smsCommandService.getSMSCommand( commandString, + SMSCommand smsCommand = smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), ParserType.TRACKED_ENTITY_REGISTRATION_PARSER ); - + Map parsedMessage = this.parse( message, smsCommand ); - Date date = lookForDate( message ); + Date date = SmsUtils.lookForDate( message ); String senderPhoneNumber = StringUtils.replace( sms.getOriginator(), "+", "" ); - Collection orgUnits = getOrganisationUnitsByPhoneNumber( senderPhoneNumber ); + Collection orgUnits = SmsUtils.getOrganisationUnitsByPhoneNumber( senderPhoneNumber, + userService.getUsersByPhoneNumber( senderPhoneNumber ) ); if ( orgUnits == null || orgUnits.size() == 0 ) { @@ -169,7 +122,7 @@ } } - OrganisationUnit orgUnit = this.selectOrganisationUnit( orgUnits, parsedMessage, smsCommand ); + OrganisationUnit orgUnit = SmsUtils.selectOrganisationUnit( orgUnits, parsedMessage, smsCommand ); TrackedEntityInstance trackedEntityInstance = new TrackedEntityInstance(); trackedEntityInstance.setOrganisationUnit( orgUnit ); @@ -180,12 +133,11 @@ { if ( parsedMessage.containsKey( code.getCode().toUpperCase() ) ) { - TrackedEntityAttributeValue trackedEntityAttributeValue = this.createTrackedEntityAttributeValue( - parsedMessage, code, smsCommand, trackedEntityInstance ); + TrackedEntityAttributeValue trackedEntityAttributeValue = this + .createTrackedEntityAttributeValue( parsedMessage, code, smsCommand, trackedEntityInstance ); patientAttributeValues.add( trackedEntityAttributeValue ); } } - int trackedEntityInstanceId = 0; if ( patientAttributeValues.size() > 0 ) @@ -194,9 +146,11 @@ null, null, patientAttributeValues ); } - programInstanceService.enrollTrackedEntityInstance( trackedEntityInstanceService.getTrackedEntityInstance( trackedEntityInstanceId ), smsCommand.getProgram(), new Date(), date, orgUnit ); + programInstanceService.enrollTrackedEntityInstance( + trackedEntityInstanceService.getTrackedEntityInstance( trackedEntityInstanceId ), smsCommand.getProgram(), + new Date(), date, orgUnit ); smsSender.sendMessage( "Register new User successfully", senderPhoneNumber ); - + } private TrackedEntityAttributeValue createTrackedEntityAttributeValue( Map parsedMessage, @@ -212,111 +166,20 @@ return trackedEntityAttributeValue; } - private OrganisationUnit selectOrganisationUnit( Collection orgUnits, - Map parsedMessage, SMSCommand smsCommand ) - { - OrganisationUnit orgUnit = null; - - for ( OrganisationUnit o : orgUnits ) - { - if ( orgUnits.size() == 1 ) - { - orgUnit = o; - } - if ( parsedMessage.containsKey( "ORG" ) && o.getCode().equals( parsedMessage.get( "ORG" ) ) ) - { - orgUnit = o; - break; - } - } - - if ( orgUnit == null && orgUnits.size() > 1 ) - { - String messageListingOrgUnits = smsCommand.getMoreThanOneOrgUnitMessage(); - - for ( Iterator i = orgUnits.iterator(); i.hasNext(); ) - { - OrganisationUnit o = i.next(); - messageListingOrgUnits += " " + o.getName() + ":" + o.getCode(); - if ( i.hasNext() ) - { - messageListingOrgUnits += ","; - } - } - - throw new SMSParserException( messageListingOrgUnits ); - } - - return orgUnit; - } - - private Collection getOrganisationUnitsByPhoneNumber( String sender ) - { - Collection orgUnits = new ArrayList<>(); - Collection users = userService.getUsersByPhoneNumber( sender ); - for ( User u : users ) - { - if ( u.getOrganisationUnits() != null ) - { - orgUnits.addAll( u.getOrganisationUnits() ); - } - } - - return orgUnits; - } - - private Date lookForDate( String message ) - { - if ( !message.contains( " " ) ) - { - return null; - } - - Date date = null; - String dateString = message.trim().split( " " )[0]; - SimpleDateFormat format = new SimpleDateFormat( "ddMM" ); - - try - { - Calendar cal = Calendar.getInstance(); - date = format.parse( dateString ); - cal.setTime( date ); - int year = Calendar.getInstance().get( Calendar.YEAR ); - int month = Calendar.getInstance().get( Calendar.MONTH ); - - if ( cal.get( Calendar.MONTH ) < month ) - { - cal.set( Calendar.YEAR, year ); - } - else - { - cal.set( Calendar.YEAR, year - 1 ); - } - - date = cal.getTime(); - } - catch ( Exception e ) - { - // no date found - } - - return date; - } - private Map parse( String message, SMSCommand smsCommand ) { HashMap output = new HashMap<>(); Pattern pattern = Pattern.compile( defaultPattern ); - + if ( !StringUtils.isBlank( smsCommand.getSeparator() ) ) { String x = "(\\w+)\\s*\\" + smsCommand.getSeparator().trim() + "\\s*([\\w ]+)\\s*(\\" + smsCommand.getSeparator().trim() + "|$)*\\s*"; pattern = Pattern.compile( x ); } - + Matcher matcher = pattern.matcher( message ); - + while ( matcher.find() ) { String key = matcher.group( 1 ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/UnregisteredSMSListener.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/UnregisteredSMSListener.java 2015-10-07 14:40:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/UnregisteredSMSListener.java 2015-12-11 11:21:38 +0000 @@ -44,52 +44,39 @@ import org.hisp.dhis.sms.incoming.SmsMessageStatus; import org.hisp.dhis.sms.parse.ParserType; import org.hisp.dhis.sms.parse.SMSParserException; +import org.hisp.dhis.system.util.SmsUtils; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserCredentials; import org.hisp.dhis.user.UserGroup; import org.hisp.dhis.user.UserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; public class UnregisteredSMSListener implements IncomingSmsListener { + + public static final String USER_NAME = "anonymous"; + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + @Autowired private SMSCommandService smsCommandService; - public void setSmsCommandService( SMSCommandService smsCommandService ) - { - this.smsCommandService = smsCommandService; - } - + @Autowired private UserService userService; - public void setUserService( UserService userService ) - { - this.userService = userService; - } - + @Autowired private MessageService messageService; - public void setMessageService( MessageService messageService ) - { - this.messageService = messageService; - } - + @Autowired private SmsMessageSender smsMessageSender; - public void setSmsMessageSender( SmsMessageSender smsMessageSender ) - { - this.smsMessageSender = smsMessageSender; - } - + @Autowired private IncomingSmsService incomingSmsService; - public void setIncomingSmsService( IncomingSmsService incomingSmsService ) - { - this.incomingSmsService = incomingSmsService; - } - - public static final String USER_NAME = "anonymous"; - // ------------------------------------------------------------------------- // IncomingSmsListener implementation // ------------------------------------------------------------------------- @@ -98,22 +85,8 @@ @Override public boolean accept( IncomingSms sms ) { - String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - return smsCommandService.getSMSCommand( commandString, ParserType.UNREGISTERED_PARSER ) != null; + return smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.UNREGISTERED_PARSER ) != null; } @Transactional @@ -121,20 +94,8 @@ public void receive( IncomingSms sms ) { String message = sms.getText(); - String commandString = null; - - for ( int i = 0; i < message.length(); i++ ) - { - String c = String.valueOf( message.charAt( i ) ); - if ( c.matches( "\\W" ) ) - { - commandString = message.substring( 0, i ); - message = message.substring( commandString.length() + 1 ); - break; - } - } - - SMSCommand smsCommand = smsCommandService.getSMSCommand( commandString, ParserType.UNREGISTERED_PARSER ); + SMSCommand smsCommand = smsCommandService.getSMSCommand( SmsUtils.getCommandString( sms ), + ParserType.UNREGISTERED_PARSER ); UserGroup userGroup = smsCommand.getUserGroup(); @@ -151,13 +112,13 @@ { User user = iterator.next(); messageError += user.getName(); - + if ( iterator.hasNext() ) { messageError += ", "; } } - + throw new SMSParserException( messageError ); } else @@ -191,8 +152,8 @@ User sender = new User(); sender.setPhoneNumber( senderPhoneNumber ); feedbackList.add( sender ); - smsMessageSender.sendMessage( smsCommand.getName(), smsCommand.getReceivedMessage(), null, - null, feedbackList, true ); + smsMessageSender.sendMessage( smsCommand.getName(), smsCommand.getReceivedMessage(), null, null, + feedbackList, true ); // update the status of the sms after process sms.setStatus( SmsMessageStatus.PROCESSED ); === 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 2015-12-07 12:46:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/outbound/DefaultOutboundSmsTransportService.java 2015-12-21 16:44:02 +0000 @@ -102,7 +102,7 @@ { this.smsPublisher = smsPublisher; } - + // ------------------------------------------------------------------------- // OutboundSmsTransportService implementation // ------------------------------------------------------------------------- @@ -472,7 +472,7 @@ if ( recipients.size() > 1 ) { removeGroup( recipient ); - } + } } if ( outboundMessage.getMessageStatus() == MessageStatuses.SENT ) === 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 2015-12-09 17:24:33 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2015-12-21 16:44:02 +0000 @@ -1095,14 +1095,9 @@ - - - + - - - - + @@ -1111,9 +1106,7 @@ - - - + @@ -1125,15 +1118,13 @@ - - - - - + + + @@ -1307,55 +1298,19 @@ - - - - - - - - - - - + - - - - - - - + class="org.hisp.dhis.sms.listener.J2MEDataValueSMSListener" /> - - - - - - + class="org.hisp.dhis.sms.listener.UnregisteredSMSListener" /> - - - - - - + class="org.hisp.dhis.sms.listener.DHISMessageAlertListener" /> - - - - - - - + class="org.hisp.dhis.sms.listener.TrackedEntityRegistrationSMSListener" /> === added file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/SmsUtils.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/SmsUtils.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/SmsUtils.java 2015-12-18 11:04:05 +0000 @@ -0,0 +1,281 @@ +package org.hisp.dhis.system.util; + +/* +* Copyright (c) 2004-2015, 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 java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.text.SimpleDateFormat; + +import org.apache.commons.lang3.StringUtils; + +import org.hisp.dhis.commons.util.TextUtils; +import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.sms.incoming.IncomingSms; +import org.hisp.dhis.sms.parse.SMSParserException; +import org.hisp.dhis.user.User; +import org.hisp.dhis.sms.command.SMSCommand; + +/** + * @author Zubair + */ +public class SmsUtils +{ + private static int MAX_CHAR = 160; + + public static String getCommandString( IncomingSms sms ) + { + String message = sms.getText(); + String commandString = null; + + for ( int i = 0; i < message.length(); i++ ) + { + String c = String.valueOf( message.charAt( i ) ); + + if ( c.matches( "\\W" ) ) + { + commandString = message.substring( 0, i ); + message = message.substring( commandString.length() + 1 ); + break; + } + } + + return commandString; + } + + public static Collection getOrganisationUnitsByPhoneNumber( String sender, + Collection users ) + { + Collection orgUnits = new ArrayList<>(); + for ( User u : users ) + { + if ( u.getOrganisationUnits() != null ) + { + orgUnits.addAll( u.getOrganisationUnits() ); + } + } + + return orgUnits; + } + + public static Date lookForDate( String message ) + { + if ( !message.contains( " " ) ) + { + return null; + } + + Date date = null; + String dateString = message.trim().split( " " )[0]; + SimpleDateFormat format = new SimpleDateFormat( "ddMM" ); + + try + { + Calendar cal = Calendar.getInstance(); + date = format.parse( dateString ); + cal.setTime( date ); + int year = Calendar.getInstance().get( Calendar.YEAR ); + int month = Calendar.getInstance().get( Calendar.MONTH ); + + if ( cal.get( Calendar.MONTH ) < month ) + { + cal.set( Calendar.YEAR, year ); + } + else + { + cal.set( Calendar.YEAR, year - 1 ); + } + + date = cal.getTime(); + } + catch ( Exception e ) + { + // no date found + } + + return date; + } + + public static User getUser( String sender, SMSCommand smsCommand, List userList ) + { + OrganisationUnit orgunit = null; + User user = null; + + // Need to be edited + for ( User u : userList ) + { + OrganisationUnit ou = u.getOrganisationUnit(); + + if ( ou != null ) + { + // Might be undefined if the user has more than one org units + if ( orgunit == null ) + { + orgunit = ou; + } + else if ( orgunit.getId() == ou.getId() ) + { + // Same org unit + } + else + { + if ( StringUtils.isEmpty( smsCommand.getMoreThanOneOrgUnitMessage() ) ) + { + throw new SMSParserException( SMSCommand.MORE_THAN_ONE_ORGUNIT_MESSAGE ); + } + else + { + throw new SMSParserException( smsCommand.getMoreThanOneOrgUnitMessage() ); + } + } + } + + user = u; + } + + if ( user == null ) + { + throw new SMSParserException( "User is not associated with any orgunit. Please contact your supervisor." ); + } + + return user; + } + + public static List splitLongUnicodeString( String message, List result ) + { + String firstTempString = null; + String secondTempString = null; + int indexToCut = 0; + + firstTempString = message.substring( 0, MAX_CHAR ); + + indexToCut = firstTempString.lastIndexOf( " " ); + + firstTempString = firstTempString.substring( 0, indexToCut ); + + result.add( firstTempString ); + + secondTempString = message.substring( indexToCut + 1, message.length() ); + + if ( secondTempString.length() <= MAX_CHAR ) + { + result.add( secondTempString ); + return result; + } + else + { + return splitLongUnicodeString( secondTempString, result ); + } + } + + public static String createMessage( String subject, String text, User sender ) + { + String name = "DHIS"; + + if ( sender != null ) + { + name = sender.getUsername(); + } + + if ( subject == null || subject.isEmpty() ) + { + subject = ""; + } + else + { + subject = " - " + subject; + } + + text = name + subject + ": " + text; + + int length = text.length(); // Simplistic cut off 160 characters + + return (length > 160) ? text.substring( 0, 157 ) + "..." : text; + } + + public static Set getRecipientsPhoneNumber( Collection users ) + { + Set recipients = new HashSet<>(); + + for ( User user : users ) + { + String phoneNumber = user.getPhoneNumber(); + + if ( StringUtils.trimToNull( phoneNumber ) != null ) + { + recipients.add( phoneNumber ); + } + } + return recipients; + } + + public static OrganisationUnit selectOrganisationUnit( Collection orgUnits, + Map parsedMessage, SMSCommand smsCommand ) + { + OrganisationUnit orgUnit = null; + + for ( OrganisationUnit o : orgUnits ) + { + if ( orgUnits.size() == 1 ) + { + orgUnit = o; + } + if ( parsedMessage.containsKey( "ORG" ) && o.getCode().equals( parsedMessage.get( "ORG" ) ) ) + { + orgUnit = o; + break; + } + } + + if ( orgUnit == null && orgUnits.size() > 1 ) + { + String messageListingOrgUnits = smsCommand.getMoreThanOneOrgUnitMessage(); + + for ( Iterator i = orgUnits.iterator(); i.hasNext(); ) + { + OrganisationUnit o = i.next(); + messageListingOrgUnits += TextUtils.SPACE + o.getName() + ":" + o.getCode(); + + if ( i.hasNext() ) + { + messageListingOrgUnits += ","; + } + } + + throw new SMSParserException( messageListingOrgUnits ); + } + + return orgUnit; + } +} === 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 2015-11-24 16:58:49 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/sms/SmsController.java 2015-12-14 13:35:40 +0000 @@ -28,9 +28,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** - * Zubair - */ +import java.text.ParseException; +import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -41,7 +40,6 @@ import org.hisp.dhis.sms.incoming.IncomingSmsService; import org.hisp.dhis.webapi.service.WebMessageService; import org.hisp.dhis.webapi.utils.WebMessageUtils; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; @@ -50,6 +48,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +/** + * Zubair + */ @RestController @RequestMapping( value = "/sms" ) public class SmsController @@ -125,11 +126,10 @@ @RequestMapping( value = "/inbound", method = RequestMethod.POST ) @PreAuthorize( "hasRole('ALL') or hasRole('F_MOBILE_SETTINGS')" ) - public void receiveSMSMessage( @RequestParam String originator, - @RequestParam( required = false ) String received_time, @RequestParam String message, - @RequestParam( defaultValue = "Unknown", required = false ) String gateway, HttpServletRequest request, - HttpServletResponse response) - throws WebMessageException + public void receiveSMSMessage( @RequestParam String originator, @RequestParam( required = false ) Date receivedTime, + @RequestParam String message, @RequestParam( defaultValue = "Unknown", required = false ) String gateway, + HttpServletRequest request, HttpServletResponse response) + throws WebMessageException, ParseException { if ( originator == null || originator.length() <= 0 ) { @@ -141,25 +141,28 @@ throw new WebMessageException( WebMessageUtils.conflict( "Message must be specified" ) ); } - incomingSMSService.save( message, originator, gateway ); - - webMessageService.send( WebMessageUtils.ok( "Received" ), response, request ); + int smsId = incomingSMSService.save( message, originator, gateway, receivedTime ); + + webMessageService.send( WebMessageUtils.ok( "Received: SMS ID " + smsId ), response, request ); + } @RequestMapping( value = "/inbound", method = RequestMethod.POST, consumes = "application/json" ) @PreAuthorize( "hasRole('ALL') or hasRole('F_MOBILE_SETTINGS')" ) public void receiveSMSMessage( @RequestBody Map jsonMassage, HttpServletRequest request, HttpServletResponse response ) - throws WebMessageException + throws WebMessageException, ParseException { if ( jsonMassage == null ) { throw new WebMessageException( WebMessageUtils.conflict( "RequestBody must not be empty" ) ); } - incomingSMSService.save( jsonMassage.get( "message" ).toString(), jsonMassage.get( "originator" ).toString(), - jsonMassage.get( "gateway" ).toString() ); - - webMessageService.send( WebMessageUtils.ok( "Received" ), response, request ); + int smsId = incomingSMSService.save( jsonMassage.get( "message" ).toString(), + jsonMassage.get( "originator" ).toString(), jsonMassage.get( "gateway" ).toString(), + (Date) jsonMassage.get( "receivedTime" ) ); + + webMessageService.send( WebMessageUtils.ok( "Received: SMS ID " + smsId ), response, request ); + } } === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/java/org/hisp/dhis/mobile/action/SendSMSAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/java/org/hisp/dhis/mobile/action/SendSMSAction.java 2015-01-17 07:41:26 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/java/org/hisp/dhis/mobile/action/SendSMSAction.java 2015-12-07 18:09:30 +0000 @@ -98,8 +98,6 @@ try { smsSender.sendMessage( new OutboundSms( msg, recipient ), null ); - // outboundSmsService.sendMessage( new OutboundSms( msg, - // recipient ), null ); this.message = "Sent message to " + recipient; } catch ( SmsServiceException e )