You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by sf...@apache.org on 2010/01/15 16:35:18 UTC
svn commit: r899665 [1/4] - in /incubator/chemistry/trunk/chemistry: ./
chemistry-shell/ chemistry-shell/scripts/ chemistry-shell/src/
chemistry-shell/src/main/ chemistry-shell/src/main/java/
chemistry-shell/src/main/java/org/ chemistry-shell/src/main/...
Author: sfermigier
Date: Fri Jan 15 15:35:14 2010
New Revision: 899665
URL: http://svn.apache.org/viewvc?rev=899665&view=rev
Log:
Initial import of CMIS Shell code, donated by Nuxeo.
Added:
incubator/chemistry/trunk/chemistry/chemistry-shell/
incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/TODO
incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/run.sh (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/
incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh.bat
incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/testscript (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/utils/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Cd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Connect.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Disconnect.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Exit.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Help.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Id.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/LCd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/LPopd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/LPushd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/LPwd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Ll.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Ls.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Match.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Popd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Pushd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/base/Pwd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/Cat.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/CreateFile.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/CreateFolder.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/DumpProps.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/DumpTree.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/Get.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/PropGet.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/Put.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/Remove.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/SetProp.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/cmds/cmis/SetStream.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/Cmd.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/Command.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandException.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandLine.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandParameter.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandRegistry.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandSyntax.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandSyntaxException.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/CommandToken.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/ExitException.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/command/NoSuchCommandException.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/CommandCompletor.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/CompositeCompletor.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/ContextItemCompletor.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/DirectoryCompletor.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/ItemNameCompletor.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/JLineConsole.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/jline/ParameterNameCompletor.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/ColorHelper.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/MimeTypeHelper.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/connect.help
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/exit.help
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/help.help
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/test.help
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/usage.help
incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java (with props)
Modified:
incubator/chemistry/trunk/chemistry/pom.xml
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt Fri Jan 15 15:35:14 2010
@@ -0,0 +1,12 @@
+Authors
+-------
+
+- Bogdan Stefanescu: initial implementation
+- Stefane Fermigier: refactoring, maintainer
+
+Contributors
+------------
+
+- Florent Guillaume: code review
+- Olivier Grisel: feature requests
+
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/CONTRIBUTORS.txt
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile Fri Jan 15 15:35:14 2010
@@ -0,0 +1,37 @@
+VERSION:=0.5
+POM_VERSION:=$(VERSION)-SNAPSHOT
+TODAY:=$(shell date +"%Y%m%d")
+
+#RELEASE:=$(VERSION)-$(TODAY)
+#RELEASE_DIR:=cmissh-$(VERSION)-$(TODAY)
+RELEASE:=$(TODAY)
+RELEASE_DIR:=cmissh-$(TODAY)
+
+.PHONY: all clean build release
+
+all: build test
+
+build:
+ mvn package
+
+test:
+ ./run.sh -t -b testscript
+
+clean:
+ mvn clean
+ find . -name "*~" | xargs rm -f
+ find . -name "*,orig" | xargs rm -f
+ rm -rf release
+
+release: clean build
+ mkdir -p target/$(RELEASE_DIR)
+ cp scripts/* target/$(RELEASE_DIR)
+ cp README.txt target/$(RELEASE_DIR)
+ cp target/chemistry-shell-$(POM_VERSION).jar \
+ target/$(RELEASE_DIR)/chemistry-shell.jar
+ cd target ; zip -r $(RELEASE_DIR).zip $(RELEASE_DIR)
+
+push:
+ rsync -e ssh target/$(RELEASE_DIR).zip \
+ zope@gironde.nuxeo.com:static/nuxeo.org/cmis/
+
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/Makefile
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt Fri Jan 15 15:35:14 2010
@@ -0,0 +1,182 @@
+About this project
+==================
+
+This is a shell (command-line tool for you Windows people) that let you browse
+and manage content on a CMIS repository (a bit like Cadaver for WebDAV, if you
+know it).
+
+Building
+--------
+
+To build this project, just run "mvn install". You probably want to install
+first Apache Chemistry, by checking out the sources and running "mvn install"
+there, since it is not yet released.
+
+If you have make on you system, you can also use the following make targets:
+clean, build, test and release.
+
+Dependencies
+------------
+
+Here are the direct dependencies:
+
+jline
+chemistry-api
+chemistry-commons
+chemistry-atompub
+chemistry-atompub-client
+
+The packaging is an all in one jar containing all dependencies required by
+chemistry-atompub-client (like httpclient, apache-commons, apache-logging, stax
+(wstx) libs etc).
+
+Usage
+-----
+
+After building (with "mvn install"), it you can launch it using the run.sh
+command (by giving the URL where to connect), e.g.:
+
+> ./run.sh http://0.0.0.0:8082/cmis/repository
+
+or
+
+> ./run.sh -u Administrator -p Administrator \
+ http://cmis.demo.nuxeo.org/nuxeo/site/cmis/repository
+
+Some of the registered commands are not yet implemented. Commands use
+annotations and optional *.help files to provide help content (the *.help files
+must have the name of the command and be put in the same package. Ex: Ls.help)
+
+Available commands for now are:
+
+help
+id - display info about the current object
+mkdir
+mkfile
+setp
+getp
+setStream
+getStream
+pwd
+ls
+cd
+pushd
+popd
+tree - show repository tree
+props - show object properties
+lpwd - local pwd (file based)
+lcd - local cd
+ll - list local directory content
+lpushd
+lpopd
+cmds
+exit
+
+Ls listing supports colors based on object types - I've made a default schema
+for demonstration (you can change this in color.properties).
+
+The shell has 3 modes:
+
+- single command execution (using -e flag)
+- batch execution of commands in a file (using -b)
+- interactive execution (the default one)
+
+Note that some commands are not available in all contexts (when not yet in a
+repository, calling "tree" will display nothing).
+
+I will improve this later to show only available commands depending on the
+context.
+
+One important note is that the initial context is not a repository but the APP
+service. So if you do a "ls" in the initial context you will have the list of
+repositories. To enter a repository, do a "cd repo_name". After entering a
+repository you are in a chemistry object context so all commands should be
+available.
+
+How to extend it
+----------------
+
+To add new commands, simply extend ChemistryCommand class and look how the
+other commands works.
+
+To register a new command you need to update the constructor of ChemistryApp:
+
+public ChemistryApp() {
+ registry.registerCommand(new DumpTree());
+ ...
+}
+
+Command registration will be automized in future.
+
+The most important interfaces you need to know about are Application and
+Context which are javadoc-umented.
+
+Some commands have aliases. Example: tree <=> dump. You can define aliases in
+your annotation. Example:
+
+@Cmd(syntax="dump|tree", synopsis="Dump a subtree")
+public class DumpTree extends ChemistryCommand {
+...
+
+
+Command Syntax
+--------------
+
+When defining new commands we need to add the @Cmd annotation on the command
+class.
+
+This annotation provides 2 command properties: syntax and synopsis
+
+- The synopsis is a short description that is listed on the right side of the
+ command when you print the commands list using 'cmds'
+
+- The syntax is important and define the command line structure and how
+ auto-completion will be done.
+
+Here is the syntax format:
+
+cmd_name param_spec param_spec ...
+cmd_name: name1 | name 2 | ... - You can have multiple names associated to a command (the first one is the command name the others are aliases)
+param_spec is a parameter specification.
+
+A parameter has a key (and 0 or more aliases), a default value, an optional flag and a type.
+
+The type is important if you need auto-completion. There are several recognized types for now:
+
+1. command - a command (to complete with available command names)
+2. file - a file (to complete with a file path)
+3. dir - a directory (to complete with directory paths)
+4. item - a remote object (to complete with remote object paths)
+
+Also a parameter can be an argument, a flag or a key/value pair. Flags are not
+yet supported (i.e. -param without a value).
+
+An optional parameter must be enclosed in brackets '[' ']'.
+
+Optional parameters can have default values that can be specified by appending
+?the_default_value after the command spec.
+
+Example: [-d|--depth?1]
+
+The type is optional and is specified after the command name list separated by
+a ':'
+
+Example: [targetFile:file?/tmp/some_file]
+
+Types parameters will be auto-completed with possible values when hiting tab
+key in shell.
+
+A complete example:
+
+> print|pr [-p|--pretty?true] [-v|--verbose?false] document:item [targetFile:file?out.txt]
+
+An instance of that command will be types on the command line like this:
+
+> print --verbose true MyDocuments/Doc1 /tmp/doc1.out
+
+Invalid characters like spaces must be escaped using backslashes ('\').
+
+Example:
+
+> print --verbose true My\ Documents/Doc1 /tmp/doc1.out
+
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/README.txt
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/TODO
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/TODO?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/TODO (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/TODO Fri Jan 15 15:35:14 2010
@@ -0,0 +1,27 @@
+P1:
+- [DONE] welcome banner
+- [DONE] refresh cache
+- [DONE] Clean up warnings
+- [DONE] fix NPE when quitting w/ ^D
+- [DONE] Make a first release + mini-announcement
+
+P2:
+- [DONE] 'put filename.txt'
+- [DONE] Don't assume File and Workspace types exist on server
+- [DONE] move to Apache Chemistry
+- write help for all commands
+- decide on a name for executable (cmissh vs. cmis)
+- bigger announcement
+
+P3:
+- 'rm -r'
+- 'ls -l'
+- 'put -t type ...' and 'mkfile/mkdir -t type'
+- variables (or at least constants): -Dname=value -> $name
+- simple wildcards
+- multiple arguments (ex: rm toto1 toto2 toto3...)
+- better error reporting (no stracktrace unless specifically asked for)
+
+P4:
+- Specify/implement .cmisrc for global configuration
+
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml Fri Jan 15 15:35:14 2010
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-parent</artifactId>
+ <version>0.5-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>chemistry-shell</artifactId>
+ <name>Chemistry Shell (aka CMIS Shell or cmissh)</name>
+ <description>Command-line client using APP protocol binding for CMIS</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>jline</groupId>
+ <artifactId>jline</artifactId>
+ <version>0.9.94</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-commons</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-atompub</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-atompub-client</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.7</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <!-- This needs a running (Nuxeo) server to pass.
+ Run it manually with ./run.sh -b testscript -->
+ <exclude>**/TestWithTestScript.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-atompub-client</artifactId>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-commons</artifactId>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-api</artifactId>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-atompub</artifactId>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1</version>
+ </artifactItem>
+ <artifactItem>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging-api</artifactId>
+ <version>1.1</version>
+ </artifactItem>
+ <artifactItem>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.15</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ </artifactItem>
+ <artifactItem>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.3</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3.2</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>stax</groupId>
+ <artifactId>stax-api</artifactId>
+ <version>1.0.1</version>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.codehaus.woodstox</groupId>
+ <artifactId>wstx-asl</artifactId>
+ <version>3.2.1</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>jline</groupId>
+ <artifactId>jline</artifactId>
+ </artifactItem>
+ </artifactItems>
+
+ <outputDirectory>target/classes</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/pom.xml
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/run.sh
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/run.sh?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/run.sh (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/run.sh Fri Jan 15 15:35:14 2010
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
+
+java ${JAVA_OPTS} -jar target/chemistry-shell-0.5-SNAPSHOT.jar $@
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/run.sh
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh Fri Jan 15 15:35:14 2010
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+LIB_DIR=.
+
+java ${JAVA_OPTS} -jar "$LIB_DIR"/chemistry-shell.jar $@
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh.bat
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh.bat?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh.bat (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/cmissh.bat Fri Jan 15 15:35:14 2010
@@ -0,0 +1,12 @@
+@echo off
+
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+java %JAVA_OPTS% -jar chemistry-shell.jar %CMD_LINE_ARGS%
+
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py Fri Jan 15 15:35:14 2010
@@ -0,0 +1,54 @@
+#!/usr/bin/python
+
+import os, sys, shutil
+
+DEFAULT_BIN = "/usr/local/bin"
+DEFAULT_LIB = "/usr/local/lib/cmissh"
+
+if sys.platform == 'darwin':
+ PLATFORM = "Mac OS"
+elif sys.platform == 'linux2':
+ PLATFORM = "Linux"
+else:
+ PLATFORM = "Something else (%s)" % sys.platform
+
+def expandTilde(path):
+ if path.startswith("~"):
+ return os.environ['HOME'] + path[1:]
+
+print "Welcome to the CMIS Shell intaller."
+print "It should work on Linux and Mac OS."
+print "Please help with a Windows port if you can."
+print
+
+print "Note that this software is provided AS IS, with no expressed"
+print "or implied warranty."
+print
+
+print "Your OS seems to be:", PLATFORM
+print
+
+msg = "Destination directory for executables?\n(Default: %s): " % DEFAULT_BIN
+bin_dir = raw_input(msg).strip() or DEFAULT_BIN
+bin_dir = expandTilde(bin_dir)
+
+print
+
+msg = "Destination directory for libraries?\n(Default: %s): " % DEFAULT_LIB
+lib_dir = raw_input(msg).strip() or DEFAULT_LIB
+lib_dir = expandTilde(lib_dir)
+
+print "(If installation fails, you may want to rerun with sudo)."
+print
+
+print "Installing chemistry-shell.jar to %s..." % lib_dir
+shutil.copy("chemistry-shell.jar", lib_dir + "/chemistry-shell.jar")
+
+print "Installing cmissh to %s..." % bin_dir
+target = open("%s/cmissh" % bin_dir, "wc")
+for line in open("cmissh").readlines():
+ if line.startswith("LIB_DIR"):
+ target.write('LIB_DIR="%s"\n' % lib_dir)
+ else:
+ target.write(line)
+shutil.copymode("cmissh", "%s/cmissh" % bin_dir)
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py
------------------------------------------------------------------------------
svn:executable = *
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/install.py
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/testscript
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/testscript?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/testscript (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/testscript Fri Jan 15 15:35:14 2010
@@ -0,0 +1,109 @@
+#!./cmissh -t -b
+
+connect http://Administrator:Administrator@cmis.demo.nuxeo.org/nuxeo/site/cmis/repository
+
+# Test main commands on root
+id
+match "^CMIS server.*"
+match -r "foobar"
+ls
+match "^default$"
+
+# Local command
+help
+help ls
+lpwd
+lls
+match "testscript"
+lpushd ..
+lpopd
+lcd .
+
+# Test main commands on 'default' object (Root)
+cd default
+id
+match "^Object.*of type Root$"
+ls
+match "^default-domain$"
+tree
+propget .
+match "^cmis:objectTypeId = Root$"
+propget . cmis:objectTypeId
+match "^Root$"
+
+# navigate around
+cd default-domain
+pwd
+match "^/default/default-domain$"
+ls
+match "^workspaces$"
+cd workspaces
+pwd
+ls
+cd ..
+pwd
+cd /default/default-domain/workspaces
+pushd ..
+popd
+
+# Create an object (a folder), test commands on it
+cd /default/default-domain
+mkdir testdir
+ls
+id testdir
+ls testdir
+tree testdir
+propget testdir
+match "^dc:title = testdir$"
+match "^cmis:baseTypeId = cmis:folder$"
+propget testdir dc:title
+
+# Test mkdir more in depth
+cd /default/default-domain
+mkdir ./testdir1
+ls testdir1
+mkdir testdir1/../testdir2
+ls testdir1/../testdir2
+cd testdir1
+mkdir ../testdir3
+ls ../testdir3
+rm ../testdir3
+cd ..
+#rm testdir?
+rm testdir1
+rm testdir2
+ls
+
+# Now a file
+cd testdir
+mkfile testfile
+ls
+id testfile
+ls testfile
+propget testfile
+match "^dc:title = testfile$"
+match "^cmis:baseTypeId = cmis:document$"
+propget testfile dc:title
+match "^testfile$"
+propset testfile dc:title some_other_title
+propget testfile dc:title
+match "^some_other_title$"
+setstream testfile testscript
+cat testfile
+rm testfile
+match -r "testfile"
+
+# Put a file
+put testscript testscript
+ls
+id testscript
+cat testscript
+rm testscript
+
+# Clean up
+cd ..
+rm testdir
+match -r "testdir"
+
+disconnect
+exit
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/scripts/testscript
------------------------------------------------------------------------------
svn:executable = *
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,192 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.chemistry.shell.app.ChemistryApp;
+import org.apache.chemistry.shell.app.Console;
+import org.apache.chemistry.shell.command.ExitException;
+import org.apache.chemistry.shell.jline.JLineConsole;
+import org.apache.chemistry.shell.util.PasswordReader;
+
+public class Main {
+
+ String username;
+ String password;
+ String url;
+ boolean batchMode;
+ boolean execMode;
+ boolean testMode;
+ String command;
+ private ChemistryApp app;
+
+ private Main() {
+ }
+
+ public static void main(String[] args) throws Exception {
+ Main main = new Main();
+ main.parseArgs(args);
+ main.run();
+ }
+
+ public void parseArgs(String[] args) throws IOException {
+ if (args.length > 0) {
+ for (int i=0; i<args.length; i++) {
+ String arg = args[i];
+ if ("-u".equals(arg)) {
+ if (++i == args.length) { // username
+ error("Invalid option -u without value. Username required.");
+ }
+ username = args[i];
+ } else if ("-p".equals(arg)) { // password
+ if (++i == args.length) { // username
+ error("Invalid option -p without value. Password required.");
+ }
+ password = args[i];
+ } else if ("-t".equals(arg)) { // test mode
+ testMode = true;
+ } else if ("-e".equals(arg)) { // execute mode
+ // execute one command
+ execMode = true;
+ StringBuilder buf = new StringBuilder();
+ for (i++; i<args.length; i++) {
+ buf.append(args[i]).append(" ");
+ }
+ command = buf.toString();
+ break;
+ } else if ("-b".equals(arg)) { // batch mode
+ // execute commands in the given file or if no specified read from stdin
+ batchMode = true;
+ if (++i < args.length) {
+ // read commands from a file
+ command = args[i];
+ }
+ break;
+ } else if ("-h".equals(arg)) { // help
+ // execute help command
+ usage();
+ System.exit(0);
+ } else if (!arg.startsWith("-")) {
+ url = arg;
+ } else {
+ // unknown option
+ }
+ }
+ if (username != null && password == null) {
+ password = PasswordReader.read();
+ }
+ if (url != null && !url.contains("://")) {
+ url = "http://"+url;
+ }
+ }
+ }
+
+ public void run() throws Exception {
+ app = new ChemistryApp();
+ if (username != null){
+ app.login(username, password == null ? new char[0] : password.toCharArray());
+ }
+ if (url != null) {
+ app.connect(url);
+ }
+
+ if (execMode) {
+ runInExecMode();
+ } else if (batchMode) {
+ runInBatchMode();
+ } else {
+ runInInteractiveMode();
+ }
+ }
+
+ private void runInExecMode() throws Exception {
+ Console.setDefault(new Console());
+ Console.getDefault().start(app);
+ Console.getDefault().runCommand(command);
+ }
+
+ private void runInBatchMode() throws IOException {
+ Console.setDefault(new Console());
+ Console.getDefault().start(app);
+ List<String> cmds;
+ if (command == null) {
+ cmds = IOUtils.readLines(System.in);
+ } else {
+ cmds = IOUtils.readLines(new FileInputStream(new File(command)));
+ }
+ for (String cmd : cmds) {
+ // Ignore empty lines / comments
+ if (cmd.length() == 0 || cmd.startsWith("#")) {
+ continue;
+ }
+ Console.getDefault().println("Running: " + cmd);
+ try {
+ Console.getDefault().runCommand(cmd);
+ } catch (ExitException e) {
+ Console.getDefault().println("Bye.");
+ return;
+ } catch (Exception e) {
+ Console.getDefault().error(e.getMessage());
+ if (testMode) {
+ e.printStackTrace();
+ Console.getDefault().println("Exiting on error.");
+ System.exit(1);
+ return;
+ }
+ }
+ }
+ Console.getDefault().println("Done.");
+ }
+
+ private void runInInteractiveMode() {
+ try {
+ //TODO use user profiles to setup console like prompt and default service to cd in
+ Console.setDefault(new JLineConsole());
+ Console.getDefault().println(
+ "CMIS Shell by Nuxeo (www.nuxeo.com). Type 'help' for help.");
+ Console.getDefault().start(app);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ static void error(String msg) {
+ System.err.println(msg);
+ System.exit(1);
+ }
+
+ static void usage() throws IOException {
+ URL url = Main.class.getResource("/help/usage.help");
+ String help = IOUtils.toString(url.openStream());
+ System.out.print(help);
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/Main.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,182 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+package org.apache.chemistry.shell.app;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.chemistry.shell.command.CommandRegistry;
+import org.apache.chemistry.shell.util.Path;
+
+public abstract class AbstractApplication implements Application {
+
+ protected final CommandRegistry registry;
+ protected final Map<String, Object> dataMap;
+
+ protected Context ctx;
+ protected URL serverUrl;
+ protected File wd;
+ protected String username;
+ protected char[] password;
+
+
+ public AbstractApplication() {
+ registry = new CommandRegistry();
+ dataMap = new HashMap<String, Object>();
+ wd = new File(".");
+ ctx = getRootContext();
+ }
+
+ public void login(String username, char[] password) {
+ this.username = username;
+ this.password = password;
+ }
+
+ protected void initServerURL(URL serverUrl) {
+ String userInfo = serverUrl.getUserInfo();
+ if (userInfo != null) {
+ int p = userInfo.indexOf(':');
+ if (p > -1) {
+ username = userInfo.substring(0, p);
+ password = userInfo.substring(p+1).toCharArray();
+ } else {
+ username = userInfo;
+ }
+ }
+ // do URL cleanup
+ try {
+ this.serverUrl = new URL(serverUrl.getProtocol(), serverUrl.getHost(), serverUrl.getPort(), serverUrl.getPath());
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public String getHost() {
+ return serverUrl.getHost();
+ }
+
+ public void connect(String uri) throws IOException {
+ connect(new URL(uri));
+ }
+
+ public void connect(URL uri) throws IOException {
+ initServerURL(uri);
+ doConnect();
+ }
+
+ protected abstract void doConnect();
+
+ public CommandRegistry getCommandRegistry() {
+ return registry;
+ }
+
+ public URL getServerUrl() {
+ return serverUrl;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public File getWorkingDirectory() {
+ return wd;
+ }
+
+ public void setWorkingDirectory(File file) {
+ wd = file;
+ Console.getDefault().updatePrompt();
+ }
+
+ public Context getContext() {
+ return ctx;
+ }
+
+ public void setContext(Context ctx) {
+ this.ctx = ctx;
+ Console.getDefault().updatePrompt();
+ }
+
+ public Context resolveContext(Path path) {
+ Context c;
+ if (path.isRelative()) {
+ if (path.segmentCount() == 0) {
+ return getContext();
+ }
+ boolean dotdot = false;
+ while (path.segmentCount() > 0) {
+ String seg = path.segment(0);
+ if (seg.equals(".")) {
+ path = path.removeFirstSegments(1);
+ } else if (seg.equals("..")) {
+ dotdot = true;
+ break;
+ } else {
+ break;
+ }
+ }
+ if (dotdot) {
+ path = getContext().getPath().append(path);
+ c = getRootContext();
+ } else {
+ c = getContext();
+ }
+ } else {
+ c = getRootContext();
+ }
+ if (c == null) {
+ return null;
+ }
+ for (int i=0,cnt=path.segmentCount(); i<cnt; i++) {
+ c = c.getContext(path.segment(i));
+ if (c == null) {
+ return null;
+ }
+ }
+ return c;
+ }
+
+ public File resolveFile(String path) {
+ if (path.startsWith("/")) {
+ return new File(path);
+ } else {
+ return new File(wd, path);
+ }
+ }
+
+ public Object getData(String key) {
+ return dataMap.get(key);
+ }
+
+ public void setData(String key, Object data) {
+ if (data == null) {
+ dataMap.remove(key);
+ } else {
+ dataMap.put(key, data);
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractApplication.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,59 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import org.apache.chemistry.shell.util.Path;
+
+public abstract class AbstractContext implements Context {
+
+ protected final Application app;
+ protected final Path path;
+
+ public AbstractContext(Application app, Path path) {
+ this.app = app;
+ this.path = path;
+ }
+
+ public String pwd() {
+ return path.toString();
+ }
+
+ public Path getPath() {
+ return path;
+ }
+
+ public Application getApplication() {
+ return app;
+ }
+
+ public Path resolvePath(String path) {
+ if (!path.startsWith("/")) {
+ return new Path(path);
+ } else {
+ return this.path.append(path);
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/AbstractContext.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,134 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.apache.chemistry.shell.command.CommandRegistry;
+import org.apache.chemistry.shell.util.Path;
+
+/**
+ * An application represents the global context of the shell.
+ *
+ * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
+ */
+public interface Application {
+
+ /**
+ * Login using the given account.
+ */
+ void login(String username, char[] password);
+
+ /**
+ * Gets the connection URL.
+ */
+ URL getServerUrl();
+
+ /**
+ * Gets he username used for the connection.
+ */
+ String getUsername();
+
+ /**
+ * Gets the host where the application is connected.
+ */
+ String getHost();
+
+ /**
+ * Gets the working directory.
+ */
+ File getWorkingDirectory();
+
+ /**
+ * Sets the working directory (will be used to resolve relative file paths).
+ */
+ void setWorkingDirectory(File file);
+
+ /**
+ * Gets a file given its path.
+ * <p>
+ * If the path is absolute (starts with '/') it will be resolved as an absolute path
+ * otherwise it will be resolved against the current working directory.
+ */
+ File resolveFile(String path);
+
+ /**
+ * Gets the current context.
+ */
+ Context getContext();
+
+ /**
+ * Sets the current context to the given one.
+ */
+ void setContext(Context ctx);
+
+ /**
+ * Resolves the given path to a context.
+ */
+ Context resolveContext(Path path);
+
+ /**
+ * Gets the root context.
+ */
+ Context getRootContext();
+
+ /**
+ * Gets the command registry.
+ */
+ CommandRegistry getCommandRegistry();
+
+ /**
+ * Sets a global variable. Can be used by commands to preserve their state.
+ */
+ void setData(String key, Object data);
+
+ /**
+ * Gets a global variable given its key.
+ */
+ Object getData(String key);
+
+ /**
+ * Connects to the given url. The current context will be reset.
+ */
+ void connect(String uri) throws IOException;
+
+ /**
+ * Connects to the given url. The current context will be reset.
+ */
+ void connect(URL uri) throws IOException;
+
+ /**
+ * Disconnects if already connected. The current context will be reset.
+ */
+ void disconnect();
+
+ /**
+ * Tests if connected.
+ */
+ boolean isConnected();
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Application.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,86 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import org.apache.chemistry.atompub.client.connector.APPContentManager;
+import org.apache.chemistry.shell.cmds.cmis.Cat;
+import org.apache.chemistry.shell.cmds.cmis.CreateFile;
+import org.apache.chemistry.shell.cmds.cmis.CreateFolder;
+import org.apache.chemistry.shell.cmds.cmis.DumpProps;
+import org.apache.chemistry.shell.cmds.cmis.DumpTree;
+import org.apache.chemistry.shell.cmds.cmis.Get;
+import org.apache.chemistry.shell.cmds.cmis.PropGet;
+import org.apache.chemistry.shell.cmds.cmis.Put;
+import org.apache.chemistry.shell.cmds.cmis.Remove;
+import org.apache.chemistry.shell.cmds.cmis.SetProp;
+import org.apache.chemistry.shell.cmds.cmis.SetStream;
+
+/**
+ * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
+ *
+ */
+public class ChemistryApp extends AbstractApplication {
+
+ protected APPContentManager cm;
+
+ public ChemistryApp() {
+ registry.registerCommand(new DumpTree());
+ registry.registerCommand(new SetProp());
+ registry.registerCommand(new PropGet());
+ registry.registerCommand(new DumpProps());
+ registry.registerCommand(new Get());
+ registry.registerCommand(new SetStream());
+ registry.registerCommand(new CreateFile());
+ registry.registerCommand(new CreateFolder());
+ registry.registerCommand(new Remove());
+ registry.registerCommand(new Cat());
+ registry.registerCommand(new Put());
+ }
+
+ @Override
+ protected void doConnect() {
+ cm = new APPContentManager(serverUrl.toExternalForm());
+ if (username != null) {
+ cm.login(username, new String(password));
+ }
+ }
+
+ public void disconnect() {
+ cm = null;
+ }
+
+ public boolean isConnected() {
+ return cm != null;
+ }
+
+ public Context getRootContext() {
+ return new ChemistryRootContext(this);
+ }
+
+ public APPContentManager getContentManager() {
+ return cm;
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,46 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import org.apache.chemistry.shell.command.Command;
+import org.apache.chemistry.shell.command.CommandLine;
+
+public abstract class ChemistryCommand extends Command {
+
+ @Override
+ public void run(Application app, CommandLine cmdLine) throws Exception {
+ if (app instanceof ChemistryApp) {
+ ensureConnected(app);
+ execute((ChemistryApp) app, cmdLine);
+ } else {
+ Console.getDefault().error(
+ "Chemistry commands cannot be run outside chemistry context");
+ }
+ }
+
+ protected abstract void execute(ChemistryApp app, CommandLine cmdLine)
+ throws Exception;
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryCommand.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,164 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.chemistry.CMISObject;
+import org.apache.chemistry.Folder;
+import org.apache.chemistry.ObjectEntry;
+import org.apache.chemistry.Repository;
+import org.apache.chemistry.atompub.client.APPConnection;
+import org.apache.chemistry.atompub.client.connector.APPContentManager;
+import org.apache.chemistry.shell.util.ColorHelper;
+import org.apache.chemistry.shell.util.Path;
+
+public class ChemistryContext extends AbstractContext {
+
+ //public static final String CONN_KEY = "chemistry.connection";
+
+ protected final APPContentManager cm;
+ protected final APPConnection conn;
+ protected final CMISObject entry;
+
+ protected String[] keys;
+ protected String[] ls;
+ protected Map<String,CMISObject> children;
+
+ public ChemistryContext(ChemistryApp app, Path path, APPConnection conn, CMISObject entry) {
+ super(app, path);
+ this.conn = conn;
+ this.entry = entry;
+ cm = app.getContentManager();
+ }
+
+ @Override
+ public ChemistryApp getApplication() {
+ return (ChemistryApp)app;
+ }
+
+ // Not used
+ public APPConnection getConnection() {
+ return conn;
+ }
+
+ // Not used
+ public CMISObject getEntry() {
+ return entry;
+ }
+
+ // Not used
+ public APPContentManager getContentManager() {
+ return cm;
+ }
+
+ // Not used
+ public Repository getRepository() {
+ return conn.getRepository();
+ }
+
+ public Context getContext(String name) {
+ load();
+ CMISObject e = children.get(name);
+ if (e != null) {
+ return new ChemistryContext((ChemistryApp) app, path.append(name), conn, e);
+ }
+ return null;
+ }
+
+ public String[] ls() {
+ load();
+ return ls;
+ }
+
+ public String[] entries() {
+ load();
+ return keys;
+ }
+
+ public void reset() {
+ children = null;
+ keys = null;
+ ls = null;
+ }
+
+ public boolean isFolder() {
+ return entry instanceof Folder;
+ }
+
+ protected void load() {
+ if (children == null) {
+ if (!isFolder()) {
+ return;
+ }
+ Folder folder = (Folder) entry;
+ List<CMISObject> feed = folder.getChildren();
+ children = new LinkedHashMap<String, CMISObject>();
+ keys = new String[feed.size()];
+ ls = new String[keys.length];
+ int i = 0;
+ for (CMISObject entry : feed) {
+ children.put(entry.getName(), entry);
+ keys[i] = entry.getName();
+ ls[i++] = ColorHelper.decorateNameByType(entry.getName(), entry.getTypeId());
+ }
+ }
+ }
+
+ public <T> T as(Class<T> type) {
+ if (type.isAssignableFrom(entry.getClass())) {
+ return type.cast(entry);
+ }
+ return null;
+ }
+
+ // Not used
+ public CMISObject getObjectByAbsolutePath(String path) {
+ ObjectEntry entry = conn.getObjectByPath(path, null);
+ if (entry!=null) {
+ return conn.getObject(entry);
+ } else {
+ return null;
+ }
+ }
+
+ // Not used
+ public CMISObject resolveObject(String path) {
+ Path p = resolvePath(path);
+ ObjectEntry entry = conn.getObjectByPath(p.toString(), null);
+ if (entry!=null) {
+ return conn.getObject(entry);
+ } else {
+ return null;
+ }
+ }
+
+ public String id() {
+ return "Object "+entry.getId()+" of type "+entry.getTypeId();
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,125 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.chemistry.CMISObject;
+import org.apache.chemistry.Repository;
+import org.apache.chemistry.atompub.client.APPConnection;
+import org.apache.chemistry.atompub.client.ContentManager;
+import org.apache.chemistry.atompub.client.connector.APPContentManager;
+import org.apache.chemistry.shell.util.ColorHelper;
+import org.apache.chemistry.shell.util.Path;
+
+public class ChemistryRootContext extends AbstractContext {
+
+ protected Map<String, Repository> repos;
+ protected String[] keys;
+ protected String[] ls;
+
+ public ChemistryRootContext(ChemistryApp app) {
+ super(app, Path.ROOT);
+ }
+
+ public APPContentManager getContentManager() {
+ return ((ChemistryApp) app).getContentManager();
+ }
+
+ @Override
+ public ChemistryApp getApplication() {
+ return (ChemistryApp) app;
+ }
+
+ public <T> T as(Class<T> type) {
+ return null;
+ }
+
+ public Context getContext(String name) {
+ load();
+ ContentManager cm = getContentManager();
+ if (cm == null) {
+ Console.getDefault().error("Not connected: cannot browse repository");
+ return null;
+ }
+ Repository r = repos.get(name); // TODO atompub client is using IDs to get repositories ...
+ Repository repo = cm.getRepository(r.getId());
+ if (repo != null) {
+ APPConnection conn = (APPConnection) repo.getConnection(null);
+ CMISObject entry = conn.getRootFolder();
+ return new ChemistryContext((ChemistryApp) app, path.append(name), conn, entry);
+ }
+ return null;
+ }
+
+ public String[] ls() {
+ if (load()) {
+ return ls;
+ }
+ return new String[0];
+ }
+
+ public String[] entries() {
+ if (load()) {
+ return keys;
+ }
+ return new String[0];
+ }
+
+ protected boolean load() {
+ if (keys == null) {
+ ContentManager cm = getContentManager();
+ if (cm == null) {
+ Console.getDefault().error("Not connected: cannot browse repository");
+ return false;
+ }
+ Repository[] repos = cm.getRepositories();
+ this.repos = new HashMap<String, Repository>();
+ keys = new String[repos.length];
+ ls = new String[repos.length];
+ for (int i=0; i<repos.length; i++) {
+ keys[i] = repos[i].getName();
+ this.repos.put(repos[i].getName(), repos[i]);
+ ls[i] = ColorHelper.decorateNameByType(repos[i].getName(), "Repository");
+ }
+ }
+ return true;
+ }
+
+ public void reset() {
+ keys = null;
+ ls = null;
+ APPContentManager cm = getContentManager();
+ if (cm != null) {
+ cm.refresh();
+ }
+ }
+
+ public String id() {
+ return "CMIS server: "+app.getServerUrl();
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,129 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.chemistry.shell.command.CommandException;
+import org.apache.chemistry.shell.command.CommandLine;
+import org.apache.chemistry.shell.command.CommandRegistry;
+import org.apache.chemistry.shell.util.PasswordReader;
+
+public class Console {
+
+ protected static Console instance;
+
+ protected Application app;
+
+ protected StringBuffer buffer = new StringBuffer();
+ protected String lastResult;
+
+ public static Console getDefault() {
+ return instance;
+ }
+
+ public static void setDefault(Console console) {
+ instance = console;
+ }
+
+ /**
+ * Starts the console.
+ */
+ public void start(Application app) throws IOException {
+ if (this.app != null) {
+ throw new IllegalStateException("Console already started");
+ }
+ this.app = app;
+ }
+
+ /**
+ * Gets the current client
+ */
+ public Application getApplication() {
+ return app;
+ }
+
+ /**
+ * Gets the result of the last command.
+ */
+ public String getLastResult() {
+ return lastResult;
+ }
+
+ public void runCommand(String line) throws Exception {
+ CommandLine commandLine = parseCommandLine(app.getCommandRegistry(), line);
+ lastResult = buffer.toString();
+ buffer = new StringBuffer();
+ commandLine.run(app);
+ if ("match".equals(commandLine.getCommand().getName())) {
+ // Keep previous result in case we have several 'match' commands
+ buffer = new StringBuffer(lastResult);
+ }
+ }
+
+ public static CommandLine parseCommandLine(CommandRegistry reg, String line) throws CommandException {
+ return new CommandLine(reg, line);
+ }
+
+ /**
+ * Update the current context of the console.
+ * Overridden in the JLine console.
+ */
+ public void updatePrompt() {
+ // do nothing
+ }
+
+ /**
+ * Reads the stream an prints the result on the screen.
+ */
+ public void print(InputStream in) throws IOException {
+ IOUtils.copy(in, System.out);
+ System.out.flush();
+ }
+
+ public void println(String str) {
+ buffer.append(str + "\n");
+ System.out.println(str);
+ }
+
+ /**
+ * Print a new line.
+ * On non text console does nothing
+ */
+ public void println() throws IOException {
+ System.out.println();
+ }
+
+ public void error(String message) {
+ System.err.println(message);
+ }
+
+ public String promptPassword() throws IOException {
+ return PasswordReader.read();
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Console.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,120 @@
+/*
+ * (C) Copyright 2009-2010 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ * Contributors:
+ * Bogdan Stefanescu (bs@nuxeo.com), Nuxeo
+ * Stefane Fermigier (sf@nuxeo.com), Nuxeo
+ * Florent Guillaume (fg@nuxeo.com), Nuxeo
+ */
+
+package org.apache.chemistry.shell.app;
+
+import org.apache.chemistry.shell.util.Path;
+
+/**
+ * A context represents the current state of the shell application and is usually wrapping
+ * the current selected remote object.
+ * <p>
+ * The context can be adapted to the wrapped object by calling {@link Context#as(Class)}
+ * and providing the desired type.
+ * If the context cannot be represented as the given type it will return null,
+ * otherwise will return the instance of the desired object.
+ * <p>
+ * A context may wrap a "folder" object (thus may contain sub contexts) or it may be a leaf context.
+ * To change a context to another remote object the Context#cd
+ * <p>
+ * A context is providing several basic operations like:
+ * <ul>
+ * <li> ls - list available sub contexts
+ * <li> pwd - get the context absolute path
+ * <li> id - show more information about the current context
+ * <li> cd - change the context to another context given a context path.
+ * If the path starts with a '/' it will be assumed to be an absolute path otherwise it will be resolved relative to the current context
+ * </ul>
+ */
+public interface Context {
+
+ /**
+ * Gets the current application.
+ *
+ * @return
+ */
+ Application getApplication();
+
+ /**
+ * Gets the context path.
+ *
+ * @return
+ */
+ Path getPath();
+
+ /**
+ * Gets the context absolute path as a string.
+ *
+ * @return
+ */
+ String pwd();
+
+ /**
+ * Lists the keys of the available sub contexts.
+ * This is used by the command line completor.
+ *
+ * @return an empty array if no sub contexts are available, otherwise return the array of sub context names
+ */
+ String[] entries();
+
+ /**
+ * Lists sub contexts names. The returned names are colored (may contain color code characters).
+ *
+ * @return
+ */
+ String[] ls(); //colored entries
+
+ /**
+ * Gets a child context given its name.
+ *
+ * @param name
+ * @return null if no such sub context exists, otherwise returns the sub context
+ */
+ Context getContext(String name);
+
+ Path resolvePath(String path);
+
+ /**
+ * Clears any cache associated with the context.
+ */
+ void reset();
+
+ /**
+ * Adapts the context to the given type.
+ *
+ * @param <T>
+ * @param type
+ * @return null if the context cannot be adapted, otherwise an instance of the given type
+ */
+ <T> T as(Class<T> type);
+
+ /**
+ * Gets a string identifying this context.
+ * (Can be the object title and path or other useful information).
+ *
+ * @return
+ */
+ String id();
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/Context.java
------------------------------------------------------------------------------
svn:keywords = Id