From f359aba1d569c00e114bad8f82c459c63fc40ec7 Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 21 Jun 2010 09:16:05 +0000
Subject: [PATCH] LMS-1594 Added jline and use it for getting passwords.

SVN: 16636
---
 datastore_server/.classpath                   | 93 ++++++++++---------
 datastore_server/build/build.xml              |  1 +
 .../dss/client/api/cli/CommandPut.java        | 21 ++---
 .../dss/client/api/cli/GlobalArguments.java   | 65 +++++++++++--
 .../shared/api/v1/FileInfoDssBuilderTest.java | 65 +++++++++++++
 5 files changed, 179 insertions(+), 66 deletions(-)
 create mode 100644 datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssBuilderTest.java

diff --git a/datastore_server/.classpath b/datastore_server/.classpath
index 5164164bb4c..a0b34f4f6e7 100644
--- a/datastore_server/.classpath
+++ b/datastore_server/.classpath
@@ -1,50 +1,51 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" path="source/java"/>
-	<classpathentry kind="src" path="sourceTest/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/common"/>
-	<classpathentry kind="lib" path="/libraries/log4j/log4j.jar" sourcepath="/libraries/log4j/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/commons-lang/commons-lang.jar" sourcepath="/libraries/commons-lang/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/testng/testng-jdk15.jar" sourcepath="/libraries/testng/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/mail/mail.jar"/>
-	<classpathentry kind="lib" path="/libraries/jmock/jmock.jar"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/bds"/>
-	<classpathentry kind="lib" path="/libraries/restrictionchecker/restrictions.jar"/>
-	<classpathentry kind="lib" path="/libraries/cglib/cglib-nodep.jar"/>
-	<classpathentry kind="lib" path="/libraries/jmock/hamcrest/hamcrest-core.jar"/>
-	<classpathentry kind="lib" path="/libraries/jmock/hamcrest/hamcrest-library.jar"/>
-	<classpathentry kind="lib" path="/libraries/jmock/objenesis/objenesis-1.0.jar"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/openbis"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/server-common"/>
-	<classpathentry kind="lib" path="/libraries/spring/spring.jar" sourcepath="/libraries/spring/src.jar"/>
-	<classpathentry kind="lib" path="/libraries/cifex/cifex.jar" sourcepath="/cifex/source/java"/>
-	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base-test.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
-	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
-	<classpathentry kind="lib" path="/libraries/cisd-args4j/cisd-args4j.jar" sourcepath="/libraries/cisd-args4j/cisd-args4j-src.zip"/>
-	<classpathentry kind="lib" path="/libraries/fast-md5/fast-md5.jar" sourcepath="/libraries/fast-md5/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar" sourcepath="/libraries/eodsql/eodsql_src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jaxb/jaxb-api.jar" sourcepath="/libraries/jaxb/jaxb-api-src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jaxb/jaxb-impl.jar" sourcepath="/libraries/jaxb/jaxb-impl.src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jaxb/jsr173_1.0_api.jar"/>
-	<classpathentry kind="lib" path="/libraries/activation/activation.jar"/>
-	<classpathentry kind="lib" path="/libraries/csv/csv.jar" sourcepath="/libraries/csv/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/imagej/ij.jar" sourcepath="/libraries/imagej/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/commons-httpclient/commons-httpclient.jar" sourcepath="/libraries/commons-httpclient/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/jfreechart/jcommon-1.0.16.jar"/>
-	<classpathentry kind="lib" path="/libraries/jfreechart/jfreechart-1.0.13.jar" sourcepath="/libraries/jfreechart/jfreechart-src.zip">
-		<attributes>
+  <classpathentry kind="src" path="source/java" />
+  <classpathentry kind="src" path="sourceTest/java" />
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" />
+  <classpathentry combineaccessrules="false" exported="true" kind="src" path="/common" />
+  <classpathentry kind="lib" path="/libraries/log4j/log4j.jar" sourcepath="/libraries/log4j/src.zip" />
+  <classpathentry kind="lib" path="/libraries/commons-lang/commons-lang.jar" sourcepath="/libraries/commons-lang/src.zip" />
+  <classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip" />
+  <classpathentry kind="lib" path="/libraries/testng/testng-jdk15.jar" sourcepath="/libraries/testng/src.zip" />
+  <classpathentry kind="lib" path="/libraries/mail/mail.jar" />
+  <classpathentry kind="lib" path="/libraries/jmock/jmock.jar" />
+  <classpathentry combineaccessrules="false" exported="true" kind="src" path="/bds" />
+  <classpathentry kind="lib" path="/libraries/restrictionchecker/restrictions.jar" />
+  <classpathentry kind="lib" path="/libraries/cglib/cglib-nodep.jar" />
+  <classpathentry kind="lib" path="/libraries/jmock/hamcrest/hamcrest-core.jar" />
+  <classpathentry kind="lib" path="/libraries/jmock/hamcrest/hamcrest-library.jar" />
+  <classpathentry kind="lib" path="/libraries/jmock/objenesis/objenesis-1.0.jar" />
+  <classpathentry combineaccessrules="false" exported="true" kind="src" path="/openbis" />
+  <classpathentry combineaccessrules="false" exported="true" kind="src" path="/server-common" />
+  <classpathentry kind="lib" path="/libraries/spring/spring.jar" sourcepath="/libraries/spring/src.jar" />
+  <classpathentry kind="lib" path="/libraries/cifex/cifex.jar" sourcepath="/cifex/source/java" />
+  <classpathentry kind="lib" path="/libraries/cisd-base/cisd-base-test.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip" />
+  <classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip" />
+  <classpathentry kind="lib" path="/libraries/cisd-args4j/cisd-args4j.jar" sourcepath="/libraries/cisd-args4j/cisd-args4j-src.zip" />
+  <classpathentry kind="lib" path="/libraries/fast-md5/fast-md5.jar" sourcepath="/libraries/fast-md5/src.zip" />
+  <classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar" sourcepath="/libraries/eodsql/eodsql_src.zip" />
+  <classpathentry kind="lib" path="/libraries/jaxb/jaxb-api.jar" sourcepath="/libraries/jaxb/jaxb-api-src.zip" />
+  <classpathentry kind="lib" path="/libraries/jaxb/jaxb-impl.jar" sourcepath="/libraries/jaxb/jaxb-impl.src.zip" />
+  <classpathentry kind="lib" path="/libraries/jaxb/jsr173_1.0_api.jar" />
+  <classpathentry kind="lib" path="/libraries/activation/activation.jar" />
+  <classpathentry kind="lib" path="/libraries/csv/csv.jar" sourcepath="/libraries/csv/src.zip" />
+  <classpathentry kind="lib" path="/libraries/imagej/ij.jar" sourcepath="/libraries/imagej/src.zip" />
+  <classpathentry kind="lib" path="/libraries/commons-httpclient/commons-httpclient.jar" sourcepath="/libraries/commons-httpclient/src.zip" />
+  <classpathentry kind="lib" path="/libraries/jfreechart/jcommon-1.0.16.jar" />
+  <classpathentry kind="lib" path="/libraries/jfreechart/jfreechart-1.0.13.jar" sourcepath="/libraries/jfreechart/jfreechart-src.zip">
+    <attributes>
 			<attribute name="javadoc_location" value="jar:platform:/resource/libraries/jfreechart/jfreechart-1.0.13-javadocs.zip!/jfreechart-1.0.13-javadocs"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/common/jetty-io.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/common/jetty-http.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/common/jetty-util.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-server.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-servlet.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-security.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/servlet-api-2.5.jar"/>
-	<classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-continuation.jar"/>
-	<classpathentry kind="output" path="targets/classes"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/common/jetty-io.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/common/jetty-http.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/common/jetty-util.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-server.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-servlet.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-security.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/server/servlet-api-2.5.jar" />
+  <classpathentry kind="lib" path="/libraries/jetty7/lib/server/jetty-continuation.jar" />
+  <classpathentry kind="lib" path="/libraries/jline/jline.jar" sourcepath="/libraries/jline/src.zip" />
+  <classpathentry kind="output" path="targets/classes" />
 </classpath>
diff --git a/datastore_server/build/build.xml b/datastore_server/build/build.xml
index bde30f93ad4..59d75c083f1 100644
--- a/datastore_server/build/build.xml
+++ b/datastore_server/build/build.xml
@@ -198,6 +198,7 @@
     <copy file="${lib}/commons-codec/commons-codec.jar" todir="${dist.dss_client.lib}" />
     <copy file="${lib}/commons-httpclient/commons-httpclient.jar" todir="${dist.dss_client.lib}" />
     <copy file="${lib}/spring/spring.jar" todir="${dist.dss_client.lib}" />
+  	<copy file="${lib}/jline/jline.jar" todir="${dist.dss_client.lib}" />
     <property name="dist.file"
               value="${dist.client.file.prefix}${variant}-${version.number}-r${revision.number}.zip" />
     
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandPut.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandPut.java
index 76a6d5308a5..c40c4159432 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandPut.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandPut.java
@@ -176,10 +176,8 @@ class CommandPut extends AbstractCommand
             String ownerIdentifier = arguments.getOwnerIdentifier();
             DataSetOwner owner = new NewDataSetDTO.DataSetOwner(ownerType, ownerIdentifier);
 
-            // Get the file infos
-            String filePath = arguments.getFilePath();
             File file = arguments.getFile();
-            ArrayList<FileInfoDssDTO> fileInfos = getFileInfosForPath(filePath, file);
+            ArrayList<FileInfoDssDTO> fileInfos = getFileInfosForPath(file);
 
             // Get the parent
             String parentNameOrNull = null;
@@ -198,26 +196,21 @@ class CommandPut extends AbstractCommand
             return dataSet;
         }
 
-        private ArrayList<FileInfoDssDTO> getFileInfosForPath(String path, File file)
-                throws IOException
+        private ArrayList<FileInfoDssDTO> getFileInfosForPath(File file) throws IOException
         {
             ArrayList<FileInfoDssDTO> fileInfos = new ArrayList<FileInfoDssDTO>();
             if (false == file.exists())
             {
                 return fileInfos;
             }
+
+            String path = file.getCanonicalPath();
             if (false == file.isDirectory())
             {
-                return fileInfos;
+                path = file.getParentFile().getCanonicalPath();
             }
-            // Strip terminal separators for the file info builder
-            String pathToUse = path;
-            String separator = "" + File.separatorChar;
-            if (pathToUse.endsWith(separator))
-            {
-                pathToUse = pathToUse.substring(0, pathToUse.length() - 1);
-            }
-            FileInfoDssBuilder builder = new FileInfoDssBuilder(pathToUse, pathToUse);
+
+            FileInfoDssBuilder builder = new FileInfoDssBuilder(path, path);
             builder.appendFileInfosForFile(file, fileInfos, true);
             return fileInfos;
         }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/GlobalArguments.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/GlobalArguments.java
index df643c41a80..d7f13bd9ec5 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/GlobalArguments.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/GlobalArguments.java
@@ -16,9 +16,14 @@
 
 package ch.systemsx.cisd.openbis.dss.client.api.cli;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.lang.StringUtils;
+
+import jline.ConsoleReader;
+
 import ch.systemsx.cisd.args4j.Argument;
 import ch.systemsx.cisd.args4j.Option;
 
@@ -33,10 +38,10 @@ import ch.systemsx.cisd.args4j.Option;
  */
 class GlobalArguments
 {
-    @Option(name = "u", longName = "username", usage = "User login name (required)")
+    @Option(name = "u", longName = "username", usage = "User login name")
     protected String username = "";
 
-    @Option(name = "p", longName = "password", usage = "User login password (required)")
+    @Option(name = "p", longName = "password", usage = "User login password")
     protected String password = "";
 
     @Option(name = "s", longName = "server-base-url", usage = "URL for openBIS Server (required)")
@@ -104,14 +109,42 @@ class GlobalArguments
         }
 
         // At the moment, username, passowrd, and server base url should all be non-empty
-        if (username.length() < 1)
+
+        // If username wasn't specified, read username and password from console
+        if (StringUtils.isBlank(username))
         {
-            return false;
+            try
+            {
+                UsernameAndPasswordReader reader = new UsernameAndPasswordReader();
+
+                // Prompt the user for the user name and see if s/he inputs something
+                username = reader.readUsername();
+                password = reader.readPassword();
+                if (StringUtils.isBlank(username))
+                {
+                    return false;
+                }
+            } catch (IOException ex)
+            {
+                // Couldn't get the username from the console
+                return false;
+            }
         }
 
-        if (password.length() < 1)
+        if (StringUtils.isBlank(password))
         {
-            return false;
+            try
+            {
+                password = new UsernameAndPasswordReader().readPassword();
+                if (StringUtils.isBlank(password))
+                {
+                    return false;
+                }
+            } catch (IOException ex)
+            {
+                // Couldn't get the username from the console
+                return false;
+            }
         }
         if (serverBaseUrl.length() < 1)
         {
@@ -120,4 +153,24 @@ class GlobalArguments
 
         return true;
     }
+
+    private static class UsernameAndPasswordReader
+    {
+        private final ConsoleReader consoleReader;
+
+        private UsernameAndPasswordReader() throws IOException
+        {
+            consoleReader = new ConsoleReader();
+        }
+
+        private String readUsername() throws IOException
+        {
+            return consoleReader.readLine("User: ");
+        }
+
+        private String readPassword() throws IOException
+        {
+            return consoleReader.readLine("Password: ", Character.valueOf('*'));
+        }
+    }
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssBuilderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssBuilderTest.java
new file mode 100644
index 00000000000..befb77fadc0
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/FileInfoDssBuilderTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed 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.
+ */
+
+package ch.systemsx.cisd.openbis.dss.generic.shared.api.v1;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+/**
+ * @author Chandrasekhar Ramakrishnan
+ */
+public class FileInfoDssBuilderTest extends AssertJUnit
+{
+    @Test
+    public void testFileInfoBuilderOnDir() throws IOException
+    {
+        String root = "sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1";
+        FileInfoDssBuilder builder = new FileInfoDssBuilder(root, root);
+        ArrayList<FileInfoDssDTO> list = new ArrayList<FileInfoDssDTO>();
+        File requestedFile = new File(root);
+        builder.appendFileInfosForFile(requestedFile, list, false);
+        // The 3 test files + .svn
+        assertEquals(4, list.size());
+    }
+
+    @Test
+    public void testFileInfoBuilderOnDirWithTrailingSlash() throws IOException
+    {
+        String root = "sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/";
+        FileInfoDssBuilder builder = new FileInfoDssBuilder(root, root);
+        ArrayList<FileInfoDssDTO> list = new ArrayList<FileInfoDssDTO>();
+        File requestedFile = new File(root);
+        builder.appendFileInfosForFile(requestedFile, list, false);
+        // The 3 test files + .svn
+        assertEquals(4, list.size());
+    }
+
+    @Test
+    public void testFileInfoBuilderOnSingleFile() throws IOException
+    {
+        String root = "sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/";
+        FileInfoDssBuilder builder = new FileInfoDssBuilder(root, root);
+        ArrayList<FileInfoDssDTO> list = new ArrayList<FileInfoDssDTO>();
+        File requestedFile = new File(new File(root), "FileInfoDssBuilderTest.java");
+        builder.appendFileInfosForFile(requestedFile, list, false);
+        assertEquals(1, list.size());
+    }
+}
-- 
GitLab