karaf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Guillaume Nodet <gno...@gmail.com>
Subject Re: svn commit: r1132688 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console: completer/CommandsCompleter.java jline/Console.java
Date Thu, 16 Feb 2012 09:53:26 GMT
Could you please try to fix the changes you've made ?   You need to
call unget in a finally block in order to release the service
reference.
In case you wondered why it was coded that way, the getTarget and
ungetTarget methods did not exists at that time ... so I had to
fallback to reflection.

On Mon, Jun 6, 2011 at 18:05,  <cschneider@apache.org> wrote:
> Author: cschneider
> Date: Mon Jun  6 16:05:00 2011
> New Revision: 1132688
>
> URL: http://svn.apache.org/viewvc?rev=1132688&view=rev
> Log:
> Refactorings in CommandsCompleter and Console
>
> Modified:
>    karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
>    karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
>
> Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java?rev=1132688&r1=1132687&r2=1132688&view=diff
> ==============================================================================
> --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
(original)
> +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
Mon Jun  6 16:05:00 2011
> @@ -18,7 +18,6 @@
>  */
>  package org.apache.karaf.shell.console.completer;
>
> -import java.lang.reflect.Field;
>  import java.util.ArrayList;
>  import java.util.Collections;
>  import java.util.HashSet;
> @@ -31,10 +30,7 @@ import org.apache.felix.gogo.runtime.Com
>  import org.apache.felix.gogo.runtime.CommandSessionImpl;
>  import org.apache.felix.service.command.CommandSession;
>  import org.apache.felix.service.command.Function;
> -import org.apache.karaf.shell.console.CompletableFunction;
>  import org.apache.karaf.shell.console.Completer;
> -import org.osgi.framework.BundleContext;
> -import org.osgi.framework.ServiceReference;
>
>  /**
>  * Like the {@link org.apache.karaf.shell.console.completer.CommandsCompleter} but does
not use OSGi but is
> @@ -100,26 +96,17 @@ public class CommandsCompleter implement
>     }
>
>     protected Function unProxy(Function function) {
> -        try {
> -            if (function instanceof CommandProxy) {
> -                Field contextField = function.getClass().getDeclaredField("context");
> -                Field referenceField = function.getClass().getDeclaredField("reference");
> -                contextField.setAccessible(true);
> -                referenceField.setAccessible(true);
> -                BundleContext context = (BundleContext) contextField.get(function);
> -                ServiceReference reference = (ServiceReference) referenceField.get(function);
> -                Object target = context.getService(reference);
> -                try {
> -                    if (target instanceof Function) {
> -                        function = (Function) target;
> -                    }
> -                } finally {
> -                    context.ungetService(reference);
> -                }
> -            }
> -        } catch (Throwable t) {
> -        }
> -        return function;
> +       if (function instanceof CommandProxy) {
> +               CommandProxy proxy = (CommandProxy) function;
> +               Object target = proxy.getTarget();
> +                       if (target instanceof Function) {
> +                               return (Function) target;
> +                       } else {
> +                               return function;
> +                       }
> +       } else {
> +               return function;
> +       }
>     }
>
>  }
>
> Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
> URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java?rev=1132688&r1=1132687&r2=1132688&view=diff
> ==============================================================================
> --- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
(original)
> +++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
Mon Jun  6 16:05:00 2011
> @@ -182,57 +182,10 @@ public class Console implements Runnable
>         welcome();
>         setSessionProperties();
>         String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT);
> -        if (scriptFileName != null) {
> -            Reader r = null;
> -            try {
> -                File scriptFile = new File(scriptFileName);
> -                r = new InputStreamReader(new FileInputStream(scriptFile));
> -                CharArrayWriter w = new CharArrayWriter();
> -                int n;
> -                char[] buf = new char[8192];
> -                while ((n = r.read(buf)) > 0) {
> -                    w.write(buf, 0, n);
> -                }
> -                session.execute(new String(w.toCharArray()));
> -            } catch (Exception e) {
> -                LOGGER.debug("Error in initialization script", e);
> -                System.err.println("Error in initialization script: " + e.getMessage());
> -            } finally {
> -                if (r != null) {
> -                    try {
> -                        r.close();
> -                    } catch (IOException e) {
> -                        // Ignore
> -                    }
> -                }
> -            }
> -        }
> +        executeScript(scriptFileName);
>         while (running) {
>             try {
> -                String command = null;
> -                boolean loop = true;
> -                boolean first = true;
> -                while (loop) {
> -                    checkInterrupt();
> -                    String line = reader.readLine(first ? getPrompt() : ">
");
> -                    if (line == null)
> -                    {
> -                        break;
> -                    }
> -                    if (command == null) {
> -                        command = line;
> -                    } else {
> -                        command += " " + line;
> -                    }
> -                    reader.getHistory().replace(command);
> -                    try {
> -                        new Parser(command).program();
> -                        loop = false;
> -                    } catch (Exception e) {
> -                        loop = true;
> -                        first = false;
> -                    }
> -                }
> +                String command = readAndParseCommand();
>                 if (command == null) {
>                     break;
>                 }
> @@ -254,35 +207,7 @@ public class Console implements Runnable
>             }
>             catch (Throwable t)
>             {
> -                try {
> -                    LOGGER.info("Exception caught while executing command",
t);
> -                    session.put(LAST_EXCEPTION, t);
> -                    if (t instanceof CommandException) {
> -                        session.getConsole().println(((CommandException)
t).getNiceHelp());
> -                    } else if (t instanceof CommandNotFoundException) {
> -                        String str = Ansi.ansi()
> -                            .fg(Ansi.Color.RED)
> -                            .a("Command not found: ")
> -                            .a(Ansi.Attribute.INTENSITY_BOLD)
> -                            .a(((CommandNotFoundException) t).getCommand())
> -                            .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
> -                            .fg(Ansi.Color.DEFAULT).toString();
> -                        session.getConsole().println(str);
> -                    }
> -                    if ( getBoolean(PRINT_STACK_TRACES)) {
> -                        session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
> -                        t.printStackTrace(session.getConsole());
> -                        session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
> -                    }
> -                    else if (!(t instanceof CommandException) && !(t
instanceof CommandNotFoundException)) {
> -                        session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
> -                        session.getConsole().println("Error executing command:
"
> -                                + (t.getMessage() != null ? t.getMessage()
: t.getClass().getName()));
> -                        session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
> -                    }
> -                } catch (Exception ignore) {
> -                        // ignore
> -                }
> +                logException(t);
>             }
>         }
>         close();
> @@ -293,6 +218,94 @@ public class Console implements Runnable
>         }
>     }
>
> +       private void logException(Throwable t) {
> +               try {
> +                   LOGGER.info("Exception caught while executing command",
t);
> +                   session.put(LAST_EXCEPTION, t);
> +                   if (t instanceof CommandException) {
> +                       session.getConsole().println(((CommandException) t).getNiceHelp());
> +                   } else if (t instanceof CommandNotFoundException) {
> +                       String str = Ansi.ansi()
> +                           .fg(Ansi.Color.RED)
> +                           .a("Command not found: ")
> +                           .a(Ansi.Attribute.INTENSITY_BOLD)
> +                           .a(((CommandNotFoundException) t).getCommand())
> +                           .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
> +                           .fg(Ansi.Color.DEFAULT).toString();
> +                       session.getConsole().println(str);
> +                   }
> +                   if ( getBoolean(PRINT_STACK_TRACES)) {
> +                       session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
> +                       t.printStackTrace(session.getConsole());
> +                       session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
> +                   }
> +                   else if (!(t instanceof CommandException) && !(t
instanceof CommandNotFoundException)) {
> +                       session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
> +                       session.getConsole().println("Error executing command:
"
> +                               + (t.getMessage() != null ? t.getMessage()
: t.getClass().getName()));
> +                       session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
> +                   }
> +               } catch (Exception ignore) {
> +                       // ignore
> +               }
> +       }
> +
> +       private String readAndParseCommand() throws IOException {
> +               String command = null;
> +               boolean loop = true;
> +               boolean first = true;
> +               while (loop) {
> +                   checkInterrupt();
> +                   String line = reader.readLine(first ? getPrompt() : ">
");
> +                   if (line == null)
> +                   {
> +                       break;
> +                   }
> +                   if (command == null) {
> +                       command = line;
> +                   } else {
> +                       command += " " + line;
> +                   }
> +                   reader.getHistory().replace(command);
> +                   try {
> +                       new Parser(command).program();
> +                       loop = false;
> +                   } catch (Exception e) {
> +                       loop = true;
> +                       first = false;
> +                   }
> +               }
> +               return command;
> +       }
> +
> +       private void executeScript(String scriptFileName) {
> +               if (scriptFileName != null) {
> +            Reader r = null;
> +            try {
> +                File scriptFile = new File(scriptFileName);
> +                r = new InputStreamReader(new FileInputStream(scriptFile));
> +                CharArrayWriter w = new CharArrayWriter();
> +                int n;
> +                char[] buf = new char[8192];
> +                while ((n = r.read(buf)) > 0) {
> +                    w.write(buf, 0, n);
> +                }
> +                session.execute(new String(w.toCharArray()));
> +            } catch (Exception e) {
> +                LOGGER.debug("Error in initialization script", e);
> +                System.err.println("Error in initialization script: " + e.getMessage());
> +            } finally {
> +                if (r != null) {
> +                    try {
> +                        r.close();
> +                    } catch (IOException e) {
> +                        // Ignore
> +                    }
> +                }
> +            }
> +        }
> +       }
> +
>     protected boolean getBoolean(String name) {
>         Object s = session.get(name);
>         if (s == null) {
>
>



-- 
------------------------
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
FuseSource, Integration everywhere
http://fusesource.com

Mime
View raw message