123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import java.util.Vector;
- import org.aspectj.testing.*;
-
- public class Counting1 {
- public static void main(String[] args) {
-
- Point pt1 = new Point(0, 0);
- Point pt2 = new Point(4, 4);
- Line ln1 = new Line(pt1, pt2);
-
- System.out.println(MoveTracking.testAndClear());
- ln1.translate(3, 6);
- System.out.println(MoveTracking.testAndClear());
-
- System.out.println(pt1.getX());
- Mobility.disableMoves();
- ln1.translate(3, 6);
- System.out.println(pt1.getX());
-
- }
-
- static class System {
- static O out = new O();
- static class O {
- public void println(Object o) {}
- public void println(int i) {}
- public void println(boolean b) {}
- }
- }
- }
-
- class FigureEditor {
- //...
- }
-
- class Figure {
- Vector elements = new Vector();
- //...
- }
-
-
-
- interface FigureElement {
- public void translate(int dx, int dy);
- //...
- }
-
- class Point implements FigureElement {
- private int _x = 0, _y = 0;
-
- Point(int x, int y) {
- _x = x;
- _y = y;
- }
-
- public void translate(int dx, int dy) {
- setX(getX() + dx);
- setY(getY() + dy);
- }
-
- int getX() { return _x; }
- int getY() { return _y; }
-
- void setX(int x) { _x = x; }
- void setY(int y) { _y = y; }
-
- //...
- }
-
- class Line implements FigureElement {
-
-
- private Point _p1, _p2;
-
- Line (Point p1, Point p2) {
- _p1 = p1;
- _p2 = p2;
- }
-
- public void translate(int dx, int dy) {
- _p1.translate(dx, dy);
- _p2.translate(dx, dy);
- }
-
- Point getP1() { return _p1; }
- Point getP2() { return _p2; }
-
- void setP1(Point p1) { _p1 = p1; }
- void setP2(Point p2) { _p2 = p2; }
-
- //...
- }
-
- aspect JoinPointCounting {
-
- static int n = 0;
- static boolean enable = true;
-
- pointcut points():
- /*
- instanceof(*) &&
- !(receptions(* *.new(..)) ||
- executions(* *.new(..)));
- */
-
- call(* *.*(..)) ||
- //receptions(* *.*(..)) ||
- execution(* *.*(..));/* ||
- gets(* *.*) ||
- sets(* *.*);
- */
-
-
- before(): points() && !within(JoinPointCounting) {
- if ( enable ) {
- String s = thisJoinPoint + "";
- Tester.check(s.indexOf("$") == -1, s + " contains a $");
- }
- }
- }
-
-
- aspect MoveTracking {
-
- static boolean flag = false;
-
- static boolean testAndClear() {
- boolean result = flag;
- flag = false;
- return result;
- }
-
- pointcut moves():
- call(void FigureElement.translate(int, int)) ||
- call(void Line.setP1(Point)) ||
- call(void Line.setP2(Point)) ||
- call(void Point.setX(int)) ||
- call(void Point.setY(int));
-
- after(): moves() {
- flag = true;
- }
- }
-
- aspect Mobility { declare precedence: Mobility, MoveTracking;
-
- private static boolean enableMoves = true;
-
- static void enableMoves() { enableMoves = true; }
- static void disableMoves() { enableMoves = false; }
-
- private int getSomething() { return 10; }
-
- void around(): MoveTracking.moves() {
- int x = getSomething();
- if ( enableMoves || enableMoves )
- proceed(); //!!! in versions prior to 0.7b10 runNext is a
- //!!! method on the join point object, so the
- //!!! syntax of this call is slightly different
- //!!! than in the paper
- }
-
- void around(int i): args(i) && call(void *gaoijbal()) {
- if (enableMoves) throw new RuntimeException("bad things");
- }
- }
-
- privileged aspect Foo {
- public static boolean getEnableMoves() {
- return Mobility.enableMoves;
- }
- }
|