Hi Andy!

Thanks for the reply!

I may have screwed this up in transit. The !within is important because we
explicitly do not want to instrument our own code/package namespace.

My original expectation was that something akin to this would do the trick:
after() : throwing (call || call || call || call ) &&
!within(com.example.app)

So any time any of the given calls(outside our Package namespace) throws we
would instrument it.

Regarding running something by accident on my aspects:
I will have to recheck on this, but as far as I understand it, the new
Android Java 8 build procedures require a desugaring step
but I do not believe that would also transform depended upon aar files(?).

Thanks for the pointers I'll have a look how the compiled class files
compare to the compiled class and if there is any indication of tool
mucking!

Thanks,

Andreas Marschke.

On Wed, 1 Aug 2018 at 02:47, Andy Clement <andrew.clem...@gmail.com> wrote:

>
> Did you mean to apply your within condition to all of those call
> pointcuts? Right now your pointcut reads:
>
>   within && call || call || call || call || call || call
>
> and because && is higher precedence than || then your within() restriction
> only applies to the first call.  It says "I'm interested in all these calls
> anywhere except for getErrorStream() calls which I'm only interested in if
> getErrorStream() isn't called from com.company.example code".  If you meant
> to say "I'm interested in all these calls if they are made outside of the
> com.company.example code" then you need
>
>   within && (call || call || call || call || call || call)
>
> Once encoded in an attribute we actually use an OR construct that only
> takes two operands, this means your:
>
> within && call || call || call || call || call || call || call
>
> becomes
>   (within && call) || (call || (call || (call || (call || ....
>
> and that is what you see  in the compiled aspect you looked inside. So
> this:
>
> @AfterThrowing(pointcut="((!within(com.company.example..*) && call(*
> java.net.HttpURLConnection.getErrorStream())) || (call(*
> java.net.HttpURLConnection.getResponseCode()) || (call(*
> java.net.HttpURLConnection.getResponseMessage()) || (call(* javax.net.ssl.
> HttpsURLConnection.getLocalCertificates()) || (call(* javax.net.ssl.
> HttpsURLConnection.getCipherSuite()) || (call(* javax.net.ssl.
> HttpsURLConnection.getServerCertificates()) || (call(* javax.net.ssl.
> HttpsURLConnection.getPeerPrincipal()) || (call(* javax.net.ssl.
> HttpsURLConnection.getLocalPrincipal()) || (call(* 
> java.net.URLConnection.connect())
> || (call(* java.net.URLConnection.getContent()) || (call(*
> java.net.URLConnection.getContentEncoding()) || (call(*
> java.net.URLConnection.getContentLength()) || (call(*
> java.net.URLConnection.getContentType()) || (call(*
> java.net.URLConnection.getDate()) || (call(* 
> java.net.URLConnection.getExpiration())
> || (call(* java.net.URLConnection.getHeaderField()) || (call(*
> java.net.URLConnection.getHeaderFieldDate()) || (call(*
> java.net.URLConnection.getHeaderFieldKey()) || (call(*
> java.net.URLConnection.getHeaderFields()) || (call(*
> java.net.URLConnection.getInputStream()) || call(* java.net.URLConnection.
> getLastModified())))))))))))))))))))))", throwing="ex", argNames="ex")
>
> is right, based on your pointcut. But if you meant to apply the within to
> all your calls, then it wouldn't look like this. We do rewrite pointcuts
> during compilation, so don't expect what you find encoded in the aspect to
> be exactly the same as what you typed. But will be what you typed in your
> source code in a DNF form with various internal components sorted to put
> those that can be cheaply evaluated first.
>
> Now, having said all that what is happening with your exception? You might
> find if you included the parentheses so within() applies to all of your
> calls, maybe it behaves, but when I see this:
>
>     java.lang.RuntimeException: Problem processing attributes in 
> com/company/example/android/aspects/URLConnectionExceptionsAspect.class
>     Caused by: org.aspectj.apache.bcel.classfile.ClassFormatException: Index 
> 151 into constant pool (size:150) is invalid
>       at 
> org.aspectj.apache.bcel.classfile.ConstantPool.getConstant(ConstantPool.java:119)
>
>
> My first suspicion is that something has transformed the aspect in between
> when it got compiled and when it got used. If there is any other tool that
> transforms the class files it can damage the aspect if it isn't aware of
> what it is dealing with.  For example, if you compiled the aspect and then
> ran something on the compiled class that threw away constant pool entries
> that didn't look like they were being used, well it might throw out entries
> it shouldn't because it didn't realize they were referenced from the
> additional attributes in the class file.
>
> So is there anything running on your compiled aspects before they get used?
>
> Andy
>
>
> On Mon, 30 Jul 2018 at 19:37, Andreas Marschke <andreas.marsc...@gmail.com>
> wrote:
>
>> Hi all!
>>
>> I am working on a larger project where we define Aspects in their own
>> *.aj files.
>>
>> In a recent trial against an Android project using Java 8 I found the
>> exception as attached (exception.txt)
>>
>> Reviewing the source code, the corresponding line looks like this:
>>
>> after() throwing (Exception ex) : (!within(com.company.example..*) &&
>>     call (* java.net.HttpURLConnection.getErrorStream()) ||
>>     call (* java.net.HttpURLConnection.getResponseCode()) ||
>>     call (* java.net.HttpURLConnection.getResponseMessage()) ||
>>     call (* javax.net.ssl.HttpsURLConnection.getLocalCertificates()) ||
>>     call (* javax.net.ssl.HttpsURLConnection.getCipherSuite()) ||
>>     call (* javax.net.ssl.HttpsURLConnection.getServerCertificates()) ||
>>     call (* javax.net.ssl.HttpsURLConnection.getPeerPrincipal()) ||
>>     call (* javax.net.ssl.HttpsURLConnection.getLocalPrincipal()) ||
>>     call (* java.net.URLConnection.connect()) ||
>>     call (* java.net.URLConnection.getContent()) ||
>>     call (* java.net.URLConnection.getContentEncoding()) ||
>>     call (* java.net.URLConnection.getContentLength()) ||
>>     call (* java.net.URLConnection.getContentType()) ||
>>     call (* java.net.URLConnection.getDate()) ||
>>     call (* java.net.URLConnection.getExpiration()) ||
>>     call (* java.net.URLConnection.getHeaderField()) ||
>>     call (* java.net.URLConnection.getHeaderFieldDate()) ||
>>     call (* java.net.URLConnection.getHeaderFieldKey()) ||
>>     call (* java.net.URLConnection.getHeaderFields()) ||
>>     call (* java.net.URLConnection.getInputStream()) ||
>>     call (* java.net.URLConnection.getLastModified()))
>>
>> As far as I understand the way after throwing conditions are supposed to
>> be defined this should still apply for any
>> of these getters except if they are thrown my project.
>>
>> Keep in mind our Aspects aren't applied against our own code but against
>> 3rd party code.
>>
>> Decompiling the respective class file shows me the following like:
>>
>>  @AfterThrowing(pointcut="((!within(com.company.example..*) && call(*
>> java.net.HttpURLConnection.getErrorStream())) || (call(*
>> java.net.HttpURLConnection.getResponseCode()) || (call(*
>> java.net.HttpURLConnection.getResponseMessage()) || (call(*
>> javax.net.ssl.HttpsURLConnection.getLocalCertificates()) || (call(*
>> javax.net.ssl.HttpsURLConnection.getCipherSuite()) || (call(*
>> javax.net.ssl.HttpsURLConnection.getServerCertificates()) || (call(*
>> javax.net.ssl.HttpsURLConnection.getPeerPrincipal()) || (call(*
>> javax.net.ssl.HttpsURLConnection.getLocalPrincipal()) || (call(*
>> java.net.URLConnection.connect()) || (call(*
>> java.net.URLConnection.getContent()) || (call(*
>> java.net.URLConnection.getContentEncoding()) || (call(*
>> java.net.URLConnection.getContentLength()) || (call(*
>> java.net.URLConnection.getContentType()) || (call(*
>> java.net.URLConnection.getDate()) || (call(*
>> java.net.URLConnection.getExpiration()) || (call(*
>> java.net.URLConnection.getHeaderField()) || (call(*
>> java.net.URLConnection.getHeaderFieldDate()) || (call(*
>> java.net.URLConnection.getHeaderFieldKey()) || (call(*
>> java.net.URLConnection.getHeaderFields()) || (call(*
>> java.net.URLConnection.getInputStream()) || call(*
>> java.net.URLConnection.getLastModified())))))))))))))))))))))",
>> throwing="ex", argNames="ex")
>>
>> As you can see the compiled result filters for each after one another?
>> That shouldn't happen right?
>>
>> Any idea how I can fix this? Or avoid this from happening?
>>
>> --
>> Kind regards,
>>
>> Andreas Marschke.
>>
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@eclipse.org
>> 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
> aspectj-users@eclipse.org
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/aspectj-users



-- 
Mit freundlichen Grüßen,

Andreas Marschke.
_________________________________________________________
Web: http://www.andreas-marschke.name
Blog: http://andreasmarschke.wordpress.com
Github: http://github.com/andreas-marschke
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to