[ https://issues.apache.org/jira/browse/CLEREZZA-617?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13105211#comment-13105211 ]
Daniel Spicar edited comment on CLEREZZA-617 at 9/15/11 8:39 AM: ----------------------------------------------------------------- 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. Please note, that the relevant code sections are the same for both, the new TypeRenderlets and the old Renderlets. In the description the old Renderlet is used. 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. was (Author: daniel.spicar): 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