[ 
https://issues.apache.org/jira/browse/CLEREZZA-617?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13105211#comment-13105211
 ] 

Daniel Spicar commented on CLEREZZA-617:
----------------------------------------

Further debugging revealed the cause of the unintended dependency:

SSPs are compiled with the CompilerService in the Scala OSGi Services 
(org.apache.clerezza.scala.scripting) bundle.
The CompilerService uses TrackingCompiler.scala and on line 81 a ClassLoader of 
the org.apache.clerezza.scala.scripting bundle is used to load the compiled SSP 
class.

Next the class gets instantiated in Platform ScalaServerPages Renderlet 
(platform.typerendering.scalaserverpages) bundle at line 186. At this point, 
Felix creates the package dependency from org.apache.clerezza.scala.scripting 
to the bundle providing the the WebRenderingService (here: 
org.apache.clerezza.org.clerezza.app.webrenderingservice).

My hypothesis is that this is because in the SSP using the WebRenderingService 
the WebRenderingService is referenced via fully qualified classname or that the 
OSGi service lookup is resolved at the SSPs compile time. Nevertheless there is 
obviously a reference on 
org.apache.clerezza.org.clerezza.app.webrenderingservice in the consuming SSP. 
Because the compiled SSP is loaded with the classloader of 
org.apache.clerezza.scala.scripting, the dependency is not as one would expect.

Intuitively one would expect a dependency from 
org.apache.clerezza.org.clerezza.app.webrenderingconsumer on 
org.apache.clerezza.org.clerezza.app.webrenderingservice. Now the straight 
forward approach would be to use the classloader of 
org.apache.clerezza.org.clerezza.app.webrenderingconsumer to load the compiled 
SSP. However this approach would change dependencies on all compiled SSPs and 
may have currently unknown side effects.

I don't currently know another viable solution. I though of only referencing 
the WebRenderingService as a String in the consuming SSP and ensure, the 
dependency gets resolved dynamically at execution time but when the scala 
scrpiting bundle does not import the webrenderingservice's package there may be 
a ClassNotFoundException, as its classloader does not know about the 
WebRenderingService's class.

Any thought on this are welcome.

> Bug in org.apache.clerezza.platform.typerendering.WebRenderingService causes 
> a refresh of all bundles
> -----------------------------------------------------------------------------------------------------
>
>                 Key: CLEREZZA-617
>                 URL: https://issues.apache.org/jira/browse/CLEREZZA-617
>             Project: Clerezza
>          Issue Type: Bug
>         Environment: Mac OSx 10.6.6
> java version "1.6.0_26"
> Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
> Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)
>            Reporter: Tsuyoshi Ito
>            Priority: Critical
>         Attachments: refreshes.png, renderingservice.zip
>
>
> Updating a bundle which provides a WebrenderingService causes an update of 
> all bundles (after refresh). Even thougth there are no dependencies between 
> most of the bundles.
> test bundles to reproduce the bug attached.
> How to reproduce it:
> parent version 0.3-incubating-SNAPSHOT is used in test bundles (probably you 
> need  0.2-incubating-SNAPSHOT).
> attempt 1
> 1. Install and start bundle org.clerezza.app.webrenderingservice
> 2. Install and start bundle org.clerezza.app.webrenderingserviceconsumer
> 3. Go to http://localhost:8080/admin/renderingtest, The WebrenderingService 
> produces the text "hello test". WebrenderingService is used in an ssp in the 
> webrenderingserviceconsumer bundle
> 4. update org.clerezza.app.webrenderingservice, 
> 5. enter ":f refresh", a refresh is necessary. all bundles are updated
> Furthermore the following error occured, which makes Clerezza Console 
> unavailable.
> org.apache.clerezza.shell.InterruptibleInputStream$$anon$1@2053076f: caught 
> java.io.IOException: Bad file descriptor
> java.io.IOException: Bad file descriptor
>       at sun.nio.ch.FileDispatcher.read0(Native Method)
>       at sun.nio.ch.FileDispatcher.read(FileDispatcher.java:26)
>       at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:202)
>       at sun.nio.ch.IOUtil.read(IOUtil.java:175)
>       at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:144)
>       at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:48)
>       at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:92)
>       at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:86)
>       at java.io.InputStream.read(InputStream.java:85)
>       at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:64)
>       at 
> org.apache.clerezza.shell.InterruptibleInputStream$$anon$1$$anonfun$act$1$$anonfun$apply$1.apply(InterruptibleInputStream.scala:40)
>       at 
> org.apache.clerezza.shell.InterruptibleInputStream$$anon$1$$anonfun$act$1$$anonfun$apply$1.apply(InterruptibleInputStream.scala:35)
>       at scala.actors.ReactorTask.run(ReactorTask.scala:34)
>       at scala.actors.Reactor$class.resumeReceiver(Reactor.scala:129)
>       at 
> org.apache.clerezza.shell.InterruptibleInputStream$$anon$1.scala$actors$ReplyReactor$$super$resumeReceiver(InterruptibleInputStream.scala:32)
>       at scala.actors.ReplyReactor$class.resumeReceiver(ReplyReactor.scala:69)
>       at 
> org.apache.clerezza.shell.InterruptibleInputStream$$anon$1.resumeReceiver(InterruptibleInputStream.scala:32)
>       at scala.actors.Actor$class.searchMailbox(Actor.scala:478)
>       at 
> org.apache.clerezza.shell.InterruptibleInputStream$$anon$1.searchMailbox(InterruptibleInputStream.scala:32)
>       at 
> scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114)
>       at 
> scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114)
>       at scala.actors.ReactorTask.run(ReactorTask.scala:36)
>       at 
> scala.concurrent.forkjoin.ForkJoinPool$AdaptedRunnable.exec(ForkJoinPool.java:611)
>       at 
> scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422)
>       at 
> scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340)
>       at 
> scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325)
> Because Clerezza Console is unavailable I have used 
> http://localhost:8080/system/console/shell 
> attempt 2
> 1 .Update bundle org.clerezza.app.webrenderingservice again without visiting 
> http://localhost:8080/admin/renderingtest first (not compiling the ssp)
> 2. enter refresh => no refresh necessary

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to