| How to include/exclude basic types in pointcuts? [message #47485] | 
Mon, 07 February 2005 16:09   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi all, 
our application creates some datastructure that need to be  
java.io.Serializable (we use that format to transfer the data to  
another system and then deserialize it there). 
 
To make sure we do not inadvertedly refer to any non-serializable,  
non-transient fields I wrote the below aspect to yield a compile error  
if we do: 
 
---------------------- 
import java.io.Serializable; 
 
public aspect SerializableCheck 
{ 
 pointcut nonSerializableAccesses(): 
  set (!transient !Serializable+  foo.bar.*.*); 
 
 declare error: 
  nonSerializableAccesses() 
  && !adviceexecution() 
  : "use of non-serializable field!"; 
} 
---------------------- 
 
This aspect in principle seems to work, at least it already pointed me  
out, that at some point we were using a Map - which indeed is not  
serializable (only some implementations of the Map-interface are, but  
not all!) - but now I am stuck, since I get many errors in statements  
that refer to basic types (like boolean, int, float, ...). I thought  
these were "java.io.Serializable" by definition, aren't they!?! 
 
Probably these fields are treated special in the compiler anyway,  
since there is no "Class" associated with them and hence the check  
whether they implement the Serializable interface fails. But then one  
would need some mechanism in the AspectJ language to exclude these  
basic types from such pointcuts. Can one do that? 
 
Any ideas or suggestion how to tackle this? Or should I file yet  
another bug-/feature-request? 
 
Cheers, 
Michael
 |  
 |  
  | 
| Re: How to include/exclude basic types in pointcuts? [message #47666 is a reply to message #47485] | 
Wed, 09 February 2005 05:33    | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Originally posted by: adrian_colyer.uk.ibm.com 
 
Michael Moser wrote: 
 
> public aspect SerializableCheck 
> { 
>  pointcut nonSerializableAccesses(): 
>   set (!transient !Serializable+  foo.bar.*.*); 
 
 
> This aspect in principle seems to work, at least it already pointed me  
> out, that at some point we were using a Map - which indeed is not  
> serializable (only some implementations of the Map-interface are, but  
> not all!) - but now I am stuck, since I get many errors in statements  
> that refer to basic types (like boolean, int, float, ...). I thought  
> these were "java.io.Serializable" by definition, aren't they!?! 
 
> Probably these fields are treated special in the compiler anyway,  
> since there is no "Class" associated with them and hence the check  
> whether they implement the Serializable interface fails. But then one  
> would need some mechanism in the AspectJ language to exclude these  
> basic types from such pointcuts. Can one do that? 
 
The secret is that primitive types do not extend Object. So the pointcut  
expression: 
 
  set(!transient (Object+ && !Serializable+) foo.bar.*.*); 
 
should do what you need...
 |  
 |  
  | 
| Re: How to include/exclude basic types in pointcuts? [message #47696 is a reply to message #47666] | 
Wed, 09 February 2005 11:15   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Bingo - that did the trick! Thanks to the *real* expert! 
 
Michael 
 
"Adrian Colyer" <adrian_colyer@uk.ibm.com> wrote in message  
news:cucou2$kuc$1@www.eclipse.org... 
> Michael Moser wrote: 
> 
>> public aspect SerializableCheck 
>> { 
>>  pointcut nonSerializableAccesses(): 
>>   set (!transient !Serializable+  foo.bar.*.*); 
> 
> 
>> This aspect in principle seems to work, at least it already pointed  
>> me out, that at some point we were using a Map - which indeed is  
>> not serializable (only some implementations of the Map-interface  
>> are, but not all!) - but now I am stuck, since I get many errors in  
>> statements that refer to basic types (like boolean, int, float,  
>> ...). I thought these were "java.io.Serializable" by definition,  
>> aren't they!?! 
> 
>> Probably these fields are treated special in the compiler anyway,  
>> since there is no "Class" associated with them and hence the check  
>> whether they implement the Serializable interface fails. But then  
>> one would need some mechanism in the AspectJ language to exclude  
>> these basic types from such pointcuts. Can one do that? 
> 
> The secret is that primitive types do not extend Object. So the  
> pointcut expression: 
> 
>  set(!transient (Object+ && !Serializable+) foo.bar.*.*); 
> 
> should do what you need... 
> 
> 
>
 |  
 |  
  | 
| Re: How to include/exclude basic types in pointcuts? [message #586531 is a reply to message #47485] | 
Wed, 09 February 2005 05:33   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Michael Moser wrote: 
 
> public aspect SerializableCheck 
> { 
>  pointcut nonSerializableAccesses(): 
>   set (!transient !Serializable+  foo.bar.*.*); 
 
 
> This aspect in principle seems to work, at least it already pointed me  
> out, that at some point we were using a Map - which indeed is not  
> serializable (only some implementations of the Map-interface are, but  
> not all!) - but now I am stuck, since I get many errors in statements  
> that refer to basic types (like boolean, int, float, ...). I thought  
> these were "java.io.Serializable" by definition, aren't they!?! 
 
> Probably these fields are treated special in the compiler anyway,  
> since there is no "Class" associated with them and hence the check  
> whether they implement the Serializable interface fails. But then one  
> would need some mechanism in the AspectJ language to exclude these  
> basic types from such pointcuts. Can one do that? 
 
The secret is that primitive types do not extend Object. So the pointcut  
expression: 
 
  set(!transient (Object+ && !Serializable+) foo.bar.*.*); 
 
should do what you need...
 |  
 |  
  | 
| Re: How to include/exclude basic types in pointcuts? [message #586538 is a reply to message #47666] | 
Wed, 09 February 2005 11:15   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Bingo - that did the trick! Thanks to the *real* expert! 
 
Michael 
 
"Adrian Colyer" <adrian_colyer@uk.ibm.com> wrote in message  
news:cucou2$kuc$1@www.eclipse.org... 
> Michael Moser wrote: 
> 
>> public aspect SerializableCheck 
>> { 
>>  pointcut nonSerializableAccesses(): 
>>   set (!transient !Serializable+  foo.bar.*.*); 
> 
> 
>> This aspect in principle seems to work, at least it already pointed  
>> me out, that at some point we were using a Map - which indeed is  
>> not serializable (only some implementations of the Map-interface  
>> are, but not all!) - but now I am stuck, since I get many errors in  
>> statements that refer to basic types (like boolean, int, float,  
>> ...). I thought these were "java.io.Serializable" by definition,  
>> aren't they!?! 
> 
>> Probably these fields are treated special in the compiler anyway,  
>> since there is no "Class" associated with them and hence the check  
>> whether they implement the Serializable interface fails. But then  
>> one would need some mechanism in the AspectJ language to exclude  
>> these basic types from such pointcuts. Can one do that? 
> 
> The secret is that primitive types do not extend Object. So the  
> pointcut expression: 
> 
>  set(!transient (Object+ && !Serializable+) foo.bar.*.*); 
> 
> should do what you need... 
> 
> 
>
 |  
 |  
  | 
Powered by 
FUDForum. Page generated in 0.04375 seconds