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 [4/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/...
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,75 @@
+/*
+ * (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.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * In java 6 there is direct support for reading passwords form a console
+ * <pre>
+ * if ((cons = System.console()) != null &&
+ * (passwd = cons.readPassword("[%s]", "Password:")) != null) {
+ * ...
+ * }
+ * </pre>
+ * This can be for java < 6.
+ * <p>
+ * A separate thread is used to send to the console the backspace character to erase the last-typed character.
+ */
+public class PasswordReader {
+
+ private PasswordReader() {
+ }
+
+ public static String read() throws IOException {
+ ConsoleEraser consoleEraser = new ConsoleEraser();
+ System.out.print("Password: ");
+ BufferedReader stdin = new BufferedReader(new
+ InputStreamReader(System.in));
+ consoleEraser.start();
+ String pass = stdin.readLine();
+ consoleEraser.halt();
+ System.out.print("\b");
+ return pass;
+ }
+
+ static class ConsoleEraser extends Thread {
+
+ private boolean running = true;
+
+ @Override
+ public void run() {
+ while (running) {
+ System.out.print("\b ");
+ }
+ }
+
+ public synchronized void halt() {
+ running = false;
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/PasswordReader.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,512 @@
+/*
+ * (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.util;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Path implements Serializable {
+
+ public static final char SEP = '/';
+
+ protected static final int HAS_LEADING = 1;
+ protected static final int HAS_TRAILING = 2;
+ protected static final int HASH_MASK = ~HAS_TRAILING;
+ protected static final int ALL_SEPARATORS = HAS_LEADING | HAS_TRAILING;
+ protected static final int USED_BITS = 2;
+ protected static final String[] NO_SEGMENTS = new String[0];
+
+ private static final long serialVersionUID = 5008948361159403627L;
+
+ public static final Path EMPTY = new Path(new String[0], 0) {
+ private static final long serialVersionUID = -1731993368728652448L;
+ @Override
+ public String toString() {
+ return "";
+ }
+ };
+
+ public static final Path ROOT = new Path(new String[0], 1) {
+ private static final long serialVersionUID = -6689687769363666578L;
+ @Override
+ public String toString() {
+ return "/";
+ }
+ };
+
+ protected String[] segments;
+ protected int flags;
+
+
+ public Path(String path) {
+ init(path);
+ updateHashCode();
+ }
+
+ public Path(String path, int flags) {
+ init(path);
+ this.flags |= flags & ALL_SEPARATORS;
+ updateHashCode();
+ }
+
+ public Path(String[] segments, int flags) {
+ this.segments = segments;
+ this.flags = flags;
+ updateHashCode();
+ }
+
+ public Path(Path path) {
+ segments = path.segments;
+ flags = path.flags;
+ }
+
+
+ private void init(String path) {
+ List<String> segments = new ArrayList<String>();
+ int len = path.length();
+ if (len == 0) {
+ flags = 0;
+ this.segments = NO_SEGMENTS;
+ return;
+ }
+ if (len == 1) {
+ char c = path.charAt(0);
+ if (c == '/') {
+ flags = HAS_LEADING;
+ this.segments = NO_SEGMENTS;
+ return;
+ } else if (c == '.'){
+ flags = 0;
+ this.segments = NO_SEGMENTS;
+ return;
+ } else {
+ flags = 0;
+ this.segments = new String[] {path};
+ return;
+ }
+ }
+ char[] chars = path.toCharArray();
+ flags = chars[0] == '/' ? HAS_LEADING : 0;
+ if (chars[len-1] == '/') {
+ flags |= HAS_TRAILING;
+ }
+
+ int slash = 0;
+ int off = 0;
+ int cnt = 0;
+ for (int i = 0; i < len; i++) {
+ char c = chars[i];
+ switch (c) {
+ case SEP:
+ if (slash == 0) { // first slash
+ if (cnt > 0) { // segment end
+ segments.add(new String(chars, off, cnt));
+ cnt = 0;
+ }
+ off = i;
+ } else { // ignore double slashes
+ off++;
+ }
+ slash++;
+ break;
+ case '.':
+ if (slash > 0 || i == 0) {
+ if (i < chars.length-2) { // look ahead 2 chars
+ char c1 = chars[i+1];
+ char c2 = chars[i+2];
+ if (c1 == '.' && c2 == SEP) { // a .. segment
+ if (segments.isEmpty()) { // add a dot segment
+ segments.add("..");
+ } else { // remove last segment
+ int last = segments.size()-1;
+ if (!"..".equals(segments.get(last))) {
+ segments.remove(last);
+ } else {
+ segments.add("..");
+ }
+ }
+ i += 2;
+ slash = 1;
+ continue;
+ } else if (c1 == SEP) { // a . segment - ignore it
+ i++;
+ slash = 1;
+ continue;
+ }
+ } else if (i < chars.length -1 && chars[i+1] == '/') { // ignore . segment
+ slash = 0;
+ continue; //TODO - we may add here the segment to avoid rereading the char
+ }
+ slash = 0;
+ }
+ // do nothing (the char will be added to the segment)
+ default:
+ if (slash > 0) {
+ slash = 0;
+ off = i;
+ }
+ cnt++;
+ break;
+ }
+ }
+ if (cnt > 0) {
+ segments.add(new String(chars, off, cnt));
+ }
+ int size = segments.size();
+ if (size == 0) {
+ this.segments = NO_SEGMENTS;
+ } else {
+ this.segments = segments.toArray(new String[segments.size()]);
+ }
+ }
+
+ protected final void updateHashCode() {
+ flags = (flags & ALL_SEPARATORS) | (computeHashCode() << USED_BITS);
+ }
+
+ protected int computeHashCode() {
+ int hash = 17;
+ int segmentCount = segments.length;
+ for (int i = 0; i < segmentCount; i++) {
+ //this function tends to given a fairly even distribution
+ hash = hash * 37 + segments[i].hashCode();
+ }
+ return hash;
+ }
+
+ public boolean isAbsolute() {
+ return (flags & HAS_LEADING) != 0;
+ }
+
+ public boolean isRelative() {
+ return (flags & HAS_LEADING) == 0;
+ }
+
+ public boolean isRoot() {
+ return (segments.length == 0) && ((flags & HAS_LEADING) != 0);
+ }
+
+ public boolean isEmpty() {
+ return (segments.length == 0) && ((flags & HAS_LEADING) == 0);
+ }
+
+ public boolean hasTrailingSeparator() {
+ return (flags & HAS_TRAILING) != 0;
+ }
+
+ public int segmentCount() {
+ return segments.length;
+ }
+
+ public String[] segments() {
+ final String[] segmentCopy = new String[segments.length];
+ System.arraycopy(segments, 0, segmentCopy, 0, segments.length);
+ return segmentCopy;
+ }
+
+ public String segment(int index) {
+ return segments[index];
+ }
+
+ public String getLastSegment() {
+ int len = segments.length;
+ return len == 0 ? null : segments[len - 1];
+ }
+
+ public String getFileExtension() {
+ int len = segments.length;
+ if (len == 0) {
+ return null;
+ }
+ String name = segments[len - 1];
+ int p = name.lastIndexOf('.');
+ if (p > -1) {
+ return name.substring(p+1);
+ }
+ return null;
+ }
+
+ public String getFileName() {
+ int len = segments.length;
+ if (len == 0) {
+ return null;
+ }
+ String name = segments[len - 1];
+ int p = name.lastIndexOf('.');
+ if (p > -1) {
+ return name.substring(0, p);
+ }
+ return name;
+ }
+
+ public String[] getFileParts() {
+ int len = segments.length;
+ if (len == 0) {
+ return null;
+ }
+ String name = segments[len - 1];
+ int p = name.lastIndexOf('.');
+ if (p > -1) {
+ return new String[] {name.substring(0, p), name.substring(p+1)};
+ }
+ return new String[] {name, null};
+ }
+
+ public Path makeAbsolute() {
+ if (isAbsolute()) {
+ return this;
+ }
+ int k = 0;
+ for (String segment : segments) {
+ if ("..".equals(segment)) {
+ k++;
+ } else {
+ break;
+ }
+ }
+ if (k > 0) {
+ String[] newSegments = new String[segments.length-k];
+ System.arraycopy(segments, k, newSegments, 0, newSegments.length);
+ return new Path(newSegments, flags | HAS_LEADING);
+ }
+ return new Path(segments, flags | HAS_LEADING);
+ }
+
+ public Path makeRelative() {
+ if (isRelative()) {
+ return this;
+ }
+ return new Path(segments, flags & ~HAS_LEADING);
+ }
+
+ public Path removeTrailingSeparator() {
+ if (!hasTrailingSeparator()) {
+ return this;
+ }
+ return new Path(segments, flags & ~HAS_TRAILING);
+ }
+
+ public Path addTrailingSeparator() {
+ if (hasTrailingSeparator()) {
+ return this;
+ }
+ return new Path(segments, flags | HAS_TRAILING);
+ }
+
+ public Path removeLastSegments(int count) {
+ if (count == 0) {
+ return this;
+ }
+ if (count >= segments.length) {
+ //result will have no trailing separator
+ return (flags & HAS_LEADING) != 0 ? ROOT : EMPTY;
+ }
+ assert count > 0;
+ final int newSize = segments.length - count;
+ final String[] newSegments = new String[newSize];
+ System.arraycopy(segments, 0, newSegments, 0, newSize);
+ return new Path(newSegments, flags);
+ }
+
+ public Path removeFirstSegments(int count) {
+ if (count == 0) {
+ return this;
+ }
+ if (count >= segments.length) {
+ return EMPTY;
+ }
+ assert count > 0;
+ int newSize = segments.length - count;
+ String[] newSegments = new String[newSize];
+ System.arraycopy(segments, count, newSegments, 0, newSize);
+
+ //result is always a relative path
+ return new Path(newSegments, flags & HAS_TRAILING);
+ }
+
+ public Path removeFileExtension() {
+ String extension = getFileExtension();
+ if (extension == null || extension.equals("")) { //$NON-NLS-1$
+ return this;
+ }
+ String lastSegment = getLastSegment();
+ int index = lastSegment.lastIndexOf(extension) - 1;
+ return removeLastSegments(1).append(lastSegment.substring(0, index));
+ }
+
+ public Path up() {
+ return removeLastSegments(1);
+ }
+
+ public Path getParent() {
+ return removeLastSegments(1);
+ }
+
+ public Path appendSegment(String segment) {
+ int myLen = segments.length;
+ String[] newSegments = new String[myLen + 1];
+ System.arraycopy(segments, 0, newSegments, 0, myLen);
+ newSegments[myLen] = segment;
+ return new Path(newSegments, flags);
+ }
+
+ public Path append(Path tail) {
+ //optimize some easy cases
+ if (tail == null || tail.segmentCount() == 0) {
+ return this;
+ }
+ if (isEmpty()) {
+ return tail.makeRelative();
+ }
+ if (isRoot()) {
+ return tail.makeAbsolute();
+ }
+
+ int flags = this.flags;
+
+ int myLen = segments.length;
+ int tailLen = tail.segmentCount();
+ int j = 0; int s = 0;
+ // remove ../ segments from the appended path
+ for (int i=0; i<tailLen; i++) {
+ String seg = tail.segments[i];
+ if ("..".equals(seg)) {
+ j++;
+ } else if (".".equals(seg)) {
+ if (j == 0) {
+ s++;
+ }
+ } else {
+ break;
+ }
+ }
+ if (j > 0) {
+ s = j;
+ }
+
+ int k = myLen - j;
+ if (k < 0) {
+ myLen = -k;
+ } else {
+ myLen = k;
+ }
+
+ //concatenate the two segment arrays
+ String[] newSegments = new String[myLen + tailLen-s];
+ if (k < 0) {
+ for (int i = 0; i < myLen; i++) {
+ newSegments[i] = "..";
+ }
+ flags &= ~HAS_LEADING;
+ } else if (k > 0) {
+ System.arraycopy(segments, 0, newSegments, 0, myLen);
+ }
+ for (int i = s; i < tailLen; i++) {
+ newSegments[myLen + i-s] = tail.segment(i);
+ }
+ //use my leading separators and the tail's trailing separator
+
+ return new Path(newSegments, (flags & HAS_LEADING) | (tail.hasTrailingSeparator() ? HAS_TRAILING : 0));
+ }
+
+ public Path append(String tail) {
+ //optimize addition of a single segment
+ if (tail.indexOf(SEP) == -1) {
+ int tailLength = tail.length();
+ if (tailLength < 3) {
+ //some special cases
+ if (tailLength == 0 || ".".equals(tail)) {
+ return this;
+ }
+ if ("..".equals(tail)) {
+ return removeLastSegments(1);
+ }
+ }
+ //just add the segment
+ int myLen = segments.length;
+ String[] newSegments = new String[myLen + 1];
+ System.arraycopy(segments, 0, newSegments, 0, myLen);
+ newSegments[myLen] = tail;
+ return new Path(newSegments, flags & ~HAS_TRAILING);
+ }
+ //go with easy implementation
+ return append(new Path(tail));
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Path)) {
+ return false;
+ }
+ Path target = (Path) obj;
+ //check leading separators and hash code
+ if (flags != target.flags) {
+ return false;
+ }
+ String[] targetSegments = target.segments;
+ int i = segments.length;
+ //check segment count
+ if (i != targetSegments.length) {
+ return false;
+ }
+ //check segments in reverse order - later segments more likely to differ
+ while (--i >= 0) {
+ if (!segments[i].equals(targetSegments[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return flags & HASH_MASK;
+ }
+
+ @Override
+ public String toString() {
+ int len = segments.length;
+ if (len == 0) {
+ return (flags & HAS_LEADING) != 0 ? "/" : "";
+ }
+ StringBuilder buf = new StringBuilder(len*16);
+ if ((flags & HAS_LEADING) != 0) {
+ buf.append(SEP);
+ }
+ buf.append(segments[0]);
+ for (int i=1; i<len; i++) {
+ buf.append(SEP).append(segments[i]);
+ }
+ if ((flags & HAS_TRAILING) != 0) {
+ buf.append(SEP);
+ }
+ return buf.toString();
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/Path.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,68 @@
+/*
+ * (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.util;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.chemistry.BaseType;
+import org.apache.chemistry.CMISObject;
+import org.apache.chemistry.Folder;
+import org.apache.chemistry.shell.app.Console;
+
+public class SimpleBrowser {
+
+ protected final Folder root;
+
+ public SimpleBrowser(Folder root) {
+ this.root = root;
+ }
+
+ public void browse() throws IOException {
+ doBrowse(root);
+ }
+
+ protected void doBrowse(Folder currentNode) throws IOException {
+ doBrowse("+", currentNode);
+ }
+
+ protected void doBrowse(String tabs, Folder currentNode) throws IOException {
+ dumpWithPath(tabs, currentNode);
+ List<CMISObject> children = currentNode.getChildren();
+ for (CMISObject child : children) {
+ if (BaseType.FOLDER.equals(child.getBaseType())) {
+ Folder folder = (Folder) child;
+ doBrowse(tabs + "--+", folder);
+ } else {
+ dumpWithPath(tabs + "---", child);
+ }
+ }
+ }
+
+ protected void dumpWithPath(String tabs, CMISObject item) {
+ Console.getDefault().println(tabs+ " "+ item.getName()+" ["+item.getType().getId()+"]");
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleBrowser.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,54 @@
+/*
+ * (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.util;
+
+import org.apache.chemistry.Document;
+import org.apache.chemistry.Folder;
+
+public class SimpleCreator {
+
+ protected final Folder folder;
+
+ public SimpleCreator(Folder folder) {
+ this.folder = folder;
+ }
+
+ public void createFolder(String typeName, String name) throws Exception {
+ Folder newFolder = folder.newFolder(typeName);
+ newFolder.setName(name);
+ // TODO
+ //newFolder.setValue("dc:title", name);
+ newFolder.save();
+ }
+
+ public void createFile(String typeName, String name) throws Exception {
+ Document newDoc = folder.newDocument(typeName);
+ newDoc.setName(name);
+ // TODO
+ //newDoc.setValue("dc:title", name);
+ newDoc.save();
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimpleCreator.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,94 @@
+/*
+ * (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.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.chemistry.CMISObject;
+import org.apache.chemistry.ContentStream;
+import org.apache.chemistry.Document;
+import org.apache.chemistry.Property;
+import org.apache.chemistry.impl.simple.SimpleContentStream;
+import org.apache.chemistry.shell.app.Console;
+import org.apache.chemistry.shell.command.CommandException;
+
+public class SimplePropertyManager {
+
+ protected final CMISObject item;
+
+ public SimplePropertyManager(CMISObject item) {
+ this.item = item;
+ }
+
+ public String getPropertyAsString(String name) {
+ Property p = item.getProperty(name);
+ if (p == null) {
+ return "[null]";
+ }
+ Serializable val = p.getValue();
+ return val != null ? val.toString() : "[null]";
+ }
+
+ public void setProperty(String name, Serializable value) throws Exception{
+ item.setValue(name, value);
+ item.save();
+ }
+
+ public void dumpProperties() {
+ Map<String, Property> props = item.getProperties();
+
+ List<String> keys = new LinkedList<String>(props.keySet());
+ Collections.sort(keys);
+
+ for (String key : keys) {
+ Property prop = props.get(key);
+ Object value = prop.getValue();
+ Console.getDefault().println(key + " = " + (value != null ? value : "[null]"));
+ }
+ }
+
+ public ContentStream getStream() throws IOException {
+ return item.getContentStream(null);
+ }
+
+ public void setStream(InputStream in, String name) throws Exception {
+ if (item instanceof Document) {
+ Document doc = (Document) item;
+ String mimeType = MimeTypeHelper.getMimeType(name);
+ ContentStream stream = new SimpleContentStream(in, mimeType, name);
+ doc.setContentStream(stream);
+ doc.save();
+ } else {
+ throw new CommandException("Target object is not a Document, can not set stream");
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/SimplePropertyManager.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,122 @@
+/*
+ * (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.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class StringUtils {
+
+ private StringUtils() {
+ }
+
+ public static String[] split(String str, char delimiter, boolean trim) {
+ int s = 0;
+ int e = str.indexOf(delimiter, s);
+ if (e == -1) {
+ if (trim) {
+ str = str.trim();
+ }
+ return new String[] {str};
+ }
+ List<String> ar = new ArrayList<String>();
+ do {
+ String segment = str.substring(s, e);
+ if (trim) {
+ segment = segment.trim();
+ }
+ ar.add(segment);
+ s = e + 1;
+ e = str.indexOf(delimiter, s);
+ } while (e != -1);
+
+ int len = str.length();
+ if (s < len) {
+ String segment = str.substring(s);
+ if (trim) {
+ segment = segment.trim();
+ }
+ ar.add(segment);
+ } else {
+ ar.add("");
+ }
+
+ return ar.toArray(new String[ar.size()]);
+ }
+
+ public static String[] tokenize(String text) {
+ boolean esc = false;
+ boolean inString = false;
+ ArrayList<String> tokens = new ArrayList<String>();
+ StringBuilder buf = new StringBuilder();
+
+ char[] chars = text.toCharArray();
+ for (char c : chars) {
+ if (esc) {
+ switch (c) {
+ case 'n':
+ buf.append('\n');
+ break;
+ case 't':
+ buf.append('\t');
+ break;
+ default:
+ buf.append(c);
+ }
+ esc = false;
+ continue;
+ }
+ if (inString && c != '"') {
+ buf.append(c);
+ continue;
+ }
+ switch (c) {
+ case ' ':
+ case '\t':
+ if (buf.length() > 0) {
+ tokens.add(buf.toString());
+ buf.setLength(0);
+ }
+ break;
+ case '\\':
+ esc = true;
+ break;
+ case '"':
+ inString = !inString;
+ break;
+ default:
+ buf.append(c);
+ break;
+ }
+ }
+
+ if (buf.length() > 0) {
+ tokens.add(buf.toString());
+ buf.setLength(0);
+ }
+ return tokens.toArray(new String[tokens.size()]);
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/util/StringUtils.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF Fri Jan 15 15:35:14 2010
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 1
+Bundle-Name: Chemistry CMIS Client
+Bundle-SymbolicName: org.apache.chemistry.shell;singleton:=true
+Main-Class: org.apache.chemistry.shell.Main
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/META-INF/MANIFEST.MF
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties Fri Jan 15 15:35:14 2010
@@ -0,0 +1,8 @@
+Repository=cyan
+WorkspaceRoot=cyan
+SectionRoot=cyan
+TemplateRoot=cyan
+Folder=blue
+Workspace=magenta
+Section=yellow
+Domain=red
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/color.properties
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/connect.help
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/connect.help?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/connect.help (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/connect.help Fri Jan 15 15:35:14 2010
@@ -0,0 +1,7 @@
+Usage: connect <url>
+
+Connect to a service URL.
+
+If credentials need to be passed, embed them in the URL, e.g. use
+
+http://<login>:<password>@<host>/...
\ No newline at end of file
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/exit.help
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/exit.help?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/exit.help (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/exit.help Fri Jan 15 15:35:14 2010
@@ -0,0 +1 @@
+Exit client application.
\ No newline at end of file
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/help.help
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/help.help?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/help.help (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/help.help Fri Jan 15 15:35:14 2010
@@ -0,0 +1,5 @@
+Usage: help [command]
+
+To get help of a specific command, type 'help name_of_command'.
+
+List of available commands:
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/test.help
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/test.help?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/test.help (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/test.help Fri Jan 15 15:35:14 2010
@@ -0,0 +1 @@
+Only for testing (will be removed),
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/usage.help
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/usage.help?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/usage.help (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/help/usage.help Fri Jan 15 15:35:14 2010
@@ -0,0 +1,49 @@
+NAME
+ cmissh - interactive or batch CMIS client
+
+SYNOPSIS
+ cmissh [OPTIONS] [-b script] [-e command] [URL]
+
+DESCRIPTION
+ cmissh is a command-line tool to connect to a document
+ management server using the OASIS CMIS (Content Management
+ Interoperability Standard) protocol.
+
+ It can be used to create, retrieve, modify and delete
+ (CRUD) document and folders.
+
+OPTIONS
+ -b script
+ Enables batch mode. Runs the specified script
+ non-interactively.
+
+ -e command
+ Enable command mode. Runs a single command as
+ specified on the command-line.
+
+ -h Reports usage information.
+
+ -p password
+ Specifies password to connect to server.
+
+ -t Enables testing mode. In testing mode (usually
+ used conjointly with batch mode), cmissh will
+ fail as soon as a command reports an error.
+
+ -u username
+ Specifies username to connect to server.
+
+SEE ALSO
+ Type 'cmissh help' or 'help' in interactive mode for the list
+ of available commands.
+
+HISTORY
+ cmissh was written by Bogdan Stefanescu (bs@nuxeo.com), then
+ Stefane Fermigier (sf@nuxeo.com) and Florent Guillaume
+ (fg@nuxeo.com).
+
+ cmissh is based on the Apache Chemistry code.
+
+LICENSE
+ cmissh is released under the Apache Public License 2.0.
+
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties Fri Jan 15 15:35:14 2010
@@ -0,0 +1,7 @@
+log4j.rootLogger=WARN, CONSOLE
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}] %m%n
+
+# HttpClient is too verbose
+log4j.category.org.apache.commons.httpclient=ERROR
\ No newline at end of file
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/resources/log4j.properties
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,38 @@
+/*
+ * (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 org.apache.chemistry.shell.Main;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestWithTestScript extends Assert {
+
+ @Test
+ public void test() throws Exception {
+ Main.main(new String[] {"cmissh", "-t", "-b", "testscript"});
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/TestWithTestScript.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,60 @@
+package org.apache.chemistry.shell.command;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.apache.chemistry.shell.app.Application;
+import org.apache.chemistry.shell.command.Cmd;
+import org.apache.chemistry.shell.command.Command;
+import org.apache.chemistry.shell.command.CommandException;
+import org.apache.chemistry.shell.command.CommandLine;
+import org.apache.chemistry.shell.command.CommandRegistry;
+
+public class TestCommandLine extends Assert {
+
+ CommandRegistry reg;
+
+ @Before
+ public void setUp() {
+ Map<String, Command> map = new HashMap<String,Command>();
+ map.put("cmd", new DummyCommand());
+ reg = new CommandRegistry(map);
+ }
+
+ @Test
+ public void testWithoutOption() throws CommandException {
+ String line = "cmd value";
+ CommandLine commandLine = new CommandLine(reg, line);
+
+ assertEquals("cmd", commandLine.getCommand().getName());
+ assertEquals("value", commandLine.getParameterValue("arg1"));
+ assertNull(commandLine.getParameter("-r"));
+ assertNull(commandLine.getParameter("-o"));
+ //assertEquals("tutu", commandLine.getParameterValue("titi"));
+ }
+
+ @Test
+ public void testWithOption() throws CommandException {
+ String line = "cmd -r -o option value";
+ CommandLine commandLine = new CommandLine(reg, line);
+
+ assertEquals("cmd", commandLine.getCommand().getName());
+ assertEquals("value", commandLine.getParameterValue("arg1"));
+ assertEquals("option", commandLine.getParameterValue("-o"));
+ assertNotNull(commandLine.getParameter("-r"));
+ //assertEquals("tutu", commandLine.getParameterValue("titi"));
+ }
+
+ @Ignore // this is not a test, you dummy Maven!
+ @Cmd(syntax="cmd [-r] [-o:*] arg1 [titi:file?tutu]", synopsis="")
+ class DummyCommand extends Command {
+ @Override
+ public void run(Application app, CommandLine cmdLine) throws Exception {}
+ }
+
+}
+
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandLine.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,140 @@
+/*
+ * (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.command;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.chemistry.shell.command.CommandSyntax;
+import org.apache.chemistry.shell.command.CommandToken;
+
+public class TestCommandSyntax extends Assert {
+
+ @Test
+ public void testNoArgument() {
+ CommandSyntax cs = CommandSyntax.parse("cmd");
+ assertEquals(0, cs.getArguments().size());
+ assertEquals(1, cs.getTokens().size());
+ assertEquals("cmd", cs.getCommandToken().getName());
+ }
+
+ @Test
+ public void testOneMandatoryArgument() {
+ CommandSyntax cs = CommandSyntax.parse("cmd arg1");
+ assertEquals(1, cs.getArguments().size());
+ assertEquals(2, cs.getTokens().size());
+
+ CommandToken cmd = cs.getCommandToken();
+ assertEquals("cmd", cmd.getName());
+ assertTrue(cmd.isCommand());
+ assertFalse(cmd.isArgument());
+
+ CommandToken arg1 = cs.getArgument(0);
+ CommandToken arg1ByName = cs.getToken("arg1");
+ assertEquals(arg1ByName, arg1);
+
+ assertEquals("arg1", arg1.getName());
+ assertTrue(arg1.isArgument());
+ assertFalse(arg1.isCommand());
+ assertFalse(arg1.isOptional());
+ assertFalse(arg1.isFlag());
+ assertNull(arg1.getValueType());
+ }
+
+ @Test
+ public void testOneMandatoryWithType() {
+ CommandSyntax cs = CommandSyntax.parse("cmd arg1:file");
+ assertEquals(1, cs.getArguments().size());
+ assertEquals(2, cs.getTokens().size());
+
+ CommandToken arg1 = cs.getArgument(0);
+ CommandToken arg1ByName = cs.getToken("arg1");
+ assertEquals(arg1ByName, arg1);
+
+ assertEquals("arg1", arg1.getName());
+ assertTrue(arg1.isArgument());
+ assertFalse(arg1.isCommand());
+ assertFalse(arg1.isFlag());
+
+ assertEquals("file", arg1.getValueType());
+ }
+
+ @Test
+ public void testOneOptionalArgument() {
+ CommandSyntax cs = CommandSyntax.parse("cmd [arg1]");
+ assertEquals(1, cs.getArguments().size());
+ assertEquals(2, cs.getTokens().size());
+
+ CommandToken cmd = cs.getCommandToken();
+ assertEquals("cmd", cmd.getName());
+ assertTrue(cmd.isCommand());
+ assertFalse(cmd.isArgument());
+
+ CommandToken arg1 = cs.getArgument(0);
+ CommandToken arg1ByName = cs.getToken("arg1");
+ assertEquals(arg1ByName, arg1);
+
+ assertEquals("arg1", arg1.getName());
+ assertTrue(arg1.isArgument());
+ assertFalse(arg1.isCommand());
+ assertTrue(arg1.isOptional());
+ assertFalse(arg1.isFlag());
+ }
+
+ @Test
+ public void testOneOptionalFlag() {
+ CommandSyntax cs = CommandSyntax.parse("cmd [-s] arg1");
+ assertEquals(1, cs.getArguments().size());
+ assertEquals(3, cs.getTokens().size());
+
+ CommandToken cmd = cs.getCommandToken();
+ assertEquals("cmd", cmd.getName());
+ assertTrue(cmd.isCommand());
+ assertFalse(cmd.isArgument());
+
+ CommandToken arg1 = cs.getToken("arg1");
+ assertEquals("arg1", arg1.getName());
+
+ CommandToken flag = cs.getToken("-s");
+
+ assertEquals("-s", flag.getName());
+ assertFalse(flag.isArgument());
+ assertFalse(flag.isCommand());
+ assertTrue(flag.isOptional());
+ assertTrue(flag.isFlag());
+ }
+
+ @Test
+ public void testDefaultValue() {
+ CommandSyntax cs = CommandSyntax.parse("cmd [arg1:file?toto]");
+ CommandToken arg1 = cs.getToken("arg1");
+ assertEquals("arg1", arg1.getName());
+ assertEquals("file", arg1.getValueType());
+ assertEquals("toto", arg1.getDefaultValue());
+ assertTrue(arg1.isArgument());
+ assertFalse(arg1.isCommand());
+ assertTrue(arg1.isOptional());
+ assertFalse(arg1.isFlag());
+ }
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/command/TestCommandSyntax.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,256 @@
+/*
+ * (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.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.chemistry.shell.util.Path;
+
+public class TestPath extends Assert {
+
+ @Test
+ public void testRelative() {
+ Path p = new Path("abc/asdf/file.ext");
+ assertEquals("abc/asdf/file.ext", p.toString());
+ assertEquals("ext", p.getFileExtension());
+ assertEquals("file", p.getFileName());
+ assertEquals("abc", p.segment(0));
+ assertEquals("asdf", p.segment(1));
+ assertEquals("file.ext", p.getLastSegment());
+
+ p = p.makeAbsolute();
+ assertEquals("/abc/asdf/file.ext", p.toString());
+
+ p = p.makeAbsolute();
+ assertEquals("/abc/asdf/file.ext", p.toString());
+
+ Path p1 = p.getParent();
+ assertEquals("/abc/asdf", p1.toString());
+
+ p1 = p.up();
+ assertEquals("/abc/asdf", p1.toString());
+ }
+
+ @Test
+ public void testAbsolute() {
+ Path p = new Path("/abc/asdf/file.ext");
+ assertEquals("/abc/asdf/file.ext", p.toString());
+
+ p = p.makeRelative();
+ assertEquals("abc/asdf/file.ext", p.toString());
+
+ p = p.makeRelative();
+ assertEquals("abc/asdf/file.ext", p.toString());
+ }
+
+ @Test
+ public void testDots() {
+ Path p = new Path("/./abc//asdf/../file.ext");
+ assertEquals("/abc/file.ext", p.toString());
+ }
+
+ @Test
+ public void testAppend() {
+ Path p = new Path("/commands");
+
+ p = p.append((Path) null);
+ assertEquals("/commands", p.toString());
+
+ p = p.append("");
+ assertEquals("/commands", p.toString());
+
+ p = p.append(Path.EMPTY);
+ assertEquals("/commands", p.toString());
+
+ p = Path.EMPTY.append(p);
+ assertEquals("commands", p.toString());
+
+ p = new Path("/commands");
+ p = p.append("test");
+ assertEquals("/commands/test", p.toString());
+
+ p = p.append("../../../test2");
+ assertEquals("../test2", p.toString());
+
+ p = p.makeAbsolute();
+ assertEquals("/test2", p.toString());
+
+ p = p.append(".");
+ assertEquals("/test2", p.toString());
+
+ p = p.append("..");
+ assertEquals("/", p.toString());
+
+ p = p.append("..");
+ assertEquals("/", p.toString());
+ }
+
+ @Test
+ public void testRoot() {
+ assertTrue(Path.ROOT.isRoot());
+ assertFalse(Path.ROOT.isEmpty());
+ assertEquals("/", Path.ROOT.toString());
+ Path p1 = new Path("/");
+ assertEquals(Path.ROOT, p1);
+ Path p2 = new Path(Path.ROOT);
+ assertEquals(Path.ROOT, p2);
+ }
+
+ @Test
+ public void testEmpty() {
+ assertTrue(Path.EMPTY.isEmpty());
+ assertFalse(Path.EMPTY.isRoot());
+ assertEquals("", Path.EMPTY.toString());
+ Path p1 = new Path("");
+ assertEquals(Path.EMPTY, p1);
+ Path p2 = new Path(Path.EMPTY);
+ assertEquals(Path.EMPTY, p2);
+ }
+
+ // Tests copied (mutatis mutandis) from the org.nuxeo.commons Path
+
+ @Test
+ public void test() {
+ Path path = new Path("/a/b/c/d");
+
+ assertFalse(path.isRoot());
+ assertFalse(path.isEmpty());
+
+ assertTrue(path.isAbsolute());
+
+ assertEquals("/a/b/c/d", path.toString());
+ assertEquals(4, path.segmentCount());
+ assertEquals(4, path.segments().length);
+ assertEquals("a", path.segment(0));
+ assertEquals("b", path.segment(1));
+ assertEquals("c", path.segment(2));
+ assertEquals("d", path.segment(3));
+ assertEquals("d", path.getLastSegment());
+
+ assertEquals(new Path("b/c/d"), path.removeFirstSegments(1));
+ assertEquals(new Path("/a/b/c"), path.removeLastSegments(1));
+ }
+
+ @Test
+ public void testEquals() {
+ Path path = new Path("/a/b/c/d");
+ Path path2 = new Path("/a/b/c/d/");
+ Path path3 = new Path("/a/b/c////d/");
+ Path path4 = new Path("/a/b/././c/./e/../d/");
+
+ assertEquals(path, path);
+
+ assertFalse(path.equals(path2));
+
+ assertEquals(path2, path3);
+ assertEquals(path2, path4);
+
+ // SF: I think this shouldn't pass...
+ assertEquals(path.hashCode(), path2.hashCode());
+ assertEquals(path.hashCode(), path3.hashCode());
+ assertEquals(path.hashCode(), path4.hashCode());
+
+ assertFalse(path.equals(null));
+
+ assertFalse(path.equals(new Path("a/b/c/d")));
+ assertFalse(path.equals(new Path("/a/b/c/e")));
+ assertFalse(path.equals(new Path("/a/b/c/d/e")));
+ }
+
+ @Test
+ public void testGetFileExtension() {
+ assertNull(new Path("/a/b/c/").getFileExtension());
+ assertNull(new Path("/a/b/c").getFileExtension());
+ assertEquals("doc", new Path("/a/b/c.doc").getFileExtension());
+ }
+
+ @Test
+ public void testBasic() {
+ final Path path = new Path("/a/b/c");
+
+ assertEquals(3, path.segmentCount());
+ assertTrue(path.isAbsolute());
+ assertFalse(path.isEmpty());
+ assertFalse(path.isRoot());
+ assertEquals(3, path.segments().length);
+ assertEquals("a", path.segment(0));
+ assertEquals("b", path.segment(1));
+ assertEquals("c", path.segment(2));
+
+ assertEquals(path, new Path("/a/b/c"));
+ }
+
+ @Test
+ public void testFileExtension() {
+ Path path = new Path("/a/b/c");
+ assertNull(path.getFileExtension());
+
+ path = new Path("/a/b/c.txt");
+ assertEquals("txt", path.getFileExtension());
+ assertEquals("/a/b/c", path.removeFileExtension().toString());
+
+ path = new Path("/a/b/c/");
+ assertNull(path.getFileExtension());
+ }
+
+ @Test
+ public void testPathNormalisation() {
+ Path path = new Path("////a/./b/../c");
+ assertEquals("/a/c", path.toString());
+ }
+
+ @Test
+ public void testEquality() {
+ assertEquals(new Path("/a/b/c"), new Path("/a/b/c"));
+ assertEquals(new Path("/a/b/c/"), new Path("/a/b/c/"));
+
+ assert !new Path("/a/b/c").equals(new Path("/a/b"));
+ assert !new Path("/a/b").equals(new Path("/a/b/c"));
+ assert !new Path("/a/b/c/").equals(new Path("/a/b/c"));
+ assert !new Path("/a/b/c").equals(new Path("/a/b/c/"));
+
+ assert !new Path("/a/b/d").equals(new Path("/a/b/c"));
+ assert !new Path("/a/d/c").equals(new Path("/a/b/c"));
+ assert !new Path("/d/b/c").equals(new Path("/a/b/c"));
+ assert !new Path("/a/b/c").equals(new Path("/a/b/d"));
+ assert !new Path("/a/b/c").equals(new Path("/a/d/c"));
+ assert !new Path("/a/b/c").equals(new Path("/d/b/c"));
+ }
+
+ @Test
+ public void testAppend1() {
+ Path path1 = new Path("/a/b/c");
+ Path path2 = new Path("/d/e/f");
+ Path path3 = new Path("/a/b/c/d/e/f");
+ assertEquals(path3, path1.append(path2));
+
+ assertEquals("/a/b/c", path1.append(".").toString());
+ assertEquals("/a/b", path1.append("..").toString());
+
+ assertEquals("/a/b/c", path1.append(new Path(".")).toString());
+ assertEquals("/a/b", path1.append(new Path("..")).toString());
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestPath.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java?rev=899665&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java Fri Jan 15 15:35:14 2010
@@ -0,0 +1,85 @@
+/*
+ * (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.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.chemistry.shell.util.StringUtils;
+
+public class TestStringUtils extends Assert {
+
+ @Test
+ public void testSplit() {
+ String[] res = StringUtils.split("abc", '|', true);
+ assertArrayEquals(new String[] {"abc"}, res);
+
+ res = StringUtils.split(" abc ", '|', true);
+ assertArrayEquals(new String[] {"abc"}, res);
+
+ res = StringUtils.split(" abc ", '|', false);
+ assertArrayEquals(new String[] {" abc "}, res);
+
+ res = StringUtils.split("a|b|c", '|', true);
+ assertArrayEquals(new String[] {"a", "b", "c"}, res);
+
+ res = StringUtils.split(" a | b |c ", '|', true);
+ assertArrayEquals(new String[] {"a", "b", "c"}, res);
+
+ res = StringUtils.split(" a | b |c ", '|', false);
+ assertArrayEquals(new String[] {" a ", " b ", "c "}, res);
+ }
+
+ @Test
+ public void testTokenizeSimple() {
+ String[] res = StringUtils.tokenize("a bc def");
+ assertArrayEquals(new String[] {"a", "bc", "def"}, res);
+ }
+
+ @Test
+ public void testTokenizeEscape() {
+ String[] res = StringUtils.tokenize("a\\ bc def");
+ assertArrayEquals(new String[] {"a bc", "def"}, res);
+
+ res = StringUtils.tokenize("a\\\\\\n\\t def");
+ assertArrayEquals(new String[] {"a\\\n\t", "def"}, res);
+
+ res = StringUtils.tokenize("a\\bc def");
+ assertArrayEquals(new String[] {"abc", "def"}, res);
+ }
+
+ @Test
+ public void testTokenizeString() {
+ String[] res = StringUtils.tokenize("a \"bc def\"");
+ assertArrayEquals(new String[] {"a", "bc def"}, res);
+ }
+
+ @Test
+ // "" is stronger than \
+ public void testTokenizeBoth() {
+ String[] res = StringUtils.tokenize("a \"bc\\ \\ndef\"");
+ assertArrayEquals(new String[] {"a", "bc\\ \\ndef"}, res);
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-shell/src/test/java/org/apache/chemistry/shell/util/TestStringUtils.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: incubator/chemistry/trunk/chemistry/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/pom.xml?rev=899665&r1=899664&r2=899665&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/pom.xml Fri Jan 15 15:35:14 2010
@@ -40,6 +40,7 @@
<module>chemistry-ws</module>
<module>chemistry-jcr</module>
<module>chemistry-tck-atompub</module>
+ <module>chemistry-shell</module>
</modules>
</project>