Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Pointcut targeting exercise ...

Hi,

There is a pattern for doing this, but I'm having a really hard time
remembering it.  It was covered in a mailing list post a while ago but
doesn't seem to have made it onto the wiki area:
http://wiki.eclipse.org/AspectJ

I *think* there was an if clause added to the pointcut which checked
if the type of the object being initialized matched the declaring type
of the constructor, something like this:

&& if(thisJoinPoint.getThis().getClass().equals(thisJoinPoint.getSignature().getDeclaringType()))

That way you wont fire the advice for an object of the subtype being
run through the initialization for the supertype constructor.

cheers
Andy

On 23 July 2011 06:49,  <lennart.jorelid@xxxxxxxxxxxxxxx> wrote:
> 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: lennart.jorelid@xxxxxxxxxxxxxxx
> // cell: +46 708 507 603
> // skype: jgurueurope
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>


Back to the top