On Thu, Feb 5, 2009 at 12:13 PM, Kris Nuttycombe
<kris.nuttyco...@gmail.com>wrote:

> David, I'm a little confused by how to use registerCleanupFunc after your
> most recent set of changes. It now appears to be package-private, so what is
> the recommended way to register a cleanup func for a RequestVar? Previously,
> I'd implemented my JNDIResource class for use with the JPA stuff like this:
>
> object JNDIResource {
>   val context = new InitialContext()
> }
>
> abstract class JNDIResource[T](val name: String) extends
> RequestVar[T](context.lookup(name).asInstanceOf[T]) {
>

The onShutdown method will always be called:

override protected def onShutdown(session: CleanUpParam): Unit = {
  dispose(this.is)
}

If you are putting something in the RequestVar that needs cleanup, you
should register the cleanup method on the session:

S.session.foreach(_.addSessionCleanup(session => cleanup))


>
>
>   // This is way too dependent upon an implementation detail of the
> superclass.
>   override def cleanupFunc : Box[() => Unit] = {
>     Log.debug("Initializing JNDI resource " + name + "(" + this.is + ")")
>     initialize(this.is) //this will result in a recursive call, but the
> the order of operations is such that it will take the other branch.
>
>     Full(() => {
>         Log.debug("Releasing JNDI resource " + name + "(" + this.is + ")")
>         dispose(this.is)
>       })
>   }
>
>   /**
>    * Subclasses should override this method to provide initialization
>    */
>   protected def initialize(resource : T) {
>   }
>
>   /**
>    * Subclasses should override this method to provide initialization
>    */
>   protected def dispose(resource: T) {
>   }
> }
>
> Using the cleanupFunc like this was of course a complete hack to add the
> ability to do additional delgated initialization to the variable retrieved
> from the JNDI context. I can handle the initialization part by overriding
> setFunc in my new implementation, but how can I set up the delegation to
> dispose?
>
> Thanks,
>
> Kris
>
>
>
>> On Feb 4, 11:56 pm, David Pollak <feeder.of.the.be...@gmail.com>
>> wrote:
>> > I've just realized that I'm a complete idiot.
>> > I need to totally re-do the clean-up mechanism.
>> >
>> > Please give me an hour.
>> >
>> > On Wed, Feb 4, 2009 at 3:06 PM, Kris Nuttycombe
>> > <kris.nuttyco...@gmail.com>wrote:
>> >
>> >
>> >
>> > > Heh, this one just bit me too. I can't say I didn't warn myself,
>> though:
>> >
>> > >   // This is way too dependent upon an implementation detail of the
>> > > superclass.
>> > >   override def cleanupFunc : Box[() => Unit] = {
>> > >      ...
>> > >   }
>> >
>> > > Kris
>> >
>> > > On Wed, Feb 4, 2009 at 1:47 PM, David Pollak <
>> > > feeder.of.the.be...@gmail.com> wrote:
>> >
>> > >> That's because cleanUpFunc is gone.
>> >
>> > >> You must do:
>> >
>> > >> object sessDirHash extends SessionVar[String]("") {
>> > >>   registerCleanupFunc(session => println("Got hash: " + this.is))
>> >
>> > >> }
>> >
>> > >> On Wed, Feb 4, 2009 at 12:43 PM, Alli <allilis...@gmail.com> wrote:
>> >
>> > >>> Hey David,
>> >
>> > >>> Two questions this time:
>> >
>> > >>> I've been playing with your commit earlier today and cleaning up
>> > >>> SessionVar's.
>> > >>> I got:
>> >
>> > >>> object sessDirHash extends SessionVar[String]("") {
>> > >>>  def cleanUpFunc(sess: LiftSession) = {
>> > >>>   println("Got hash: " + this.is)
>> > >>> }
>> >
>> > >>> In my test snippet I got:
>> > >>> sessDirHash("this is a test")
>> > >>> println("Got var: " + ResizeMyPics.sessDirHash.is)
>> >
>> > >>> I can see it printed out correctly after setting it but it's empty
>> in
>> > >>> the cleanup function.
>> >
>> > >>> 2)
>> > >>> Second question, I submit a form and my flash component starts e.g.
>> 3
>> > >>> new sessions and POST's to /resize
>> >
>> > >>> /resize sets a SessionVar variable but it's like it's only being set
>> > >>> the first time. I'm printing out right before I register
>> > >>> the clean up handler in the SessionVar, from my jetty logs:
>> >
>> > >>> INFO - Service request (GET) /images/cancelbutton.gif took 9
>> > >>> Milliseconds
>> > >>> Rez Gots: 127.0.0.1
>> > >>> Registering cleanup for: 1uvl5176sdy9r
>> > >>> Rez Rep Gots: 127.0.0.1
>> > >>> INFO - Service request (POST) /resize took 270 Milliseconds
>> > >>> Rez Gots: 127.0.0.1
>> > >>> Rez Rep Gots: 127.0.0.1
>> > >>> INFO - Service request (POST) /resize took 91 Milliseconds
>> > >>> Rez Gots: 127.0.0.1
>> > >>> Rez Rep Gots: 127.0.0.1
>> > >>> INFO - Service request (POST) /resize took 481 Milliseconds
>> >
>> > >>> I would think it should print out Registering cleanup handler ...
>> > >>> after each /resize request since they are different sessions.
>> >
>> > >>> Then the sessions all timeout and I can see there are 4 sessions
>> > >>> expiring but there is only message printed out once
>> > >>> from the clean up handler.
>> >
>> > >>> What are your thoughts on this?
>> >
>> > >>> Cheers,
>> > >>> Alfred
>> >
>> > >>> On Feb 4, 1:19 am, Alli <allilis...@gmail.com> wrote:
>> > >>> > Thanks David, I'll get it tomorrow from scala-tools.org and
>> finish up
>> > >>> > the app.
>> > >>> > URL will behttp://www.resizemypics.netafree service for people to
>> > >>> > resize their pictures
>> > >>> > and view them online. Just a simple, yet convenient service. Gives
>> me
>> > >>> > a chance to learn
>> > >>> > more about lift as well. Been following lift for a while but this
>> is
>> > >>> > the first site I finish, have a
>> > >>> > half finished blog site in lift. Doing all this stuff outside of
>> work
>> > >>> > so it's easy to get distracted.
>> >
>> > >>> > Will let you know once the site is in production.
>> >
>> > >>> > Again thanks for your help.
>> >
>> > >>> > Cheers,
>> > >>> > Alli
>> >
>> > >>> > On Feb 4, 1:12 am, David Pollak <feeder.of.the.be...@gmail.com>
>> wrote:
>> >
>> > >>> > > 0.11-SNAPSHOT is 0.10 with bug fixes.  It's very stable and will
>> be
>> > >>> 1.0 on
>> > >>> > > 2/26.
>> > >>> > > I'll commit up a fix to this problem in a few minutes.
>> >
>> > >>> > > Also, what's the URL of the site? :-)
>> >
>> > >>> > > On Tue, Feb 3, 2009 at 4:58 PM, Alli <allilis...@gmail.com>
>> wrote:
>> >
>> > >>> > > > 0.10 at the moment, reckon i should upgrade to 0.11? This site
>> is
>> > >>> > > > going live soon though and I was not sure
>> > >>> > > > about the status of 0.11-snapshot.
>> >
>> > >>> > > > On Feb 4, 12:56 am, David Pollak <
>> feeder.of.the.be...@gmail.com>
>> > >>> > > > wrote:
>> > >>> > > > > Crud.  It looks like the session cleanup is done outside of
>> the
>> > >>> session
>> > >>> > > > > scope.
>> > >>> > > > > Are you using 0.11-SNAPSHOT?
>> >
>> > >>> > > > > On Tue, Feb 3, 2009 at 4:35 PM, Alli <allilis...@gmail.com>
>> > >>> wrote:
>> >
>> > >>> > > > > > Been testing this stuff and my object is like this:
>> >
>> > >>> > > > > > object ReportAddress extends SessionVar[String]("") {
>> > >>> > > > > >   def cleanUp() = {
>> > >>> > > > > >    println(S.session)
>> > >>> > > > > >    S.session.map { sess =>
>> > >>> > > > > >      println("Session ID: " + sess.uniqueId)
>> > >>> > > > > >      println("REM ADDRESS: " + this.is)
>> > >>> > > > > >      val tempDir = ...
>> > >>> > > > > >      // Remove the temporary dir for this session.
>> > >>> > > > > >      tempDir.destroy()
>> > >>> > > > > >    }
>> > >>> > > > > >  }
>> >
>> > >>> > > > > >  registerCleanupFunc(cleanUp _)
>> > >>> > > > > > }
>> >
>> > >>> > > > > > println(S.session) always gives me "Empty"
>> >
>> > >>> > > > > > Any idea what could cause this?
>> >
>> > >>> > > > > > On Feb 3, 10:38 pm, David Pollak <
>> > >>> feeder.of.the.be...@gmail.com>
>> > >>> > > > > > wrote:
>> > >>> > > > > > > On Tue, Feb 3, 2009 at 2:13 PM, Alli <
>> allilis...@gmail.com>
>> > >>> wrote:
>> >
>> > >>> > > > > > > > Makes a lot of sense, thanks David.
>> >
>> > >>> > > > > > > > Always amazes me how good and clean the design of lift
>> is.
>> >
>> > >>> > > > > > > Flattery will get you a lot... :-)
>> >
>> > >>> > > > > > > > On Feb 3, 9:49 pm, David Pollak <
>> > >>> feeder.of.the.be...@gmail.com>
>> > >>> > > > wrote:
>> > >>> > > > > > > > > On Tue, Feb 3, 2009 at 1:06 PM, Alli <
>> > >>> allilis...@gmail.com>
>> > >>> > > > wrote:
>> >
>> > >>> > > > > > > > > > Evening,
>> >
>> > >>> > > > > > > > > > During the lifetime of a session, the session may
>> have
>> > >>> uploaded
>> > >>> > > > > > bunch
>> > >>> > > > > > > > > > of files and these need to be able to be
>> > >>> destroyed/unlinked
>> > >>> > > > when a
>> > >>> > > > > > > > > > session ends.
>> >
>> > >>> > > > > > > > > > When user uploads a file it's parent dir is
>> determined
>> > >>> by the
>> > >>> > > > > > session
>> > >>> > > > > > > > > > unique ID and the remote address of the uploader.
>> The
>> > >>> name is
>> > >>> > > > e.g.
>> > >>> > > > > > /
>> > >>> > > > > > > > > > tmp/sha1 hash of session id and remote address'.
>>  This
>> > >>> means in
>> > >>> > > > > > order
>> > >>> > > > > > > > > > to determine what to destroy I need to know what
>> remote
>> > >>> address
>> > >>> > > > the
>> > >>> > > > > > > > > > session belongs to. I am setting that when
>> uploading a
>> > >>> file has
>> > >>> > > > > > been
>> > >>> > > > > > > > > > uploaded successfully.
>> >
>> > >>> > > > > > > > > > In Boot.scala I want to do something like:
>> > >>> > > > > > > > > >  // Set session handler.
>> > >>> > > > > > > > > >    LiftSession.onAboutToShutdownSession =
>> > >>> List[LiftSession =>
>> > >>> > > > > > Unit](
>> > >>> > > > > > > > > >        session => {
>> > >>> > > > > > > > > >          var sessId = session.uniqueId
>> > >>> > > > > > > > > >          val remoteIp =
>> session.get("remoteAddress")
>> > >>> > > > > > > > > >          val myTempDir = new TempDirWeb(sessId,
>> > >>> remoteIp)
>> > >>> > > > > > > > > >          myTempDir.unlinkall()
>> > >>> > > > > > > > > >        })
>> >
>> > >>> > > > > > > > > > Problem with this is that the LiftSession.get[T]()
>> > >>> method is
>> > >>> > > > > > package
>> > >>> > > > > > > > > > private (liftweb). I can think of some other
>> scenarios
>> > >>> where
>> > >>> > > > one
>> > >>> > > > > > would
>> > >>> > > > > > > > > > need access to the session variables before
>> destroying
>> > >>> the
>> > >>> > > > session.
>> >
>> > >>> > > > > > > > > > Does this make sense or is my design just plain
>> wrong?
>> > >>> :).
>> >
>> > >>> > > > > > > > > get is typesafe, so exposing it would make it not
>> type
>> > >>> safe.
>> > >>> > > >  It's
>> > >>> > > > > > always
>> > >>> > > > > > > > > accessed via SessionVars.
>> >
>> > >>> > > > > > > > > You can do something like:
>> >
>> > >>> > > > > > > > > object ReportAddress extends SessionVar[String]("")
>> {
>> > >>> > > > > > > > >   def cleanUp() {
>> > >>> > > > > > > > >     S.session.map{ sess =>
>> > >>> > > > > > > > >     val td = new TempDirWeb(sess.uniqueId, this.is)
>> > >>> > > > > > > > >     td.unlinkall()
>> > >>> > > > > > > > >     }
>> > >>> > > > > > > > >   }
>> >
>> > >>> > > > > > > > >   registerCleanupFunc(cleanUp _)
>> >
>> > >>> > > > > > > > > }
>> >
>> > >>> > > > > > > > > Each SessionVar (and RequestVar) has a cleanup func
>> that
>> > >>> will be
>> > >>> > > > > > called
>> > >>> > > > > > > > as
>> > >>> > > > > > > > > the Var is going away.
>> >
>> > >>> > > > > > > > > > Cheers,
>> > >>> > > > > > > > > > Alfred
>> >
>> > >>> > > > > > > > > --
>> > >>> > > > > > > > > Lift, the simply functional web frameworkhttp://
>> > >>> liftweb.net
>> > >>> > > > > > > > > Beginning Scalahttp://
>> > >>>www.apress.com/book/view/1430219890
>> > >>> > > > > > > > > Follow me:http://twitter.com/dpp
>> > >>> > > > > > > > > Git some:http://github.com/dpp
>> >
>> > >>> > > > > > > --
>> > >>> > > > > > > Lift, the simply functional web frameworkhttp://
>> liftweb.net
>> > >>> > > > > > > Beginning Scalahttp://
>> www.apress.com/book/view/1430219890
>> > >>> > > > > > > Follow me:http://twitter.com/dpp
>> > >>> > > > > > > Git some:http://github.com/dpp
>> >
>> > >>> > > > > --
>> > >>> > > > > Lift, the simply functional web frameworkhttp://liftweb.net
>> > >>> > > > > Beginning Scalahttp://www.apress.com/book/view/1430219890
>> > >>> > > > > Follow me:http://twitter.com/dpp
>> > >>> > > > > Git some:http://github.com/dpp
>> >
>> > >>> > > --
>> > >>> > > Lift, the simply functional web frameworkhttp://liftweb.net
>> > >>> > > Beginning Scalahttp://www.apress.com/book/view/1430219890
>> > >>> > > Follow me:http://twitter.com/dpp
>> > >>> > > Git some:http://github.com/dpp
>> >
>> > >> --
>> > >> Lift, the simply functional web frameworkhttp://liftweb.net
>> > >> Beginning Scalahttp://www.apress.com/book/view/1430219890
>> >
>> > >> Follow me:http://twitter.com/dpp
>> > >> Git some:http://github.com/dpp
>> >
>> > --
>> > Lift, the simply functional web frameworkhttp://liftweb.net
>> > Beginning Scalahttp://www.apress.com/book/view/1430219890
>> > Follow me:http://twitter.com/dpp
>> > Git ...
>> >
>> > read more ยป
>>
>>
>
> >
>


-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp

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

Reply via email to