Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/core/Login.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/core/Login.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/core/Login.java (working copy) @@ -21,6 +21,8 @@ import javax.jcr.Session; import javax.jcr.SimpleCredentials; +import jline.ConsoleReader; + import org.apache.commons.chain.Command; import org.apache.commons.chain.Context; import org.apache.commons.logging.Log; @@ -58,10 +60,11 @@ user = anon; } - if (password == null) { - password = anon; + if (password == null || (password.equals(anon) && !user.equals(anon))) { + ConsoleReader reader = new ConsoleReader(); + password = reader.readLine("Password: ", (char) 0); } - + if (log.isDebugEnabled()) { log.debug("logging in as " + user); } Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/info/Info.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/info/Info.java (revision 0) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/info/Info.java (revision 0) @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2006-2007 Mindquarry GmbH, All Rights Reserved + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + */ +package org.apache.jackrabbit.command.info; + +import java.io.PrintWriter; + +import javax.jcr.Session; + +import org.apache.commons.chain.Command; +import org.apache.commons.chain.Context; +import org.apache.jackrabbit.command.CommandException; +import org.apache.jackrabbit.command.CommandHelper; + +/** + * @author + * Alexander Klimetschek + * + */ +public class Info implements Command { + + /* (non-Javadoc) + * @see org.apache.commons.chain.Command#execute(org.apache.commons.chain.Context) + */ + public boolean execute(Context ctx) throws Exception { + PrintWriter out = CommandHelper.getOutput(ctx); + + out.println(); + + try { + CommandHelper.getRepository(ctx); + } catch (CommandException e) { + out.println("No connection to a repository."); + return false; + } + + out.println("Repository: " + CommandHelper.getRepositoryAddress(ctx)); + + Session session; + String currentPath; + try { + session = CommandHelper.getSession(ctx); + currentPath = CommandHelper.getCurrentNode(ctx).getPath(); + } catch (CommandException e) { + out.println("Not logged in / no session."); + return false; + } + + out.println("User : " + session.getUserID()); + out.println("Workspace : " + session.getWorkspace().getName()); + out.println("Node : " + currentPath); + + out.println(); + + if (session.isLive()) { + out.println("Session is live."); + } else { + out.println("Session is not live."); + } + + if (session.hasPendingChanges()) { + out.println("Session has pending changes."); + } else { + out.println("Session has no changes."); + } + + return false; + } + +} Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/CommandHelper.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/CommandHelper.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/CommandHelper.java (working copy) @@ -49,9 +49,12 @@ /** session key */ public static final String SESSION_KEY = "jcr.session"; - /** session key */ + /** output key */ public static final String OUTPUT_KEY = "jcr.output"; + /** address key */ + public static final String REPO_ADDRESS_KEY = "jcr.repo.address"; + /** * should never get called */ @@ -96,11 +99,13 @@ * @param repository * the current working Repository */ - public static void setRepository(Context ctx, Repository repository) { + public static void setRepository(Context ctx, Repository repository, String address) { if (repository == null) { ctx.remove(REPOSITORY_KEY); + ctx.remove(REPO_ADDRESS_KEY); } else { ctx.put(REPOSITORY_KEY, repository); + ctx.put(REPO_ADDRESS_KEY, address); } } @@ -168,6 +173,14 @@ } return r; } + + public static String getRepositoryAddress(Context ctx) throws CommandException { + String a = (String) ctx.get(REPO_ADDRESS_KEY); + if (a == null) { + throw new CommandException("exception.no.current.repository"); + } + return a; + } /** * Gets the current working Session Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StopJackrabbit.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StopJackrabbit.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StopJackrabbit.java (working copy) @@ -47,7 +47,7 @@ "Jackrabbit is not the current working repository"); } repo.shutdown(); - CommandHelper.setRepository(ctx, null); + CommandHelper.setRepository(ctx, null, null); return false; } } Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/ConnectToJNDIServer.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/ConnectToJNDIServer.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/ConnectToJNDIServer.java (working copy) @@ -50,7 +50,7 @@ ClientAdapterFactory adapter = new ClientAdapterFactory(); RemoteRepository remote = (RemoteRepository) iCtx.lookup(url); Repository repo = adapter.getRepository(remote); - CommandHelper.setRepository(ctx, repo); + CommandHelper.setRepository(ctx, repo, "jndi " + url); return false; } Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StartJackrabbit.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StartJackrabbit.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StartJackrabbit.java (working copy) @@ -52,7 +52,7 @@ } RepositoryConfig conf = RepositoryConfig.create(config, home); Repository repo = RepositoryImpl.create(conf); - CommandHelper.setRepository(ctx, repo); + CommandHelper.setRepository(ctx, repo, "local " + home); return false; } Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/ConnectToRmiServer.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/ConnectToRmiServer.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/ConnectToRmiServer.java (working copy) @@ -46,7 +46,7 @@ } ClientRepositoryFactory factory = new ClientRepositoryFactory(); Repository repository = factory.getRepository(url); - CommandHelper.setRepository(ctx, repository); + CommandHelper.setRepository(ctx, repository, "jcr-rmi " + url); return false; } Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StartJackrabbitSingleton.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StartJackrabbitSingleton.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/ext/StartJackrabbitSingleton.java (working copy) @@ -75,7 +75,7 @@ repo = RepositoryImpl.create(conf); cache.put(key, repo); } - CommandHelper.setRepository(ctx, repo); + CommandHelper.setRepository(ctx, repo, "local singleton " + home); } } catch (Exception e) { log.error("Unable to start jackrabbit", e); Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/resources.properties =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/resources.properties (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/resources.properties (working copy) @@ -48,6 +48,7 @@ cmd.help = Show available Commands. If a Command is specified it will show its description, usage and parameters. cmd.help.command = name cmd.help.command.desc = name of the command to describe +cmd.info = Show status information, including repository, username, workspace and session status cmd.importfilesystem = Import data from the file system. If the given path refers to a file it's imported to a Node of type nt:file under the current working Node. If the given path refers to a folder, the given folder and all the subtree is imported. cmd.importxml = Imports the xml view from the given file to the current working Node cmd.jndi = Connect to a repository through jndi @@ -239,6 +240,7 @@ word.overview = overview word.overwrite = overwrite word.password = password +word.path = path word.pattern = pattern word.prefix = prefix word.preview = preview Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/JcrClient.java =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/JcrClient.java (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/JcrClient.java (working copy) @@ -20,13 +20,23 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import javax.jcr.InvalidItemStateException; +import javax.jcr.Item; import javax.jcr.Node; import javax.jcr.RepositoryException; +import jline.ArgumentCompletor; +import jline.Completor; +import jline.ConsoleReader; +import jline.History; +import jline.SimpleCompletor; + import org.apache.commons.chain.Context; import org.apache.commons.chain.impl.ContextBase; import org.apache.commons.cli.BasicParser; @@ -39,6 +49,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.command.CommandException; import org.apache.jackrabbit.command.CommandHelper; +import org.apache.jackrabbit.util.ChildrenCollectorFilter; /** * Command line interface client @@ -118,7 +129,46 @@ return; } } + + /** + * jline ConsoleReader tab completor that completes on the children of the + * current jcr node (both nodes and properties). + * + * @author + * Alexander Klimetschek + * + */ + private class JcrChildrenCompletor implements Completor { + public int complete(String buffer, int cursor, List clist) { + String start = (buffer == null) ? "" : buffer; + + Node node; + try { + node = CommandHelper.getNode(ctx, "."); + Collection items = new ArrayList(); + ChildrenCollectorFilter collector = new ChildrenCollectorFilter( + "*", items, true, true, 1); + collector.visit(node); + for (Object item : items) { + String can = ((Item) item).getName(); + if (can.startsWith(start)) { + clist.add(can); + } + } + + return 0; + } catch (CommandException e) { + e.printStackTrace(); + } catch (RepositoryException e) { + e.printStackTrace(); + } + + return -1; + } + + } + /** * Run in interactive mode * @param cl @@ -127,18 +177,38 @@ * if an Exception occurs */ private void runInteractive(CommandLine cl) throws Exception { - // Prompt command + // built jline console reader with history + tab completion + ConsoleReader reader = new ConsoleReader(); + reader.setHistory(new History()); + reader.setUseHistory(true); + + // get all available commands for command tab completion + Collection commands = + CommandLineFactory.getInstance().getCommandLines(); + List commandNames = new ArrayList(); + for (org.apache.jackrabbit.command.cli.CommandLine c : commands) { + commandNames.add(c.getName()); + for (Object alias : c.getAlias()) { + commandNames.add((String) alias); + } + } + commandNames.add("exit"); + commandNames.add("quit"); + + // first part is the command, then all arguments will get children tab completion + reader.addCompletor(new ArgumentCompletor( new Completor[] { + new SimpleCompletor(commandNames.toArray(new String[] {} )), + new JcrChildrenCompletor() + })); + while (!exit) { try { - System.out.print(this.getPrompt() + ">"); - // Read input - BufferedReader br = new BufferedReader(new InputStreamReader( - System.in)); - String input = br.readLine(); + String input = reader.readLine("[" + this.getPrompt() + "] > "); + log.debug("running: " + input); if (input.trim().equals("exit") || input.trim().equals("quit")) { // exit? exit = true; - System.out.println("Good bye.."); + System.out.println("Good bye..."); } else if (input.trim().length() == 0) { // Do nothing } else { @@ -148,7 +218,7 @@ System.out.println(e.getLocalizedMessage()); System.out.println(); } catch (Exception e) { - handleException(e); + handleException(reader, e); } } } @@ -206,7 +276,7 @@ * @param ex * the Exception to handle */ - private void handleException(Exception ex) { + private void handleException(ConsoleReader cr, Exception ex) { System.out.println(); System.out.println(bundle.getString("exception.occurred")); System.out.println(); @@ -217,14 +287,14 @@ System.out.println(); String prompt = bundle.getString("phrase.display.stacktrace") + "? [y/n]"; - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + String str = ""; int tries = 0; while (!str.equals("y") && !str.equals("n") && tries < 3) { tries++; - System.out.print(prompt); + try { - str = in.readLine(); + str = cr.readLine(prompt); } catch (IOException e) { e.printStackTrace(); } Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/command-line.xml =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/command-line.xml (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/command-line.xml (working copy) @@ -940,4 +940,8 @@ + + + + \ No newline at end of file Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/command.xml =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/command.xml (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/src/java/org/apache/jackrabbit/command/cli/command.xml (working copy) @@ -283,5 +283,8 @@ fromKey="collected"/> + + \ No newline at end of file Index: /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/pom.xml =================================================================== --- /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/pom.xml (revision 509144) +++ /Users/alex/Library/OpenSource/jackrabbit/contrib/jcr-commands/pom.xml (working copy) @@ -28,7 +28,7 @@ org.apache.jackrabbit jcr-commands - 1.1-SNAPSHOT + 1.3-SNAPSHOT jar JCR commands @@ -56,7 +56,7 @@ org.apache.jackrabbit jackrabbit-core - 1.1-SNAPSHOT + 1.3-SNAPSHOT compile @@ -70,7 +70,7 @@ org.apache.jackrabbit jackrabbit-jcr-rmi - 1.1-SNAPSHOT + 1.3-SNAPSHOT jar @@ -108,6 +108,11 @@ compile + + jline + jline + 0.9.9 + @@ -138,6 +143,18 @@ false + + org.apache.maven.plugins + maven-jar-plugin + + + + org.apache.jackrabbit.command.cli.JcrClient + true + + + +