1 /* 2 * Replica is published under the terms 3 * of the Apache Software License. 4 */ 5 package replica.server.commands.plsql; 6 7 import java.util.StringTokenizer; 8 9 import replica.command.CommandProcessor; 10 import replica.core.ApplicationCommandProcessor; 11 import replica.core.ApplicationMessage; 12 import replica.group.GroupManager; 13 import replica.server.ServerProcess; 14 import replica.session.SessionManager; 15 16 /*** 17 * 18 * @author Pedro Costa 19 * @author Helder Silva 20 * @since 29/Jan/2004 21 */ 22 public class PlsqlCommandProcessor extends ApplicationCommandProcessor { 23 24 StringBuffer plsqlCommand = new StringBuffer(); 25 SessionManager sessionManager; 26 CommandProcessor oldCommandProcessor; 27 ServerProcess serverProcess; 28 GroupManager groupManager; 29 30 /*** 31 * 32 */ 33 public PlsqlCommandProcessor(String plsqlCommandStart, ServerProcess serverProcess, GroupManager groupManager) { 34 super(); 35 36 plsqlCommand.append(plsqlCommandStart); 37 setServerProcess( serverProcess ); 38 setGroupManager(groupManager); 39 } 40 41 /*** 42 * Process one received appMsg that is part of a plsql program. 43 * 44 * Adds the received command to the internal program body. 45 * Checks if the end of a plsql program. If yes, process program end, 46 * else return and wait for more. 47 * 48 * @see replica.core.ApplicationCommandProcessor#process(replica.core.ApplicationMessage) 49 */ 50 protected Object process(ApplicationMessage appMsg) { 51 52 String command = appMsg.getBody().toString(); 53 plsqlCommand.append(command); 54 55 if( isPlsqlEnd(command) ){ 56 processPlsqlCommandEnd(appMsg); 57 } 58 59 return ""; 60 } 61 62 /*** 63 * Called when a end of the plsql program is received. 64 * 65 * Reset the command processor on the receiving thread and sends the full plsql program 66 * to the group. 67 * 68 * @param appMsg the last message received. 69 */ 70 void processPlsqlCommandEnd(ApplicationMessage appMsg){ 71 72 getServerProcess().setCommandProcessor(getOldCommandProcessor()); 73 74 appMsg.setBody(plsqlCommand.toString()); 75 76 getGroupManager().sendMessage(appMsg); 77 } 78 79 /*** 80 * Return true if the given command is the end of a plsql program. 81 * 82 * A plsql ends with <i>end;</i> or <i>end<anyseparator>;</i> 83 * 84 * For a list of what is considered <anyseparator> see {@link java.util.StringTokenizer(String)}. 85 * 86 * @param command 87 * @return 88 */ 89 boolean isPlsqlEnd(String command){ 90 91 StringTokenizer tok = new StringTokenizer(command.trim(), " "); 92 93 String token = tok.nextToken(); 94 return ( token.equals("end") && tok.hasMoreTokens() && tok.nextToken().equals(";") ) || 95 token.equals("end;"); 96 } 97 98 /*** 99 * @return 100 */ 101 public SessionManager getSessionManager() { 102 return sessionManager; 103 } 104 105 /*** 106 * @param manager 107 */ 108 public void setSessionManager(SessionManager manager) { 109 sessionManager = manager; 110 } 111 112 /*** 113 * @return 114 */ 115 public CommandProcessor getOldCommandProcessor() { 116 return oldCommandProcessor; 117 } 118 119 /*** 120 * @param processor 121 */ 122 public void setOldCommandProcessor(CommandProcessor processor) { 123 oldCommandProcessor = processor; 124 } 125 126 /*** 127 * @return 128 */ 129 public ServerProcess getServerProcess() { 130 return serverProcess; 131 } 132 133 /*** 134 * @param process 135 */ 136 public void setServerProcess(ServerProcess process) { 137 serverProcess = process; 138 setOldCommandProcessor( serverProcess.getCommandProcessor() ); 139 serverProcess.setCommandProcessor( this ); 140 } 141 142 /*** 143 * @return 144 */ 145 public GroupManager getGroupManager() { 146 return groupManager; 147 } 148 149 /*** 150 * @param manager 151 */ 152 public void setGroupManager(GroupManager manager) { 153 groupManager = manager; 154 } 155 156 }

This page was automatically generated by Maven