Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Not catching all methods

Title: Not catching all methods

Two questions:

First:
I seem to be hitting some odd behavior with AspectJ.

As discussed earlier, I have an Aspect that watches all the SQL calls to my JDBC Driver (Oracle).  It then logs the statements to a log file via Log4j.

It seems to only be doing this some of the time though.  Here is my aspect:
    private static AuditLogger LOG =
        AuditLogger.getLogger(StatementAspect.class, LDAPPrincipal.class);
   
    pointcut executeSql(String sql):
                (
                call (public CallableStatement Connection.prepareCall(..)) ||
                call (public PreparedStatement Connection.prepareStatement(..)) ||
                call (public boolean Statement.execute(..)) ||
                call (public ResultSet Statement.executeQuery(..)) ||
                call (public int Statement.executeUpdate(..)) ||
                call (public void Statement.addBatch(..))
                ) &&
                args(sql, ..);
       
       
        before(String sql): executeSql(sql) {
                recordSqlStmt(sql);
        }
        private void recordSqlStmt(String sql) {
                // custom level
            LOG.audit((Subject)currentSubjectHolder.get(), sql);
        }

It seems to log it initiailly but when my JDO implementation (XORM) does anything, it doesn't get logged.  I've looked at XORM's src and it is using Connection.prepareStatement(String)....

Any one know what this would be happening?


Second question:

I have a class, AspectAuditProxy that has the following:
    public static void setAuditable(Subject subject) {}

    public static void setAuditable(Subject subject, Class principalClass) {}
   
    public static void setAuditable(Class auditingClass,
        Subject subject, Class principalClass)
    {}

I then have an Aspect like so:
        before (Subject subject):
            call (public static void AspectAuditProxy.setAuditable(Subject)) &&
            args(subject)
        {
            currentSubjectHolder.set(subject);
        }

        before (Subject subject, Class principalClass):
            call (public static void AspectAuditProxy.setAuditable(Subject, Class)) &&
            args(subject, principalClass)
        {
            currentSubjectHolder.set(subject);
            LOG = AuditLogger.getLogger(StatementAspect.class, principalClass);
        }

        before (Class auditingClass, Subject subject, Class principalClass):
            call (public static void AspectAuditProxy.setAuditable(Class, Subject, Class)) &&
            args(auditingClass, subject, principalClass)
        {
            currentSubjectHolder.set(subject);
            LOG = AuditLogger.getLogger(auditingClass, principalClass);
        }

But it doesn't seem to be catching anything.  I use AspectAuditProxy as a way to get the Subject object to the Aspect system for logging purposes like so (in my Login.class):

LoginContext lc = new LoginContext("Ldap",
            new SimpleCallbackHandler(username, password));
lc.login();
AspectAuditProxy.setAuditable(lc.getSubject());

Any ideas about this one?

Sorry for the long email...

--
Sloan


Back to the top