On Feb 16, 8:11 pm, soumik <[email protected]> wrote:
> Thanks Marius and David for your suggestions.
> I'll try that out.
>
> As to the problem itself, don't you think there should some kind of
> exception generation to avoid the issue happening?

I still don't think there is a hang involved. Can you wrap your method
call with a try/catch ? ... I have the feeling that a NPE (due to lack
of proper S context) is thrown but because this is  thrown on a
different thread (as you'r inside a LiftActor) that is not shown
anywhere.

>
> On Feb 16, 10:35 pm, Marius <[email protected]> wrote:
>
>
>
> > On Feb 16, 11:17 am, soumik <[email protected]> wrote:
>
> > > Hi Marius,
> > >  Thanks for the quick update.
> > > The xhtml returned from the listFilesInDir() is actually sent as a
> > > message to a display CometActor which renders the xhtml it receives
> > > within a specific <div> tag.
> > > So in essence we have these multiple feature threads running(the one
> > > in question is intended to be a local file manager feature) which
> > > generates xhtml for different functions which are then sent to this
> > > one display CometActor which displays it.
> > > So we intend to handle multi-feature tasking by running just the one
> > > CometActor and not multiples of them which obviously is a problem for
> > > lift(since the max no. of CometActors in a page is 2).
>
> > > But back to your explanation of the S context getting lost, I think I
> > > understand what you mean regarding the session context. But does it
> > > also apply for SHtml generator methods?? I mean, does SHtml generator
> > > methods depend on the state of the session??
>
> > Yes if you bind functions. Functions are kept per session.
>
> > > Another question I have is - even if SHtml generator methods fail to
> > > co-relate the session, shouldn't SHtml generator methods return?? or
> > > throw an exception?
>
> > No as SHtml should be used in the proper S context. That's why it is
> > called [S]html.
>
> > > I don't know if you happened to use the exact same function in a
> > > LiftActor object or not, but if you do that you'll see that the
> > > function just doesn't return.
>
> > > Also, I don't intend to maintain state preservation.
>
> > You do not explicitly but as you are trying to bind functions (attach
> > a scla function to a link, button etc) you need the proper context.
>
> > > I just want to
> > > create a list of <a href> tags for all files which when clicked should
> > > make an Ajax call to a specific function in the LiftActor thread which
> > > processes the selection. Could you suggest some alternative way I
> > > could go about this with the current architecture(1 comet actor for
> > > display and individual feature-specific LiftActors sending xhtml to
> > > CometActor for rendering)??
>
> > Take Dave's advice. It is very good and leads to cleaner separation of
> > concern.
>
> > > Thanks,
> > > Soumik
>
> > > On Feb 16, 1:16 pm, Marius <[email protected]> wrote:
>
> > > > Well so you're using it from your own actor. I would not recommend
> > > > this due to state preservation. I mean S context is very likely lost
> > > > because your LiftActor is running on a different thread. What you need
> > > > is to pass the LiftSession instance to your LiftActor say using some
> > > > distinct message like:
>
> > > > case class Init(session: LiftSession)
>
> > > > then in your messageHandler
>
> > > >  protected def messageHandler = {
> > > >        case FileManagerMsg(someMsg) =>
> > > >        {
> > > >          S.initIfNotInitted(session) {
> > > >             var fileList = listFilesInDir("/Users/soumik/Movies/")
> > > >             Log.info("OUTPUT: " + fileList)
> > > >          }
> > > >        }
>
> > > > }
>
> > > > But I'm not sure from your code wht you do with the output of your
> > > > listFilesInDir since that never gets to be rendered.
>
> > > > I strongly recommend using CometActor whenever you want to render
> > > > something asynchronously. It does a lots of good things for you.
>
> > > > Br's,
> > > > Marius
>
> > > > On Feb 16, 9:33 am, soumik <[email protected]> wrote:
>
> > > > > Hi Marius,
>
> > > > >  Thanks for your response. I'm sorry for mis-communicating my problem
> > > > > earlier. As you pointed out the problem doesn't occur when the call to
> > > > > the function is made from a CometActor.
> > > > > In my case too, it was not a CometActor. Rather, it was the LiftActor.
> > > > > (Sometime back we had different CometActors for different feature
> > > > > threads, now we have 1 single CometActor which takes care of the
> > > > > display and different LiftActor threads which do the feature related
> > > > > stuff. Hence the confusion on my part).
>
> > > > > Anyways, here's the relevant code:
> > > > > -------------------------------------
> > > > > object TheVideoPlayerThread extends LiftActor
> > > > > {
> > > > >    val threadName = "FileManager"
>
> > > > >    def listFilesInDir(dirName:String): NodeSeq =
> > > > >    {
> > > > >       Log.info("Recursing for: " + dirName)
> > > > >       val files = (new java.io.File(dirName)).listFiles
>
> > > > >       def showFile1() = "AAA"
>
> > > > >       <li class="fileElem" id="dir">{dirName}</li>
> > > > >          <ul>
> > > > >          {files.flatMap(f => {
> > > > >               if (f.isDirectory())
> > > > >               {
> > > > >                  Log.info("Directory: " + f.toString)
> > > > >                  listFilesInDir(f.toString)
> > > > >               }
> > > > >               else
> > > > >               {
> > > > >                  Log.info("Regular file: " + f.getName)
> > > > >                  <li class="fileElem" id="regfile">
> > > > >                   {SHtml.link("", () => showFile1,
> > > > > Text(f.getName)) }                   //This is the line causing the
> > > > > issue
> > > > >                  </li>
> > > > >               }
> > > > >            }
> > > > >          )}
> > > > >          </ul>
> > > > >    }
>
> > > > >    protected def messageHandler = {
> > > > >        case FileManagerMsg(someMsg) =>
> > > > >        {
> > > > >            var fileList = listFilesInDir("/Users/soumik/Movies/")
> > > > >            Log.info("OUTPUT: " + fileList)
> > > > >        }
> > > > >   }
> > > > > -------------------------------------
> > > > > (I've omitted some of code in this thread which are not related to the
> > > > > file listing functionality.)
> > > > > The problem I see is as soon as I encounter the first file in the
> > > > > directory specified, it prints - "Regular file: <filename>", but after
> > > > > that I don't see the log - "OUTPUT - ...". The function never returns.
> > > > > Same function works perfectly in a CometActor and I see the nodeseq of
> > > > > files in <li> tags to be rendered.
> > > > > Also in the same method in my LiftActor object, if I replace the line:
> > > > > {SHtml.link("", () => showFile1, Text(f.getName)) }
> > > > > with just
> > > > > {f.getName}
> > > > > I see the function return and print the log "OUTPUT - .." with the
> > > > > list of all the files as <li> entries.
>
> > > > > I'm sorry I couldn't give a more concrete example which you could run
> > > > > and reproduce the issue. I'll appreciate if you could just give this
> > > > > function a try from any LiftActor object and check the output on
> > > > > console.
> > > > >  Also, I'm still on 1.1-SNAPSHOT. I've a fairly big codebase, so not
> > > > > sure if migrating to 2.0-SNAPSHOT will cause any other issues,
> > > > > particularly with jquery(i'm using lot of jquery plugins dependent on
> > > > > 1.3.2, not sure if all of them works nicely with 1.4).
>
> > > > > Thanks,
> > > > > Soumik
>
> > > > > On Feb 15, 11:22 pm, Marius <[email protected]> wrote:
>
> > > > > > I don't think the cause is in SHtml. I tried your code from a 
> > > > > > snippet
> > > > > > and from a Comet actor and there was no lock whatsoever. But I did 
> > > > > > use
> > > > > > lift 2.0-SNAPSHOT. can you try with 2.0-SNAPSHOT ?
>
> > > > > > Br's,
> > > > > > Marius
>
> > > > > > On 15 feb., 15:20, soumik <[email protected]> wrote:
>
> > > > > > > Hi,
> > > > > > >  I'm using 1.1-SNAPSHOT lift release and am experiencing strange
> > > > > > > behaviour when trying to output a NodeSeq formed from nested 
> > > > > > > NodeSeq &
> > > > > > > Scala code.
>
> > > > > > > To highlight the problem let me show you the code I'm trying to
> > > > > > > execute:
> > > > > > > -----------------------------------
> > > > > > > def listFilesInDir(dirName:String): NodeSeq =
> > > > > > >    {
> > > > > > >       Log.info("Recursing for: " + dirName)
> > > > > > >       val files = (new java.io.File(dirName)).listFiles
>
> > > > > > >       def playFile1() = "AAA"
>
> > > > > > >       <li class="fileElem" id="dir">{dirName}</li>
> > > > > > >          <ul>
> > > > > > >          {files.flatMap(f => {
> > > > > > >               if (f.isDirectory())
> > > > > > >               {
> > > > > > >                  Log.info("Directory: " + f.toString)
> > > > > > >                  listFilesInDir(f.toString)
> > > > > > >                  <span></span>
> > > > > > >               }
> > > > > > >               else
> > > > > > >               {
> > > > > > >                  Log.info("Regular file: " + f.getName)
> > > > > > >                  <li class="fileElem" id="regfile">
> > > > > > >                   {SHtml.link("", () => playFile1,
> > > > > > > Text("Something")) }                 /* Problem in this line */
> > > > > > >                  </li>
> > > > > > >               }
> > > > > > >            }
> > > > > > >          )}
> > > > > > >          </ul>
> > > > > > > -----------------------------------
> > > > > > > I'm trying to render the output of the above function in a comet
> > > > > > > actor. The problem i see is with the highlighted line of code. 
> > > > > > > When
> > > > > > > the execution reaches this line of code, it gets stuck; the 
> > > > > > > function
> > > > > > > doesn't return and i don't get a NodeSeq to render.
> > > > > > > However, for some reason if I change the highlighted line of code 
> > > > > > > to
> > > > > > > say:
> > > > > > > {f.getName}
> > > > > > > I get the proper NodeSeq which lists all the files in the 
> > > > > > > directory.
>
> > > > > > > Seems to me that the SHtml class functions are encountering an 
> > > > > > > error
>
> ...
>
> read more »

-- 
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en.

Reply via email to