Hi John!
 
That is very close to what I've done.
I was tired of typing code to save every fields I wanted, so I added an 
annotation to use one generic save/restore method automatically.
 
/**
* Selected sample.
*/
@Session
private List<Sample> sampleList;
 
Just adding an annotation will automatically save the field and restore it with 
an interceptor.
I don't think this will interest many people, but sharing addition to open 
source is something I like.
 
Here's the basic interceptor idea. Save all @Session fields on Resolution. 
Restore all @Session fields on ActionBean resolution.
I need to change a small code part before submitting it to users.
 
/**
* Interceptor that stores or restores session objects.
* 
* @author poitrac
*/
@Intercepts(value={LifecycleStage.ActionBeanResolution, 
LifecycleStage.ResolutionExecution})
public class SessionStoreInterceptor implements Interceptor {
 
/** Lazily filled in map of Class to fields annotated with Session. */
private static Map<Class<?>, Collection<Field>> fieldMap = new 
ConcurrentHashMap<Class<?>, Collection<Field>>();
 
/* (non-Javadoc)
* @see 
net.sourceforge.stripes.controller.Interceptor#intercept(net.sourceforge.stripes.controller.ExecutionContext)
*/
public Resolution intercept(ExecutionContext context) throws Exception {
// Continue on and execute other filters and the lifecycle code.
Resolution resolution = context.proceed();
 
// Get all fields with session.
Collection<Field> fields = getSessionFields(context.getActionBean().getClass());
 
// Restores values from session.
if (LifecycleStage.ActionBeanResolution.equals(context.getLifecycleStage())) {
this.restoreFields(fields, context.getActionBean(), 
(WebContext)context.getActionBeanContext());
}
// Store values in session.
if (LifecycleStage.ResolutionExecution.equals(context.getLifecycleStage())) {
this.saveFields(fields, context.getActionBean(), 
(WebContext)context.getActionBeanContext());
}
 
return resolution;
}
 
/**
* Saves all fields in session.
* @param fields Fields to save in session.
* @param actionBean ActionBean.
* @param context WebContext.
* @throws IllegalAccessException Cannot get access to some fields.
*/
protected void saveFields(Collection<Field> fields, ActionBean actionBean, 
WebContext context) throws IllegalAccessException {
for (Field field : fields) {
if (!field.isAccessible()) {
field.setAccessible(true);
}
context.set(getFieldKey(field), field.get(actionBean), 
((Session)field.getAnnotation(Session.class)).serializable(), 
((Session)field.getAnnotation(Session.class)).maxTime());
}
}
/**
* Restore all fields from value stored in session.
* @param fields Fields to restore from session.
* @param actionBean ActionBean.
* @param context WebContext.
* @throws IllegalAccessException Cannot get access to some fields.
*/
protected void restoreFields(Collection<Field> fields, ActionBean actionBean, 
WebContext context) throws IllegalAccessException {
for (Field field : fields) {
if (!field.isAccessible()) {
field.setAccessible(true);
}
Object value = context.get(getFieldKey(field));
// If value is null and field is primitive, don't set value.
if (value != null || !field.getType().isPrimitive()) {
field.set(actionBean, value);
}
}
}
 
 

 
________________________________

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Newman, John W
Sent: Friday, November 02, 2007 11:06 AM
To: Stripes Development List
Subject: Re: [Stripes-dev] Session annotation



Hi,

 

What I've typically done for this is the following:

 

Class ActionBean  {

    DateRange dateFilter;

 

 

    @Before(stages={LifecycleStage.BindingAndValidation})

    void prepareBean()  {

      setDateFilter(getContext().getDateFilter());

    }

 

 

   @Before(stages={LifecycleStage.ResolutionExecution})

    Void saveBean()  {

      getContext().setDateFilter(getDateFilter());

    }

}

 

class ActionBeanContext  {

     DateRange getDateFilter()  {
        return (DateFilter) getSessionAttribute(AttrNames.SES_DATE_FILTER);

     }

   

    void setDateFilter(DateRange dateFilter)  {

       setSessionAttribute(AttrNames.SES_DATE_FILTER, dateFilter);

    }

}

 

Those interceptor methods pull it out of the context before binding, the 
binding phase potentially overwrites it if something came in via the post, and 
whatever is in the bean gets sent back out to the context before the page is 
displayed.  easy

 

John

 

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Poitras Christian
Sent: Friday, November 02, 2007 10:09 AM
To: [email protected]
Subject: [Stripes-dev] Session annotation

 

Hi!

 

I've added an annotation and an interceptor to Stripes to store ActionBean 
fields in session and restore them automatically on subsequent requests.

I wanted to share this "plugin" with people of stripes. Where can I post such 
information and classes.

 

The annotation is below.

Christian

 

 

/*
 * <p>Copyright: Copyright (c) 2007</p>
 * <p>Company: Institut de recherches cliniques de Montréal (IRCM)</p>
 */
package ca.qc.ircm.lims.web.annotation;

 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

 

/**
 * Annotation used to indicate that an attribute should be stored in session.
 * 
 * @author poitrac
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Session {
    /**
     * Indicate if attribute is serializable.
     */
    boolean serializable() default false;
    /**
     * Maximum time in minutes the object will stay in session if not accessed.
     */
    int maxTime() default -1;
}

 

 

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to