From eddc8cb2dd1b8d0735bcae0e71d9e1da45882400 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 17 Aug 2010 07:42:07 +0000
Subject: [PATCH] SE-292 improve and extend admin console

SVN: 17471
---
 .../generic/client/console/AdminConsole.java  | 29 +++----
 .../openbis/generic/client/console/Lexer.java |  4 +-
 .../client/console/RegisterDataSetType.java   | 80 ++++++++++++++++++-
 .../generic/client/console/ScriptContext.java | 11 +++
 .../generic/client/console/LexerTest.java     |  4 +-
 5 files changed, 106 insertions(+), 22 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/AdminConsole.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/AdminConsole.java
index d2dc9a1b80c..4d555c4eded 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/AdminConsole.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/AdminConsole.java
@@ -25,9 +25,9 @@ import java.util.Map;
 import jline.ConsoleReader;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
+import ch.systemsx.cisd.common.utilities.ExtendedProperties;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 
@@ -73,7 +73,7 @@ public class AdminConsole
             Map<String, ICommand> commands = createCommands();
             String sessionToken = session.getSessionToken();
             List<String> lines = FileUtilities.loadToStringList(new File(script));
-            ScriptContext context = new ScriptContext();
+            ScriptContext context = new ScriptContext(ExtendedProperties.getSubset(System.getProperties(), "openbis.", true));
             for (int i = 0; i < lines.size(); i++)
             {
                 String line = lines.get(i).trim();
@@ -86,14 +86,16 @@ public class AdminConsole
                     ICommand cmd = commands.get(command);
                     if (cmd == null)
                     {
-                        throw createException(i, line, "Unknown command: " + command);
-                    }
-                    try
-                    {
-                        cmd.execute(service, sessionToken, context, argument);
-                    } catch (RuntimeException ex)
+                        printError(i, line, "Unknown command: " + command);
+                    } else
                     {
-                        throw createException(i, line, ex);
+                        try
+                        {
+                            cmd.execute(service, sessionToken, context, argument);
+                        } catch (RuntimeException ex)
+                        {
+                            printError(i, line, ex);
+                        }
                     }
                 }
             }
@@ -101,16 +103,11 @@ public class AdminConsole
         }
     }
     
-    private static UserFailureException createException(int lineIndex, String line, Object reason)
+    private static void printError(int lineIndex, String line, Object reason)
     {
         String message = "Error in line " + (lineIndex + 1) + " [" + line
                 + "]\nReason: " + reason;
-        if (reason instanceof Throwable)
-        {
-            Throwable throwable = (Throwable) reason;
-            return new UserFailureException(message, throwable);
-        }
-        return new UserFailureException(message);
+        System.err.println(message);
     }
 
     private static ConsoleReader getConsoleReader()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/Lexer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/Lexer.java
index 890b5f76fde..fbe3300d090 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/Lexer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/Lexer.java
@@ -81,7 +81,6 @@ class Lexer
                 }
                 if (character == '\"')
                 {
-                    context.finishToken();
                     return IN_QUOTED_TOKEN;
                 }
                 context.addCharacter(character);
@@ -95,8 +94,7 @@ class Lexer
             {
                 if (character == '\"')
                 {
-                    context.finishToken();
-                    return BETWEEN_TOKENS;
+                    return IN_TOKEN;
                 }
                 context.addCharacter(character);
                 return this;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/RegisterDataSetType.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/RegisterDataSetType.java
index 3f197f892da..49635c60094 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/RegisterDataSetType.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/RegisterDataSetType.java
@@ -16,6 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.client.console;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 
@@ -26,10 +30,84 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
  */
 class RegisterDataSetType implements ICommand
 {
+    private static interface AttributeSetter<T>
+    {
+        public String getAttributeName();
+        public void setAttributeFor(T object, String value);
+    }
+    
+    private enum DataSetTypeAttributeSetter implements AttributeSetter<DataSetType>
+    {
+        DESCRIPTION("description")
+        {
+            public void setAttributeFor(DataSetType type, String value)
+            {
+                type.setDescription(value);
+
+            }
+        },
+        PATTERN("main-pattern")
+        {
+            public void setAttributeFor(DataSetType type, String value)
+            {
+                type.setMainDataSetPattern(value);
+                
+            }
+        },
+        PATH("main-path")
+        {
+            public void setAttributeFor(DataSetType type, String value)
+            {
+                type.setMainDataSetPath(value);
+
+            }
+        };
+        
+        private final String attributeName;
+        private DataSetTypeAttributeSetter(String attributeName)
+        {
+            this.attributeName = attributeName;
+        }
+        
+        public String getAttributeName()
+        {
+            return attributeName;
+        }
+    }
+
+    private final Map<String, AttributeSetter<DataSetType>> attributeSetters =
+            new HashMap<String, AttributeSetter<DataSetType>>();
+
+    RegisterDataSetType()
+    {
+        for (DataSetTypeAttributeSetter attributeSetter : DataSetTypeAttributeSetter.values())
+        {
+            attributeSetters.put(attributeSetter.getAttributeName(), attributeSetter);
+        }
+    }
 
     public void execute(ICommonServer server, String sessionToken, ScriptContext context, String argument)
     {
-        server.registerDataSetType(sessionToken, new DataSetType(argument));
+        List<String> tokens = Lexer.extractTokens(argument);
+        DataSetType dataSetType = new DataSetType(tokens.get(0));
+        for (int i = 1; i < tokens.size(); i++)
+        {
+            String token = tokens.get(i);
+            int indexOfEqualSign = token.indexOf('=');
+            if (indexOfEqualSign < 0)
+            {
+                throw new IllegalArgumentException("Missing '=': " + token);
+            }
+            String key = token.substring(0, indexOfEqualSign);
+            String value = token.substring(indexOfEqualSign + 1);
+            AttributeSetter<DataSetType> attributeSetter = attributeSetters.get(key);
+            if (attributeSetter == null)
+            {
+                throw new IllegalArgumentException("Unknown attribute '" + key + "': " + token);
+            }
+            attributeSetter.setAttributeFor(dataSetType, value);
+        }
+        server.registerDataSetType(sessionToken, dataSetType);
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/ScriptContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/ScriptContext.java
index a33cd99c854..c08dc92da4b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/ScriptContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/console/ScriptContext.java
@@ -18,7 +18,9 @@ package ch.systemsx.cisd.openbis.generic.client.console;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
+import java.util.Map.Entry;
 
 import ch.systemsx.cisd.common.utilities.Template;
 
@@ -31,6 +33,15 @@ class ScriptContext
 {
     private final Map<String, String> bindings = new HashMap<String, String>();
     
+    ScriptContext(Properties properties)
+    {
+        Set<Entry<Object, Object>> entrySet = properties.entrySet();
+        for (Entry<Object, Object> entry : entrySet)
+        {
+            bind((String) entry.getKey(), (String) entry.getValue());
+        }
+    }
+    
     void bind(String variable, String value)
     {
         bindings.put(variable, value);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/console/LexerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/console/LexerTest.java
index 65e7b5e14b9..a97d765ffe6 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/console/LexerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/console/LexerTest.java
@@ -38,8 +38,8 @@ public class LexerTest extends AssertJUnit
         check("[alpha]", " alpha\t  ");
         check("[a, b, hello world]", "a  b \"hello world\"");
         check("[a, b, hello \t world ]", " a\tb \"hello \t world \"  ");
-        check("[a, b, hello 'world']", "a  b\"hello 'world'\"");
-        check("[a, b]", "\"a\"\"b\"");
+        check("[a, b, hello 'world']", "a  b \"hello 'world'\"");
+        check("[a=hello world]", "a=\"hello world\"");
     }
     
     private void check(String expectedTokens, String input)
-- 
GitLab