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