diff options
author | wisberg <wisberg> | 2003-08-07 20:42:23 +0000 |
---|---|---|
committer | wisberg <wisberg> | 2003-08-07 20:42:23 +0000 |
commit | bdfba603c4aee6d32a4873ddca43657e6eee92a8 (patch) | |
tree | 50c75bf95e36a09d0b4a098ccfd65d0162a64bb1 /docs/sandbox | |
parent | 1cf6391380ae594b165b32acd92222057545e7ad (diff) | |
download | aspectj-bdfba603c4aee6d32a4873ddca43657e6eee92a8.tar.gz aspectj-bdfba603c4aee6d32a4873ddca43657e6eee92a8.zip |
library of basic pointcut idioms and test case that causes BCException (copied to tests/bugs/pointcutLibrary)
Diffstat (limited to 'docs/sandbox')
-rw-r--r-- | docs/sandbox/common/org/aspectj/langlib/Pointcuts.java | 174 | ||||
-rw-r--r-- | docs/sandbox/readme-sandbox.html | 3 | ||||
-rw-r--r-- | docs/sandbox/sandbox-test.xml | 86 | ||||
-rw-r--r-- | docs/sandbox/testsrc/org/aspectj/langlib/PointcutsCW.java | 217 |
4 files changed, 479 insertions, 1 deletions
diff --git a/docs/sandbox/common/org/aspectj/langlib/Pointcuts.java b/docs/sandbox/common/org/aspectj/langlib/Pointcuts.java new file mode 100644 index 000000000..948bbef57 --- /dev/null +++ b/docs/sandbox/common/org/aspectj/langlib/Pointcuts.java @@ -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+); + +} diff --git a/docs/sandbox/readme-sandbox.html b/docs/sandbox/readme-sandbox.html index 4745b98f2..d5757ef57 100644 --- a/docs/sandbox/readme-sandbox.html +++ b/docs/sandbox/readme-sandbox.html @@ -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 diff --git a/docs/sandbox/sandbox-test.xml b/docs/sandbox/sandbox-test.xml index fe0eb4110..60d4a367c 100644 --- a/docs/sandbox/sandbox-test.xml +++ b/docs/sandbox/sandbox-test.xml @@ -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>
\ No newline at end of file diff --git a/docs/sandbox/testsrc/org/aspectj/langlib/PointcutsCW.java b/docs/sandbox/testsrc/org/aspectj/langlib/PointcutsCW.java new file mode 100644 index 000000000..6a95d47fc --- /dev/null +++ b/docs/sandbox/testsrc/org/aspectj/langlib/PointcutsCW.java @@ -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 + +*/
\ No newline at end of file |