@AppliesTo({PropertyMixin.PropertyFilter.class,ManyAssociationMixin.AssociationFilter.class,AssociationMixin.AssociationFilter.class})
public class EventLogSideEffect extends GenericSideEffect {
    @Service
    EventLogService service;

    @Override
    public Object invoke(Object target, Method method, Object[] params) throws 
Throwable {
        final Object result = super.invoke(target, method, params);
        service.logEvent(target,method,params,result);
        return result;
    }
    // my workaround solution
    public static class EventLogFilter implements AppliesToFilter {
final static Collection<AppliesToFilter> filters=asList(new PropertyMixin.PropertyFilter(),new ManyAssociationMixin.AssociationFilter(),new AssociationMixin.AssociationFilter());

        public boolean appliesTo(Method method, Class<?> mixin, Class<?> 
compoisteType, Class<?> modifierClass) {
            for (AppliesToFilter filter : filters) {
                if (filter.appliesTo(method,mixin,compoisteType,modifierClass)) 
return true;
            }
            return false;
        }
    }
}


Am 02.10.09 08:00, schrieb Niclas Hedhman:
On Fri, Oct 2, 2009 at 1:50 PM, Michael Hunger<[email protected]>  wrote:
I had some trouble last night attaching (reusing) several AppliesToFilter
classes to a sideeffect.

While the annotation doc says they are or'ed, so that if any of those
matches the Mixin is applied, the code in AbstractModifierDeclaration uses
an AndAppliesTo composition to add up all the filters. Which naturally fails
as the different filter classes are mutually exclusive.

AMD: 104 :                     appliesToFilter = new AndAppliesToFilter(
appliesToFilter, filter );
also in line 68:                 appliesToFilter = new AndAppliesToFilter(
appliesToFilter, new ImplementsMethodAppliesToFilter() );

My workaround solution for the tutorial, was to provide a custom filter that
manually or's a list of filters.

But this wouldn't work with implicitely inherited applies to lists.

Do you have some samples, so usecases can easier be discussed?

I vaguely remember that this was discussed way back in time (Rickard's
apartment in Orebro, 2007), and OR was selected, but the code was
written later, at which point such could have been forgotten or some
other usecase showed AND being more natural.


Cheers


_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to