AspectJ pointcut matching arguments (args()) is not matching correctly

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

AspectJ pointcut matching arguments (args()) is not matching correctly

Eric B
Hi,

I just posted this on StackOverflow, but then realized I might have better success asking a specific question like this here:

I've got an pointcut that I am trying to use with LTW.  I have 2 methods that I am trying to advise, each with a different parameter list.  However, they both have a single common parameter that I want.

These are the method signatures I want to advise:

       public static WorkflowModifierFlags authenticateUser(String username, String password, String ip, boolean webGUI, boolean realAuthentication)
    
       public static boolean loginJAAS(HttpServletRequest request, HttpServletResponse response, String username, String password, HttpSession session)


I've tried the following pointcut/advice, but it is failing; the username variable is sometimes getting injected with the IP address (ie: the args() from the first pointcut).

    @Before("(execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)) || "
    + "(execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..))" )
    public void setUsername(JoinPoint jp, String username) {
    // inject the username into the MDC
    MDCUtils.setUsername(username);
    }


I would have expected that the `args()` parameter is associated to the execution() method, but sometimes it would appear that it is "confused", and gives me the IP instead of the username.

Am I using AspectJ incorrectly, or is this a bug in the LTW?  I'm running AspectJ 1.6.13.

Thanks,

Eric


_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: AspectJ pointcut matching arguments (args()) is not matching correctly

Eric B
A few more tests and, not surprisingly, I got no further:
@Pointcut("execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)")
public void authenticateUser(String username){}

@Pointcut("execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..)" )
public void loginJAAS(String username) {}
@Before("authenticateUser(username) || loginJAAS(username)" )
public void setUsername(JoinPoint jp, String username) {
// inject the username into the MDC
MDCUtils.setUsername(username);
}


Not surprisingly, this produces the exact same results.

Is this a bug, or just me doing this incorrectly?

Thanks,
Eric


On Tue, Dec 13, 2016 at 3:25 PM, Eric B <[hidden email]> wrote:
Hi,

I just posted this on StackOverflow, but then realized I might have better success asking a specific question like this here:

I've got an pointcut that I am trying to use with LTW.  I have 2 methods that I am trying to advise, each with a different parameter list.  However, they both have a single common parameter that I want.

These are the method signatures I want to advise:

       public static WorkflowModifierFlags authenticateUser(String username, String password, String ip, boolean webGUI, boolean realAuthentication)
    
       public static boolean loginJAAS(HttpServletRequest request, HttpServletResponse response, String username, String password, HttpSession session)


I've tried the following pointcut/advice, but it is failing; the username variable is sometimes getting injected with the IP address (ie: the args() from the first pointcut).

    @Before("(execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)) || "
    + "(execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..))" )
    public void setUsername(JoinPoint jp, String username) {
    // inject the username into the MDC
    MDCUtils.setUsername(username);
    }


I would have expected that the `args()` parameter is associated to the execution() method, but sometimes it would appear that it is "confused", and gives me the IP instead of the username.

Am I using AspectJ incorrectly, or is this a bug in the LTW?  I'm running AspectJ 1.6.13.

Thanks,

Eric



_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: AspectJ pointcut matching arguments (args()) is not matching correctly

Andy Clement
Hi Eric,

I was half surprised you didn't get a compiler warning/error that it didn't like your alternatives for binding - to be clear, there is nothing wrong with them theoretically, but I thought the compiler would say it doesn't support doing that. But I just crafted a small similar program and it does what you describe. So definitely an issue - it should either work or you get told it isn't supported. But it shouldn't silently do the wrong thing.  My test program:

---
public class Code {
  public static void main(String []argv) {
    foo("fooname",1,2,3);
    bar("barone","bartwo","barname",1,2,3);
  }

  public static void foo(String username, int i, int j, int k) {}

  public static void bar(String a, String b, String username, int i, int j, int k) { }
}

aspect X {
  before(String username): (execution(public static * foo(..)) && args(username,..)) ||
                           (execution(public static * bar(..)) && args(*,*,username,..)) {
    System.out.println("username = "+username);
  }
}
---

prints

username = fooname
username = barone


I'm suspecting the pointcut validation and rewriting that goes on. I'm sure you know what the workaround is. Just have two pieces of advice with different pointcuts attached.

Andy


On 13 December 2016 at 13:02, Eric B <[hidden email]> wrote:
A few more tests and, not surprisingly, I got no further:
@Pointcut("execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)")
public void authenticateUser(String username){}

@Pointcut("execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..)" )
public void loginJAAS(String username) {}
@Before("authenticateUser(username) || loginJAAS(username)" )
public void setUsername(JoinPoint jp, String username) {
// inject the username into the MDC
MDCUtils.setUsername(username);
}


Not surprisingly, this produces the exact same results.

Is this a bug, or just me doing this incorrectly?

Thanks,
Eric


On Tue, Dec 13, 2016 at 3:25 PM, Eric B <[hidden email]> wrote:
Hi,

I just posted this on StackOverflow, but then realized I might have better success asking a specific question like this here:

I've got an pointcut that I am trying to use with LTW.  I have 2 methods that I am trying to advise, each with a different parameter list.  However, they both have a single common parameter that I want.

These are the method signatures I want to advise:

       public static WorkflowModifierFlags authenticateUser(String username, String password, String ip, boolean webGUI, boolean realAuthentication)
    
       public static boolean loginJAAS(HttpServletRequest request, HttpServletResponse response, String username, String password, HttpSession session)


I've tried the following pointcut/advice, but it is failing; the username variable is sometimes getting injected with the IP address (ie: the args() from the first pointcut).

    @Before("(execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)) || "
    + "(execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..))" )
    public void setUsername(JoinPoint jp, String username) {
    // inject the username into the MDC
    MDCUtils.setUsername(username);
    }


I would have expected that the `args()` parameter is associated to the execution() method, but sometimes it would appear that it is "confused", and gives me the IP instead of the username.

Am I using AspectJ incorrectly, or is this a bug in the LTW?  I'm running AspectJ 1.6.13.

Thanks,

Eric



_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: AspectJ pointcut matching arguments (args()) is not matching correctly

Eric B
Thanks Andy.

Indeed - separate pointcuts is exactly what I ended up doing; it just makes the code feel a little more cluttered.


Thanks,

Eric


On Tue, Dec 13, 2016 at 5:36 PM, Andy Clement <[hidden email]> wrote:
Hi Eric,

I was half surprised you didn't get a compiler warning/error that it didn't like your alternatives for binding - to be clear, there is nothing wrong with them theoretically, but I thought the compiler would say it doesn't support doing that. But I just crafted a small similar program and it does what you describe. So definitely an issue - it should either work or you get told it isn't supported. But it shouldn't silently do the wrong thing.  My test program:

---
public class Code {
  public static void main(String []argv) {
    foo("fooname",1,2,3);
    bar("barone","bartwo","barname",1,2,3);
  }

  public static void foo(String username, int i, int j, int k) {}

  public static void bar(String a, String b, String username, int i, int j, int k) { }
}

aspect X {
  before(String username): (execution(public static * foo(..)) && args(username,..)) ||
                           (execution(public static * bar(..)) && args(*,*,username,..)) {
    System.out.println("username = "+username);
  }
}
---

prints

username = fooname
username = barone


I'm suspecting the pointcut validation and rewriting that goes on. I'm sure you know what the workaround is. Just have two pieces of advice with different pointcuts attached.

Andy


On 13 December 2016 at 13:02, Eric B <[hidden email]> wrote:
A few more tests and, not surprisingly, I got no further:
@Pointcut("execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)")
public void authenticateUser(String username){}

@Pointcut("execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..)" )
public void loginJAAS(String username) {}
@Before("authenticateUser(username) || loginJAAS(username)" )
public void setUsername(JoinPoint jp, String username) {
// inject the username into the MDC
MDCUtils.setUsername(username);
}


Not surprisingly, this produces the exact same results.

Is this a bug, or just me doing this incorrectly?

Thanks,
Eric


On Tue, Dec 13, 2016 at 3:25 PM, Eric B <[hidden email]> wrote:
Hi,

I just posted this on StackOverflow, but then realized I might have better success asking a specific question like this here:

I've got an pointcut that I am trying to use with LTW.  I have 2 methods that I am trying to advise, each with a different parameter list.  However, they both have a single common parameter that I want.

These are the method signatures I want to advise:

       public static WorkflowModifierFlags authenticateUser(String username, String password, String ip, boolean webGUI, boolean realAuthentication)
    
       public static boolean loginJAAS(HttpServletRequest request, HttpServletResponse response, String username, String password, HttpSession session)


I've tried the following pointcut/advice, but it is failing; the username variable is sometimes getting injected with the IP address (ie: the args() from the first pointcut).

    @Before("(execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)) || "
    + "(execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..))" )
    public void setUsername(JoinPoint jp, String username) {
    // inject the username into the MDC
    MDCUtils.setUsername(username);
    }


I would have expected that the `args()` parameter is associated to the execution() method, but sometimes it would appear that it is "confused", and gives me the IP instead of the username.

Am I using AspectJ incorrectly, or is this a bug in the LTW?  I'm running AspectJ 1.6.13.

Thanks,

Eric



_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
[hidden email]
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users
Loading...