beehive-user@incubator.apache.org
[Top] [All Lists]

Re: question about inheritance

Subject: Re: question about inheritance
From: Adam Jenkins
Date: Mon, 23 May 2005 05:10:47 +1000
Hi Rich,

I'm working on a very simple example currently (to teach myself the tech
before tackling anything production related).  The two pieces of
functionality I'm looking at are logging in and building/deploying with
maven.

I'd be happy to doc up what we've been discussing and send you that and
the code to use as a sample if you're intestested.  I'm probably a week
or so away from finished though.

Cheers
Adam

On Sat, 2005-05-21 at 23:37 -0600, Richard Feit wrote:
> Hi Adam,
> 
> The login/logout methods are currently only called from the base 
> FlowController.login() and FlowController.logout() convenience methods 
> (which can be called directly from Page Flow actions).  But you can 
> always get the current LoginHandler by calling Handlers.get( 
> servletContext ).getLoginHandler().
> 
> I'm going to try and get a login example into the distribution sometime 
> tomorrow -- it's always one of the first things people want to do.
> 
> Let me know if you have more questions about this.
> 
> Rich
> 
> Adam Jenkins wrote:
> 
> >Hi Rich,
> >
> >I've written my own LoginHandler and registered it in
> >beehive-netui-config.xml.  I was just wondering about the 
> >method:
> >
> >public void login(final FlowControllerHandlerContext context, final
> >String username, final String password)
> >
> >How do I have this method called?  Do I call it directly (in which case,
> >where do I get the reference to the current login handler from?), or is
> >there a framework specific way to activate a 'login' action, maybe
> >through an annotation or something?
> >
> >Do you know of any examples of using a LoginHandler and the
> >'loginRequired' annotation anywhere?
> >
> >Cheers
> >Adam
> >
> >On Fri, 2005-05-20 at 18:19 -0600, Richard Feit wrote:
> >  
> >
> >>Hi Adam,
> >>
> >>You're right -- it should return null (so it acts like 
> >>HttpServletRequest.getUserPrincipal()).  I'll update the javadoc for this.
> >>
> >>Thanks,
> >>Rich
> >>
> >>Adam Jenkins wrote:
> >>
> >>    
> >>
> >>>Hi Again Rich,
> >>>
> >>>I'm writing an implementation of the LoginHandler to solve my
> >>>requirements.  The method getUserPrincipal(), should I return null from
> >>>that method if the user hasn't yet logged in?  The javadoc doesn't say
> >>>and there are no exceptions signified to use.
> >>>
> >>>Cheers
> >>>Adam
> >>>
> >>>On Fri, 2005-05-20 at 14:14 -0600, Richard Feit wrote:
> >>> 
> >>>
> >>>      
> >>>
> >>>>Thank you!  :)
> >>>>Hopefully you'll continue to find that it's got what you need, and where 
> >>>>it doesn't, we'd love to get bugs/feature-requests, or better yet, to 
> >>>>have people get involved.
> >>>>
> >>>>The questions are great for us to hear -- they give us a sense for where 
> >>>>we've done things well and where there are holes... and where we need to 
> >>>>fill in the docs.
> >>>>
> >>>>Oh, and if it *is* good, getting the word out definitely helps the 
> >>>>project.  :)
> >>>>
> >>>>Rich
> >>>>
> >>>>Adam Jenkins wrote:
> >>>>
> >>>>   
> >>>>
> >>>>        
> >>>>
> >>>>><explitative> awesome!
> >>>>>
> >>>>>Wow, talk about spoilt for choice! :)  Each of those answers not only
> >>>>>help, but that's fantastic information to know for other uses.
> >>>>>
> >>>>>A big well done to all the people that worked on this.  My entire team
> >>>>>(all fairly senior developers) are continually blown away by not just
> >>>>>the things that beehive does, but that lateral thinking that went into
> >>>>>it's creation.
> >>>>>
> >>>>>It's good to see programming of this calibre.  Very inspiring to others
> >>>>>in the field.  Cheers for all the hard work and such a quick response to
> >>>>>my questions.
> >>>>>
> >>>>>Thanks again
> >>>>>Adam
> >>>>>
> >>>>>On Fri, 2005-05-20 at 13:10 -0600, Richard Feit wrote:
> >>>>>
> >>>>>
> >>>>>     
> >>>>>
> >>>>>          
> >>>>>
> >>>>>>Hi Adam,
> >>>>>>
> >>>>>>These are great questions.  A few responses; hopefully one or more will 
> >>>>>>help you.
> >>>>>>
> >>>>>>  - You can override beforeAction()/afterAction() on either the base 
> >>>>>>class or the derived class.  This is a brute-force way to run code 
> >>>>>>before/after every action.  In the beforeAction method, you could even 
> >>>>>>write code to read the action method's annotations through reflection, 
> >>>>>>and look for a custom annotation that you wrote to determine whether to 
> >>>>>>do the check and throw an exception if necessary.
> >>>>>>
> >>>>>>  - We do have the idea of "action interceptors".  An action 
> >>>>>>interceptor is a class that can be configured to run before/after a 
> >>>>>>particular action, or all actions, or all actions in a particular page 
> >>>>>>flow.  It can do things like change/cancel the destination URI, throw 
> >>>>>>an 
> >>>>>>exception, or "inject" an entire nested page flow to run before the 
> >>>>>>action.  These are registered in WEB-INF/beehive-netui-config.xml.  
> >>>>>>There's a bit of doc on this at 
> >>>>>>http://incubator.apache.org/beehive/pageflow/config/beehive-netui-config.html#pageflow-action-interceptors
> >>>>>> 
> >>>>>>.  But what you *really* want is a "named" action interceptor that you 
> >>>>>>can refer to in an annotation.  Short of that, you could write an 
> >>>>>>interceptor that would use the reflection/annotation-based approach I 
> >>>>>>mentioned above.  But read on...
> >>>>>>
> >>>>>>  - In this specific case our annotations can help you do what you 
> >>>>>>want.  If you set the 'loginRequired' attribute on an action (or on the 
> >>>>>>page flow class, in @Jpf.Controller, which can be overridden on a 
> >>>>>>per-action basis), then a NotLoggedInException will be thrown if you 
> >>>>>>hit 
> >>>>>>the action without being logged in.  By default, "being logged in" 
> >>>>>>means 
> >>>>>>that getUserPrincipal() returns a non-null value on the request; 
> >>>>>>however, you can plug in your own login behavior.  To do this, you'd 
> >>>>>>implement org.apache.beehive.netui.pageflow.handler.LoginHandler, and 
> >>>>>>register your class under <login-handler> in 
> >>>>>>WEB-INF/beehive-netui-config.xml. 
> >>>>>>
> >>>>>>Hope this helps -- let me know if you need more info on any of this.
> >>>>>>
> >>>>>>Rich
> >>>>>>
> >>>>>>Adam Jenkins wrote:
> >>>>>>
> >>>>>>  
> >>>>>>
> >>>>>>       
> >>>>>>
> >>>>>>            
> >>>>>>
> >>>>>>>Hi Rich,
> >>>>>>>
> >>>>>>>Thanks for the quick response.  That's excellent info, it answers about
> >>>>>>>3/4 of what I was after.  I have one more small question about 
> >>>>>>>executing
> >>>>>>>the assertion.
> >>>>>>>
> >>>>>>>Lets say I have a controller (and my syntax could be wrong here, I'm
> >>>>>>>still getting my head around beehive, but I think it get's what I'm
> >>>>>>>trying to achieve accross):
> >>>>>>>
> >>>>>>>@Jpf.Controller(
> >>>>>>>       simpleActions={
> >>>>>>>               @Jpf.Forward(name="not_authenticated" path="login.do")
> >>>>>>>       }       
> >>>>>>>       catches={
> >>>>>>>               @Jpf.Catch(type=UserNotLoggedInException.class 
> >>>>>>> method="forceLogin")
> >>>>>>>       }
> >>>>>>>)
> >>>>>>>public clas Base extends PageFlowController{
> >>>>>>>
> >>>>>>>       private void assertUserLoggedIn(...) throws 
> >>>>>>> UserNotLoggedInException{
> >>>>>>>               //do some stuff to make sure the user is validated.
> >>>>>>>       }
> >>>>>>>
> >>>>>>>       public Forward forceLogin(...){
> >>>>>>>               return new Forward("not_authenticated");
> >>>>>>>       }
> >>>>>>>}
> >>>>>>>
> >>>>>>>Now, I want to call assertUserLoggedIn before any action is executed 
> >>>>>>>and
> >>>>>>>I want it on almost every action in the system (except of course the
> >>>>>>>'login' action).  I would normally do this in a superclass of all the
> >>>>>>>struts actions I used.  That is, I would call assertUserLoggedIn in the
> >>>>>>>super class struts action and, if the exception was thrown it would be
> >>>>>>>handled by the global exception handling.  If no exception was thrown, 
> >>>>>>>I
> >>>>>>>would then call an abstract method that is implemented in the subclass
> >>>>>>>that actually does the processing and returns the forward.  That was my
> >>>>>>>way of enforcing that the first thing every action did was check and
> >>>>>>>make sure that the user was in fact logged in.  So, in a nut shell, is
> >>>>>>>there a way to call a common assertion or set of assertions (or set of
> >>>>>>>methods for that matter) from a whole set of actions without actually
> >>>>>>>specifying the assertions at the start of every action (think
> >>>>>>>crosscutting).  How would you recommend achieving something like that 
> >>>>>>>in
> >>>>>>>beehive?
> >>>>>>>
> >>>>>>>Cheers
> >>>>>>>Adam
> >>>>>>>
> >>>>>>>On Thu, 2005-05-19 at 17:14 -0600, Richard Feit wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>>    
> >>>>>>>
> >>>>>>>         
> >>>>>>>
> >>>>>>>              
> >>>>>>>
> >>>>>>>>Hi Adam,
> >>>>>>>>
> >>>>>>>>Beehive does support inheritance in page flows (and in controls, for 
> >>>>>>>>that matter).  The important point for page flows is that the base 
> >>>>>>>>and 
> >>>>>>>>derived @Jpf.Controller annotations are merged.   So if you have the 
> >>>>>>>>following hierarchy:
> >>>>>>>>
> >>>>>>>> @Jpf.Controller(
> >>>>>>>>     nested=true,
> >>>>>>>>     catches={
> >>>>>>>>         @Jpf.Catch(type=Exception1.class, method="handleException1")
> >>>>>>>>     }
> >>>>>>>> )
> >>>>>>>> public class Base extends PageFlowController ...
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> @Jpf.Controller(
> >>>>>>>>     catches={
> >>>>>>>>         @Jpf.Catch(type=Exception2.class, method="handleException2")
> >>>>>>>>     }
> >>>>>>>> )
> >>>>>>>> public class Derived1 extends Base ...
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> @Jpf.Controller(
> >>>>>>>>     catches={
> >>>>>>>>         @Jpf.Catch(type=Exception3.class, method="handleException3")
> >>>>>>>>     }
> >>>>>>>> )
> >>>>>>>> public class Derived2 extends Derived1 ...
> >>>>>>>>
> >>>>>>>>...then the @Jpf.Controller annotation for Derived2 is virtually this:
> >>>>>>>>
> >>>>>>>> @Jpf.Controller(
> >>>>>>>>     nested=true,
> >>>>>>>>     catches={
> >>>>>>>>         @Jpf.Catch(type=Exception1.class, method="handleException1")
> >>>>>>>>         @Jpf.Catch(type=Exception2.class, method="handleException2")
> >>>>>>>>         @Jpf.Catch(type=Exception3.class, method="handleException3")
> >>>>>>>>     }
> >>>>>>>> )
> >>>>>>>>
> >>>>>>>>Additionally, action methods, exception handler methods, and 
> >>>>>>>>annotated 
> >>>>>>>>control fields are all inherited as long as they're not private.
> >>>>>>>>
> >>>>>>>>Does this answer your question?
> >>>>>>>>
> >>>>>>>>Rich
> >>>>>>>>
> >>>>>>>>Adam Jenkins wrote:
> >>>>>>>>
> >>>>>>>> 
> >>>>>>>>
> >>>>>>>>      
> >>>>>>>>
> >>>>>>>>           
> >>>>>>>>
> >>>>>>>>                
> >>>>>>>>
> >>>>>>>>>Hi All,
> >>>>>>>>>
> >>>>>>>>>I'm starting out with beehive and wondering about inheritance.  With
> >>>>>>>>>struts apps, I would put security assertions in a super class of all
> >>>>>>>>>actions and redirect any exceptions thrown to the appropriate page.  
> >>>>>>>>>Is
> >>>>>>>>>there a way to do similar in beehive or do you have to use shared 
> >>>>>>>>>flows
> >>>>>>>>>for common stuff like that.
> >>>>>>>>>
> >>>>>>>>>Cheers
> >>>>>>>>>Adam
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>   
> >>>>>>>>>
> >>>>>>>>>        
> >>>>>>>>>
> >>>>>>>>>             
> >>>>>>>>>
> >>>>>>>>>                  
> >>>>>>>>>
> >>>>>>>    
> >>>>>>>
> >>>>>>>         
> >>>>>>>
> >>>>>>>              
> >>>>>>>
> >>>>>     
> >>>>>
> >>>>>          
> >>>>>
> >>> 
> >>>
> >>>      
> >>>
> >
> >
> >  
> >

<Prev in Thread] Current Thread [Next in Thread>