Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] Excluding Particular Joinpoints

Just to clarify my original posting, I was showing how to match exception
handler join points that are enclosed inside annotated methods (or other
sources). The only way to do that is with code like I posted (you could put
it in an if pointcut designator if you like).

Dean's code is the right way to match join points (such as method execution)
that exit by an exception from an annotated method.

-----Original Message-----
From: aspectj-users-bounces@xxxxxxxxxxx
[mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Dean Wampler
Sent: Wednesday, November 30, 2005 9:57 PM
To: aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] Excluding Particular Joinpoints

You can exclude the method annotation in the PCD itself. Here is a
complete example:

TestExcludeExceptions.aj: Aspect that declares a nested method
annotation "DontLog". Note the PCD that excludes methods with this
annotation.

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

public aspect ExcludeExceptions {
	@Target(ElementType.METHOD)
	public static @interface DontLog {}
	
	pointcut watch(): execution (!@DontLog * *.*(..));
	
	after() throwing(Throwable th): watch() {
		System.err.println("Oops! "+thisJoinPointStaticPart+":
"+th);
	}
}

TestExcludeExceptions.aj: Test routine. You'll see the advice "Oops!"
message only after calls to "failUnexpected()", because
"failExpected()" has the marker annotation "DontLog". (The "okay()"
method is for "background subtraction" - that's a bone for you other
physicists out there... ;)

public class TestExcludeExceptions {
	public void okay() {
		System.out.println ("TestExcludeExceptions.okay():");
	}
	
	@ExcludeExceptions.DontLog
	public void failExpected() {
		System.out.println
("TestExcludeExceptions.failExpected():");
		throw new RuntimeException();
	}
	
	public void failUnexpected() {
		System.out.println
("TestExcludeExceptions.failUnexpected():");
		throw new RuntimeException();
	}
	
	public static void main(String[] args) {
		TestExcludeExceptions tee = new TestExcludeExceptions();
		tee.okay();
		try {
			tee.failExpected();
		} catch (Throwable th) {}
		try {
			tee.failUnexpected();
		} catch (Throwable th) {}
       }
}

dean

On 11/30/05, Ron Bodkin <rbodkin@xxxxxxxxxxxxxx> wrote:
>
>
>
> You can use the signature at the enclosing join point static part to get
the
> right Java reflective object (a Method or Constructor). For example,
>
((MethodSignature)thisEnclosingJoinPointStaticPart.getSignature()).getMethod
().getAnnotation(myAnnotationType);
>
>
>
> You probably want to have at least 2 cases for method and constructor. To
be
> totally complete there are 6 cases (for advice, initialization,
> pre-initialization and static initialization). To support static
> initialization you'd want to have annotations on the class too.
>
>
>
> http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00655.html
>
>
>
>  ________________________________
>
>
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of
> Tobias Dunn-Krahn
>  Sent: Wednesday, November 30, 2005 4:13 PM
>
>  To: aspectj-users@xxxxxxxxxxx
>  Subject: RE: [aspectj-users] Excluding Particular Joinpoints
>
>
>
>
> Hi Ron,
>
>
>
> I agree that annotating the method is the cleanest proposal so far.  One
> problem though. I can't figure out how to examine annotations from
> thisEnclosingJoinpointStaticPart (or the JoinPoint
> interface in general).  Any hints?
>
>
>
> Tobias
>
>
>
>  ________________________________
>
>
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Ron
> Bodkin
>  Sent: Wednesday, November 30, 2005 2:32 PM
>  To: aspectj-users@xxxxxxxxxxx
>  Subject: RE: [aspectj-users] Excluding Particular Joinpoints
>
>
>
> Hi Tobias,
>
>
>
> You can use annotations at the method level to address this: you could
then
> look at thisEnclosingJoinPointStaticPart to see if there is
> an appropriate annotation. If you find that the same exception is handled
> differently in the same method, I'd suggest extracting a method to deal
with
> this. This would be a lot cleaner than using a naming convention on the
> methods.
>
>
>
> As you noted, it isn't possible to use variable annotations both because
> they are not retained in the binary representation and AspectJ relies on
> binary representations for weaving. Also AspectJ doesn't in general expose
> information about local variables (e.g., there is way to match pointcuts
or
> expose join point information based on local variables). By the same
token,
> you can't determine the name of the local variable being used in the catch
> block, so a naming convention like this wouldn't help with AspectJ. This
is
> a good thing IMHO: it would be too brittle if renaming local variables
would
> change pointcut matching.
>
>
>
>  ________________________________
>
>
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of
> Tobias Dunn-Krahn
>  Sent: Wednesday, November 30, 2005 2:03 PM
>  To: gregor@xxxxxxxxx; aspectj-users@xxxxxxxxxxx
>  Subject: RE: [aspectj-users] Excluding Particular Joinpoints
>
>
>
> Gregor and Ron,
>
>
>
> Thanks for your suggestions.  Unfortunately in my case, I can't determine
> from just the Throwable whether or not it should be logged.  For example,
a
> FooBarException should be logged in some cases but not others, depending
on
> the surrounding application logic.  Really the only way to determine this
is
> a decision on the part of developer, which is why I was experimenting with
> annotations.
>
>
>
> Perhaps I could use thisJoinPoint in combination with a naming convention
> for the throwable, i.e. any throwable named "expectedThrowable" would not
be
> logged.  It would be nice if I could do something more explicit (like an
> annotation) but perhaps it's not possible.  Please let me know if I've
> misunderstood something about your suggestions.
>
>
>
> Thanks,
>
> Tobias
>
>
>
>  ________________________________
>
>
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of
> Gregor Kiczales
>  Sent: Wednesday, November 30, 2005 1:26 PM
>  To: aspectj-users@xxxxxxxxxxx
>  Subject: RE: [aspectj-users] Excluding Particular Joinpoints
>
>
>
>  ________________________________
>
>
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of
> Tobias Dunn-Krahn
>
>
>
> I am using AspectJ in a project to log all handled exceptions.  In general
> this is what I want, but in a small number of cases such exceptions are
> "expected" and I do not wish to log them.
>
>
>
> aspect FooBarExceptionLoggingStrategy {
>
>
>
>   before(Throwable t): handler(Throwable) && args(t) {
>
>     if( shouldLog(t) )
>
>        log(t);
>
>   }
>
>
>
>   private boolean shouldLog(Throwable t) {
>
>     <<test whatever needs testing here>>
>
>   }
>
>
>
>   private void log(Throwable t) {
>
>     ...
>
>   }
>
> }
>
>
>
> The point being that you can test the exception in any way you want before
> logging it.
>
> You could also pass thisJoinPoint or thisJoinPointStaticPart. If you want,
> you could
>
> move shouldLog into the actual pointcut, using if(shouldLog(t)).
>
>
>
>
>
>
>
>  ________________________________
>
>
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of
> Tobias Dunn-Krahn
>  Sent: Wednesday, November 30, 2005 11:42 AM
>  To: aspectj-users@xxxxxxxxxxx
>  Subject: [aspectj-users] Excluding Particular Joinpoints
>
> Hello All,
>
>
>
> I am using AspectJ in a project to log all handled exceptions.  In general
> this is what I want, but in a small number of cases such exceptions are
> "expected" and I do not wish to log them.  My pointcut definition is
> currently very simple; it matches all exception handlers except those that
> handle SocketTimeoutExceptions:
>
>
>
>   pointcut exceptionHandlers(Throwable t) : handler(Throwable+) &&
(args(t)
>
>       && !args(java.net.SocketTimeoutException));
>
>
>
> However, now I need to exclude matching of particular exception handlers
> that are not distinguishable by type.  I tried creating a custom
annotation
> with target type LOCAL_VARIABLE and using this annotation to decorate the
> exception, but unfortunately annotations of this type are not retained for
> runtime (and are therefore inaccessible).  Does anyone have any
suggestions?
>
>
>
> Thanks in advance,
>
> Tobias
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
>


--
Dean Wampler
http://www.aspectprogramming.com
http://www.newaspects.com
http://www.contract4j.org



Back to the top