@@ -0,0 +1,174 @@ | |||
/* ******************************************************************* | |||
* Copyright (c) 2003 Contributors. | |||
* All rights reserved. | |||
* This program and the accompanying materials are made available | |||
* under the terms of the Common Public License v1.0 | |||
* which accompanies this distribution and is available at | |||
* http://www.eclipse.org/legal/cpl-v10.html | |||
* | |||
* Contributors: | |||
* Wes Isberg initial implementation | |||
* ******************************************************************/ | |||
// START-SAMPLE library-pointcutIdioms Standard pointcut idioms | |||
package org.aspectj.langlib; | |||
import java.io.*; | |||
/** | |||
* Library of pointcut idioms to use in combination with | |||
* other pointcuts. | |||
* | |||
* @author Wes Isberg | |||
*/ | |||
public class Pointcuts { | |||
// ------- not staticly-determinable | |||
public pointcut adviceCflow() : cflow(adviceexecution()); | |||
public pointcut notInAdviceCflow() : !adviceCflow(); | |||
public pointcut cflowMainExecution() : | |||
cflow(mainExecution()); | |||
// ------- staticly-determinable | |||
public pointcut mainExecution() : | |||
execution(public static void main(String[])); | |||
/** staticly-determinable to never match any join point */ | |||
public pointcut never() : if(false) | |||
&& execution(ThreadDeath *(ThreadDeath, ThreadDeath)); | |||
public pointcut anyMethodExecution() : | |||
execution(* *(..)); | |||
public pointcut anyPublicMethodExecution() : | |||
execution(public * *(..)); | |||
public pointcut anyNonPrivateMethodExecution() : | |||
execution(!private * *(..)); | |||
public pointcut anyConstructorExecution() : | |||
execution(new(..)); | |||
public pointcut anyPublicConstructorExecution() : | |||
execution(public new(..)); | |||
public pointcut anyNonPrivateConstructorExecution() : | |||
execution(!private new(..)); | |||
public pointcut anyPublicFieldGet() : | |||
get(public * *); | |||
public pointcut anyNonPrivateFieldGet() : | |||
get(!private * *); | |||
public pointcut anyPublicFieldSet() : | |||
set(public * *); | |||
public pointcut anyNonPrivateFieldSet() : | |||
set(!private * *); // also !transient? | |||
public pointcut withinSetter() : | |||
withincode(* set*(..)); | |||
public pointcut withinGetter() : | |||
withincode(Object+ get*(..)); | |||
public pointcut anyNonPublicFieldSetOutsideConstructorOrSetter() : | |||
set(!public * *) && !withincode(new(..)) | |||
&& !withinSetter(); | |||
public pointcut anyRunnableImplementation() : | |||
staticinitialization(Runnable+); | |||
public pointcut anyGetSystemErrOut() : | |||
get(PrintStream System.err) || get(PrintStream System.out); | |||
public pointcut anySetSystemErrOut() : | |||
call(void System.setOut(..)) || call(void System.setErr(..)); | |||
public pointcut withinAnyJavaCode() : | |||
within(java..*) || within(javax..*); | |||
public pointcut notWithinJavaCode() : | |||
!withinAnyJavaCode(); | |||
public pointcut toStringExecution() : | |||
execution(String toString()) && !within(String); | |||
/** call or execution of any Thread constructor, including subclasses */ | |||
public pointcut anyThreadConstruction() : | |||
call(Thread+.new(..)) || execution(Thread+.new(..)); | |||
/** | |||
* Any calls to java.io classes | |||
* (but not methods declared only on their subclasses). | |||
*/ | |||
public pointcut anyJavaIOCalls() : | |||
call(* java.io..*.*(..)) || call(java.io..*.new(..)); | |||
/** | |||
* Any calls to java.awt or javax.swing classes | |||
* (but not methods declared only on their subclasses). | |||
*/ | |||
public pointcut anyJavaAWTOrSwingCalls() : | |||
call(* java.awt..*.*(..)) || call(java.awt..*.new(..)) | |||
|| call(* javax.swing..*.*(..)) || call(javax.swing..*.new(..)); | |||
public pointcut cloneImplementationsInNonCloneable() : | |||
execution(Object !Cloneable+.clone()); | |||
public pointcut runImplementationsInNonRunnable() : | |||
execution(void !Runnable+.run()); | |||
/** any calls to java.lang.reflect or Class.get* (except getName()) */ | |||
public pointcut anySystemReflectiveCalls() : | |||
call(* java.lang.reflect..*.*(..)) | |||
|| (!call(* Class.getName()) | |||
&& call(* Class.get*(..))); | |||
/** standard class-loading calls by Class and ClassLoader */ | |||
public pointcut anySystemClassLoadingCalls() : | |||
call(Class Class.forName(..)) | |||
|| call(Class ClassLoader.loadClass(..)); | |||
public pointcut anySystemProcessSpawningCalls() : | |||
call(Process Runtime.exec(..)) | |||
|| call(Class ClassLoader.loadClass(..)); | |||
public pointcut mostThrowableReadCalls() : | |||
call(* Throwable+.get*(..)) | |||
|| call(* Throwable+.print*(..)) | |||
|| call(String Throwable+.toString(..)); | |||
public pointcut exceptionWrappingCalls() : | |||
(args(Throwable+,..) || args(.., Throwable+)) | |||
&& (set(Throwable+ Throwable+.*) | |||
|| (call(* Throwable+.*(..)) | |||
|| call(Throwable+.new(..)))); | |||
private Pointcuts() {} | |||
} | |||
//END-SAMPLE library-pointcutIdioms | |||
aspect A { | |||
private static aspect PointcutsOnly { | |||
/** require this library to only contain pointcuts */ | |||
declare error : within(Pointcuts) && | |||
(Pointcuts.anyMethodExecution() | |||
|| Pointcuts.anyNonPrivateConstructorExecution() | |||
|| set(* *)) : "only pointcuts permitted in Pointcuts"; | |||
// does not pick out field definitions -- too costly | |||
// set(* Pointcuts.*) || get(* Pointcuts.*) | |||
} | |||
} | |||
class PointcutQuestions { | |||
public pointcut anyCodeThrowingException() : // XXX broken? | |||
execution(* *(..) throws Exception+) | |||
|| execution(new(..) throws Exception+); | |||
} |
@@ -117,6 +117,9 @@ belongs in its own directory, | |||
as do sets pertaining to particular publications or tutorials. | |||
An example of this are the sources for the "Test Inoculated" | |||
article in the <a href="inoculated">inoculated/</a> directory. | |||
Finally, the <a href="testsrc">testsrc/</a> directory is reserved for | |||
code used to test the other code in the sandbox. There should | |||
be no samples under testsrc. | |||
<h3>Testing samples</h3> | |||
We try to make sure that the samples we present to people |
@@ -16,7 +16,7 @@ | |||
--> | |||
<suite> | |||
<ajc-test dir="common" title="declares-* default declares"> | |||
<compile | |||
argfiles="company.lst" | |||
@@ -130,6 +130,90 @@ | |||
<run class="StubReplace"/> | |||
</ajc-test> | |||
<ajc-test dir="." title="library-pointcutIdioms compile check"> | |||
<compile files="common/org/aspectj/langlib/Pointcuts.java"/> | |||
</ajc-test> | |||
<!-- | |||
<ajc-test dir="." title="library-pointcutIdioms test all pointcuts" | |||
comment="disabled pending fix for BCException" | |||
> | |||
<compile files="common/org/aspectj/langlib/Pointcuts.java, | |||
testsrc/org/aspectj/langlib/PointcutsCW.java"> | |||
<message kind="warning" line="67" text="anyMethodExecution"/> | |||
<message kind="warning" line="67" text="anyPublicMethodExecution"/> | |||
<message kind="warning" line="67" text="anyNonPrivateMethodExecution"/> | |||
<message kind="warning" line="72" text="anyConstructorExecution"/> | |||
<message kind="warning" line="74" text="anyConstructorExecution"/> | |||
<message kind="warning" line="74" text="anyPublicConstructorExecution"/> | |||
<message kind="warning" line="74" text="anyNonPrivateConstructorExecution"/> | |||
<message kind="warning" line="76" text="anyConstructorExecution"/> | |||
<message kind="warning" line="76" text="anyNonPrivateConstructorExecution"/> | |||
<message kind="warning" line="78" text="anyNonPrivateFieldSet"/> | |||
<message kind="warning" line="82" text="anyMethodExecution"/> | |||
<message kind="warning" line="82" text="anyPublicMethodExecution"/> | |||
<message kind="warning" line="82" text="anyNonPrivateMethodExecution"/> | |||
<message kind="warning" line="83" text="toStringExecution "/> | |||
<message kind="warning" line="87" text="anyMethodExecution"/> | |||
<message kind="warning" line="89" text="anyMethodExecution, "/> | |||
<message kind="warning" line="91" text="anyNonPrivateFieldSet"/> | |||
<message kind="warning" line="91" text="withinSetter"/> | |||
<message kind="warning" line="97" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="97" text="withinGetter"/> | |||
<message kind="warning" line="102" text="anyMethodExecution"/> | |||
<message kind="warning" line="102" text="anyPublicMethodExecution"/> | |||
<message kind="warning" line="102" text="anyNonPrivateMethodExecution"/> | |||
<message kind="warning" line="103" text="runImplementationsInNonRunnable"/> | |||
<message kind="warning" line="107" text="anyRunnableImplementation"/> | |||
<message kind="warning" line="109" text="anyMethodExecution"/> | |||
<message kind="warning" line="109" text="anyPublicMethodExecution"/> | |||
<message kind="warning" line="109" text="anyNonPrivateMethodExecution"/> | |||
<message kind="warning" line="114" text="anyMethodExecution"/> | |||
<message kind="warning" line="114" text="anyPublicMethodExecution"/> | |||
<message kind="warning" line="114" text="anyNonPrivateMethodExecution"/> | |||
<message kind="warning" line="115" text="cloneImplementationsInNonCloneable"/> | |||
<message kind="warning" line="121" text="anyMethodExecution"/> | |||
<message kind="warning" line="121" text="anyPublicMethodExecution"/> | |||
<message kind="warning" line="121" text="anyNonPrivateMethodExecution"/> | |||
<message kind="warning" line="124" text="anyPublicFieldGet"/> | |||
<message kind="warning" line="124" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="126" text="anyPublicFieldGet"/> | |||
<message kind="warning" line="126" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="132" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="134" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="136" text="anyPublicFieldSet"/> | |||
<message kind="warning" line="136" text="anyNonPrivateFieldSet"/> | |||
<message kind="warning" line="138" text="anyPublicFieldSet"/> | |||
<message kind="warning" line="138" text="anyNonPrivateFieldSet"/> | |||
<message kind="warning" line="141" text="anyNonPublicFieldSetOutsideConstructorOrSetter"/> | |||
<message kind="warning" line="143" text="anyNonPublicFieldSetOutsideConstructorOrSetter"/> | |||
<message kind="warning" line="145" text="anyNonPublicFieldSetOutsideConstructorOrSetter"/> | |||
<message kind="warning" line="147" text="anyNonPublicFieldSetOutsideConstructorOrSetter"/> | |||
<message kind="warning" line="145" text="anyNonPrivateFieldSet"/> | |||
<message kind="warning" line="147" text="anyNonPrivateFieldSet"/> | |||
<message kind="warning" line="149" text="anyGetSystemErrOut"/> | |||
<message kind="warning" line="149" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="149" text="anyPublicFieldGet"/> | |||
<message kind="warning" line="151" text="anyGetSystemErrOut"/> | |||
<message kind="warning" line="151" text="anyNonPrivateFieldGet"/> | |||
<message kind="warning" line="151" text="anyPublicFieldGet"/> | |||
<message kind="warning" line="153" text="anyThreadConstruction"/> | |||
<message kind="warning" line="155" text="anyJavaIOCalls"/> | |||
<message kind="warning" line="157" text="anyJavaIOCalls"/> | |||
<message kind="warning" line="159" text="anyJavaAWTOrSwingCalls"/> | |||
<message kind="warning" line="161" text="anyJavaAWTOrSwingCalls"/> | |||
<message kind="warning" line="163" text="anyJavaAWTOrSwingCalls"/> | |||
<message kind="warning" line="165" text="anyJavaAWTOrSwingCalls"/> | |||
<message kind="warning" line="169" text="anySystemClassLoadingCalls"/> | |||
<message kind="warning" line="171" text="anySystemReflectiveCalls"/> | |||
<message kind="warning" line="173" text="anySystemProcessSpawningCalls"/> | |||
<message kind="warning" line="177" text="mostThrowableReadCalls"/> | |||
<message kind="warning" line="179" text="mostThrowableReadCalls"/> | |||
<message kind="warning" line="181" text="mostThrowableReadCalls"/> | |||
</compile> | |||
<run class="org.aspectj.langlib.PointcutsCW"/> | |||
</ajc-test> | |||
--> | |||
</suite> | |||
@@ -0,0 +1,217 @@ | |||
package org.aspectj.langlib; | |||
import org.aspectj.testing.Tester; | |||
import java.awt.Button; | |||
import java.awt.event.ActionEvent; | |||
import java.beans.PropertyChangeListener; | |||
import java.io.*; | |||
import java.lang.reflect.Method; | |||
import javax.swing.*; | |||
import javax.swing.Action; | |||
/** | |||
* todo yet untested: | |||
* - dynamic calls | |||
*/ | |||
public aspect PointcutsCW { | |||
declare error: Pointcuts.never() : "never"; | |||
declare error: within(PointcutsCW) && Pointcuts.never() : "never"; | |||
declare warning: Pointcuts.mainExecution() : "mainExecution"; | |||
declare warning: Pointcuts.anyMethodExecution() : "anyMethodExecution"; | |||
declare warning: Pointcuts.anyPublicMethodExecution() : "anyPublicMethodExecution"; | |||
declare warning: Pointcuts.anyNonPrivateMethodExecution() : "anyNonPrivateMethodExecution"; | |||
declare warning: Pointcuts.anyConstructorExecution() : "anyConstructorExecution"; | |||
declare warning: Pointcuts.anyPublicConstructorExecution() : "anyPublicConstructorExecution"; | |||
declare warning: Pointcuts.anyNonPrivateConstructorExecution() : "anyNonPrivateConstructorExecution"; | |||
declare warning: Pointcuts.anyPublicFieldGet() : "anyPublicFieldGet"; | |||
declare warning: Pointcuts.anyNonPrivateFieldGet() : "anyNonPrivateFieldGet"; | |||
declare warning: Pointcuts.anyPublicFieldSet() : "anyPublicFieldSet"; | |||
declare warning: Pointcuts.anyNonPrivateFieldSet() : "anyNonPrivateFieldSet"; | |||
declare warning: Pointcuts.withinSetter() : "withinSetter"; | |||
declare warning: Pointcuts.withinGetter() : "withinGetter"; | |||
declare warning: Pointcuts.anyNonPublicFieldSetOutsideConstructorOrSetter() : "anyNonPublicFieldSetOutsideConstructorOrSetter"; | |||
declare warning: Pointcuts.anyRunnableImplementation() : "anyRunnableImplementation"; | |||
declare warning: Pointcuts.anyGetSystemErrOut() : "anyGetSystemErrOut"; | |||
declare warning: Pointcuts.anySetSystemErrOut() : "anySetSystemErrOut"; | |||
declare warning: Pointcuts.withinAnyJavaCode() : "withinAnyJavaCode"; // XXX | |||
declare warning: Pointcuts.notWithinJavaCode() : "notWithinJavaCode"; // XXX | |||
declare warning: Pointcuts.toStringExecution() : "toStringExecution"; | |||
declare warning: Pointcuts.anyThreadConstruction() : "anyThreadConstruction"; | |||
declare warning: Pointcuts.anyJavaIOCalls() : "anyJavaIOCalls"; | |||
declare warning: Pointcuts.anyJavaAWTOrSwingCalls() : "anyJavaAWTOrSwingCalls"; | |||
declare warning: Pointcuts.cloneImplementationsInNonCloneable() : "cloneImplementationsInNonCloneable"; | |||
declare warning: Pointcuts.runImplementationsInNonRunnable() : "runImplementationsInNonRunnable"; | |||
declare warning: Pointcuts.anySystemReflectiveCalls() : "anySystemReflectiveCalls"; | |||
declare warning: Pointcuts.anySystemClassLoadingCalls() : "anySystemClassLoadingCalls"; | |||
declare warning: Pointcuts.anySystemProcessSpawningCalls() : "anySystemProcessSpawningCalls"; | |||
declare warning: Pointcuts.mostThrowableReadCalls() : "mostThrowableReadCalls"; | |||
declare warning: Pointcuts.exceptionWrappingCalls() : "exceptionWrappingCalls"; | |||
public static int publicStaticInt; | |||
public int publicInt; | |||
private static int privateStaticInt; | |||
private int privateInt; | |||
static int defaultStaticInt; | |||
int defaultInt; | |||
// CW anyMethodExecution, anyPublicMethodExecution, anyNonPrivateMethodExecution | |||
public static void main(String[] list) { | |||
new PointcutsCW().toString(); // RT cflowMainExecution | |||
} | |||
private PointcutsCW() {} // CW anyConstructorExecution | |||
public PointcutsCW(int i) {} // CW anyConstructorExecution, anyPublicConstructorExecution, anyNonPrivateConstructorExecution | |||
PointcutsCW(String s) { // CW anyConstructorExecution, anyNonPrivateConstructorExecution | |||
defaultInt = 0; // CW anyNonPrivateFieldSet | |||
} | |||
// CW anyMethodExecution, anyPublicMethodExecution, anyNonPrivateMethodExecution | |||
public String toString() {// CW toStringExecution | |||
return ""; | |||
} | |||
private int perrorCode() { } // CW anyMethodExecution | |||
private void setInt() { // CW anyMethodExecution, | |||
defaultInt = 0; // CW anyNonPrivateFieldSet, withinSetter | |||
} | |||
private int getInt() { | |||
return defaultInt; // CW anyNonPrivateFieldGet, withinGetter | |||
} | |||
static class NotRunnable { | |||
// CW anyMethodExecution, anyPublicMethodExecution, anyNonPrivateMethodExecution | |||
public void run() { // CW runImplementationsInNonRunnable | |||
} | |||
} | |||
static class R implements Runnable { // CW anyRunnableImplementation | |||
// CW anyMethodExecution, anyPublicMethodExecution, anyNonPrivateMethodExecution | |||
public void run() { | |||
} | |||
// CW anyMethodExecution, anyPublicMethodExecution, anyNonPrivateMethodExecution | |||
public Object clone() { // CW cloneImplementationsInNonCloneable | |||
return null; | |||
} | |||
} | |||
// CW anyMethodExecution, anyPublicMethodExecution, anyNonPrivateMethodExecution | |||
public static void pserrorCode() throws IOException { | |||
i = publicStaticInt; // CW anyPublicFieldGet, anyNonPrivateFieldGet | |||
i = publicInt; // CW anyPublicFieldGet, anyNonPrivateFieldGet | |||
i = privateStaticInt; | |||
i = privateInt; | |||
i = defaultStaticInt; // CW anyNonPrivateFieldGet | |||
i = defaultInt; // CW anyNonPrivateFieldGet | |||
publicStaticInt = 1; // CW anyPublicFieldSet, anyNonPrivateFieldSet | |||
publicInt = 1; // CW anyPublicFieldSet, anyNonPrivateFieldSet | |||
// for these 4: CW anyNonPublicFieldSetOutsideConstructorOrSetter | |||
privateStaticInt = 1; | |||
privateInt = 1; | |||
defaultStaticInt = 1; // CW anyNonPrivateFieldSet | |||
defaultInt = 1; // CW anyNonPrivateFieldSet | |||
System.out.println(""); // CW anyGetSystemErrOut, anyNonPrivateFieldGet, anyPublicFieldGet | |||
System.err.println(""); // CW anyGetSystemErrOut, anyNonPrivateFieldGet anyPublicFieldGet | |||
new Thread((Runnable)null); // CW anyThreadConstruction | |||
FileReader fr = new FileReader("none"); // CW anyJavaIOCalls | |||
int i = fr.read(); // CW anyJavaIOCalls | |||
DefaultListModel model = new DefaultListModel(); // CW anyJavaAWTOrSwingCalls | |||
model.addElement(null); // CW anyJavaAWTOrSwingCalls | |||
Button button = new Button(); // CW anyJavaAWTOrSwingCalls | |||
button.addActionListener(null); // CW anyJavaAWTOrSwingCalls | |||
String myName = PointcutsCW.class.getName(); | |||
Class me = Class.forName(myName); // CW anySystemClassLoadingCalls | |||
Method m = me.getDeclaredMethod("notFound", new Class[]{}); // CW anySystemReflectiveCalls | |||
Process p = Runtime.exec("ls"); // CW anySystemProcessSpawningCalls | |||
Error e = new Error("hello"); | |||
e.getMessage(); // CW mostThrowableReadCalls | |||
e.printStackTrace(); // CW mostThrowableReadCalls | |||
e.getClass(); // CW mostThrowableReadCalls | |||
} | |||
} | |||
aspect DynamicTests { | |||
static { | |||
Tester.expectEvent("mainExecution"); | |||
Tester.expectEvent("cflowMainExecution"); | |||
Tester.expectEvent("adviceCflow"); | |||
Tester.expectEvent("notInAdviceCflow"); | |||
} | |||
after(PointcutsCE pointcutsCE) returning : target(pointcutsCE) | |||
&& Pointcuts.cflowMainExecution() && call(String toString()) { | |||
String targ = pointcutsCE.toString(); | |||
Tester.event("cflowMainExecution"); | |||
Tester.event("adviceCflow"); | |||
} | |||
after(PointcutsCE pointcutsCE) returning : target(pointcutsCE) | |||
&& notInAdviceCflow() && call(String toString()) { | |||
Tester.event("notInAdviceCflow"); // should only get one of these | |||
} | |||
after() returning : within(PointcutsCE) && Pointcuts.mainExecution() { | |||
Tester.event("mainExecution"); // also cflowMainExecution | |||
Tester.checkAllEvents(); | |||
} | |||
} | |||
/* | |||
grep -n " CW" PointcutsCW.java \ | |||
| sed 's|^\(.*\)\:.*\/\/*CW \(.*\)$|<message kind="warning" line="\1" text="\2"/>|' \ | |||
> messages.txt | |||
*/ |