You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by kw...@apache.org on 2002/11/09 02:13:48 UTC
cvs commit: xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/utility URLUtils.java
kward 2002/11/08 17:13:48
Added: java/scratchpad/admin/src/org/apache/xindice/admin
XindiceAdmin.java
java/scratchpad/admin/src/org/apache/xindice/admin/commandline
BaseCommand.java BasePrompt.java Command.java
CommandException.java CommandRegister.java
Prompt.java ShellPrompt.java
XindiceToolBuilder.java XindiceTools.java
java/scratchpad/admin/src/org/apache/xindice/admin/commands
AddDocumentCommand.java CreateCommand.java
DirCommand.java ExitCommand.java
GetConfigCommand.java HelpCommand.java
ListCommand.java QueryCommand.java
RunScriptCommand.java TimeCommand.java
URLCommand.java UseCommand.java
java/scratchpad/admin/src/org/apache/xindice/admin/utility
URLUtils.java
Log:
Adding scratchpad command line tools
Revision Changes Path
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/XindiceAdmin.java
Index: XindiceAdmin.java
===================================================================
/*
* Created by IntelliJ IDEA.
* User: kward
* Date: Oct 30, 2002
* Time: 9:57:34 PM
* To change template for new class use
* Code Style | Class Templates options (Tools | IDE Options).
*/
import org.apache.xindice.admin.commandline.ShellPrompt;
import java.util.Iterator;
/**
* Example program that creates a ShellPrompt and then starts it. Type
* exit to exit.
*/
public class XindiceAdmin {
public static void main(String args[]) {
ShellPrompt prompt = new ShellPrompt("Xindice ");
prompt.start();
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/BaseCommand.java
Index: BaseCommand.java
===================================================================
package org.apache.xindice.admin.commandline;
import java.util.Iterator;
import java.util.Vector;
import java.util.Hashtable;
/**
* Base class for creating named commands. The BaseCommand constructor should
* be called from the constructor of a derived class that is the actual
* command. For example:
* <p><pre>
* class ExitCommand extends BaseCommand {
* ExitCommand() {
* super("exit", 0, "calls the System to exit");
* }
* }
* </pre>
* <p>
* For a complete example of creating a command, see the RunScriptCommand.
* @see RunScriptCommand
*/
public abstract class BaseCommand implements Command {
protected String name_;
protected int numArgs_;
protected CommandRegister register_;
protected String help_;
protected static BasePrompt prompt = null;
/**
* All inheriting classes are required to call this constructor using
* <pre>super(name, numArgs, help)</pre>.
*
* @param name the name of the command - an exception will be thrown if
* a command already exists with this name
* @param numArgs the number of arguments this command takes.
* -1 can be specified if the command takes a variable number of
* arguments, in which case it is up to the derived command to carefully
* check the arguments.
* @param help this string is returned to the user when they request
* help about a command. It should include a brief description of what
* the command accomplishes and what each of the required arguments is.
*/
public BaseCommand(String name, int numArgs, String help) {
name_ = name;
numArgs_ = numArgs;
help_ = help;
}
/**
* This method is called by the CommandRegister whenever a new command
* is registered - this gives commands access to help information for
* other commands - eg. see the HelpCommand.
*/
public void set(CommandRegister cregister) {
register_ = cregister;
}
public CommandRegister getRegister() {
return register_;
}
static void setPrompt(BasePrompt prompt) {
BaseCommand.prompt = prompt;
}
protected BasePrompt getPrompt() {
if (prompt == null) {
System.err.println("cannot access prompt as it has not been set");
}
return prompt;
}
public String getName() { return name_; }
/**
* This method enables a command to be used independently of the
* command prompt. You instantiate a command, and then execute it
* by passing a string containing the arguments. If the arguments are
* not properly formatted, an error will be printed.
*/
public void execute(String args)
{
if (register_ == null) {
prompt.err.println("Warning: command '" +
getName() + "' not registered: can't execute");
return;
}
execute(register_.parseCommand(args));
}
/**
* This method should be overloaded by each command that is defined -
* it will be called by the CommandRegister after the number of
* arguments have been checked.
*/
public abstract void execute(String args[]);
/**
* This method is called internally whenever a command is executed to
* check the arguments. After checking arguments, it will call the
* execute(String[]) method for the specific command.
*/
public void execute(Iterator iter) {
String args[] = null;
if (numArgs_ != -1) {
args = new String[numArgs_];
for (int i=0; i<numArgs_; i++) {
if (!iter.hasNext()) {
prompt.out.println(getHelp());
return;
}
args[i] = (String)iter.next();
}
// check that there are not extra arguments
if (iter.hasNext()) {
prompt.err.println("Too many arguments in command");
prompt.out.println(getHelp());
return;
}
// unknown number of arguments indicated by -1
} else {
Vector vector = new Vector(10);
while(iter.hasNext()) {
vector.add(iter.next());
}
args = new String[vector.size()];
vector.toArray(args);
}
execute(args);
}
/**
* Return a the help string for this command. This is basically the help
* string required in the constructor for all BaseCommands.
*/
public String getHelp() {
return "usage:\n" + name_ + " " + help_;
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/BasePrompt.java
Index: BasePrompt.java
===================================================================
package org.apache.xindice.admin.commandline;
import java.util.StringTokenizer;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Iterator;
import java.io.*;
/**
* Base class for all command prompts. This class handles the
* prompt-independent processing, such as the basic user-interaction loop and
* command execution.
*
* Optionally, System.in, System.err, System.out can be redirected to the
* prompt's streams.
*
* @see ShellPrompt
* @see TextAreaPrompt
*/
public class BasePrompt extends Thread implements Prompt {
private String name_;
private BufferedReader reader_;
private CommandRegister register_;
public PrintStream out;
public PrintStream err;
public InputStream in;
// If System streams are redirected, a handle to the originals must
// be kept so that we can reset them if asked to exit
//
private PrintStream defaultOut_;
private PrintStream defaultErr_;
private InputStream defaultIn_;
protected BasePrompt( String name,
CommandRegister register,
PrintStream out,
PrintStream err,
InputStream in) {
name_ = name;
this.out = out;
this.err = err;
this.in = in;
reader_ = new BufferedReader(new InputStreamReader(in));
if (register == null) {
register_ = new CommandRegister();
} else {
register_ = register;
}
BaseCommand.setPrompt(this);
}
public void redirectSystemIOToPrompt() {
// maintain a handle to the default System.out and System.err
// streams so that we can reset these when we exit
//
defaultOut_ = System.out;
defaultErr_ = System.err;
defaultIn_ = System.in;
// reassign standard output, error and input to the same as that
// being used by the prompt. The whole idea here is to still be
// able to write "System.out.println()" in your code and have this
// automatically redirected to the command prompt.
//
System.setOut(out);
// At one time, I was prefixing all error messages with "Error: ".
// However, this acts somewhat funny for multi-line error messages.
// System.setErr(new PrefixPrintStream(error, "Error: "));
//
System.setErr(err);
System.setIn(in);
}
/**
* This method is called to register a new command to be used with this
* prompt. Note, every prompt contains a reference to a CommandRegister
* that keeps track of available commands.
*/
public void registerCommand(Command command) {
register_.add(command);
}
public void registerPackage(XindiceToolBuilder ci) {
register_.add(ci);
}
/**
* Iterates through all the registered packages and tells them we are
* exiting - just in case they have resources to free.
*/
public void exit() {
register_.exit();
// reset the output Streams to the defaults
// (some messages might be displayed on exit, however these will
// not be visible if the out and err streams are directed to a
// TextArea and this is no longer visible)
//
System.setOut(defaultOut_);
System.setErr(defaultErr_);
System.setIn(defaultIn_);
System.exit(0);
}
protected void printPrompt() {
out.print(name_ + "> ");
out.flush();
}
/**
* This method starts the prompt in interactive mode. Note that this is
* the starting point for a new thread of execution whcih blocks until
* the user enters input into the input stream.
*/
public void run() {
for(;;) {
printPrompt();
String command = null;
try {
command = reader_.readLine();
if (command != null && command.length() != 0) {
register_.execute(command);
}
} catch (CommandException e) {
err.println("Error: " + e);
} catch (IOException e) {
err.println("could not read line");
}
}
}
/**
* Ask the user a boolean question. Eg. "How are you today?"
* @return true if the user responds "yes" or "y", false if they respond
* "no" or "n" - all case insensitive.
*/
public boolean askBooleanQuestion(String question) {
String response = askQuestion(question, "n");
if (response.equalsIgnoreCase("yes") ||
response.equalsIgnoreCase("y")) {
return true;
}
return false;
}
/**
* Ask the user a question.
* @return a string containing the typed response.
*/
public String askQuestion(String question) {
return askQuestion(question, null);
}
/**
* Ask the user a question and provide a default answer (to save the
* user typing if it is a likely default).
* @return a string containing the typed response, or the default answer
* if the user just hits enter.
*/
public String askQuestion(String question, String defaultAns) {
out.print(question);
if (defaultAns != null) {
out.print(" (" + defaultAns + ")");
}
out.print(": ");
out.flush();
String response = "";
try {
response = reader_.readLine();
if (defaultAns != null &&
(response.equalsIgnoreCase("") ||
response.equalsIgnoreCase("\n"))) {
return defaultAns;
}
} catch (IOException e) {
err.println("could not read response");
}
return response;
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/Command.java
Index: Command.java
===================================================================
package org.apache.xindice.admin.commandline;
import java.util.Iterator;
/**
* Interface implemented by all commands. Note that this interface is
* implemented by BaseCommand.
*
* @see BaseCommand
*/
public interface Command {
String getName();
String getHelp();
void execute(String args[]);
void execute(Iterator iterator);
void set(CommandRegister cregister);
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/CommandException.java
Index: CommandException.java
===================================================================
package org.apache.xindice.admin.commandline;
/**
* If an unrecoverable error occurs when executing a command (eg. invalid
* parameters etc.), a CommandException should be thrown that will
* cleanly be handled by the prompt. The user can then retry the command
* with the correct parameters, or atleast they will have an idea why the
* command is failing.
*/
public class CommandException extends RuntimeException {
String error_;
public CommandException(String error) {
error_ = error;
}
public String toString() {
return error_;
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/CommandRegister.java
Index: CommandRegister.java
===================================================================
package org.apache.xindice.admin.commandline;
import java.util.StringTokenizer;
import java.util.Iterator;
import java.util.Hashtable;
import java.util.Vector;
/**
* This class is used internally by the BasePrompt to maintain a table
* of registered commands. You should never be required to interact with it
* using the cline package.
*/
public class CommandRegister extends Hashtable {
private Hashtable packages_ = new Hashtable(20);
public CommandRegister() {
super(100);
// always register the basic XindiceTools
add(new XindiceTools());
}
public final void add(Command command) {
command.set(this);
put(command.getName(), command);
}
/**
* Registers an entire Java package for use with the command line. All
* commands returned by this packages getCommands() method will be
* registerred when this method is called.
*/
public void add(XindiceToolBuilder ci) {
String key = ci.getClass().getName();
if (packages_.contains(key)) {
System.err.println("attempt to register duplicate package");
return;
}
packages_.put(key, ci);
// now register all the commands from this package
Command[] commands = ci.getCommands();
for (int i=0; i<commands.length; i++) {
add(commands[i]);
}
}
public void exit() {
Iterator iter = packages_.values().iterator();
while (iter.hasNext()) {
XindiceToolBuilder ci = (XindiceToolBuilder)iter.next();
ci.exit();
}
}
/**
* This method returns the tokens from a String that does not contain
* any quotations.
*/
private final Iterator parseCommandNoQuotes(String input) {
StringTokenizer tokenizer = new StringTokenizer(input, " \t");
// convert from an Enumeration to an Iterator to try and be
// consistent with our use of Collections
//
Vector tokens = new Vector();
while (tokenizer.hasMoreElements()) {
tokens.add(tokenizer.nextElement());
}
return tokens.iterator();
}
/**
* This command returns the tokens from a string. If the string contains
* a quote, the words between the quotes are returned as a single token.
*/
final Iterator parseCommand(String input) {
if (input.indexOf('"') == -1) {
return parseCommandNoQuotes(input);
}
// else we might have to parse between quotations
// For example, the string below:
// question "how are you" 2
// contains three tokens (question, how are you, 2)
int curIndex = 0;
int endIndex = input.length();
// used to hold the arguments of the command
Vector vector = new Vector(4); // 4 args is a large command
while (curIndex < endIndex) {
int spaceIndex = input.indexOf(' ', curIndex);
int quotationIndex = input.indexOf('"', curIndex);
//System.out.println("spaceIndex: [" + spaceIndex +
// "] quotationIndex: [" + quotationIndex +
// "] curIndex: [" + curIndex + "]");
String next = null;
if (quotationIndex == -1) {
Iterator iter = parseCommandNoQuotes(
input.substring(curIndex, endIndex));
while (iter.hasNext()) {
vector.add(iter.next());
}
break;
} else if (spaceIndex != -1 && spaceIndex < quotationIndex) {
next = input.substring(curIndex, spaceIndex);
curIndex = spaceIndex+1;
} else { // quotationIndex != -1
// we have to extract a string between quotations
int matchingQuote = input.indexOf('"', quotationIndex+1);
if (matchingQuote == -1) {
throw new CommandException("quotations do not match");
}
next = input.substring(quotationIndex+1, matchingQuote);
// this assumes that an end quote will always be followed
// by a space
curIndex = matchingQuote+2;
}
vector.add(next);
}
return vector.iterator();
}
public final Command getCommand(String name) {
if (containsKey(name)) {
return (Command)get(name);
}
return null;
}
/**
* Parses a string containing a command name and arguments and then
* executes the command if it was well structured (the string 'command'
* will be parsed - looking for the name of the command and any
* arguments required for that command).
*/
public void execute(String command) {
executeCommand(parseCommand(command));
}
/**
* Execute a command - the first String in the iterator should be the
* name of the command, the following strings are the parameters that
* will be passed to the command.
*/
private final void executeCommand(Iterator iter) {
if (!iter.hasNext()) {
throw new CommandException("no command specified");
}
String name = (String)iter.next();
Command command = getCommand(name);
if (command != null) {
command.execute(iter);
} else {
throw new CommandException("invalid syntax near \"" + name + "\"");
}
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/Prompt.java
Index: Prompt.java
===================================================================
package org.apache.xindice.admin.commandline;
/**
* Command prompt interface.
*
* @see ShellPrompt
*/
public interface Prompt {
public void registerCommand(Command command);
public void registerPackage(XindiceToolBuilder ci);
public void start();
public void exit();
public boolean askBooleanQuestion(String question);
public String askQuestion(String question);
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/ShellPrompt.java
Index: ShellPrompt.java
===================================================================
package org.apache.xindice.admin.commandline;
import java.util.StringTokenizer;
import java.util.Enumeration;
import java.util.Hashtable;
import java.io.*;
/**
* Command prompt to be used within a xterm or DOS-shell.
*
* @see BasePrompt
* @see TextAreaPrompt
*/
public class ShellPrompt extends BasePrompt {
/**
* The shell prompt is an easy one - it just makes use of System.out,
* System.err and System.in. The second parameter is a register of
* commands - which might have been created before we needed to allocate
* a ShellPrompt.
*/
public ShellPrompt(String name, CommandRegister register) {
super(name, register, System.out, System.err, System.in);
}
/**
* Same idea as the other constructor, however will construct a new
* CommandRegister for use with the prompt.
*/
public ShellPrompt(String name) {
super(name, null, System.out, System.err, System.in);
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/XindiceToolBuilder.java
Index: XindiceToolBuilder.java
===================================================================
package org.apache.xindice.admin.commandline;
/**
* Any Java package that is intended to be used with the cline package needs
* to implement this interface and return an array of Commands that it would
* like to use with the command prompt.
*
* @see BasePrompt#registerPackage(XindiceToolBuilder)
*/
public interface XindiceToolBuilder {
public Command[] getCommands();
public void exit();
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commandline/XindiceTools.java
Index: XindiceTools.java
===================================================================
package org.apache.xindice.admin.commandline;
import org.apache.xindice.admin.commands.*;
/**
* Package containing all commands that will be automatically registered for
* use with the command prompt. These include basic commands such as the
* HelpCommand, RunScriptCommand etc.
*/
class XindiceTools implements XindiceToolBuilder {
public Command[] getCommands() {
Command[] commands = {
// Help,Dir and Time are util commands
new HelpCommand(),
new DirCommand(),
new TimeCommand(),
new GetConfigCommand(),
new ListCommand(),
new UseCommand(),
new AddDocumentCommand(),
new CreateCommand(),
new QueryCommand(),
new RunScriptCommand(),
new ExitCommand()
};
return commands;
}
public void exit() {
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/AddDocumentCommand.java
Index: AddDocumentCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import java.util.Iterator;
import java.util.Set;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xindice.admin.commandline.Command;
/**
* This command is used to query information about any command that has
* been registered with the prompt.
*/
public class AddDocumentCommand extends BaseCommand {
public AddDocumentCommand() {
super("add", 1, "adds an XML document to the current collection");
}
public void execute(String args[]) {
String document = args[0];
prompt.out.println("Added document " + document);
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/CreateCommand.java
Index: CreateCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import java.util.Iterator;
import java.util.Set;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xindice.admin.commandline.Command;
/**
* This command is used to query information about any command that has
* been registered with the prompt.
*/
public class CreateCommand extends BaseCommand {
public CreateCommand() {
super("create", 1, "creates a new collection in the current collection");
}
public void execute(String args[]) {
String collection = args[0];
prompt.out.println("Created collection " + collection);
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/DirCommand.java
Index: DirCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.commandline.BaseCommand;
import java.io.File;
/**
* Command to display the contents of the current working directory.
* Probably not available when running in an Applet.
*/
public class DirCommand extends BaseCommand {
public DirCommand() {
super("ls", 0,
"\n- lists the contents of the current working directory");
}
public void execute(String args[]) {
try {
String dir = System.getProperty("user.dir");
File file = new File(dir);
String[] files = file.list();
for (int i=0; i<files.length; i++) {
prompt.out.println("\t"+files[i]);
}
} catch (SecurityException e) {
prompt.err.println("System security exception: " + e);
} catch (NullPointerException e) {
prompt.err.println("Null system property key: " + e);
} catch (IllegalArgumentException e) {
prompt.err.println("Bad system property key: " + e);
}
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/ExitCommand.java
Index: ExitCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.commandline.BaseCommand;
/**
* Command to exit the program. This command calls the prompt to exit the
* System and therefore requires special permissions - usually not available
* when running in an Applet.
*/
public class ExitCommand extends BaseCommand {
public ExitCommand() {
super("exit", 0,"\n- closes the prompt and any registered command packages");
}
public void execute(String args[]) {
prompt.out.println("Goodbye");
prompt.exit();
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/GetConfigCommand.java
Index: GetConfigCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Date;
/**
* Simple command to prints out the current date/time.
*/
public class GetConfigCommand extends BaseCommand {
public GetConfigCommand() {
super("info", 0,
"\n- prints out server version and server API version");
}
public static Hashtable run(Hashtable message) throws Exception {
XmlRpc.setEncoding("UTF8");
XmlRpc.setDriver("xerces");
XmlRpcClient client = new XmlRpcClient("http://localhost:8080/Xindice");
Vector params = new Vector();
params.addElement(message);
return (Hashtable) client.execute("run", params);
}
public void execute(String args[]) {
try {
String dir = System.getProperty("user.dir");
prompt.out.println("\n\tWorking directory: "+dir);
} catch (SecurityException e) {
prompt.err.println("System security exception: " + e);
} catch (NullPointerException e) {
prompt.err.println("Null system property key: " + e);
} catch (IllegalArgumentException e) {
prompt.err.println("Bad system property key: " + e);
}
Hashtable message = new Hashtable();
message.put("message", "GetServerVersion");
Hashtable result = null;
try {
result = run(message);
} catch(Exception e) {
}
prompt.out.println("\tServer Version: " + result.get("result"));
message.clear();
message.put("message", "GetApiVersion");
try {
result = run(message);
} catch(Exception e) {
}
prompt.out.println("\tAPI Version: " + result.get("result"));
prompt.out.println("\tCopyright 2002, Apache Software Foundation\n");
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/HelpCommand.java
Index: HelpCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import java.util.Iterator;
import java.util.Set;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xindice.admin.commandline.Command;
/**
* This command is used to query information about any command that has
* been registered with the prompt.
*/
public class HelpCommand extends BaseCommand {
public HelpCommand() {
super("help", 1, "command" +
"\n- prints out help information for a command");
}
public void execute(String args[]) {
String topic = args[0];
Command command = getRegister().getCommand(topic);
if (command == null) {
prompt.out.println("No help available for " + topic);
} else {
prompt.out.println(command.getHelp());
}
}
/**
* This method overloads the BaseCommand help function - the HelpCommand
* is the only class where this makes sense.
*/
public String getHelp() {
String help = super.getHelp();
// create a list of the command topics available
help += "\n Commands available are: ";
Set keySet = getRegister().keySet();
Iterator iterator = keySet.iterator();
while (iterator.hasNext()) {
String commandName = (String)iterator.next();
help += "\n " + commandName;
}
return help;
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/ListCommand.java
Index: ListCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Date;
/**
* Simple command to prints out the current date/time.
*/
public class ListCommand extends BaseCommand {
public ListCommand() {
super("list", 0, "\n- prints the current collection's structure.");
}
public void execute(String args[]) {
XmlRpcClient client = null;
try {
XmlRpc.setEncoding("UTF8");
XmlRpc.setDriver("xerces");
} catch(Exception e) {
}
try {
client = new XmlRpcClient("http://localhost:8080/Xindice");
} catch(Exception e) {
}
Hashtable message = new Hashtable();
message.put("message", "ListCollections");
message.put("collection", "/db");
Hashtable result = null;
Vector params = new Vector();
params.addElement( message );
try {
result = (Hashtable) client.execute("run", params);
} catch(Exception e) {
}
prompt.out.println("\t"+result.get("result"));
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/QueryCommand.java
Index: QueryCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import java.util.Iterator;
import java.util.Set;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xindice.admin.commandline.Command;
/**
* This command is used to query information about any command that has
* been registered with the prompt.
*/
public class QueryCommand extends BaseCommand {
public QueryCommand() {
super("query", 0, "executes an XPath or XUpdate query against a document or collection");
}
public void execute(String args[]) {
//String collection = args[0];
prompt.out.println("Query results...");
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/RunScriptCommand.java
Index: RunScriptCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.commandline.CommandException;
import java.util.Iterator;
import java.net.URL;
import java.io.*;
/**
* This command reads in a text file (or URL) containing a list of commands.
* It is basically a utility for batch executions. Each line of the file
* should contain a command to be executed. Comment lines can be inserted
* by placing a '#' at the start of the line. By convention, I name all my
* scripts with a .scr ending (good old ms-dos syntax).
*/
public class RunScriptCommand extends URLCommand {
public RunScriptCommand() {
super("exec", 1, "url" +
"\n- reads the specified url containing a list of commands");
}
public void execute(String args[]) {
Iterator urls = getURLs(args);
if (urls == null || ( ! urls.hasNext()) ) {
prompt.err.println("must specify valid script URL");
return;
}
URL url = (URL)urls.next();
BufferedReader in = getBufferedReader(url);
if (in == null) {
return;
}
String nextCommand = null;
int lineNumber=0;
try {
while ((nextCommand=in.readLine()) != null) {
lineNumber++;
if (nextCommand.equals("") || nextCommand.startsWith("#")) {
continue;
}
try {
register_.execute(nextCommand);
} catch (CommandException e) {
prompt.err.println("while reading script file '" +
url + "' on line " + lineNumber);
prompt.err.println(e);
return;
}
}
in.close();
} catch (IOException e) {
prompt.err.println("IOException reading script from: " +
url);
}
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/TimeCommand.java
Index: TimeCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.commandline.BaseCommand;
import java.util.Date;
/**
* Simple command to prints out the current date/time.
*/
public class TimeCommand extends BaseCommand {
public TimeCommand() {
super("time", 0,
"\n- prints out the current date and time");
}
public void execute(String args[]) {
prompt.out.println("Current time is: " + (new Date()).toString());
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/URLCommand.java
Index: URLCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import org.apache.xindice.admin.utility.URLUtils;
import org.apache.xindice.admin.commandline.BaseCommand;
import java.util.Iterator;
import java.util.Vector;
import java.net.URL;
import java.io.*;
/**
* Any command that loads a URL (eg. file) for input should extend this
* command. It basically checks that the Strings representing the URLs
* are valid and returns URL instances as an enumeration (takes some of
* the pain out of creating URLs). It is used by the RunScriptCommand.
*
* @see RunScriptCommand
*/
public abstract class URLCommand extends BaseCommand {
protected URLCommand(String name, int numArgs, String help) {
super(name, numArgs, help);
}
public Iterator getURLs(String args[]) {
Vector urls = new Vector(args.length);
// build the URL
for (int i=0; i<args.length; i++) {
URL url = URLUtils.createURL(args[i]);
if (url != null) {
urls.add(url);
}
}
return urls.iterator();
}
/**
* Utility method
*/
public BufferedReader getBufferedReader(URL url) {
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(url.openStream()));
} catch (IOException e) {
prompt.err.println("error opening url: " + url);
}
return reader;
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/commands/UseCommand.java
Index: UseCommand.java
===================================================================
package org.apache.xindice.admin.commands;
import java.util.Iterator;
import java.util.Set;
import org.apache.xindice.admin.commandline.BaseCommand;
import org.apache.xindice.admin.commandline.Command;
/**
* This command is used to query information about any command that has
* been registered with the prompt.
*/
public class UseCommand extends BaseCommand {
public UseCommand() {
super("use", 1, "command sets the current database collection");
}
public void execute(String args[]) {
String collection = args[0];
prompt.out.println("Collection changed to "+ collection);
}
}
1.1 xml-xindice/java/scratchpad/admin/src/org/apache/xindice/admin/utility/URLUtils.java
Index: URLUtils.java
===================================================================
package org.apache.xindice.admin.utility;
import java.io.File;
import java.net.URL;
import java.net.MalformedURLException;
public class URLUtils {
public static final boolean isURLString(String string) {
if (string.indexOf("://") != -1) {
return true;
} else if ( string.indexOf("/") != -1 ||
string.indexOf("\\") != -1 ) {
// this might be a file, this is expensive but we need to try
URL test = createURL(string);
if (test != null) {
return true;
}
}
return false;
}
public static final URL createURL(String name) {
// try and determine if this string is a full URL or just a
// partial file name (default protocol if "protocol://" is not
// prepended to the string)
URL url = null;
if (name.indexOf("://") != -1) {
try {
url = new URL(name);
} catch (MalformedURLException e) {
System.err.println("Could not create URL from '" +
name + "'");
return null;
}
} else {
// else we default to the file protocol
File file = new File(name);
try {
url = file.toURL();
} catch (MalformedURLException e) {
// if the command has mixed fileName and integer (or non-file
// name) arguments, we might be trying to create a URL for
// an integer argument - just skip this name and return null
// System.err.println(
// "URL path '" + name + "' is not valid: " + e);
return null;
}
}
return url;
}
}