You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2008/10/07 13:54:28 UTC

svn commit: r702444 - in /geronimo/gshell/trunk: gshell-commands/gshell-builtins/src/main/java/org/apache/geronimo/gshell/commands/builtins/ gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/ gshell-wisdom/gshel...

Author: jdillon
Date: Tue Oct  7 04:54:27 2008
New Revision: 702444

URL: http://svn.apache.org/viewvc?rev=702444&view=rev
Log:
Implement (again finally) a variable configurable prompt, a few wee hacks to make it work
Use io.outputStream for set output to avoid any unwanted translation (like ansi stuff)

Added:
    geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java   (with props)
Modified:
    geronimo/gshell/trunk/gshell-commands/gshell-builtins/src/main/java/org/apache/geronimo/gshell/commands/builtins/SetAction.java
    geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariableInterpolator.java
    geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ConsolePrompterImpl.java
    geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ShellImpl.java

Modified: geronimo/gshell/trunk/gshell-commands/gshell-builtins/src/main/java/org/apache/geronimo/gshell/commands/builtins/SetAction.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-commands/gshell-builtins/src/main/java/org/apache/geronimo/gshell/commands/builtins/SetAction.java?rev=702444&r1=702443&r2=702444&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-commands/gshell-builtins/src/main/java/org/apache/geronimo/gshell/commands/builtins/SetAction.java (original)
+++ geronimo/gshell/trunk/gshell-commands/gshell-builtins/src/main/java/org/apache/geronimo/gshell/commands/builtins/SetAction.java Tue Oct  7 04:54:27 2008
@@ -93,6 +93,8 @@
         assert context != null;
         IO io = context.getIo();
 
+        // NOTE: Using io.outputStream to display values to avoid any ANSI encoding or other translation.
+        
         switch (mode) {
             case PROPERTY: {
                 Properties props = System.getProperties();
@@ -101,12 +103,14 @@
                     String name = (String) o;
                     String value = props.getProperty(name);
 
-                    io.out.print(name);
-                    io.out.print("=");
-                    io.out.print(value);
+                    io.outputStream.print(name);
+                    io.outputStream.print("='");
+                    io.outputStream.print(value);
+                    io.outputStream.print("'");
+
                     // Value is always a string, so no need to add muck here for --verbose
 
-                    io.out.println();
+                    io.outputStream.println();
                 }
                 break;
             }
@@ -117,25 +121,36 @@
 
                 while (iter.hasNext()) {
                     String name = iter.next();
+
+                    // HACK: Hide some internal muck for now
+                    if (name.startsWith("SHELL")) {
+                        continue;
+                    }
+
                     Object value = variables.get(name);
 
-                    io.out.print(name);
-                    io.out.print("=");
-                    io.out.print(value);
+                    io.outputStream.print(name);
+                    io.outputStream.print("='");
+                    io.outputStream.print(value);
+                    io.outputStream.flush();
+                    io.outputStream.print("'");
 
                     // When --verbose include the class details of the value
                     if (verbose && value != null) {
-                        io.out.print(" (");
-                        io.out.print(value.getClass());
-                        io.out.print(")");
+                        io.outputStream.print(" (");
+                        io.outputStream.print(value.getClass());
+                        io.outputStream.print(")");
                     }
 
-                    io.out.println();
+                    io.outputStream.println();
                 }
                 break;
             }
         }
 
+        // Manually flush the stream, normally framework only flushes io.out
+        io.outputStream.flush();
+
         return Result.SUCCESS;
     }
 }

Modified: geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariableInterpolator.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariableInterpolator.java?rev=702444&r1=702443&r2=702444&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariableInterpolator.java (original)
+++ geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariableInterpolator.java Tue Oct  7 04:54:27 2008
@@ -19,24 +19,14 @@
 
 package org.apache.geronimo.gshell.interpolation;
 
-import org.apache.commons.jexl.Expression;
-import org.apache.commons.jexl.ExpressionFactory;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jexl.resolver.FlatResolver;
 import org.apache.geronimo.gshell.command.Variables;
 import org.apache.geronimo.gshell.notification.ErrorNotification;
 import org.codehaus.plexus.interpolation.InterpolationException;
 import org.codehaus.plexus.interpolation.Interpolator;
 import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
-import org.codehaus.plexus.interpolation.ValueSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-import java.util.List;
-
 /**
  * Provides interpolation for shell variables using Jexl.
  *
@@ -49,8 +39,6 @@
 {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final FlatResolver resolver = new FlatResolver(true);
-
     public String interpolate(final String input, final Variables vars) {
         assert input != null;
         assert vars != null;
@@ -78,109 +66,10 @@
     }
 
     private Interpolator createInterpolator(final Variables vars) {
+        assert vars != null;
+        
         Interpolator interp = new RegexBasedInterpolator();
-
-        // This complex crap here is to adapt our Variables to a JexlContext w/the least overhead
-        interp.addValueSource(new ValueSource()
-        {
-            final Map map = new Map() {
-                private String key(final Object key) {
-                    return String.valueOf(key);
-                }
-
-                public Object get(final Object key) {
-                    return vars.get(key(key));
-                }
-
-                public Object put(final Object key, final Object value) {
-                    Object prev = vars.get(key(key));
-
-                    vars.set(key(key), value);
-
-                    return prev;
-                }
-
-                // Jexl does not use any of these Map methods
-
-                public int size() {
-                    throw new UnsupportedOperationException();
-                }
-
-                public boolean isEmpty() {
-                    throw new UnsupportedOperationException();
-                }
-
-                public boolean containsKey(Object key) {
-                    throw new UnsupportedOperationException();
-                }
-
-                public boolean containsValue(Object value) {
-                    throw new UnsupportedOperationException();
-                }
-
-                public Object remove(Object key) {
-                    throw new UnsupportedOperationException();
-                }
-
-                public void putAll(Map t) {
-                    throw new UnsupportedOperationException();
-                }
-
-                public void clear() {
-                    throw new UnsupportedOperationException();
-                }
-
-                public Set keySet() {
-                    throw new UnsupportedOperationException();
-                }
-
-                public Collection values() {
-                    throw new UnsupportedOperationException();
-                }
-
-                public Set entrySet() {
-                    throw new UnsupportedOperationException();
-                }
-            };
-
-            final JexlContext jc = new JexlContext()
-            {
-                public Map getVars() {
-                    return map;
-                }
-
-                // Jexl never calls setVars
-
-                public void setVars(Map map) {
-                    throw new UnsupportedOperationException();
-                }
-            };
-
-            public Object getValue(final String s) {
-                try {
-                    Expression expr = ExpressionFactory.createExpression(s);
-                    expr.addPreResolver(resolver);
-
-                    return expr.evaluate(jc);
-                }
-                catch (Exception e) {
-                    throw new ErrorNotification("Failed to evaluate expression: " + s, e);
-                }
-            }
-
-            //
-            // TODO: See what this is supposed to return...
-            //
-
-            public List getFeedback() {
-                return null;
-            }
-
-            public void clearFeedback() {
-                // ???
-            }
-        });
-
+        interp.addValueSource(new VariablesValueSource(vars));
         return interp;
     }
 }
\ No newline at end of file

Added: geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java?rev=702444&view=auto
==============================================================================
--- geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java (added)
+++ geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java Tue Oct  7 04:54:27 2008
@@ -0,0 +1,163 @@
+/*
+ * 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.
+ */
+
+package org.apache.geronimo.gshell.interpolation;
+
+import org.apache.commons.jexl.Expression;
+import org.apache.commons.jexl.ExpressionFactory;
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jexl.resolver.FlatResolver;
+import org.apache.geronimo.gshell.command.Variables;
+import org.apache.geronimo.gshell.notification.ErrorNotification;
+import org.codehaus.plexus.interpolation.AbstractValueSource;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * {@link org.codehaus.plexus.interpolation.ValueSource} implementation pulling data from a {@link Variables} instance.
+ *
+ * @version $Rev$ $Date$
+ */
+public class VariablesValueSource
+    extends AbstractValueSource
+{
+    private final FlatResolver resolver = new FlatResolver(true);
+
+    private final JexlContext jexlContext;
+
+    private Variables variables;
+
+    public VariablesValueSource(final Variables vars) {
+        super(false);
+
+        jexlContext = new JexlContext() {
+            private final Map map = new VariablesMapAdapter();
+
+            public Map getVars() {
+                return map;
+            }
+
+            public void setVars(Map map) {
+                throw new UnsupportedOperationException();
+            }
+        };
+
+        if (vars != null) {
+            setVariables(vars);
+        }
+    }
+
+    public VariablesValueSource() {
+        this(null);
+    }
+    
+    public Variables getVariables() {
+        return variables;
+    }
+
+    public void setVariables(final Variables variables) {
+        this.variables = variables;
+    }
+
+    public Object getValue(final String input) {
+        assert input != null;
+
+        if (variables == null) {
+            throw new IllegalStateException("Variables have not yet been set");
+        }
+        
+        try {
+            Expression expr = ExpressionFactory.createExpression(input);
+            expr.addPreResolver(resolver);
+
+            return expr.evaluate(jexlContext);
+        }
+        catch (Exception e) {
+            throw new ErrorNotification("Failed to evaluate expression: " + input, e);
+        }
+    }
+
+    //
+    // VariablesMapAdapter
+    //
+
+    private class VariablesMapAdapter
+        implements Map
+    {
+        private String key(final Object key) {
+            return String.valueOf(key);
+        }
+
+        public Object get(final Object key) {
+            return variables.get(key(key));
+        }
+
+        public Object put(final Object key, final Object value) {
+            Object prev = variables.get(key(key));
+
+            variables.set(key(key), value);
+
+            return prev;
+        }
+
+        // Jexl does not use any of these Map methods
+
+        public int size() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean isEmpty() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean containsKey(Object key) {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean containsValue(Object value) {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object remove(Object key) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void putAll(Map t) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void clear() {
+            throw new UnsupportedOperationException();
+        }
+
+        public Set keySet() {
+            throw new UnsupportedOperationException();
+        }
+
+        public Collection values() {
+            throw new UnsupportedOperationException();
+        }
+
+        public Set entrySet() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
\ No newline at end of file

Propchange: geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: geronimo/gshell/trunk/gshell-support/gshell-interpolation/src/main/java/org/apache/geronimo/gshell/interpolation/VariablesValueSource.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ConsolePrompterImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ConsolePrompterImpl.java?rev=702444&r1=702443&r2=702444&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ConsolePrompterImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ConsolePrompterImpl.java Tue Oct  7 04:54:27 2008
@@ -19,15 +19,21 @@
 
 package org.apache.geronimo.gshell.wisdom.shell;
 
-import org.apache.geronimo.gshell.ansi.Code;
 import org.apache.geronimo.gshell.ansi.Renderer;
 import org.apache.geronimo.gshell.application.Application;
+import org.apache.geronimo.gshell.command.Variables;
 import org.apache.geronimo.gshell.console.Console;
-import org.apache.geronimo.gshell.model.application.Branding;
+import org.apache.geronimo.gshell.interpolation.VariablesValueSource;
+import org.codehaus.plexus.interpolation.InterpolationException;
+import org.codehaus.plexus.interpolation.Interpolator;
+import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
+import org.codehaus.plexus.interpolation.StringSearchInterpolator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import javax.annotation.PostConstruct;
+
 /**
  * {@link Console.Prompter} component.
  *
@@ -41,27 +47,55 @@
     @Autowired
     private Application application;
 
-    private Renderer renderer = new Renderer();
+    private final Interpolator interp = new StringSearchInterpolator("%{", "}");
+
+    private final VariablesValueSource variablesValueSource = new VariablesValueSource();
+
+    private final Renderer renderer = new Renderer();
 
-    //
-    // TODO: Need to create a PatternPrompter, which can use interpolation of a variable to render the prompt
-    //       so the following variable value would set the same prompt as we are hardcoding here:
-    //
-    //    set gshell.prompt="@|bold ${application.username}|@${application.localHost.hostName}:@|bold ${application.branding.name}|> "
-    //
+    @PostConstruct
+    public void init() {
+        assert application != null;
+        interp.addValueSource(new PrefixedObjectValueSource("application", application));
+        interp.addValueSource(new PrefixedObjectValueSource("branding", application.getModel().getBranding()));
+        interp.addValueSource(variablesValueSource);
+    }
 
     public String prompt() {
+        String prompt = null;
+
         assert application != null;
-        Branding branding = application.getModel().getBranding();
+        Variables vars = application.getVariables();
+        String pattern = (String) vars.get("prompt");
+
+        if (pattern != null) {
+            assert variablesValueSource != null;
+            variablesValueSource.setVariables(vars);
+
+            try {
+                assert interp != null;
+                prompt = interp.interpolate(pattern);
+            }
+            catch (InterpolationException e) {
+                log.error("Failed to render prompt pattern: " + pattern, e);
+            }
+        }
+
+        // Use a default prompt if we don't have anything here
+        if (prompt == null) {
+            prompt = defaultPrompt();
+        }
+
+        // Encode ANSI muck if it looks like there are codes encoded
+        if (Renderer.test(prompt)) {
+            prompt = renderer.render(prompt);
+        }
 
-        StringBuilder buff = new StringBuilder();
-        buff.append(Renderer.encode(application.getUserName(), Code.BOLD));
-        buff.append("@");
-        buff.append(application.getLocalHost().getHostName());
-        buff.append(":");
-        buff.append(Renderer.encode(branding.getName(), Code.BOLD));
-        buff.append("> ");
+        return prompt;
+    }
 
-        return renderer.render(buff.toString());
+    private String defaultPrompt() {
+        assert application != null;
+        return application.getModel().getBranding().getName() + "> ";
     }
 }
\ No newline at end of file

Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ShellImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ShellImpl.java?rev=702444&r1=702443&r2=702444&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ShellImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/shell/ShellImpl.java Tue Oct  7 04:54:27 2008
@@ -123,6 +123,9 @@
         // HACK: Add history for the 'history' command, since its not part of the Shell interf it can't really access it easy, resolve with ^^^
         vars.set("SHELL.HISTORY", getHistory(), true);
 
+        // HACK: Set the default prompt here for now, probably want to get this from branding
+        vars.set("prompt", "@|bold %{application.userName}|@%{application.localHost.hostName}:@|bold %{branding.name}|> ");
+        
         branding = application.getModel().getBranding();
 
         opened = true;