You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2011/03/12 13:16:36 UTC
svn commit: r1080927 - in /incubator/clerezza/trunk/parent/osgi.services: ./
src/main/scala/org/apache/clerezza/osgi/services/ServicesDsl.scala
Author: reto
Date: Sat Mar 12 12:16:36 2011
New Revision: 1080927
URL: http://svn.apache.org/viewvc?rev=1080927&view=rev
Log:
CLEREZZA-459: added doWith method for executing an action as soon as a service is available
Modified:
incubator/clerezza/trunk/parent/osgi.services/ (props changed)
incubator/clerezza/trunk/parent/osgi.services/src/main/scala/org/apache/clerezza/osgi/services/ServicesDsl.scala
Propchange: incubator/clerezza/trunk/parent/osgi.services/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sat Mar 12 12:16:36 2011
@@ -1,5 +1,8 @@
-target
.classpath
-.project
.externalToolBuilders
+.project
+target
+shell.iws
+shell.ipr
+shell.iml
.settings
Modified: incubator/clerezza/trunk/parent/osgi.services/src/main/scala/org/apache/clerezza/osgi/services/ServicesDsl.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/osgi.services/src/main/scala/org/apache/clerezza/osgi/services/ServicesDsl.scala?rev=1080927&r1=1080926&r2=1080927&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/osgi.services/src/main/scala/org/apache/clerezza/osgi/services/ServicesDsl.scala (original)
+++ incubator/clerezza/trunk/parent/osgi.services/src/main/scala/org/apache/clerezza/osgi/services/ServicesDsl.scala Sat Mar 12 12:16:36 2011
@@ -18,7 +18,7 @@
*/
package org.apache.clerezza.osgi.services
-import org.osgi.framework.BundleContext
+import org.osgi.framework.{BundleContext, Constants, ServiceEvent, ServiceListener}
import scala.collection.JavaConversions._
class ServicesDsl(bundleContext: BundleContext) {
@@ -36,4 +36,29 @@ class ServicesDsl(bundleContext: BundleC
bundleContext.getService(serviceReference).asInstanceOf[T]
} else null.asInstanceOf[T]
}
+
+ /**
+ * executes action as soon as a service exposing T is available, if such
+ * a service is already available the action is executed immedtely and the
+ * method blocks until the action finished executing, otherwise the method
+ * returns and action will be executed when a respective becomes available.
+ */
+ def doWith[T](action: T => Unit)(implicit m: Manifest[T]) {
+ val clazz = m.erasure.asInstanceOf[Class[T]]
+ val service = getService(clazz)
+ if (service != null) {
+ action(service)
+ } else {
+ lazy val serviceListener: ServiceListener = new ServiceListener {
+ def serviceChanged(e: ServiceEvent) = {
+ if (e.getType == ServiceEvent.REGISTERED) {
+ bundleContext.removeServiceListener(serviceListener)
+ action(bundleContext.getService(e.getServiceReference).asInstanceOf[T])
+ }
+ }
+ }
+ bundleContext.addServiceListener(serviceListener,
+ "("+Constants.OBJECTCLASS+"="+clazz.getName+")")
+ }
+ }
}