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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user