Good stuff
In our project we don't need this right now, but it might be a useful
addition later.
3 things:
- There's no code in the interceptor that uses the serializable and
maxTime attributes, right?
- Wouldn't it be better to use a WeakHashMap? It's not like two persons
will access the same session at the same time ;)
- Shouldn't this block
// If value is null and field is primitive, don't set value.
if (value != null || !field.getType().isPrimitive()) {
field.set(actionBean, value);
}
be changed to:
// If value is null or field is primitive, don't set value.
if (value != null && !field.getType().isPrimitive()) {
field.set(actionBean, value);
}
Like the extended formtag for SSL, i think this would be a nice little
piece of code to add to the Wiki (as opposed to adding a patch to JIRA).
Anybody knows if that's possible yet, and if yes, how to do it?
-j
Poitras Christian wrote:
> 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.
> *
> * [EMAIL PROTECTED] 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.
> * [EMAIL PROTECTED] fields Fields to save in session.
> * [EMAIL PROTECTED] actionBean ActionBean.
> * [EMAIL PROTECTED] context WebContext.
> * [EMAIL PROTECTED] 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.
> * [EMAIL PROTECTED] fields Fields to restore from session.
> * [EMAIL PROTECTED] actionBean ActionBean.
> * [EMAIL PROTECTED] context WebContext.
> * [EMAIL PROTECTED] 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
-------------------------------------------------------------------------
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