Hello all,

I have an aspect which should fire only once after any non-default constructor 
has been executed
(i.e. after the object has been fully constructed). The purpose is simply to 
fire a method validating
the internal state within the Entity just constructed.

a) All non-default constructors
b) The constructor only in the concrete subclass - i.e. not the constructors of 
all superclasses within the inheritance hierarchy.
c) Only the constructors for (a) and (b) when the type of the class being 
constructed - or any of its supertypes - implement the Validatable interface as 
per below.

The pointcut definition below works for [a] and [c] - but it fires for all 
constructors within the
inheritance hierarchy of the class being constructed (i.e. after the 
constructor of the superclass is
executed but before the statements within the constructor of the subclass are 
executed).

What have I missed?
How should the Pointcut expression be to fire only once after the object itself 
is constructed?


@Aspect
public class ValidationAspect {

    // Our log
    private static final Logger log = 
LoggerFactory.getLogger(ValidationAspect.class);

    /**
     * Pointcut defining a default constructor within any class.
     */
    @Pointcut("initialization(*.new())")
    void anyDefaultConstructor() {
    }

    /**
     * Defines a Pointcut for any constructor to a class implementing 
Validatable -
     * except default constructors (i.e. those having no arguments).
     *
     * @param joinPoint    The currently executing joinPoint.
     * @param aValidatable The Validatable instance just created.
     */
    @Pointcut(value = 
"initialization(com.teliasonera.tindra.core.common.validation.Validatable+.new(..))
 "
    + "&& this(aValidatable) "
    + "&& !anyDefaultConstructor()", argNames = "joinPoint, aValidatable")
    void anyNonDefaultConstructor(final JoinPoint joinPoint, final Validatable 
aValidatable) {
    }

    /**
     * Validation aspect, performing its job after calling any constructor 
except
     * non-private default ones (having no arguments).
     *
     * @param joinPoint   The currently executing joinPoint.
     * @param validatable The validatable instance just created.
     * @throws InternalStateValidationException
     *          if the validation of the validatable failed.
     */
    @After(value = "anyNonDefaultConstructor(joinPoint, validatable)", argNames 
= "joinPoint, validatable")
    public void performValidationAfterCompoundConstructor(final JoinPoint 
joinPoint, final Validatable validatable)
            throws InternalStateValidationException {

… [ code omitted ] …
    }
}

--
// Bästa hälsningar,
// [sw. "Best regards,"]
//
// Lennart Jörelid, Systems Architect
// email: 
[email protected]<mailto:[email protected]>
// cell: +46 708 507 603
// skype: jgurueurope

_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to