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
+
+
+
+