|
Akka/Scala example source code file (PojoSRTestSupport.scala)
The PojoSRTestSupport.scala Akka example source code/** * Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com> */ package akka.osgi import de.kalpatec.pojosr.framework.launch.{ BundleDescriptor, PojoServiceRegistryFactory, ClasspathScanner } import scala.collection.JavaConversions.seqAsJavaList import org.apache.commons.io.IOUtils.copy import org.osgi.framework._ import java.net.URL import java.util.jar.JarInputStream import java.io._ import org.scalatest.{ BeforeAndAfterAll, Suite } import java.util.{ UUID, Date, ServiceLoader, HashMap } import scala.reflect.ClassTag import scala.collection.immutable import scala.concurrent.duration._ import scala.annotation.tailrec /** * Trait that provides support for building akka-osgi tests using PojoSR */ trait PojoSRTestSupport extends Suite with BeforeAndAfterAll { val MaxWaitDuration = 12800.millis val SleepyTime = 50.millis /** * All bundles being found on the test classpath are automatically installed and started in the PojoSR runtime. * Implement this to define the extra bundles that should be available for testing. */ def testBundles: immutable.Seq[BundleDescriptor] val bufferedLoadingErrors = new ByteArrayOutputStream() lazy val context: BundleContext = { val config = new HashMap[String, AnyRef]() System.setProperty("org.osgi.framework.storage", "target/akka-osgi/" + UUID.randomUUID().toString) val bundles = new ClasspathScanner().scanForBundles() bundles.addAll(testBundles) config.put(PojoServiceRegistryFactory.BUNDLE_DESCRIPTORS, bundles) val oldErr = System.err System.setErr(new PrintStream(bufferedLoadingErrors)) try { ServiceLoader.load(classOf[PojoServiceRegistryFactory]).iterator.next.newPojoServiceRegistry(config).getBundleContext } catch { case e: Throwable ⇒ oldErr.write(bufferedLoadingErrors.toByteArray); throw e } finally { System.setErr(oldErr) } } // Ensure bundles get stopped at the end of the test to release resources and stop threads override protected def afterAll() = context.getBundles.foreach(_.stop) /** * Convenience method to find a bundle by symbolic name */ def bundleForName(name: String) = context.getBundles.find(_.getSymbolicName == name).getOrElse(fail("Unable to find bundle with symbolic name %s".format(name))) /** * Convenience method to find a service by interface. If the service is not already available in the OSGi Service * Registry, this method will wait for a few seconds for the service to appear. */ def serviceForType[T](implicit t: ClassTag[T]): T = context.getService(awaitReference(t.runtimeClass)).asInstanceOf[T] def awaitReference[T](serviceType: Class[T]): ServiceReference[T] = awaitReference(serviceType, SleepyTime) def awaitReference[T](serviceType: Class[T], wait: FiniteDuration): ServiceReference[T] = { @tailrec def poll(step: Duration, deadline: Deadline): ServiceReference[T] = context.getServiceReference(serviceType.getName) match { case null ⇒ if (deadline.isOverdue()) fail("Gave up waiting for service of type %s".format(serviceType)) else { Thread.sleep((step min deadline.timeLeft max Duration.Zero).toMillis) poll(step, deadline) } case some ⇒ some.asInstanceOf[ServiceReference[T]] } poll(wait, Deadline.now + MaxWaitDuration) } protected def buildTestBundles(builders: immutable.Seq[BundleDescriptorBuilder]): immutable.Seq[BundleDescriptor] = builders map (_.build) def filterErrors()(block: ⇒ Unit): Unit = try block catch { case e: Throwable ⇒ System.err.write(bufferedLoadingErrors.toByteArray); throw e } } object PojoSRTestSupport { /** * Convenience method to define additional test bundles */ def bundle(name: String) = new BundleDescriptorBuilder(name) } /** * Helper class to make it easier to define test bundles */ class BundleDescriptorBuilder(name: String) { import org.ops4j.pax.tinybundles.core.TinyBundles val tinybundle = TinyBundles.bundle.set(Constants.BUNDLE_SYMBOLICNAME, name) /** * Add a Blueprint XML file to our test bundle */ def withBlueprintFile(name: String, contents: URL): BundleDescriptorBuilder = { tinybundle.add("OSGI-INF/blueprint/%s".format(name), contents) this } /** * Add a Blueprint XML file to our test bundle */ def withBlueprintFile(contents: URL): BundleDescriptorBuilder = { val filename = contents.getFile.split("/").last withBlueprintFile(filename, contents) } /** * Add a Bundle activator to our test bundle */ def withActivator(activator: Class[_ <: BundleActivator]): BundleDescriptorBuilder = { tinybundle.set(Constants.BUNDLE_ACTIVATOR, activator.getName) this } /** * Build the actual PojoSR BundleDescriptor instance */ def build: BundleDescriptor = { val file: File = tinybundleToJarFile(name) new BundleDescriptor(getClass().getClassLoader(), new URL("jar:" + file.toURI().toString() + "!/"), extractHeaders(file)) } def extractHeaders(file: File): HashMap[String, String] = { import scala.collection.JavaConverters.iterableAsScalaIterableConverter val headers = new HashMap[String, String]() val jis = new JarInputStream(new FileInputStream(file)) try { for (entry ← jis.getManifest.getMainAttributes.entrySet.asScala) headers.put(entry.getKey.toString, entry.getValue.toString) } finally jis.close() headers } def tinybundleToJarFile(name: String): File = { val file = new File("target/%s-%tQ.jar".format(name, new Date())) val fos = new FileOutputStream(file) try copy(tinybundle.build(), fos) finally fos.close() file } } Other Akka source code examplesHere is a short list of links related to this Akka PojoSRTestSupport.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.