123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- /* *******************************************************************
- * Copyright (c) 2005 Contributors.
- * All rights reserved.
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution and is available at
- * http://eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Adrian Colyer initial implementation
- * ******************************************************************/
- package org.aspectj.internal.lang.reflect;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
-
- import junit.framework.TestCase;
-
- import org.aspectj.internal.lang.annotation.ajcDeclareEoW;
- import org.aspectj.internal.lang.annotation.ajcPrivileged;
- import org.aspectj.lang.annotation.AdviceName;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.DeclareError;
- import org.aspectj.lang.annotation.DeclareWarning;
- import org.aspectj.lang.reflect.Advice;
- import org.aspectj.lang.reflect.AdviceKind;
- import org.aspectj.lang.reflect.AjType;
- import org.aspectj.lang.reflect.AjTypeSystem;
- import org.aspectj.lang.reflect.DeclareErrorOrWarning;
- import org.aspectj.lang.reflect.NoSuchAdviceException;
- import org.aspectj.lang.reflect.NoSuchPointcutException;
- import org.aspectj.lang.reflect.PerClause;
- import org.aspectj.lang.reflect.PerClauseKind;
- import org.aspectj.lang.reflect.Pointcut;
- import org.aspectj.lang.reflect.PointcutBasedPerClause;
- import org.aspectj.lang.reflect.TypePatternBasedPerClause;
-
- public class AjTypeWithAspectsTest extends TestCase {
-
- private AjType<SimpleAspect> sa;
-
- protected void setUp() throws Exception {
- super.setUp();
- sa = AjTypeSystem.getAjType(SimpleAspect.class);
- }
-
- public void testGetPerClause() {
- AjType<PerThisAspect> perThisA = AjTypeSystem.getAjType(PerThisAspect.class);
- AjType<PerTargetAspect> perTargetA = AjTypeSystem.getAjType(PerTargetAspect.class);
- AjType<PerCflowAspect> perCflowA = AjTypeSystem.getAjType(PerCflowAspect.class);
- AjType<PerCflowbelowAspect> perCflowbelowA = AjTypeSystem.getAjType(PerCflowbelowAspect.class);
- AjType<PerTypeWithin> perTypeWithinA = AjTypeSystem.getAjType(PerTypeWithin.class);
-
- PerClause pc = perThisA.getPerClause();
- assertEquals(PerClauseKind.PERTHIS,pc.getKind());
- assertEquals("pc()",((PointcutBasedPerClause)pc).getPointcutExpression().asString());
- assertEquals("perthis(pc())",pc.toString());
-
- pc= perTargetA.getPerClause();
- assertEquals(PerClauseKind.PERTARGET,pc.getKind());
- assertEquals("pc()",((PointcutBasedPerClause)pc).getPointcutExpression().asString());
- assertEquals("pertarget(pc())",pc.toString());
-
- pc= perCflowA.getPerClause();
- assertEquals(PerClauseKind.PERCFLOW,pc.getKind());
- assertEquals("pc()",((PointcutBasedPerClause)pc).getPointcutExpression().asString());
- assertEquals("percflow(pc())",pc.toString());
-
- pc= perCflowbelowA.getPerClause();
- assertEquals(PerClauseKind.PERCFLOWBELOW,pc.getKind());
- assertEquals("pc()",((PointcutBasedPerClause)pc).getPointcutExpression().asString());
- assertEquals("percflowbelow(pc())",pc.toString());
-
- pc= perTypeWithinA.getPerClause();
- assertEquals(PerClauseKind.PERTYPEWITHIN,pc.getKind());
- assertEquals("org.aspectj..*",((TypePatternBasedPerClause)pc).getTypePattern().asString());
- assertEquals("pertypewithin(org.aspectj..*)",pc.toString());
-
- }
-
- public void testGetDeclaredField() throws Exception{
- Field f = sa.getDeclaredField("s");
- try {
- Field f2 = sa.getDeclaredField("ajc$xyz$s");
- fail("Expecting NoSuchFieldException");
- } catch (NoSuchFieldException nsf) {}
- }
-
- public void testGetField() throws Exception {
- Field f = sa.getField("s");
- try {
- Field f2 = sa.getField("ajc$xyz$s");
- fail("Expecting NoSuchFieldException");
- } catch (NoSuchFieldException nsf) {}
- }
-
- public void testGetDeclaredFields() {
- Field[] fields = sa.getDeclaredFields();
- assertEquals(1,fields.length);
- assertEquals("s",fields[0].getName());
- }
-
- public void testGetFields() {
- Field[] fields = sa.getFields();
- assertEquals(1,fields.length);
- assertEquals("s",fields[0].getName());
- }
-
- public void testGetDeclaredMethod() throws Exception {
- Method m = sa.getDeclaredMethod("aMethod");
- try {
- Method m2 = sa.getDeclaredMethod("logEntry");
- fail("Expecting NoSuchMethodException");
- } catch(NoSuchMethodException ex) {}
- try {
- Method m3 = sa.getDeclaredMethod("ajc$before$123");
- fail("Expecting NoSuchMethodException");
- } catch(NoSuchMethodException ex) {}
- }
-
- public void testGetMethod() throws Exception {
- Method m = sa.getMethod("aMethod");
- try {
- Method m2 = sa.getMethod("logEntry");
- fail("Expecting NoSuchMethodException");
- } catch(NoSuchMethodException ex) {}
- try {
- Method m3 = sa.getMethod("ajc$before$123");
- fail("Expecting NoSuchMethodException");
- } catch(NoSuchMethodException ex) {}
- }
-
- public void testGetDeclaredMethods() {
- Method[] ms = sa.getDeclaredMethods();
- assertEquals(1,ms.length);
- assertEquals("aMethod",ms[0].getName());
- }
-
- public void testGetMethods() {
- Method[] ms = sa.getMethods();
- assertEquals(10,ms.length);
- //AV was corrupted, cannot rely on ordering
- String match = "";
- for (int i = 0; i < ms.length; i++) {
- match = match + "--" + ms[i].getName();
- }
- assertTrue(match.indexOf("aMethod") >=0);
- }
-
- public void testGetDeclaredPointcut() throws Exception {
- Pointcut p1 = sa.getDeclaredPointcut("simpleAspectMethodExecution");
- assertEquals("simpleAspectMethodExecution",p1.getName());
- assertEquals("execution(* SimpleAspect.*(..))",p1.getPointcutExpression().asString());
- assertEquals("simpleAspectMethodExecution() : execution(* SimpleAspect.*(..))",p1.toString());
- assertEquals(sa,p1.getDeclaringType());
- assertEquals(0,p1.getParameterTypes().length);
- assertTrue(Modifier.isPublic(p1.getModifiers()));
- Pointcut p2 = sa.getDeclaredPointcut("simpleAspectCall");
- assertEquals("simpleAspectCall",p2.getName());
- assertEquals("call(* SimpleAspect.*(..))",p2.getPointcutExpression().asString());
- assertEquals(sa,p2.getDeclaringType());
- assertEquals(1,p2.getParameterTypes().length);
- assertTrue(Modifier.isPrivate(p2.getModifiers()));
- try {
- Pointcut p3 = sa.getDeclaredPointcut("sausages");
- fail("Expecting NoSuchPointcutExcetpion");
- } catch (NoSuchPointcutException ex) {
- assertEquals("sausages",ex.getName());
- }
- }
-
- public void testGetPointcut() throws Exception {
- Pointcut p1 = sa.getPointcut("simpleAspectMethodExecution");
- assertEquals("simpleAspectMethodExecution",p1.getName());
- assertEquals("execution(* SimpleAspect.*(..))",p1.getPointcutExpression().asString());
- assertEquals(sa,p1.getDeclaringType());
- assertEquals(0,p1.getParameterTypes().length);
- assertTrue(Modifier.isPublic(p1.getModifiers()));
- Pointcut p2 = sa.getDeclaredPointcut("simpleAspectCall");
- assertEquals("simpleAspectCall",p2.getName());
- assertEquals("call(* SimpleAspect.*(..))",p2.getPointcutExpression().asString());
- assertEquals(sa,p2.getDeclaringType());
- assertEquals(1,p2.getParameterTypes().length);
- assertTrue(Modifier.isPrivate(p2.getModifiers()));
- try {
- Pointcut p3 = sa.getPointcut("sausages");
- fail("Expecting NoSuchPointcutExcetpion");
- } catch (NoSuchPointcutException ex) {
- assertEquals("sausages",ex.getName());
- }
- }
-
- public void testGetDeclaredPointcuts() {
- Pointcut[] pcs = sa.getDeclaredPointcuts();
- assertEquals(2,pcs.length);
- // AV was corrupted, cannot rely on ordering
- String match = "simpleAspectMethodExecution--simpleAspectCall";
- assertTrue(match.indexOf(pcs[0].getName()) >= 0);
- assertTrue(match.indexOf(pcs[1].getName()) >= 0);
- }
-
- public void testGetPointcuts() {
- Pointcut[] pcs = sa.getPointcuts();
- assertEquals(1,pcs.length);
- assertEquals("simpleAspectMethodExecution",pcs[0].getName());
- }
-
- public void testGetDeclaredAdvice() {
- Advice[] advice = sa.getDeclaredAdvice();
- assertEquals(10,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.BEFORE);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AFTER);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AFTER_RETURNING);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AFTER_THROWING);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AROUND);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.BEFORE,AdviceKind.AFTER);
- assertEquals(4,advice.length);
-
- advice = sa.getDeclaredAdvice(AdviceKind.BEFORE);
- // AV: corrupted test: cannot rely on ordering since a Set is used behind
- Advice aone, atwo;
- if (advice[0].getName()!=null && advice[0].getName().length()>0) {
- aone = advice[0];
- atwo = advice[1];
- } else {
- aone = advice[1];
- atwo = advice[0];
- }
- assertEquals("execution(* SimpleAspect.*(..))",aone.getPointcutExpression().toString());
- assertEquals("@AdviceName(\"logEntry\") before() : execution(* SimpleAspect.*(..))",aone.toString());
- assertEquals("logEntry",aone.getName());
- assertEquals(AdviceKind.BEFORE,aone.getKind());
- assertEquals("execution(* SimpleAspect.*(..))",atwo.getPointcutExpression().toString());
- assertEquals("",atwo.getName());
- assertEquals("before() : execution(* SimpleAspect.*(..))",atwo.toString());
- }
-
- public void testGetAdvice() {
- Advice[] advice = sa.getDeclaredAdvice();
- assertEquals(10,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.BEFORE);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AFTER);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AFTER_RETURNING);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AFTER_THROWING);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.AROUND);
- assertEquals(2,advice.length);
- advice = sa.getDeclaredAdvice(AdviceKind.BEFORE,AdviceKind.AFTER);
- assertEquals(4,advice.length);
- }
-
- public void testGetNamedAdvice() throws Exception {
- Advice a = sa.getAdvice("logItAll");
- assertEquals("logItAll",a.getName());
- assertEquals(AdviceKind.AROUND,a.getKind());
- a = sa.getAdvice("whatGoesAround");
- assertEquals("whatGoesAround",a.getName());
- assertEquals(AdviceKind.AROUND,a.getKind());
- try {
- a = sa.getAdvice("ajc$after$123");
- fail("Expecting NoSuchAdviceException");
- } catch (NoSuchAdviceException ex) {
- assertEquals("ajc$after$123",ex.getName());
- }
- try {
- a = sa.getAdvice("");
- fail("Expecting IllegalArgumentException");
- } catch (IllegalArgumentException ex) {
- ;
- }
- }
-
- public void testGetNamedDeclaredAdvice() throws Exception {
- Advice a = sa.getDeclaredAdvice("logItAll");
- assertEquals("logItAll",a.getName());
- assertEquals(AdviceKind.AROUND,a.getKind());
- a = sa.getDeclaredAdvice("whatGoesAround");
- assertEquals("whatGoesAround",a.getName());
- assertEquals(AdviceKind.AROUND,a.getKind());
- try {
- a = sa.getDeclaredAdvice("ajc$after$123");
- fail("Expecting NoSuchAdviceException");
- } catch (NoSuchAdviceException ex) {
- assertEquals("ajc$after$123",ex.getName());
- }
- try {
- a = sa.getDeclaredAdvice("");
- fail("Expecting IllegalArgumentException");
- } catch (IllegalArgumentException ex) {
- ;
- }
- }
-
- public void testIsPrivileged() {
- assertFalse(sa.isPrivileged());
- assertTrue(AjTypeSystem.getAjType(SimplePrivilegedAspect.class).isPrivileged());
- }
-
- public void testIsAspect() {
- assertTrue(sa.isAspect());
- }
-
- public void testIsMemberAspect() {
- assertFalse(AjTypeSystem.getAjType(SimplePrivilegedAspect.class).isMemberAspect());
- assertTrue(AjTypeSystem.getAjType(SimplePrivilegedAspect.MemberAspect.class).isMemberAspect());
-
- }
-
- public void testGetDeclareEoWarnings() {
- DeclareErrorOrWarning[] deows = sa.getDeclareErrorOrWarnings();
- assertEquals(4,deows.length);
- boolean foundCodeWarning = false;
- boolean foundCodeError = false;
- boolean foundAnnWarning = false;
- boolean foundAnnError = false;
- for (DeclareErrorOrWarning deow : deows) {
- if (deow.isError()) {
- if (deow.getMessage().equals("dont call this method code")) {
- foundCodeError = true;
- assertEquals("declare error : call(* DontDoIt.*(..)) : \"dont call this method code\"",deow.toString());
- }
- if (deow.getMessage().equals("dont call this method ann")) foundAnnError = true;
- assertEquals("call(* DontDoIt.*(..))",deow.getPointcutExpression().toString());
- } else {
- if (deow.getMessage().equals("dont call this method code")) foundCodeWarning = true;
- if (deow.getMessage().equals("dont call this method ann")) foundAnnWarning = true;
- assertEquals("call(* DontDoIt.*(..))",deow.getPointcutExpression().toString());
- }
- }
- assertTrue(foundCodeWarning && foundAnnWarning && foundCodeError && foundAnnError);
- }
-
- }
-
-
- @Aspect
- class SimpleAspect {
-
- // regular field
- public String s;
-
- // synthetic field
- public String ajc$xyz$s;
-
- // regular method
- public void aMethod() {}
-
- // advice method, annotation style
- @Before("execution(* SimpleAspect.*(..))")
- public void logEntry() {}
-
- // advice method, code style
- @Before("execution(* SimpleAspect.*(..))")
- public void ajc$before$123() {}
-
- // advice method, annotation style
- @After("execution(* SimpleAspect.*(..))")
- public void logFinally() {}
-
- // advice method, code style
- @After("execution(* SimpleAspect.*(..))")
- public void ajc$after$123() {}
-
- // advice method, annotation style
- @AfterReturning("execution(* SimpleAspect.*(..))")
- public void logExit() {}
-
- // advice method, code style
- @AfterReturning("execution(* SimpleAspect.*(..))")
- public void ajc$afterReturning$123() {}
-
- // advice method, annotation style
- @AfterThrowing("execution(* SimpleAspect.*(..))")
- public void logException() {}
-
- // advice method, code style
- @AfterThrowing("execution(* SimpleAspect.*(..))")
- public void ajc$afterThrowing$123() {}
-
- // advice method, annotation style
- @Around("execution(* SimpleAspect.*(..))")
- public void logItAll() {}
-
- // advice method, code style
- @Around("execution(* SimpleAspect.*(..))")
- @AdviceName("whatGoesAround")
- public void ajc$around$123() {}
-
- // pointcut, annotation style
- @org.aspectj.lang.annotation.Pointcut("execution(* SimpleAspect.*(..))")
- public void simpleAspectMethodExecution() {};
-
- // pointcut, code style
- @org.aspectj.lang.annotation.Pointcut("call(* SimpleAspect.*(..))")
- private void ajc$pointcut$$simpleAspectCall$123(SimpleAspect target) {};
-
- // decw, ann style
- @DeclareWarning("call(* DontDoIt.*(..))")
- public static final String dontDoIt = "dont call this method ann";
-
- // decw, code style
- @ajcDeclareEoW(pointcut="call(* DontDoIt.*(..))",message="dont call this method code",isError=false)
- private void ajc$declare_eow$123() {}
-
- // dec., ann style
- @DeclareError("call(* DontDoIt.*(..))")
- public static final String dontDoItISaid = "dont call this method ann";
-
- // decw, code style
- @ajcDeclareEoW(pointcut="call(* DontDoIt.*(..))",message="dont call this method code",isError=true)
- private void ajc$declare_eow$124() {}
- }
-
- @Aspect
- @ajcPrivileged
- class SimplePrivilegedAspect {
-
- @Aspect
- static class MemberAspect {}
-
- }
-
- @Aspect("perthis(pc())")
- class PerThisAspect {}
-
- @Aspect("pertarget(pc())")
- class PerTargetAspect {}
-
- @Aspect("percflow(pc())")
- class PerCflowAspect {}
-
- @Aspect("percflowbelow(pc())")
- class PerCflowbelowAspect {}
-
- @Aspect("pertypewithin(org.aspectj..*)")
- class PerTypeWithin {}
|