Hi Reto!

Mmhh.. interesting. Though did not follow your step myself did you look into
the bundle that has been generated ?
I mean, you can dump it (its an inputstream) to a file and have a look ?
Guess its the only way to see whats really happening. Also look if a bundle
looks clean (technically) when not adding anything. Or at least nothing you
declared just at runtime.
Speaking of that i might see the problem. Tinybundles takes a Class type in
"addClass" but just for API brevity. It really resolves the fully qualified
name and tried to find it on disk.
The funny full qualified class name
(ine6$object$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$HelloWorld.class) speaks for
itself - but its not about aesthetics probably ;)

Can you load the (generated) bundle in your IDE (and use the aforementioned
class) ?

Toni

On Fri, Jan 21, 2011 at 3:14 PM, Reto Bachmann-Gmuer <
[email protected]> wrote:

> Goal: create and install a bundle at runtime from the clerzza-console
>
> Starting point: Clerezza tdb launcher with additional TinyBundle and its
> dependencies installed
>
> Welcome to the Apache Clerezza Console
> Console is based on Scala version 2.8.1.final (OpenJDK 64-Bit Server VM,
> Java 1.6.0_20).
> Type in expressions to have them evaluated.
> Hint: To execute a Felix-Shell command prepend ":f "
> Type :help for more information.
> zz>import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles._
> import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles._
> zz>val nb = newBundle()
> nb: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle =
> org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67
> zz>class HelloWorld { def hello = println("hello") }
> defined class HelloWorld
> zz>nb.add(classOf[HelloWorld])
> res0: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle =
> org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67
> zz>nb.set("Some-Key", "some value")
> res1: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle =
> org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67
> zz>import java.io._
> import java.io._
> zz>nb.add("test-file", new ByteArrayInputStream("some
> test-data".getBytes("utf-8")))
> res2: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle =
> org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67
> zz>val in = nb.build(withBnd())
> in: java.io.InputStream = java.io.PipedInputStream@5906edd5
> zz>val myBundle = bundleContext.installBundle("myBundle", in)
> myBundle: org.osgi.framework.Bundle =
> BuildByTinyBundlestinybundles7983922728161488712UID [139]
> zz>val entries = myBundle.findEntries("/", null, true)
> entries: java.util.Enumeration[_] =
> org.apache.felix.framework.EntryFilterEnumeration@3aa0d67c
> zz>while (entries.hasMoreElements) { out println("Entry:
> "+entries.nextElement) }
> Entry: bundle://139.0:0/META-INF/
> Entry: bundle://139.0:0/META-INF/MANIFEST.MF
> Entry:
> bundle://139.0:0/line6$object$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$HelloWorld.class
> zz>headers(myBundle)
> Bnd-LastModified = 1295608733169
> Built-By = reto
> Bundle-ManifestVersion = 2
> Bundle-Name = BuildByTinyBundlestinybundles7983922728161488712UID
> Bundle-SymbolicName = BuildByTinyBundlestinybundles7983922728161488712UID
> Bundle-Version = 0
> Created-By = 1.6.0_20 (Sun Microsystems Inc.)
> Generated-By-Ops4j-Pax-From =
> BuildByTinyBundlestinybundles7983922728161488712UID
> Manifest-Version = 1.0
> Originally-Created-By = pax-swissbox-tinybundles-1.3.0
> Private-Package = .
> Some-Key = some value
> SwissboxTinybundlesVersion = pax-swissbox-tinybundles-1.3.0
> Tool = Bnd-0.0.313
> zz>myBundle.loadClass("line6$object$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$HelloWorld")
>
> java.lang.ClassFormatError: Truncated class file
>     at java.lang.ClassLoader.defineClass1(Native Method)
>     at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
>     at
> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.findClass(ModuleImpl.java:1874)
>     at
> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:720)
>     at org.apache.felix.framework.ModuleImpl.access$300(ModuleImpl.java:73)
>     at
> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1735)
>     at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
>     at
> org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:638)
>     at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1599)
>     at
> org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:90...zz>
> zz>
>
>
> Well not the surprising that this class created in the shell creates
> problems. A bit surpring that the resource "test-file" isn't in the list.
>
> Let's try compiling a class using the compiler service
> zz>import org.apache.clerezza.scala.scripting.CompilerService
> import org.apache.clerezza.scala.scripting.CompilerService
> zz>val cs = $[CompilerService]
> cs: org.apache.clerezza.scala.scripting.CompilerService =
> org.apache.clerezza.scala.scripting.CompilerService@54075697
> zz>val source = """ package foo
>      | class Hello() {
>      | def say() { println("hello")}
>      | }
>      | """
> zz>val chars = source.toCharArray
> chars: Array[Char] =
> Array( , p, a, c, k, a, g, e,  , f, o, o,
> , c, l, a, s, s,  , H, e, l, l, o, (, ),  , {,
> , d, e, f,  , s, a, y, (, ),  , {,  , p, r, i, n, t, l, n, (, ", h, e, l,
> l, o, ", ),  , },
> , },
> )
> zz>val classes = cs.compile(List(chars))
> classes: List[Class[_]] = List(class foo.Hello)
> zz>val tinyFoo = newBundle()
> tinyFoo: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle =
> org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@6ca68dbd
> zz>val fooStream = tinyFoo.build(withBnd())
> fooStream: java.io.InputStream = java.io.PipedInputStream@fd855ae
> zz>val fooBundle = bundleContext.installBundle("fooBundle",
> fooStream)
> fooBundle: org.osgi.framework.Bundle =
> BuildByTinyBundlestinybundles3268593457443402016UID [145]
> zz>headers(fooBundle)
> Bnd-LastModified = 1295618427023
> Built-By = reto
> Bundle-ManifestVersion = 2
> Bundle-Name = BuildByTinyBundlestinybundles3268593457443402016UID
> Bundle-SymbolicName = BuildByTinyBundlestinybundles3268593457443402016UID
> Bundle-Version = 0
> Created-By = 1.6.0_20 (Sun Microsystems Inc.)
> Export-Package = foo
> Generated-By-Ops4j-Pax-From =
> BuildByTinyBundlestinybundles3268593457443402016UID
> Import-Package = foo;resolution:=optional
> Manifest-Version = 1.0
> Originally-Created-By = pax-swissbox-tinybundles-1.3.0
> SwissboxTinybundlesVersion = pax-swissbox-tinybundles-1.3.0
> Tool = Bnd-0.0.313
>
> looking good so far, no reconnecting to the shell (ssh -p 8022
> admin@localhost) to have the new bundle in the classpath
>
> reto@trisa-laptop:~$ ssh -p 8022 admin@localhost
> admin@localhost's password:
> Welcome to the Apache Clerezza Console
> Console is based on Scala version 2.8.1.final (OpenJDK 64-Bit Server VM,
> Java 1.6.0_20).
> Type in expressions to have them evaluated.
> Hint: To execute a Felix-Shell command prepend ":f "
> Type :help for more information.
> zz>import foo.Hello
> import foo.Hello
> zz>val h = new Hello()
> error: error while loading Hello, class file 'foo/Hello.class' is broken
> (0)
> <console>:13: error: foo.Hello does not have a constructor
>        val h = new Hello()
>                ^
> zz>
>
>
> Well if you read till here, you might have a suggestion on what to try
> next...
>
> Cheers,
> Reto
>
>
>
> _______________________________________________
> general mailing list
> [email protected]
> http://lists.ops4j.org/mailman/listinfo/general
>
>


-- 
*Toni Menzel - http://www.okidokiteam.com*
_______________________________________________
general mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/general

Reply via email to