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?

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
> > > > > > scenario(frm which its unable to recover). I've tried a couple of
> > > > > > SHtml functions(a, text, link, submit etc.) all of them show the 
> > > > > > same
> > > > > > problem, but if I use some other scala code it executes properly.
>
> > > > > > Could anyone look into this and verify whether this is indeed a bug
> > > > > > with the SHtml functions?
>
> > > > > > Thanks,
> > > > > > Soumik- Hide quoted text -
>
> - Show quoted text -- Hide quoted text -
>
> - Show quoted text -

-- 
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