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

/* *******************************************************************
* 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

as do sets pertaining to particular publications or tutorials. as do sets pertaining to particular publications or tutorials.
An example of this are the sources for the "Test Inoculated" An example of this are the sources for the "Test Inoculated"
article in the <a href="inoculated">inoculated/</a> directory. 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> <h3>Testing samples</h3>
We try to make sure that the samples we present to people We try to make sure that the samples we present to people

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

--> -->
<suite> <suite>
<ajc-test dir="common" title="declares-* default declares"> <ajc-test dir="common" title="declares-* default declares">
<compile <compile
argfiles="company.lst" argfiles="company.lst"
<run class="StubReplace"/> <run class="StubReplace"/>
</ajc-test> </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> </suite>



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

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