But does tinybundles (look at the (also tiny) source base) report any errors
about that ? Let me know if we can access this virtual (in memory  only?)
class container in order to get the bytes.

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

> Hi Toni!
>
> Indeed its not possible to find the classes on disk but also getting
> "foo/Hello.class" with the Classloader doesn't return any content
>
> zz>val clazz = classes(0)
> clazz: java.lang.Class[_] = class foo.Hello
> zz>clazz.getClassLoader.getResourceAsStream("foo/Hello.class")
> res34: java.io.InputStream = java.util.zip.ZipFile$1@46b48bc5
> zz>import scala.io.Source
> import scala.io.Source
> zz>Source.fromInputStream(res34).length
> res36: Int = 0
>
> I'll have to get those bytes from the "virtual directory" used by the
> compiler.
>
> Cheers,
> Reto
>
>
> On Fri, Jan 21, 2011 at 3:31 PM, Toni Menzel <[email protected]> wrote:
>
>> 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*
>>
>
>


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

Reply via email to