=== 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 2013-05-20 09:32:19 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/sms/parse/ParserType.java 2013-06-10 11:42:40 +0000 @@ -4,5 +4,7 @@ { KEY_VALUE_PARSER, J2ME_PARSER, - ALERT_PARSER; + ALERT_PARSER, + UNREGISTERED_PARSER, + ; } === 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 2013-06-08 21:51:15 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml 2013-06-10 11:42:40 +0000 @@ -785,6 +785,14 @@ + + @@ -801,6 +809,7 @@ + === modified file 'dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/outbound/SmsSender.java' --- dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/outbound/SmsSender.java 2013-06-10 11:33:06 +0000 +++ dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/outbound/SmsSender.java 2013-06-10 11:42:40 +0000 @@ -35,7 +35,6 @@ import org.apache.commons.logging.LogFactory; import org.hisp.dhis.message.MessageSender; import org.hisp.dhis.sms.SmsServiceException; -import org.hisp.dhis.sms.smslib.SmsLibService; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -103,11 +102,6 @@ String gatewayId = transportService.getDefaultGateway(); - if ( SmsLibService.gatewayMap.get( "bulk_gw" ).equals( gatewayId ) ) - { - //bulk is limited in sending long SMS. to be continue.... - } - if ( gatewayId != null && !gatewayId.trim().isEmpty() ) { for ( User user : users ) @@ -135,15 +129,53 @@ if ( outboundSmsService != null || outboundSmsService.isEnabled() ) { - text = createMessage( subject, text, sender ); - phoneNumbers = getRecipientsPhoneNumber( toSendList ); - - if ( !phoneNumbers.isEmpty() && phoneNumbers.size() > 0 ) - { - message = sendMessage( text, phoneNumbers, gatewayId ); - } - + /*if ( SmsLibService.gatewayMap.get( "bulk_gw" ).equals( gatewayId ) ) + { + try + { + String hexText = toHex( text.getBytes( "unicode" ) ); + if ( hexText.length() > MAX_HEX_CHAR ) + { + + List splitTextList = new ArrayList(); + splitTextList = splitLongHexString( hexText, text, splitTextList ); + for ( String each: splitTextList ) + { + //text = createMessage( subject, each, sender ); + + if ( !phoneNumbers.isEmpty() && phoneNumbers.size() > 0 ) + { + //message = sendMessage( text, phoneNumbers, gatewayId ); + message = sendMessage( each, phoneNumbers, gatewayId ); + } + } + } + else + { + //text = createMessage( subject, text, sender ); + + if ( !phoneNumbers.isEmpty() && phoneNumbers.size() > 0 ) + { + message = sendMessage( text, phoneNumbers, gatewayId ); + } + } + } + catch ( UnsupportedEncodingException e ) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + else*/ + { + text = createMessage( subject, text, sender ); + + if ( !phoneNumbers.isEmpty() && phoneNumbers.size() > 0 ) + { + message = sendMessage( text, phoneNumbers, gatewayId ); + } + } } } @@ -229,8 +261,6 @@ } private String sendMessage( String text, Set recipients, String gateWayId ) - // private String sendMessage( String text, Set recipients, String - // gateWayId, boolean isUnicode ) { String message = null; OutboundSms sms = new OutboundSms(); @@ -251,7 +281,7 @@ return message; } - public static String toHex( byte[] buf ) + public String toHex( byte[] buf ) { char[] chars = new char[2 * buf.length]; for ( int i = 0; i < buf.length; ++i ) @@ -262,7 +292,7 @@ return new String( chars ); } - public static List spitLongHexString( String hexString, String message, List result ) + public List splitLongHexString( String hexString, String message, List result ) { String firstTempHex = null; @@ -289,7 +319,7 @@ } else { - return spitLongHexString( secondTempHex, secondTempString, result ); + return splitLongHexString( secondTempHex, secondTempString, result ); } } } === modified file 'dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/parse/DefaultParserManager.java' --- dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/parse/DefaultParserManager.java 2013-05-30 09:49:45 +0000 +++ dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/parse/DefaultParserManager.java 2013-06-10 11:42:40 +0000 @@ -59,6 +59,8 @@ import org.hisp.dhis.message.MessageSender; import org.hisp.dhis.message.UserMessage; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.patient.Patient; +import org.hisp.dhis.patient.PatientService; import org.hisp.dhis.period.CalendarPeriodType; import org.hisp.dhis.period.DailyPeriodType; import org.hisp.dhis.period.MonthlyPeriodType; @@ -78,6 +80,7 @@ import org.hisp.dhis.smscommand.SMSCommandService; import org.hisp.dhis.system.util.ValidationUtils; 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; @@ -91,6 +94,8 @@ implements ParserManager { + public static final String ANONYMOUS_USER_NAME = "Anonymous"; + private static final Log log = LogFactory.getLog( DefaultParserManager.class ); private CompleteDataSetRegistrationService registrationService; @@ -118,7 +123,7 @@ { this.messageConversationStore = messageConversationStore; } - + private MessageSender messageSender; public void setMessageSender( MessageSender messageSender ) @@ -126,6 +131,13 @@ this.messageSender = messageSender; } + private PatientService patientService; + + public void setPatientService( PatientService patientService ) + { + this.patientService = patientService; + } + @Autowired private IncomingSmsService incomingSmsService; @@ -170,19 +182,13 @@ sender = StringUtils.replace( sender, "+", "" ); - Collection orgUnits = getOrganisationUnitsByPhoneNumber( sender ); - if ( orgUnits == null || orgUnits.size() == 0 ) - { - log.info( "No user found for phone number: " + sender ); - throw new SMSParserException( "No user associated with this phone number. Please contact your supervisor." ); - } - if ( StringUtils.isEmpty( message ) ) { throw new SMSParserException( "No command in SMS" ); } String commandString = null; + // here, check command first if ( message.indexOf( " " ) > 0 ) { commandString = message.substring( 0, message.indexOf( " " ) ); @@ -195,6 +201,8 @@ boolean foundCommand = false; + Collection orgUnits = getOrganisationUnitsByPhoneNumber( sender ); + for ( SMSCommand command : smsCommandService.getSMSCommands() ) { if ( command.getName().equalsIgnoreCase( commandString ) ) @@ -202,24 +210,55 @@ foundCommand = true; if ( ParserType.KEY_VALUE_PARSER.equals( command.getParserType() ) ) { + checkIfDHISUsers( orgUnits, sender ); runKeyValueParser( sender, message, orgUnits, command ); break; } else if ( ParserType.J2ME_PARSER.equals( command.getParserType() ) ) { + checkIfDHISUsers( orgUnits, sender ); runJ2MEParser( sender, message, orgUnits, command ); break; } else if ( ParserType.ALERT_PARSER.equals( command.getParserType() ) ) { + checkIfDHISUsers( orgUnits, sender ); runDhisMessageAlertParser( sender, message, command ); break; } + else if ( ParserType.UNREGISTERED_PARSER.equals( command.getParserType() ) ) + { + runUnregisteredParser( sender, message, command ); + break; + } } } if ( !foundCommand ) { - throw new SMSParserException( "Command '" + commandString + "' does not exist" ); + Collection patientList = patientService.getPatientsByPhone( sender, null, null ); + + if ( patientList != null && patientList.size() > 0 ) + { + for ( Patient each : patientList ) + { + if ( each.getHealthWorker() != null ) + { + UserCredentials patientUser = userService.getUserCredentialsByUsername( "system" ); + + MessageConversation conversation = new MessageConversation( "Patients' Message", patientUser.getUser() ); + + conversation.addMessage( new Message( sms.getText().trim(), null, patientUser.getUser() ) ); + + conversation.addUserMessage( new UserMessage( each.getHealthWorker(), false ) ); + + messageConversationStore.save( conversation ); + } + } + } + else + { + throw new SMSParserException( "Command '" + commandString + "' does not exist" ); + } } } @@ -238,6 +277,15 @@ return orgUnits; } + private void checkIfDHISUsers( Collection orgUnits, String sender ) + { + if ( orgUnits == null || orgUnits.size() == 0 ) + { + log.info( "No user found for phone number: " + sender ); + throw new SMSParserException( "No user associated with this phone number. Please contact your supervisor." ); + } + } + private void runKeyValueParser( String sender, String message, Collection orgUnits, SMSCommand command ) { @@ -316,10 +364,10 @@ Set receivers = new HashSet( userGroup.getMembers() ); - //forward to user group by SMS + // forward to user group by SMS messageSender.sendMessage( command.getName(), message, sender, receivers, true ); - - //forward to user group by dhis message + + // forward to user group by dhis message if ( sender != null ) { receivers.add( sender ); @@ -336,7 +384,7 @@ conversation.addUserMessage( new UserMessage( receiver, read ) ); } messageConversationStore.save( conversation ); - //confirm SMS was received and forwarded completely + // confirm SMS was received and forwarded completely Set feedbackList = new HashSet(); feedbackList.add( sender ); messageSender.sendMessage( command.getName(), command.getReceivedMessage(), null, feedbackList, true ); @@ -344,6 +392,30 @@ } } + private void runUnregisteredParser( String senderNumber, String message, SMSCommand command ) + { + UserGroup userGroup = command.getUserGroup(); + + if ( userGroup != null ) + { + Set receivers = new HashSet( userGroup.getMembers() ); + + UserCredentials anonymousUser = userService.getUserCredentialsByUsername( "system" ); + + MessageConversation conversation = new MessageConversation( command.getName(), anonymousUser.getUser() ); + + conversation.addMessage( new Message( message, null, anonymousUser.getUser() ) ); + + for ( User receiver : receivers ) + { + boolean read = false; + + conversation.addUserMessage( new UserMessage( receiver, read ) ); + } + messageConversationStore.save( conversation ); + } + } + protected OrganisationUnit selectOrganisationUnit( Collection orgUnits, Map parsedMessage ) { === modified file 'dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/smslib/SmsLibService.java' --- dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/smslib/SmsLibService.java 2013-05-30 09:49:45 +0000 +++ dhis-2/dhis-services/dhis-service-sms/src/main/java/org/hisp/dhis/sms/smslib/SmsLibService.java 2013-06-10 11:42:40 +0000 @@ -52,6 +52,7 @@ import org.smslib.Service.ServiceStatus; import java.io.IOException; +import java.lang.Character.UnicodeBlock; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -147,7 +148,15 @@ OutboundMessage outboundMessage = new OutboundMessage( recipient, sms.getMessage() ); - outboundMessage.setEncoding( MessageEncodings.ENCUCS2 ); + //Check if text contain any specific unicode character + for( char each: sms.getMessage().toCharArray()) + { + if( !Character.UnicodeBlock.of(each).equals( UnicodeBlock.BASIC_LATIN ) ) + { + outboundMessage.setEncoding( MessageEncodings.ENCUCS2 ); + break; + } + } outboundMessage.setStatusReport( true ); === modified file 'dhis-2/dhis-services/dhis-service-sms/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-sms/src/main/resources/META-INF/dhis/beans.xml 2013-05-30 09:49:45 +0000 +++ dhis-2/dhis-services/dhis-service-sms/src/main/resources/META-INF/dhis/beans.xml 2013-06-10 11:42:40 +0000 @@ -62,6 +62,7 @@ + === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/java/org/hisp/dhis/mobile/action/smscommand/CreateSMSCommandForm.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/java/org/hisp/dhis/mobile/action/smscommand/CreateSMSCommandForm.java 2013-05-20 09:32:19 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/java/org/hisp/dhis/mobile/action/smscommand/CreateSMSCommandForm.java 2013-06-10 11:42:40 +0000 @@ -114,7 +114,7 @@ DataSet dataset = dataSetService.getDataSet( selectedDataSetID ); command.setDataset( dataset ); } - else if ( parserType.equals( ParserType.ALERT_PARSER ) ) + else if ( parserType.equals( ParserType.ALERT_PARSER ) || parserType.equals( ParserType.UNREGISTERED_PARSER ) ) { UserGroup userGroup = new UserGroup(); userGroup = userGroupService.getUserGroup( userGroupID ); === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/webapp/dhis-web-maintenance-mobile/javascript/command.js' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/webapp/dhis-web-maintenance-mobile/javascript/command.js 2013-05-20 09:40:29 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/webapp/dhis-web-maintenance-mobile/javascript/command.js 2013-06-10 11:42:40 +0000 @@ -4,7 +4,7 @@ hideAll(); if ( value == 'KEY_VALUE_PARSER' || value == 'J2ME_PARSER') { showById( "dataSetParser" ); - } else if ( value == 'ALERT_PARSER' ) { + } else if ( value == 'ALERT_PARSER' || value == 'UNREGISTERED_PARSER' ) { showById( "alertParser" ); } currentType = value; === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/webapp/dhis-web-maintenance-mobile/smscommand/edit-sms-command.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/webapp/dhis-web-maintenance-mobile/smscommand/edit-sms-command.vm 2013-05-30 09:49:45 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-mobile/src/main/webapp/dhis-web-maintenance-mobile/smscommand/edit-sms-command.vm 2013-06-10 11:42:40 +0000 @@ -66,7 +66,7 @@ - #elseif( $smsCommand.parserType == 'ALERT_PARSER' ) + #elseif( $smsCommand.parserType == 'ALERT_PARSER' || $smsCommand.parserType == 'UNREGISTERED_PARSER' ) $i18n.getString( "userGroup" )