Author: gnodet Date: Wed Apr 11 06:28:50 2012 New Revision: 1324579 URL: http://svn.apache.org/viewvc?rev=1324579&view=rev Log: [KARAF-866] New dev:wait-for-service command to wait for a given osgi service
Conflicts: shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml Added: karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java Modified: karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java karaf/branches/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml Modified: karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java URL: http://svn.apache.org/viewvc/karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java?rev=1324579&r1=1324578&r2=1324579&view=diff ============================================================================== --- karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java (original) +++ karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java Wed Apr 11 06:28:50 2012 @@ -26,7 +26,7 @@ import org.apache.karaf.shell.console.Os @Command(scope = "dev", name = "restart", description = "Restart Karaf.") public class Restart extends OsgiCommandSupport { - @Option(name = "-c", aliases = { "--clean" }, description = "Force a clean restart by deleteting the working directory") + @Option(name = "-c", aliases = { "--clean" }, description = "Force a clean restart by deleting the working directory") private boolean clean; @Override Added: karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java URL: http://svn.apache.org/viewvc/karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java?rev=1324579&view=auto ============================================================================== --- karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java (added) +++ karaf/branches/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java Wed Apr 11 06:28:50 2012 @@ -0,0 +1,79 @@ +/* + * 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.karaf.shell.dev; + +import java.util.concurrent.TimeoutException; + +import org.apache.felix.gogo.commands.Argument; +import org.apache.felix.gogo.commands.Command; +import org.apache.felix.gogo.commands.Option; +import org.apache.karaf.shell.console.OsgiCommandSupport; +import org.osgi.framework.Constants; +import org.osgi.framework.Filter; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.util.tracker.ServiceTracker; + +/** + * Command that can be used to wait for an OSGi service. + */ +@Command(scope = "dev", name = "wait-for-service", description = "Wait for a given OSGi service.") +public class WaitForService extends OsgiCommandSupport { + + @Option(name = "-e", aliases = { "--exception" }, description = "throw an exception if the service is not found after the timeout") + boolean exception; + + @Option(name = "-t", aliases = { "--timeout" }, description = "timeout to wait for the service (in milliseconds, negative to not wait at all, zero to wait forever)") + long timeout = 0; + + @Argument(name = "service", description="The service class or filter", required = true, multiValued = false) + String service; + + @Override + protected Object doExecute() throws Exception { + ServiceTracker tracker = null; + try { + String filter = service; + if (!filter.startsWith("(")) { + if (!filter.contains("=")) { + filter = Constants.OBJECTCLASS + "=" + filter; + } + filter = "(" + filter + ")"; + } + Filter osgiFilter = FrameworkUtil.createFilter(filter); + tracker = new ServiceTracker(bundleContext, osgiFilter, null); + tracker.open(true); + Object svc = tracker.getService(); + if (timeout >= 0) { + svc = tracker.waitForService(timeout); + } + if (exception && svc == null) { + throw new TimeoutException("Can not find service '" + service + "' in the OSGi registry"); + } + return svc != null; + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException("Invalid filter", e); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + if (tracker != null) { + tracker.close(); + } + } + } + +} Modified: karaf/branches/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml URL: http://svn.apache.org/viewvc/karaf/branches/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml?rev=1324579&r1=1324578&r2=1324579&view=diff ============================================================================== --- karaf/branches/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml (original) +++ karaf/branches/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml Wed Apr 11 06:28:50 2012 @@ -38,6 +38,9 @@ <command name="dev/system-property"> <action class="org.apache.karaf.shell.dev.SystemProperty" /> </command> + <command name="dev/wait-for-service"> + <action class="org.apache.karaf.shell.dev.WaitForService" /> + </command> <command name="dev/watch"> <action class="org.apache.karaf.shell.dev.Watch" > <property name="watcher" ref="watcher"/>