| /* |
| * Copyright 2004-2005 The Apache Software Foundation or its licensors, |
| * as applicable. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.jackrabbit.command.info; |
| |
| import java.io.PrintWriter; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.ResourceBundle; |
| |
| import org.apache.commons.chain.Command; |
| import org.apache.commons.chain.Context; |
| import org.apache.commons.cli.HelpFormatter; |
| import org.apache.jackrabbit.command.CommandException; |
| import org.apache.jackrabbit.command.CommandHelper; |
| import org.apache.jackrabbit.command.cli.AbstractParameter; |
| import org.apache.jackrabbit.command.cli.Argument; |
| import org.apache.jackrabbit.command.cli.CommandLine; |
| import org.apache.jackrabbit.command.cli.CommandLineFactory; |
| import org.apache.jackrabbit.command.cli.Flag; |
| import org.apache.jackrabbit.command.cli.Option; |
| |
| /** |
| * Show available <code>Command</code>s. If a <code>Command</code> is |
| * specified it will show its description, usage and parameters. |
| */ |
| public class Help implements Command { |
| /** bundle */ |
| private static ResourceBundle bundle = CommandHelper.getBundle(); |
| |
| /** Command factory */ |
| private CommandLineFactory factory = CommandLineFactory.getInstance(); |
| |
| /** Help formatter */ |
| private HelpFormatter hf = new HelpFormatter(); |
| |
| /** command key */ |
| private String commandKey = "command"; |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public boolean execute(Context ctx) throws Exception { |
| String command = (String) ctx.get(this.commandKey); |
| PrintWriter out = CommandHelper.getOutput(ctx); |
| out.println(); |
| if (command == null) { |
| helpAll(ctx); |
| } else { |
| helpCommand(ctx); |
| } |
| return false; |
| } |
| |
| /** |
| * Writes help for all the commands |
| * @param ctx |
| * the current working <code>Context</code> |
| * @throws CommandException |
| */ |
| private void helpAll(Context ctx) throws CommandException { |
| PrintWriter out = CommandHelper.getOutput(ctx); |
| Collection descriptors = factory.getCommandLines(); |
| Iterator iter = descriptors.iterator(); |
| |
| // Tab position |
| int tabPos = 20; |
| while (iter.hasNext()) { |
| CommandLine desc = (CommandLine) iter.next(); |
| if (desc.getName().length() > tabPos) { |
| tabPos = desc.getName().length() + 1; |
| } |
| } |
| |
| iter = descriptors.iterator(); |
| while (iter.hasNext()) { |
| CommandLine desc = (CommandLine) iter.next(); |
| StringBuffer buf = new StringBuffer(desc.getName()); |
| buf.setLength(tabPos); |
| for (int i = desc.getName().length(); i < buf.length(); i++) { |
| buf.setCharAt(i, ' '); |
| } |
| buf.append(desc.getLocalizedDescription()); |
| hf.printWrapped(out, 70, tabPos, buf.toString()); |
| } |
| } |
| |
| /** |
| * Writes detailed help for the given command |
| * @param ctx |
| * the current working <code>Context</code> |
| * @throws CommandException |
| */ |
| private void helpCommand(Context ctx) throws CommandException { |
| PrintWriter out = CommandHelper.getOutput(ctx); |
| |
| String cmdName = (String) ctx.get(this.commandKey); |
| |
| CommandLine desc = factory.getCommandLine(cmdName); |
| |
| out.println(bundle.getString("word.description") + ": "); |
| out.println(desc.getLocalizedDescription()); |
| out.println(); |
| |
| // Usage |
| out.print(bundle.getString("word.usage") + ":"); |
| out.print(desc.getName() + " "); |
| |
| // Arguments |
| Iterator iter = desc.getArguments().values().iterator(); |
| while (iter.hasNext()) { |
| Argument arg = (Argument) iter.next(); |
| out.print("<" + arg.getLocalizedArgName() + "> "); |
| } |
| |
| // Options |
| iter = desc.getOptions().values().iterator(); |
| while (iter.hasNext()) { |
| Option arg = (Option) iter.next(); |
| out.print("-" + arg.getName() + " <" + arg.getLocalizedArgName() |
| + "> "); |
| } |
| |
| // flags |
| iter = desc.getFlags().values().iterator(); |
| while (iter.hasNext()) { |
| Flag arg = (Flag) iter.next(); |
| out.print("-" + arg.getName() + " "); |
| } |
| out.println(); |
| |
| // Alias |
| if (desc.getAlias().size() > 0) { |
| out.print(bundle.getString("word.alias") + ":"); |
| iter = desc.getAlias().iterator(); |
| while (iter.hasNext()) { |
| out.print((String) iter.next() + " "); |
| |
| } |
| out.println(); |
| } |
| out.println(); |
| |
| // Arguments details |
| if (desc.getArguments().size() > 0) { |
| out.println("<" + bundle.getString("word.arguments") + ">"); |
| printParam(ctx, desc.getArguments().values()); |
| } |
| |
| // Options details |
| if (desc.getOptions().values().size() > 0) { |
| out.println(); |
| out.println("<" + bundle.getString("word.options") + ">"); |
| printParam(ctx, desc.getOptions().values()); |
| } |
| |
| // flag details |
| if (desc.getFlags().values().size() > 0) { |
| out.println(); |
| out.println("<" + bundle.getString("word.flags") + ">"); |
| printParam(ctx, desc.getFlags().values()); |
| } |
| |
| } |
| |
| /** |
| * @param ctx |
| * the current working <code>Context</code> |
| * @param params |
| * the parameters |
| */ |
| private void printParam(Context ctx, Collection params) { |
| int[] width = new int[] { |
| 10, 10, 10, 40 |
| }; |
| |
| String[] header = new String[] { |
| bundle.getString("word.name"), |
| bundle.getString("word.argument"), |
| bundle.getString("word.required"), |
| bundle.getString("word.description") |
| }; |
| |
| PrintHelper.printRow(ctx, width, header); |
| PrintHelper.printSeparatorRow(ctx, width, '-'); |
| |
| Iterator iter = params.iterator(); |
| while (iter.hasNext()) { |
| AbstractParameter p = (AbstractParameter) iter.next(); |
| String[] item = new String[] { |
| p.getName(), p.getLocalizedArgName(), |
| Boolean.toString(p.isRequired()), |
| p.getLocalizedDescription() |
| }; |
| PrintHelper.printRow(ctx, width, item); |
| } |
| |
| } |
| |
| /** |
| * @return the command key |
| */ |
| public String getCommandKey() { |
| return commandKey; |
| } |
| |
| /** |
| * @param commandKey |
| * the command key to set |
| */ |
| public void setCommandKey(String commandKey) { |
| this.commandKey = commandKey; |
| } |
| } |