Hi
I have found that order of seam interceptors sometimes violates constraints, 
defined by @Within and @Around annotations.

You can see it if You look at two beans in "booking" example, one with 
@LoggedIn interceptor another without. The relative position of 
ConversationInterceptor, BijectionInterceptor changes.
...... ConversationInterceptor, BijectionInterceptor ......
...... BijectionInterceptor, ConversationInterceptor ......

======================================
I have fix it, by reimplementing sorter.
Sorry, if i post it in wrong place.

Changed file (modified function)
org.jboss.seam.Component.java

  | ....
  |    private void initInterceptors()
  |    {
  |       initDefaultInterceptors();
  | 
  |       for (Annotation annotation: beanClass.getAnnotations())
  |       {
  |          if ( 
annotation.annotationType().isAnnotationPresent(Interceptors.class) )
  |          {
  |             interceptors.add( new Interceptor(annotation, this) );
  |          }
  |       }
  | 
  | //      new Sorter<Interceptor>() {
  | //         protected boolean isOrderViolated(Interceptor outside, 
Interceptor inside)
  | //         {
  | //            Class<?> insideClass = inside.getUserInterceptor().getClass();
  | //            Class<?> outsideClass = 
outside.getUserInterceptor().getClass();
  | //            Around around = insideClass.getAnnotation(Around.class);
  | //            Within within = outsideClass.getAnnotation(Within.class);
  | //            return ( around!=null && Arrays.asList( around.value() 
).contains( outsideClass ) ) ||
  | //                  ( within!=null && Arrays.asList( within.value() 
).contains( insideClass ) );
  | //         }
  | //      }.sort(interceptors);
  |       newSort(interceptors);
  | 
  |       log.trace("interceptor stack: " + interceptors);
  |    }
  | ......
  | 

Changed file (new function)
org.jboss.seam.Component.java

  | .......
  |    private List<Interceptor> newSort(List<Interceptor> list){
  |        List<SortItem<Interceptor>> siList = new 
ArrayList<SortItem<Interceptor>>();
  |        Map<Class<?>,SortItem<Interceptor>> ht = new 
HashMap<Class<?>,SortItem<Interceptor>>();
  |        for (Interceptor i : list){
  |                SortItem<Interceptor> si = new SortItem<Interceptor>(i);
  |                siList.add(si);
  |                ht.put(i.getUserInterceptor().getClass(),si);
  |        }
  |        for (SortItem<Interceptor> si : siList){
  |                Class<?> clazz = si.getObj().getUserInterceptor().getClass();
  |            Around around = clazz.getAnnotation(Around.class);
  |            Within within = clazz.getAnnotation(Within.class);
  |            if  (around!=null){
  |                for (Class<?> cl : Arrays.asList( around.value() ) ){
  |                        si.getAround().add( ht.get(cl) );
  |                }
  |            }
  |            if  (within!=null){
  |                for (Class<?> cl : Arrays.asList( within.value() ) ){
  |                        si.getWithin().add( ht.get(cl) );
  |                }
  |            }
  |        }
  |        //===========//
  |        SorterNew<Interceptor> sList = new SorterNew<Interceptor>();
  |        siList = sList.sort(siList);
  |        //siList = SortItem.sort(siList);
  |        //===========//
  |        list.clear();
  |        for (SortItem<Interceptor> si : siList){
  |                list.add(si.getObj());
  |        }
  |     return list ;
  |    }
  | .......
  | 


New file:
org.jboss.seam.util.SorterNew
package org.jboss.seam.util;
  | 
  | import java.util.ArrayList;
  | import java.util.List;
  | 
  | public class SorterNew<T> {
  |     private List<SortItem<T>> list = null; //new ArrayList();
  | 
  |     public List<SortItem<T>> sort(List<SortItem<T>> lst){
  |             this.list = lst;
  |             List<SortItem<T>> res = new ArrayList<SortItem<T>>();
  |             SortItem<T> inmost = null;
  |             do{     
  |                     inmost = getInmost();
  |                     if (inmost!=null){
  |                             res.add(inmost);
  |                             remove(inmost);
  |                     }
  |             }while(list.size()>0 && inmost!=null);
  |             if (list.size()>0){
  |                     throw new RuntimeException("Can not sort interceptors 
list:"+list.toString());
  |             }
  |             return res;             
  |     }
  |     private void remove(SortItem<T> item){
  |             list.remove(item);
  |             for(SortItem<T> o : list){
  |                     o.getAround().remove(item);
  |             }
  |     }
  |     private SortItem<T> getInmost() {
  |             SortItem<T> res=null;
  |             for(SortItem<T> o : list){
  |                     if ((o.getAround().size()==0) && 
testNobodyWantsWithin(o) ){
  |                             res = o;
  |                             break;
  |                     }
  |             }
  |             return res;
  |     }
  |     private boolean testNobodyWantsWithin(SortItem<T> item){
  |             boolean res = true;
  |             for (SortItem<T> o : list){
  |                     if (o.getWithin().contains(item)){
  |                             res = false;
  |                             break;
  |                     }
  |             }
  |             return res;
  |     }
  | }
  | 

[New file:
org.jboss.seam.util.SortItem
package org.jboss.seam.util;
  | 
  | import java.util.ArrayList;
  | import java.util.List;
  | 
  | public class SortItem<T> {
  |     private T obj;
  |     private List<SortItem> around = new ArrayList<SortItem>();
  |     private List<SortItem> within = new ArrayList<SortItem>();
  |     
  |     public SortItem(T obj){
  |             this.obj = obj;
  |     }
  |     public T getObj(){
  |             return obj;
  |     }
  | 
  |     public List<SortItem> getAround() {
  |             return around;
  |     }
  |     public List<SortItem> getWithin() {
  |             return within;
  |     }
  | }
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3944219#3944219

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3944219


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
JBoss-user mailing list
JBoss-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to