[Lift] Re: Need access to session variables when about to shut down a session.

2009-02-05 Thread Alli

This works now smoothly.

On Feb 5, 8:50 pm, Kris Nuttycombe kris.nuttyco...@gmail.com wrote:
 On Thu, Feb 5, 2009 at 1:43 PM, David Pollak
 feeder.of.the.be...@gmail.comwrote:





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

 I don't think I understand this - will the RequestVar onShutdown hook get
 not called at the end of the processing of each HTTP request?

 Thanks,

 Kris



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



[Lift] Re: Need access to session variables when about to shut down a session.

2009-02-04 Thread Alli

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.neta free 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

[Lift] Re: Need access to session variables when about to shut down a session.

2009-02-04 Thread Alli

Sorry, for some reason the whole stuff i copy/pasted didn't get in:

object sessDirHash extends SessionVar[String]() {
  def cleanUpFunc(sess: LiftSession) = {
   println(Got hash:  + this.is)

  registerCleanUpFunc(cleanUpFunc _)
}

Anyway I changed it to this:
object sessDirHash extends SessionVar[String]() {
  def cleanUpFunc(sess: LiftSession) = {
println(Got hash:  + this.is)
  }

  registerCleanupFunc(session = println(Got hash:  + this.is))
}

This is what I get afterwards:
INFO -  Session kps4gk1dz4n4 expired
INFO -  Session 1qxs8vlro53pw expired
Got hash:

There may or may not be something i'm doing wrong

On Feb 4, 8: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

[Lift] Re: Need access to session variables when about to shut down a session.

2009-02-04 Thread Alli

No worries, the session vars seem to be reset to their default values
before the callback gets
called. I followed the code myself in Vars and LiftSession and
couldn't find anything wrong. Will
look at your change set tomorrow to learn better how this works.

If i spot possible bugs I would like to get involved and write test
cases etc so I don't have to
bother you and others on the list all the time.

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.comwrote:



  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

[Lift] Need access to session variables when about to shut down a session.

2009-02-03 Thread Alli

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? :).

Cheers,
Alfred



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



[Lift] Re: Need access to session variables when about to shut down a session.

2009-02-03 Thread Alli

Makes a lot of sense, thanks David.

Always amazes me how good and clean the design of lift is.

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



[Lift] Potential LiftRules dispatch issue.

2009-01-27 Thread Alli

I wrote a frontend so e.g. localhost:8080/picture/blah.jpg
encapsulates /tmp/blah.jpg and will return an InMemoryResponse() with
blah.jpg as content.

I have something like the following:
LiftRules.dispatch.append {
  case r @ Req(picture :: fileName :: Nil, , GetRequest) = () =
 ...
}

Thing is my partial function is not being called when I do /picture/
blah.jpg but only gets called on /picture/blah

It looks like 'fileName' is not allowed to have a 'dot' in it.

Is it possible that this is a bug?

I'm not familiar enough with the Lift code base to dive into the rules
engine.

Cheers,
Alfred
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[Lift] Re: Potential LiftRules dispatch issue.

2009-01-27 Thread Alli

Thanks chaps, can't believe i didn't spot it :).

Cheers,
Alfred

On Jan 27, 11:48 pm, Tim Perrett he...@timperrett.com wrote:
 Change the req to this:

 Req(picture :: fileName :: Nil, jpg, GetRequest)

 That should then work for you

 Cheers, Tim

 On Jan 27, 11:39 pm, Alli allilis...@gmail.com wrote:

  LiftRules.dispatch.append {
    case r @ Req(picture :: fileName :: Nil, , GetRequest) = () =
       ...

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



[Lift] Re: Potential LiftRules dispatch issue.

2009-01-27 Thread Alli

Is it possible to make the extension a wild card somehow, e.g.
if i want jpg,png,gif,bmp ?

On Jan 27, 11:50 pm, Alli allilis...@gmail.com wrote:
 Thanks chaps, can't believe i didn't spot it :).

 Cheers,
 Alfred

 On Jan 27, 11:48 pm, Tim Perrett he...@timperrett.com wrote:

  Change the req to this:

  Req(picture :: fileName :: Nil, jpg, GetRequest)

  That should then work for you

  Cheers, Tim

  On Jan 27, 11:39 pm, Alli allilis...@gmail.com wrote:

   LiftRules.dispatch.append {
     case r @ Req(picture :: fileName :: Nil, , GetRequest) = () =
        ...

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



[Lift] Re: Potential LiftRules dispatch issue.

2009-01-27 Thread Alli

Thanks, will definitely order a PDF or your book when it's out.

Cheers,
Alli

On Jan 27, 11:56 pm, David Pollak feeder.of.the.be...@gmail.com
wrote:
 On Tue, Jan 27, 2009 at 3:53 PM, Alli allilis...@gmail.com wrote:

  Is it possible to make the extension a wild card somehow, e.g.
  if i want jpg,png,gif,bmp ?

 LiftRules.dispatch.append {
  case r @ Req(picture :: fileName :: Nil, extension, GetRequest) if
 List(jpg, png, gif).contains(extension) = () =
     ...

 }

 Note that this is not a speed-optimal solution (you'd pre-populate set with
 the valid extensions).  But it demonstrates using extractors and guards...
 the stuff I'm writing about this very day in *Beginning Scala*.

 Thanks,
 David





  On Jan 27, 11:50 pm, Alli allilis...@gmail.com wrote:
   Thanks chaps, can't believe i didn't spot it :).

   Cheers,
   Alfred

   On Jan 27, 11:48 pm, Tim Perrett he...@timperrett.com wrote:

Change the req to this:

Req(picture :: fileName :: Nil, jpg, GetRequest)

That should then work for you

Cheers, Tim

On Jan 27, 11:39 pm, Alli allilis...@gmail.com wrote:

 LiftRules.dispatch.append {
   case r @ Req(picture :: fileName :: Nil, , GetRequest) = () =
      ...

 }

 --
 Lift, the simply functional web frameworkhttp://liftweb.net
 Beginning 
 Scalahttp://www.amazon.com/Beginning-Scala-David-Pollak/dp/1430219890/ref=...
 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
-~--~~~~--~~--~--~---



[Lift] Re: [ANN] Lift 0.10

2009-01-15 Thread Alli

Congrats, keep up the good work!

On Jan 15, 7:52 am, Viktor Klang viktor.kl...@gmail.com wrote:
 Awesome guys! Simply and stunningly awesome!

 On Thu, Jan 15, 2009 at 2:57 AM, Matt Harrington mbh.li...@gmail.comwrote:



  Hats Off to you all.  Looking forward to 1.0 and the books!

  Matt

 --
 Viktor Klang
 Senior Systems Analyst

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



[Lift] Re: Writing data to the HttpServletResponse

2009-01-11 Thread Alli

Thanks guys, that's very helpful.

What I'm doing is using swfupload to let the user upload one or more
images (png, gif, jpg etc.). Then I'm gonna resize them and send them
back to the user.
This is what I guess I'll have to do:

1) Subclass LiftResponse to send the appropriate headers (content-
disposition, content-length etc) and the write the file to the
response
2) Do some stuff in Boot.scala to hook my new response in when a
specific URL is being used e.g. /downloadimage.

Cheers,
Alli

On Jan 11, 12:08 pm, Tim Perrett he...@timperrett.com wrote:
 Alli,

 Mark is correct - I'd create a LiftResponse sublass and handle that
 request with a DispatchPF. If your not familiar, check out
 prependDispatch in Boot.scala of the demo site.

 If you can supply a bit more information about what exacty you want to
 do (I'm guessing you want to force downlod a PDF or something?) then
 we can give you a more specific answer.

 Cheers

 Tim

 On Jan 11, 12:41 am, Marc Boschma marc+lift...@boschma.cx wrote:

  I'm not an expert but I would model a Response class in much the same  
  way as:

     package net.liftweb.http

     object PlainTextResponse {
       def apply(text: String): PlainTextResponse =  
  PlainTextResponse(text, Nil, 200)
       def apply(text: String, code: Int): PlainTextResponse =  
  PlainTextResponse(text, Nil, code)
     }

     case class PlainTextResponse(text: String, headers: List[(String,  
  String)], code: Int) extends LiftResponse {
       def toResponse = {
         val bytes = text.getBytes(UTF-8)
         InMemoryResponse(bytes, (Content-Length,  
  bytes.length.toString) :: (Content-Type, text/plain) :: headers,  
  Nil, code)
       }
     }

  from TextResponse.scala. Look at InMemoryResponse or possibly  
  StreamingResponse in Response.scala.

  Marc

  On 11/01/2009, at 4:27 AM, Alli wrote:

   Hey, I have been searching the list and also the liftweb.net wiki and
   haven't found a way to do this:

   I have a form to upload a file that I want to manipulate and send back
   to the client. When sending it back I am using S.setHeader to set the
   content type, disposition etc but I haven't found a way to write the
   file back to the response. What I think I need is access to the
   response's printwriter (response.getWriter()) instance. Any help would
   be greatly appreciated.

   Cheers,
   Alli

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



[Lift] Re: Writing data to the HttpServletResponse

2009-01-11 Thread Alli

Yeah I think I need to add a custom dispatch function and make that
return my own response. I was actually
hoping I could do this straight from the snippet instead of having to
redirect, makes the whole thing more complex.

On Jan 11, 12:41 am, Marc Boschma marc+lift...@boschma.cx wrote:
 I'm not an expert but I would model a Response class in much the same  
 way as:

    package net.liftweb.http

    object PlainTextResponse {
      def apply(text: String): PlainTextResponse =  
 PlainTextResponse(text, Nil, 200)
      def apply(text: String, code: Int): PlainTextResponse =  
 PlainTextResponse(text, Nil, code)
    }

    case class PlainTextResponse(text: String, headers: List[(String,  
 String)], code: Int) extends LiftResponse {
      def toResponse = {
        val bytes = text.getBytes(UTF-8)
        InMemoryResponse(bytes, (Content-Length,  
 bytes.length.toString) :: (Content-Type, text/plain) :: headers,  
 Nil, code)
      }
    }

 from TextResponse.scala. Look at InMemoryResponse or possibly  
 StreamingResponse in Response.scala.

 Marc

 On 11/01/2009, at 4:27 AM, Alli wrote:



  Hey, I have been searching the list and also the liftweb.net wiki and
  haven't found a way to do this:

  I have a form to upload a file that I want to manipulate and send back
  to the client. When sending it back I am using S.setHeader to set the
  content type, disposition etc but I haven't found a way to write the
  file back to the response. What I think I need is access to the
  response's printwriter (response.getWriter()) instance. Any help would
  be greatly appreciated.

  Cheers,
  Alli

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



[Lift] Re: Writing data to the HttpServletResponse

2009-01-11 Thread Alli

I'm not sure how i would hook SHtml.fileUpload into this because
swfupload lets me configure an URL
that it will post to for each file uploaded, I don't even  need a form
to do this (this is all flash/swf). I currently
have a LiftView subclass that handles it and is processing it like
this:

S.request match {
case Full(req) =
  req.uploadedFiles.foreach { file: FileParamHolder =
println(Name:  + file.name)
println(File name:  + file.fileName)
resizeAndSave(file)
  }

  case _ =
}

I guess the only thing I need to change is using a custom dispatch
instead of the view in order to return my own LiftResponse instead of
a NodeSeq
back to the client.

Cheers,
Alli


On Jan 11, 12:37 pm, Marius marius.dan...@gmail.com wrote:
 Alli are you using SHtml.fileUpload ... or you want to upload it
 manually processing everything in your dispatch? .. I'd opt in for
 SHtml.fileUpload because there is a bunch of stuff Lift does for you.

 On Jan 11, 5:12 am, Alli allilis...@gmail.com wrote:

  Yeah I think I need to add a custom dispatch function and make that
  return my own response. I was actually
  hoping I could do this straight from the snippet instead of having to
  redirect, makes the whole thing more complex.

  On Jan 11, 12:41 am, Marc Boschma marc+lift...@boschma.cx wrote:

   I'm not an expert but I would model a Response class in much the same  
   way as:

      package net.liftweb.http

      object PlainTextResponse {
        def apply(text: String): PlainTextResponse =  
   PlainTextResponse(text, Nil, 200)
        def apply(text: String, code: Int): PlainTextResponse =  
   PlainTextResponse(text, Nil, code)
      }

      case class PlainTextResponse(text: String, headers: List[(String,  
   String)], code: Int) extends LiftResponse {
        def toResponse = {
          val bytes = text.getBytes(UTF-8)
          InMemoryResponse(bytes, (Content-Length,  
   bytes.length.toString) :: (Content-Type, text/plain) :: headers,  
   Nil, code)
        }
      }

   from TextResponse.scala. Look at InMemoryResponse or possibly  
   StreamingResponse in Response.scala.

   Marc

   On 11/01/2009, at 4:27 AM, Alli wrote:

Hey, I have been searching the list and also the liftweb.net wiki and
haven't found a way to do this:

I have a form to upload a file that I want to manipulate and send back
to the client. When sending it back I am using S.setHeader to set the
content type, disposition etc but I haven't found a way to write the
file back to the response. What I think I need is access to the
response's printwriter (response.getWriter()) instance. Any help would
be greatly appreciated.

Cheers,
Alli

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



[Lift] Re: Writing data to the HttpServletResponse

2009-01-11 Thread Alli

Thanks chaps, that did the trick.

Cheers,
Alfred

On Jan 11, 3:25 pm, Marius marius.dan...@gmail.com wrote:
 Ummm ... Does it really need to return a DispatchPf? It could create
 internally the DispatchPF as just append it to LiftRules dispatch
 list.

 On Jan 11, 5:09 pm, David Pollak feeder.of.the.be...@gmail.com
 wrote:

  I think something like:
  createFileHandler(path: List[String], nameOfFileParam: String,
  returnContentType: String)(f: Array[Byte] = Array[Byte]): DispatchPF

  would be a cool method.  It would build the DispatchPF for you and all you
  need do is supply the transformation function.  If you wanted to get fancy
  and do access control, etc., you'd have to write your own.

  On Sun, Jan 11, 2009 at 7:00 AM, Marius marius.dan...@gmail.com wrote:

   I wonder if it makes sense to have a built-in DispatchPF to ease up
   things so that user to just provide a  (FileParamHolder =
   LiftResponse)

   perhaps something like:

   FIleUploader.init {

    case (path, fileParamHolder ) = a LiftResponse

   }

   ... internally it will just add itsellf as a DispathPf

   Br's,
   Marius

   On Jan 11, 3:43 pm, David Pollak feeder.of.the.be...@gmail.com
   wrote:
Alli,
Yes, I think your want to go with a DispatchPF to handle the destination
   of
the POST request from your Flash component.

DispatchPF {
  case r @ Req(upload :: thing :: Nil, , PostRequent) if
r.uploadedFiles.exists(_.name == upload) =
    () = {
    val uploadedFile = r.uploadedFiles.find(_.name == upload).get
    val fileBytes = uploadedFile.file
    ... do stuff here
    val newFileBytes: Array[Byte]
    val headers: List[(String, String)]
    Full(InMemoryResponse(newFileBytes, headers, Nil /* no cookies sent
   back
*/, 200))
    }

}

Thanks,

David

On Sun, Jan 11, 2009 at 4:52 AM, Alli allilis...@gmail.com wrote:

 I'm not sure how i would hook SHtml.fileUpload into this because
 swfupload lets me configure an URL
 that it will post to for each file uploaded, I don't even  need a form
 to do this (this is all flash/swf). I currently
 have a LiftView subclass that handles it and is processing it like
 this:

 S.request match {
    case Full(req) =
      req.uploadedFiles.foreach { file: FileParamHolder =
        println(Name:  + file.name)
        println(File name:  + file.fileName)
        resizeAndSave(file)
      }

      case _ =
    }

 I guess the only thing I need to change is using a custom dispatch
 instead of the view in order to return my own LiftResponse instead of
 a NodeSeq
 back to the client.

 Cheers,
 Alli

 On Jan 11, 12:37 pm, Marius marius.dan...@gmail.com wrote:
  Alli are you using SHtml.fileUpload ... or you want to upload it
  manually processing everything in your dispatch? .. I'd opt in for
  SHtml.fileUpload because there is a bunch of stuff Lift does for 
  you.

  On Jan 11, 5:12 am, Alli allilis...@gmail.com wrote:

   Yeah I think I need to add a custom dispatch function and make 
   that
   return my own response. I was actually
   hoping I could do this straight from the snippet instead of having
   to
   redirect, makes the whole thing more complex.

   On Jan 11, 12:41 am, Marc Boschma 
   marc+lift...@boschma.cxmarc%2blift...@boschma.cx
   marc%2blift...@boschma.cx marc%252blift...@boschma.cx
 wrote:

I'm not an expert but I would model a Response class in much the
   same

way as:

   package net.liftweb.http

   object PlainTextResponse {
     def apply(text: String): PlainTextResponse =
PlainTextResponse(text, Nil, 200)
     def apply(text: String, code: Int): PlainTextResponse =
PlainTextResponse(text, Nil, code)
   }

   case class PlainTextResponse(text: String, headers:
   List[(String,

String)], code: Int) extends LiftResponse {
     def toResponse = {
       val bytes = text.getBytes(UTF-8)
       InMemoryResponse(bytes, (Content-Length,
bytes.length.toString) :: (Content-Type, text/plain) ::
   headers,

Nil, code)
     }
   }

from TextResponse.scala. Look at InMemoryResponse or possibly
StreamingResponse in Response.scala.

Marc

On 11/01/2009, at 4:27 AM, Alli wrote:

 Hey, I have been searching the list and also the 
 liftweb.netwiki
 and
 haven't found a way to do this:

 I have a form to upload a file that I want to manipulate and
   send
 back
 to the client. When sending it back I am using S.setHeader to
   set
 the
 content type, disposition etc but I haven't found a way to
   write
 the
 file back to the response. What I think I need is access to 
 the
 response's printwriter

[Lift] Re: Lift compiles with 2.7.3.RC2

2009-01-10 Thread Alli

This is fabulous news that you guys are almost at the first release
candidate for 1.0. Is there any estimate as when 1.0 will be released
and is there any roadmap?
I had a look at the book that is in progress and it looks very
promising.

Good work chaps.

Cheers,
Alfred

On Jan 10, 2:50 pm, David Pollak feeder.of.the.be...@gmail.com
wrote:
 Jorge,
 Have you done any stress tests to make sure that the Actors memory leak
 thing is fixed?  If not, I'll work some up on Monday.

 Thanks,

 David

 On Fri, Jan 9, 2009 at 11:01 PM, Jorge Ortiz jorge.or...@gmail.com wrote:
  I've made two Git branches which compile Lift against Scala 2.7.3-SNAPSHOT
  and 2.7.3.RC2.

  As soon as Scala 2.7.3 goes final we'll release Lift 1.0.RC1.

  --j

 --
 Lift, the simply functional web frameworkhttp://liftweb.net
 Collaborative Task Managementhttp://much4.us
 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
-~--~~~~--~~--~--~---