org.aspectj/tests/new/pointcutLibrary/langlib/Pointcuts.java

174 lines
5.5 KiB
Java

/* *******************************************************************
* 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 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() {}
}
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.*)
}
}
// END-SAMPLE library-pointcutIdioms
class PointcutQuestions {
public pointcut anyCodeThrowingException() : // XXX broken?
execution(* *(..) throws Exception+)
|| execution(new(..) throws Exception+);
}