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