On Sun, Dec 14, 2008 at 10:46 PM, Marius <marius.dan...@gmail.com> wrote:

>
> So LiftConfig would take the role of LiftRules from API perspective
> meaning that LiftRules could be completely hidden from Lift users but
> available internally to Lift only ?


Since LiftRules would then only expose immutable data, I'd see no problem
exposing it if there is value in exposing it.
But keeping it private is a very viable strategy.


>
>
> Still from maintainability perspective initializing LifRules with a
> LiftConfig may imply lots of assignments (unless LiftRules will
> reference a LiftConfig in which case LiftRules code needs to change to
> use LiftConfig) or when we'd want to expose some new stuff we'd have
> to add it in two different places LiftConfig toexpose it to users and
> LiftRules so that Lift code to use that.


Yes, there'd be quite a few assignments, but with a nifty unit test you
could secure that everything is used properly.

Cheers,
Viktor


>
>
> Otherwise not a bad idea ...
>
> Br's,
> Marius
>
> On Dec 14, 5:21 pm, "Viktor Klang" <viktor.kl...@gmail.com> wrote:
> > On Sun, Dec 14, 2008 at 4:01 PM, David Pollak <
> feeder.of.the.be...@gmail.com
> >
> >
> >
> > > wrote:
> >
> > > On Sun, Dec 14, 2008 at 6:51 AM, Viktor Klang <viktor.kl...@gmail.com
> >wrote:
> >
> > >> David,
> >
> > >> sounds reasonable.
> >
> > >> So being able to call prepend/append after boot() makes no sense.
> >
> > >> In the light of htis, it shouldn't be possible to call the
> prepend/append
> > >> outside of boot.
> > >> I suggest my approach described previously. (Injecting an
> initialization
> > >> context into boot and use that to configure LiftRules, then we don't
> expose
> > >> the mutativity in LiftRules.
> > >> Result: No runtime exceptions, no confusion on when to configure the
> > >> webapp etc.
> >
> > > I have no idea what this means or how to translate it into code.  Can
> you
> > > give me an example of code that "injects an initialization context into
> > > boot"?
> >
> > class Boot
> > {
> >    def boot(val lc: LiftConfig) =
> >    {
> >           add all configuration to LiftConfig
> >    }
> >
> > }
> >
> > and then in the code that lookups, creates and calls Boot.boot (haven't
> got
> > access to the repository on this machine)
> >
> > just add/modify the code in the bootstrap loader:
> >
> > {
> >  val boot = ...//Lookup and create Boot instance
> >  val lc = LiftConfig() //(1)
> >  boot.boot(lc) //(2)
> >  LiftRules.init(lc) //(3)
> >
> > }
> >
> > (1) : Must create LiftConfig (this object is the placeholder of the
> > configuration=
> > (2) : Pass it into the boot-call
> > (3) : Initialize LiftRules with the configuration prepared by the
> boot-call
> >
> > result:
> >
> > No need to expose mutability in LiftRules (since we discovered that
> changing
> > stuff while the webserver was up and running had few applications at
> best)
> >
> > More clear now?
> >
> > Remeber that this is only a friendly suggestion to an issue brought up by
> > someone else in this thread.
> > If such suggestions are superflous, please just tell me so and I'll keep
> my
> > trap shut.
> >
> > Cheers,
> > Viktor
> >
> >
> >
> >
> >
> > >> Input?
> >
> > >> Cheers,
> > >> Viktor
> >
> > >> On Sun, Dec 14, 2008 at 3:41 PM, David Pollak <
> > >> feeder.of.the.be...@gmail.com> wrote:
> >
> > >>> Folks,
> >
> > >>> I have not had a single instance of wanting to change global
> application
> > >>> behavior at runtime.  I cannot think of use case for such a feature.
> >
> > >>> On the other hand, the idea that your program behavior is stable from
> the
> > >>> first HTTP request on makes a lot of sense to me.  It means tests
> work
> > >>> because the tests don't have to worry about the behavior of the
> program
> > >>> changing.  The same n steps will lead to the same result.
> >
> > >>> If anyone can come up with a use case for globally changing program
> > >>> behavior during program execution, I'm all ears, but barring that,
> once the
> > >>> boot phase is over, the stuff in LiftRules should be frozen.
> >
> > >>> Thanks,
> >
> > >>> David
> >
> > >>> On Sun, Dec 14, 2008 at 3:54 AM, Marius <marius.dan...@gmail.com>
> wrote:
> >
> > >>>> On Dec 14, 12:53 pm, "Viktor Klang" <viktor.kl...@gmail.com> wrote:
> > >>>> > On Sun, Dec 14, 2008 at 11:42 AM, Marius <marius.dan...@gmail.com
> >
> > >>>> wrote:
> >
> > >>>> > > On Dec 14, 12:10 pm, "Viktor Klang" <viktor.kl...@gmail.com>
> wrote:
> > >>>> > > > On Sun, Dec 14, 2008 at 9:28 AM, Marius <
> marius.dan...@gmail.com>
> > >>>> wrote:
> >
> > >>>> > > > > On Dec 14, 3:02 am, "Jorge Ortiz" <jorge.or...@gmail.com>
> > >>>> wrote:
> > >>>> > > > > > Not to beat a dead horse, but... what's the rationale,
> again,
> > >>>> for
> > >>>> > > > > throwing
> > >>>> > > > > > an exception after boot? Is there a real danger to some or
> all
> > >>>> > > RulesSeqs
> > >>>> > > > > > being mutable after boot? If some, then those rules should
> > >>>> > > selectively be
> > >>>> > > > > > protected. Even if they're all dangerous, there are better
> > >>>> (i.e.,
> > >>>> > > type
> > >>>> > > > > safe)
> > >>>> > > > > > ways of protecting RulesSeqs from mutation than just
> throwing
> > >>>> an
> > >>>> > > > > exception.
> >
> > >>>> > > > > This was actually DPP's suggestion. I'm not sure why would
> > >>>> someone
> > >>>> > > > > mutate them after boot but I'm totally opened if there is a
> > >>>> strong
> > >>>> > > > > case for allowing that. I do not have strong feelings about
> this
> > >>>> so
> > >>>> > > > > changing it would be trivial. Still I kind of like it this
> way.
> > >>>> What
> > >>>> > > > > other ways of protecting mutations after boot are you
> referring?
> > >>>> ...
> > >>>> > > > > something like ignore it and do nothing?
> >
> > >>>> > > > Hmm, how about "locking" them by havign a paralell lazy val?
> >
> > >>>> > > > val somePf : RuleSeq = Nil;
> >
> > >>>> > > > lazy val runtimeSomePf = somePf.toList
> >
> > >>>> > > > Then prepending/appending on the somePf AFTER runtimeSomePf
> has
> > >>>> been
> > >>>> > > > dereferenced won't make a difference.
> > >>>> > > > (runtimeSomePf would be used by Lift internally if that isn't
> > >>>> clear
> > >>>> > > enough
> > >>>> > > > :) )
> >
> > >>>> > > Still we'd allow useless strong references on those lists.
> >
> > >>>> > > > Or another, perhaps more suitable suggestion:
> >
> > >>>> > > > make boot() have an InitializationContext parameter that's
> only
> > >>>> available
> > >>>> > > in
> > >>>> > > > the scope of boot, and then the problem should disappear?
> >
> > >>>> > > How would the problem disappear? ... I mean after boot people
> would
> > >>>> > > still be able to add their functions (from API perspective) and
> they
> > >>>> > > would be surprised that their functions are not called and yet
> lift
> > >>>> > > just allowed them to do that.
> >
> > >>>> > I meant something like:
> >
> > >>>> > def boot(val lc : LiftContext) =
> > >>>> > {
> > >>>> >      //prepend/append,configure everything on lc
> >
> > >>>> > }
> >
> > >>>> > And then when the LiftFilter runt boot:
> >
> > >>>> > {
> > >>>> >    val lc = LiftContext(/*servletContext and stuff goes here*/)
> > >>>> >    boot(lc)
> > >>>> >    LiftRules.init(lc)
> >
> > >>>> > }
> >
> > >>>> > And then only have non-append/prependable stuff in LiftRules?
> >
> > >>>> > But really, what is it a problem that lift is reconfigurable
> during
> > >>>> runtime?
> > >>>> > I thought that was kind of cool?
> >
> > >>>> As I said I don't have strong opinions on this. It was DPP's
> > >>>> suggestion and personally I kind of like it which does not mean that
> > >>>> things can not change :) ... AFAIC reconfiguration at runtime does
> not
> > >>>> make a whole lot of sense because:
> >
> > >>>> 1. We'd have to expose other functions to allow people to also
> remove
> > >>>> their function not only prepend & append them
> > >>>> 2. I do not see what kinds of problems runtime reconfiguration
> really
> > >>>> solve (I'm only referring on the current RulesSeq members). I
> haven't
> > >>>> encounter a practical need but if you have please let me know.
> > >>>> 3. Dynamic behavior can happen inside user's functions without
> > >>>> allowing runtime reconfiguration.
> >
> > >>>> Just my 2 cents ...
> >
> > >>>> P.S.
> > >>>> If the general consensus is to remove this restriction I have no
> > >>>> problem removing it ... so more thoughts/perspectives on this are
> > >>>> welcomed.
> >
> > >>>> > Cheers,
> > >>>> > Viktor
> >
> > >>>> > > > Cheers,
> > >>>> > > > Viktor
> >
> > >>>> > > > > > Nit-pick: why is 'toList' (which just returns 'rules')
> defined
> > >>>> as
> > >>>> > > > > > private[http] when 'rules' itself is public?
> >
> > >>>> > > > > Why would you use toList in the lift app code? ...RulesSeq
> is
> > >>>> mainly
> > >>>> > > > > about adding user functions to lift. If "rules" itself is
> public
> > >>>> > > > > doesn't necessary mean that it should not have its "private"
> > >>>> logic.
> >
> > >>>> > > > > > Also, if RulesSeq are always made up of either Functions
> or
> > >>>> > > > > > PartialFunctions, maybe we should enforce that at a type
> > >>>> level, and
> > >>>> > > the
> > >>>> > > > > > helper methods on Seqs of PFs that now exist in the
> NamedPF
> > >>>> object
> > >>>> > > can be
> > >>>> > > > > > put in the RulesSeq object.
> >
> > >>>> > > > > But what would be the benefit? .. except that it would
> simplify
> > >>>> a bit
> > >>>> > > > > how Lift calls these PF's?
> >
> > >>>> > > > > ... to me distinguishing between functions and partial
> functions
> > >>>> here
> > >>>> > > > > by using Either or even using different RulesSeq traits
> would
> > >>>> not
> > >>>> > > > > bring much benefits ... but I hope I'm wrong.
> >
> > >>>> > > > > > --j
> >
> > >>>> > > > > > On Sat, Dec 13, 2008 at 2:31 PM, Marius <
> > >>>> marius.dan...@gmail.com>
> > >>>> > > wrote:
> >
> > >>>> > > > > > > All,
> >
> > >>>> > > > > > > I committed a bunch of changes in LiftRules. In a
> previous
> > >>>> thread
> > >>>> > > > > > > Jorge suggested the abstraction of LiftRules variables.
> > >>>> Lists of
> > >>>> > > > > > > functions are now abstracted by RulesSeq trait, which
> > >>>> contains
> > >>>> > > prepend
> > >>>> > > > > > > and append functions. Note that if you're calling
> > >>>> prepend/append
> > >>>> > > > > > > functions after boot they will throw an exception. If
> there
> > >>>> are
> > >>>> > > > > > > compelling reasons not to do this please let us know.
> This
> > >>>> is just
> > >>>> > > a
> > >>>> > > > > > > mechanism to enforce the use of these functions on
> startup.
> >
> > >>>> > > > > > > Br's,
> > >>>> > > > > > > Marius
> >
> > >>>> > > > --
> > >>>> > > > Viktor Klang
> > >>>> > > > Senior Systems Analyst
> >
> > >>>> > --
> > >>>> > Viktor Klang
> > >>>> > Senior Systems Analyst
> >
> > >>> --
> > >>> 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
> >
> > >> --
> > >> Viktor Klang
> > >> Senior Systems Analyst
> >
> > > --
> > > 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
> >
> > --
> > Viktor Klang
> > Senior Systems Analyst
> >
>


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

Reply via email to