Not sure to understand what you mean. When you call getTarget, the underlying code [1] calls context.getService so you need to call ungetTarget to release this reference.
[1] https://github.com/apache/felix/blob/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/CommandProxy.java#L48 On Fri, Feb 17, 2012 at 12:36, Christian Schneider <[email protected]> wrote: > Hi Guillaume, > > I just checked the class you mentioned. It does not seem to contain > context.getService anymore. So I think the code already looks good now. > > Christian > > Am 16.02.2012 10:53, schrieb Guillaume Nodet: >> >> 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,<[email protected]> 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) { >>> >>> >> >> > > > -- > > Christian Schneider > http://www.liquid-reality.de > > Open Source Architect > Talend Application Integration Division http://www.talend.com > -- ------------------------ Guillaume Nodet ------------------------ Blog: http://gnodet.blogspot.com/ ------------------------ FuseSource, Integration everywhere http://fusesource.com
