aboutsummaryrefslogtreecommitdiffstats
path: root/docs/sandbox
diff options
context:
space:
mode:
authorwisberg <wisberg>2003-08-07 20:42:23 +0000
committerwisberg <wisberg>2003-08-07 20:42:23 +0000
commitbdfba603c4aee6d32a4873ddca43657e6eee92a8 (patch)
tree50c75bf95e36a09d0b4a098ccfd65d0162a64bb1 /docs/sandbox
parent1cf6391380ae594b165b32acd92222057545e7ad (diff)
downloadaspectj-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.java174
-rw-r--r--docs/sandbox/readme-sandbox.html3
-rw-r--r--docs/sandbox/sandbox-test.xml86
-rw-r--r--docs/sandbox/testsrc/org/aspectj/langlib/PointcutsCW.java217
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