I am okay with an NPE thrown from using S outside a request.  Yeah, it'd be
nicer to have a more polite error message, but there should be no creep
towards being able to call S outside a request/session scope.

Also, except for tests or actors, one should never think about initializing
S.



On Sat, Nov 21, 2009 at 3:28 PM, Ross Mellgren <dri...@gmail.com> wrote:

> Hmm, you raise an interesting point. So I guess the situation is more
> variegated:
>
> 1) If you have a locale calculator that works per-request and does not have
> an app default, then it is definitely incorrect to call S.? out of a request
> context,
> 2) but if you have one that works app-wide then it should work -- but
> doesn't, unless you call S.init or one of those by yourself,
> 3) so my proposed error is not good.
>
> It would be nice to catch uses of S.? outside of a request context when
> your intended behavior is that you only have per-request locales, so I guess
> if that is the desire then one should make their locale calculator log the
> error text, and the change to lift should be something more like:
>
>   def resourceBundles: List[ResourceBundle] = {
> -    _resBundle.value match {
> -      case Nil => {
> +    _resBundle.box match {
> +      case Full(bundles) if !bundles.isEmpty => bundles
> +      case _ => {
>         _resBundle.set(LiftRules.resourceNames.flatMap(name => tryo(
>           List(ResourceBundle.getBundle(name, locale))
>           ).openOr(
>           NamedPF.applyBox((name, locale),
> LiftRules.resourceBundleFactories.toList).map(List(_)) openOr Nil
>           )))
>         _resBundle.value
>       }
> -      case bundles => bundles
>     }
>   }
>
> That is, if the _resBundle ThreadGlobal has not been initialized yet, or
> it's been initialized with the empty list, then do resource bundle loading.
> If it has been initialized with a non-empty list then use that.
>
> I don't think this should interact badly with S.init, since S.init uses
> _resBundle.doWith(Nil) ... which will both overwrite any loaded "app-level"
> bundles with the empty list, but also restore them upon completion of the S
> scope.
>
> -Ross
>
>
> On Nov 21, 2009, at 6:15 PM, Timothy Perrett wrote:
>
> > I agree that getting an NPE is less than desirable!
> >
> > I'm not sure things are wrong per-say; the defualt locale calculator
> > has an app wide setting and there is nothing to say that that a user
> > must implement their locale calculator in a particular way... This is
> > one of the great things about lift ;-)
> >
> > So the issue here seems to be the lazy / eager evaluation of bald
> > rather than localization out of request context? I'm all for getting
> > rid of these NPE scenarios though :-)
> >
> > Cheers, Tim
> >
> > Sent from my iPhone
> >
> > On 22 Nov 2009, at 00:02, Ross Mellgren <dri...@gmail.com> wrote:
> >
> >> It's being called to provide the link text for menus during sitemap
> >> creation at boot time, as well as during class initialization time
> >> to make some vals that contain error text. I believe initializing
> >> these at Boot time to be incorrect since the correct locale cannot
> >> be known until a request is made (unless you force one locale for
> >> the entire site, I guess), but the NPE seems uglier than providing
> >> an error log explaining the problem.
> >>
> >> -Ross
> >>
> >>
> >> On Nov 21, 2009, at 5:57 PM, Timothy Perrett wrote:
> >>
> >>> Ross,
> >>>
> >>> Where in your code are you calling this method? What I'd the context
> >>> that puts it outside of a request?
> >>>
> >>> Cheers, Tim
> >>>
> >>> Sent from my iPhone
> >>>
> >>> On 21 Nov 2009, at 23:03, Ross Mellgren <dri...@gmail.com> wrote:
> >>>
> >>>> I'm poking around the LiftTicket codebase, and currently it suffers
> >>>> from an NPE on Boot:
> >>>>
> >>>> ERROR - Failed to Boot
> >>>> java.lang.ExceptionInInitializerError
> >>>> at org.liftticket.liftticket.snippet.UserAdmin$.menus
> >>>> (UserAdmin.scala:41)
> >>>> at bootstrap.liftweb.Boot.buildMenus(Boot.scala:74)
> >>>> at bootstrap.liftweb.Boot.boot(Boot.scala:67)
> >>>> ...
> >>>> Caused by: java.lang.NullPointerException
> >>>> at net.liftweb.http.S$.$qmark$bang(S.scala:675)
> >>>> at net.liftweb.http.S$.$qmark(S.scala:636)
> >>>> at org.liftticket.liftticket.snippet.RoleAdmin$.<init>
> >>>> (RoleAdmin.scala:94)
> >>>> at org.liftticket.liftticket.snippet.RoleAdmin$.<clinit>
> >>>> (RoleAdmin.scala)
> >>>> ... 57 more
> >>>>
> >>>> This is apparently due to S._resBundle being null because S.init has
> >>>> not yet been entered, so S._resBundle.doWith(Nil) is not in the
> >>>> enclosing scope, and so:
> >>>>
> >>>> private def ?!(str: String, resBundle: List[ResourceBundle]):
> >>>> String = resBundle.flatMap(r => tryo(r.getObject(str) match {
> >>>>
> >>>> Blows up with NPE. resBundle is passed in from S.? by calling
> >>>> S.resourceBundles, which is defined thus:
> >>>>
> >>>> def resourceBundles: List[ResourceBundle] = {
> >>>> _resBundle.value match {
> >>>>   case Nil => {
> >>>>      // loads the resource bundles here
> >>>>   }
> >>>>   case bundles => bundles
> >>>> }
> >>>> }
> >>>>
> >>>> I don't think the resource bundles can be reasonably loaded outside
> >>>> a request since no locale can be computed -- the call site should
> >>>> lazily compute the menu text at request time using LinkText rather
> >>>> than eagerly using S.?, but the error case is not helpful. What I
> >>>> propose is changing S.resourceBundles like this:
> >>>>
> >>>> def resourceBundles: List[ResourceBundle] = {
> >>>> _resBundle.box match {
> >>>>   case Full(Nil) => {
> >>>>      // same code
> >>>>   }
> >>>>   case Full(bundles) => bundles
> >>>>   case _ => {
> >>>>     Log.error("Resource bundles cannot be loaded outside of a
> >>>> request scope since the current locale cannot be computed. Did you
> >>>> use S.? during Boot time?")
> >>>>     Nil
> >>>>   }
> >>>> }
> >>>> }
> >>>>
> >>>> -Ross
> >>>>
> >>>>
> >>>> --
> >>>>
> >>>> You received this message because you are subscribed to the Google
> >>>> Groups "Lift" group.
> >>>> To post to this group, send email to lift...@googlegroups.com.
> >>>> To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> >>>> .
> >>>> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=
> >>>> .
> >>>>
> >>>>
> >>>>
> >>>
> >>> --
> >>>
> >>> You received this message because you are subscribed to the Google
> >>> Groups "Lift" group.
> >>> To post to this group, send email to lift...@googlegroups.com.
> >>> To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> >>> .
> >>> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=
> >>> .
> >>>
> >>>
> >>
> >> --
> >>
> >> You received this message because you are subscribed to the Google
> >> Groups "Lift" group.
> >> To post to this group, send email to lift...@googlegroups.com.
> >> To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> >> .
> >> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=
> >> .
> >>
> >>
> >>
> >
> > --
> >
> > You received this message because you are subscribed to the Google Groups
> "Lift" group.
> > To post to this group, send email to lift...@googlegroups.com.
> > To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> .
> > For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=.
> >
> >
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Lift" group.
> To post to this group, send email to lift...@googlegroups.com.
> To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=.
>
>
>


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

--

You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to lift...@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=.


Reply via email to