[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
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