1 /**
2 *
3 * Copyright 2003-2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.geronimo.deployment.cli;
19
20 import org.apache.geronimo.common.DeploymentException;
21 import org.apache.geronimo.common.GeronimoEnvironment;
22
23 import java.util.*;
24 import java.io.*;
25
26 /**
27 * The main class for the CLI deployer. Handles chunking the input arguments
28 * and formatting help text and maintaining the list of individual commands.
29 * Uses a ServerConnection to handle the server connection and arguments, and
30 * a list of DeployCommands to manage the details of the various available
31 * commands.
32 *
33 * Returns 0 normally, or 1 of any exceptions or error messages were generated
34 * (whether for syntax or other failure).
35 *
36 * @version $Rev: 430319 $ $Date: 2006-08-10 01:52:16 -0700 (Thu, 10 Aug 2006) $
37 */
38 public class DeployTool {
39 private final static Map commands = new HashMap();
40
41 public static void registerCommand(DeployCommand command) {
42 String key = command.getCommandName();
43 if(commands.containsKey(key)) {
44 throw new IllegalArgumentException("Command "+key+" is already registered!");
45 } else {
46 commands.put(key, command);
47 }
48 }
49
50 private static DeployCommand getCommand(String name) {
51 return (DeployCommand) commands.get(name);
52 }
53
54 private static DeployCommand[] getAllCommands() {
55 DeployCommand[] list = (DeployCommand[]) commands.values().toArray(new DeployCommand[0]);
56 Arrays.sort(list, new Comparator() {
57 public int compare(Object o1, Object o2) {
58 return ((DeployCommand)o1).getCommandName().compareTo(((DeployCommand)o2).getCommandName());
59 }
60 });
61 return list;
62 }
63
64 static {
65
66 GeronimoEnvironment.init();
67
68 registerCommand(new CommandLogin());
69 registerCommand(new CommandDeploy());
70 registerCommand(new CommandDistribute());
71 registerCommand(new CommandListModules());
72 registerCommand(new CommandListTargets());
73 registerCommand(new CommandRedeploy());
74 registerCommand(new CommandStart());
75 registerCommand(new CommandStop());
76 registerCommand(new CommandRestart());
77 registerCommand(new CommandUndeploy());
78 registerCommand(new CommandListConfigurations());
79 registerCommand(new CommandInstallCAR());
80 }
81
82 private boolean failed = false;
83 String[] generalArgs = new String[0];
84 ServerConnection con = null;
85 private boolean multipleCommands = false;
86
87 public boolean execute(String args[]) {
88 PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out), true);
89 InputStream in = System.in;
90
91 String command;
92 String[] commandArgs = new String[0];
93 if(args.length == 0) {
94 command = "help";
95 } else {
96 String[] temp = getCommonArgsAndCommand(args);
97 if(temp == null || temp.length == 0) {
98 command = "help";
99 } else {
100 command = temp[temp.length-1];
101 if(generalArgs.length == 0 && temp.length > 1) {
102 generalArgs = new String[temp.length-1];
103 System.arraycopy(temp, 0, generalArgs, 0, temp.length-1);
104 }
105 commandArgs = new String[args.length - temp.length];
106 System.arraycopy(args, temp.length, commandArgs, 0, commandArgs.length);
107 }
108 }
109 if(command.equals("help")) {
110 showHelp(out, commandArgs);
111 } else if(command.equals("command-file")) {
112 multipleCommands = true;
113 if(commandArgs.length != 1) {
114 processException(out, new DeploymentSyntaxException("Must provide a command file to read from and no other arguments"));
115 } else {
116 String arg = commandArgs[0];
117 File source = new File(arg);
118 if(!source.exists() || !source.canRead() || source.isDirectory()) {
119 processException(out, new DeploymentSyntaxException("Cannot read command file "+source.getAbsolutePath()));
120 } else {
121 try {
122 BufferedReader commands = new BufferedReader(new FileReader(source));
123 String line;
124 boolean oneFailed = false;
125 while((line = commands.readLine()) != null) {
126 line = line.trim();
127 if(!line.equals("")) {
128 String[] lineArgs = splitCommand(line);
129 if(failed) {
130 oneFailed = true;
131 }
132 failed = false;
133 execute(lineArgs);
134 }
135 }
136 failed = oneFailed;
137 } catch (IOException e) {
138 processException(out, new DeploymentException("Unable to read command file", e));
139 } finally {
140 try {
141 con.close();
142 } catch (DeploymentException e) {
143 processException(out, e);
144 }
145 }
146 }
147 }
148 } else {
149 DeployCommand dc = getCommand(command);
150 if(dc == null) {
151 out.println();
152 processException(out, new DeploymentSyntaxException("No such command: '"+command+"'"));
153 showHelp(out, new String[0]);
154 } else {
155 try {
156 if(con == null) {
157 con = new ServerConnection(generalArgs, out, in);
158 }
159 try {
160 dc.execute(out, con, commandArgs);
161 } catch (DeploymentSyntaxException e) {
162 processException(out, e);
163 } catch (DeploymentException e) {
164 processException(out, e);
165 } finally {
166 if(!multipleCommands) {
167 try {
168 con.close();
169 } catch(DeploymentException e) {
170 processException(out, e);
171 }
172 }
173 }
174 } catch(DeploymentException e) {
175 processException(out, e);
176 }
177 }
178 }
179 out.flush();
180 System.out.flush();
181 return !failed;
182 }
183
184 public static String[] splitCommand(String line) {
185 String[] chunks = line.split("\"");
186 List list = new LinkedList();
187 for (int i = 0; i < chunks.length; i++) {
188 String chunk = chunks[i];
189 if(i % 2 == 1) {
190 list.add(chunk);
191 } else {
192 list.addAll(Arrays.asList(chunk.split("\\s")));
193 }
194 }
195 for (Iterator it = list.iterator(); it.hasNext();) {
196 String test = (String) it.next();
197 if(test.trim().equals("")) {
198 it.remove();
199 }
200 }
201 return (String[]) list.toArray(new String[list.size()]);
202 }
203
204 private void processException(PrintWriter out, Exception e) {
205 failed = true;
206 out.print(DeployUtils.reformat("Error: "+e.getMessage(),4,72));
207 if(e.getCause() != null) {
208 e.getCause().printStackTrace(out);
209 }
210 }
211
212 private void showHelp(PrintWriter out, String[] args) {
213 out.println();
214 out.println("Command-line deployer syntax:");
215 out.println(" deployer [general options] command [command options]");
216 out.println();
217 if(args.length > 0) {
218 DeployCommand command = getCommand(args[0]);
219 if(command != null) {
220 out.println("Help for command: "+command.getCommandName());
221 out.println();
222 out.println(" deployer "+hangingIndent(command.getCommandName()+" "+command.getHelpArgumentList(), 13));
223 out.println();
224 out.print(DeployUtils.reformat(command.getHelpText(), 8, 72));
225 out.println();
226 return;
227 } else if(args[0].equals("options")) {
228 out.println("Help on general options:");
229 out.println();
230 Map map = ServerConnection.getOptionHelp();
231 for (Iterator it = map.keySet().iterator(); it.hasNext();) {
232 String s = (String) it.next();
233 out.println(" "+s);
234 out.println();
235 out.print(DeployUtils.reformat((String)map.get(s), 8, 72));
236 }
237 return;
238 } else if(args[0].equals("all")) {
239 DeployCommand[] all = getAllCommands();
240 out.println();
241 out.println("All commands");
242 out.println();
243 for (int i = 0; i < all.length; i++) {
244 DeployCommand cmd = all[i];
245 out.println(" deployer "+hangingIndent(cmd.getCommandName()+" "+cmd.getHelpArgumentList(), 13));
246 out.print(DeployUtils.reformat(cmd.getHelpText(), 8, 72));
247 }
248 out.println();
249 return;
250 }
251 }
252 out.println("The general options are:");
253 Map map = ServerConnection.getOptionHelp();
254 for (Iterator it = map.keySet().iterator(); it.hasNext();) {
255 String s = (String) it.next();
256 out.println(" "+s);
257 }
258 out.println();
259 out.println("The available commands are:");
260 renderCommandList(out, getAllCommands());
261 out.println();
262 out.println("For more information about a specific command, run");
263 out.println(" deployer help [command name]");
264 out.println();
265 out.println("For more information about general options, run");
266 out.println(" deployer help options");
267 out.println();
268 }
269
270 private String hangingIndent(String source, int cols) {
271 String s = DeployUtils.reformat(source, cols, 72);
272 return s.substring(cols);
273 }
274
275 private void renderCommandList(PrintWriter out, DeployCommand[] all) {
276 Map temp = new HashMap();
277 for (int i = 0; i < all.length; i++) {
278 DeployCommand command = all[i];
279 List list = (List) temp.get(command.getCommandGroup());
280 if(list == null) {
281 list = new ArrayList();
282 temp.put(command.getCommandGroup(), list);
283 }
284 list.add(command.getCommandName());
285 }
286 List groups = new ArrayList(temp.keySet());
287 Collections.sort(groups);
288 for (int i = 0; i < groups.size(); i++) {
289 String name = (String) groups.get(i);
290 out.println(" "+name);
291 List list = (List) temp.get(name);
292 Collections.sort(list);
293 for (int j = 0; j < list.size(); j++) {
294 String cmd = (String) list.get(j);
295 out.println(" "+cmd);
296 }
297 }
298 }
299
300 private String[] getCommonArgsAndCommand(String[] all) {
301 List list = new ArrayList();
302 for (int i = 0; i < all.length; i++) {
303 String s = all[i];
304 boolean option = ServerConnection.isGeneralOption(list, s);
305 list.add(s);
306 if(!option) {
307 break;
308 }
309 }
310 return (String[]) list.toArray(new String[list.size()]);
311 }
312
313 public static void main(String[] args) {
314 if(!new DeployTool().execute(args)) {
315 System.exit(1);
316 } else {
317 System.exit(0);
318 }
319 }
320 }