Browse Source

library of basic pointcut idioms and test case that causes BCException (copied to tests/bugs/pointcutLibrary)

tags/V1_1_1
wisberg 21 years ago
parent
commit
bdfba603c4

+ 174
- 0
docs/sandbox/common/org/aspectj/langlib/Pointcuts.java View File

@@ -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+);

}

+ 3
- 0
docs/sandbox/readme-sandbox.html View File

@@ -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

+ 85
- 1
docs/sandbox/sandbox-test.xml View File

@@ -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>


+ 217
- 0
docs/sandbox/testsrc/org/aspectj/langlib/PointcutsCW.java View File

@@ -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

*/

Loading…
Cancel
Save