[Lift] Re: Need access to session variables when about to shut down a session.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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
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
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
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
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 -~--~~~~--~~--~--~---