/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.aop.bean; import org.jboss.aop.Advised; import org.jboss.aop.InstanceAdvisor; import org.jboss.aop.metadata.ThreadMetaData; import org.jboss.logging.Logger; import org.jboss.system.ServiceMBeanSupport; import javax.management.MBeanRegistration; import javax.management.MBeanServer; import javax.management.ObjectName; /** * * @author <a href="mailto:bill@jboss.org">Bill Burke</a> * @version $Revision: 81036 $ */ public class AOPTester extends ServiceMBeanSupport implements AOPTesterMBean, MBeanRegistration { // Constants ---------------------------------------------------- // Attributes --------------------------------------------------- static Logger log = Logger.getLogger(AOPTester.class); MBeanServer m_mbeanServer; // Static ------------------------------------------------------- // Constructors ------------------------------------------------- public AOPTester() { } // Public ------------------------------------------------------- // MBeanRegistration implementation ----------------------------------- public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { m_mbeanServer = server; return name; } public void postRegister(Boolean registrationDone) { } public void preDeregister() throws Exception { } public void postDeregister() { } protected void startService() throws Exception { // this is to load up the management console so that we can view everything try { testBasic(); testInheritance(); testMetadata(); testDynamicInterceptors(); testFieldInterception(); testMethodInterception(); testConstructorInterception(); testExceptions(); testMixin(); testCallerPointcut(); } catch (Exception ignored) { } } protected void stopService() { } public void testBasic() { log.info("RUNNING TEST BASIC"); try { POJO pojo = new POJO(); if (!(pojo instanceof org.jboss.aop.Advised)) throw new RuntimeException("POJO is not instanceof Advised"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; pojo.someMethod(); if (!"someMethod".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); InstanceOfInterceptor.intercepted = false; Implements1 impl1 = new Implements1(); if (InstanceOfInterceptor.intercepted == false) throw new RuntimeException("failed all(instanceof) constructor interception"); InstanceOfInterceptor.intercepted = false; impl1.foo = 1; if (InstanceOfInterceptor.intercepted == false) throw new RuntimeException("failed all(instanceof) field interception"); InstanceOfInterceptor.intercepted = false; impl1.someMethod(); if (InstanceOfInterceptor.intercepted == false) throw new RuntimeException("failed all(instanceof) method interception"); InstanceOfInterceptor.intercepted = false; Implements2 impl2 = new Implements2(); if (InstanceOfInterceptor.intercepted == true) throw new RuntimeException("failed method only (instanceof) constructor interception"); InstanceOfInterceptor.intercepted = false; impl2.someMethod(); if (InstanceOfInterceptor.intercepted == false) throw new RuntimeException("failed method only(instanceof) method interception"); InstanceOfInterceptor.intercepted = false; CFlowedPOJO cflow = new CFlowedPOJO(); InterceptorCounter.count = 0; cflow.method3(); if (InterceptorCounter.count > 0) throw new RuntimeException("method3 count should be null"); InterceptorCounter.count = 0; cflow.method1(); if (InterceptorCounter.count != 1) throw new RuntimeException("method1 count should be 1"); InterceptorCounter.count = 0; cflow.recursive(1); if (InterceptorCounter.count == 0) throw new RuntimeException("recursive never get intercepted"); if (InterceptorCounter.count > 1) throw new RuntimeException("recursive too many interceptions"); } catch (Throwable ex) { log.error("failed", ex); ex.printStackTrace(); throw new RuntimeException(ex.getMessage()); } } public void testInheritance() { log.info("RUNNING TEST INHERITANCE"); try { SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; POJOChild pojo = new POJOChild(); pojo.someMethod2(); if (!"someMethod2".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; pojo.someMethod(); if (!"someMethod".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); } catch (Throwable ex) { log.error("failed", ex); throw new RuntimeException(ex); } } public void testMetadata() { log.info("RUNNING TEST METADATA"); try { POJOChild pojo = new POJOChild(); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; pojo.someMethod(); if (!"someMethod".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; pojo.anotherMethod(); if (!"anotherMethod".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"Required".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; pojo.someMethod2(); if (!"someMethod2".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; pojo.someMethod3(); if (!"someMethod3".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"Supports".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; org.jboss.aop.metadata.ThreadMetaData.instance().addMetaData("transaction", "trans-attribute", "Never"); pojo.someMethod3(); if (!"someMethod3".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"Never".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); org.jboss.aop.metadata.ThreadMetaData.instance().clear(); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; InstanceAdvisor instanceAdvisor = ((Advised) pojo)._getInstanceAdvisor(); instanceAdvisor.getMetaData().addMetaData("transaction", "trans-attribute", "NotSupported"); pojo.someMethod3(); if (!"someMethod3".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"NotSupported".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); org.jboss.aop.metadata.ThreadMetaData.instance().clear(); } catch (Throwable ex) { log.error("failed", ex); throw new RuntimeException(ex); } } public void testDynamicInterceptors() { log.info("RUNNING TEST DYNAMIC INTERCEPTORS"); try { POJOChild pojo = new POJOChild(); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; BeforeInterceptor.lastIntercepted = null; BeforeInterceptor.lastTransAttributeAccessed = null; ((Advised) pojo)._getInstanceAdvisor().insertInterceptor(new BeforeInterceptor()); pojo.someMethod(); if (!"someMethod".equals(SimpleInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(SimpleInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); if (!"someMethod".equals(BeforeInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(BeforeInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastIntercepted = null; SimpleInterceptor.lastTransAttributeAccessed = null; BeforeInterceptor.lastIntercepted = null; BeforeInterceptor.lastTransAttributeAccessed = null; AfterInterceptor.lastIntercepted = null; AfterInterceptor.lastTransAttributeAccessed = null; ((Advised) pojo)._getInstanceAdvisor().appendInterceptor(new AfterInterceptor()); pojo.someMethod(); if (!"someMethod".equals(BeforeInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(BeforeInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); if (!"someMethod".equals(AfterInterceptor.lastIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"RequiresNew".equals(AfterInterceptor.lastTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); } catch (Throwable ex) { log.error("failed", ex); throw new RuntimeException(ex); } } public void testFieldInterception() { log.info("RUNNING TEST FIELD INTERCEPTION"); try { POJO pojo = new POJO(); SimpleInterceptor.lastFieldIntercepted = null; SimpleInterceptor.lastFieldTransAttributeAccessed = null; pojo.accessField(); if (!"privateField".equals(SimpleInterceptor.lastFieldIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"NotSupported".equals(SimpleInterceptor.lastFieldTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); POJOChild child = new POJOChild(); SimpleInterceptor.lastFieldIntercepted = null; SimpleInterceptor.lastFieldTransAttributeAccessed = null; child.accessField(); if (!"privateField".equals(SimpleInterceptor.lastFieldIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"NotSupported".equals(SimpleInterceptor.lastFieldTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); SimpleInterceptor.lastFieldIntercepted = null; SimpleInterceptor.lastFieldTransAttributeAccessed = null; child.accessProtectedField(); if (!"protectedField".equals(SimpleInterceptor.lastFieldIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"Supports".equals(SimpleInterceptor.lastFieldTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); POJORef ref = new POJORef(); SimpleInterceptor.lastFieldIntercepted = null; SimpleInterceptor.lastFieldTransAttributeAccessed = null; ref.refPOJO(); if (!"protectedField".equals(SimpleInterceptor.lastFieldIntercepted)) throw new RuntimeException("Failed on interception test"); if (!"Supports".equals(SimpleInterceptor.lastFieldTransAttributeAccessed)) throw new RuntimeException("Failed on metadata test"); pojo.accessStaticField(); } catch (Throwable ex) { log.error("failed", ex); throw new RuntimeException(ex); } } public void testMethodInterception() { System.out.println("RUNNING METHOD INTERCEPTION"); try { POJO.staticMethod(); POJOConstructorTest vanilla; vanilla = new POJOConstructorTest(); vanilla.data = "error"; vanilla.someMethod(); if (!vanilla.data.equals("someMethod")) throw new RuntimeException("someMethod() didn't get correct method metadata"); vanilla.data = "error"; vanilla.another(); if (!vanilla.data.equals("another()")) throw new RuntimeException("another() didn't get correct method metadata: " + vanilla.data); vanilla.data = "nothing"; POJOMethodInterceptor.wasHit = false; vanilla.another(1); if (POJOMethodInterceptor.wasHit) throw new RuntimeException("interceptor should not have been called"); if (!vanilla.data.equals("nothing")) throw new RuntimeException("another(int) shouldn't get intercepted: " + vanilla.data); vanilla.data = "nothing"; vanilla.another(1, 1); if (!vanilla.data.equals("another(int, int)")) throw new RuntimeException("another(int, int) didn't get intercepted: " + vanilla.data); } catch (Throwable ex) { ex.printStackTrace(); throw new RuntimeException(ex.getMessage()); } } public void testAspect() { System.out.println("RUNNING ASPECT TEST"); try { POJO.staticMethod(); POJOAspectTester vanilla; vanilla = new POJOAspectTester(); if (!vanilla.marker.equals("interceptConstructor")) throw new RuntimeException("vanilla constructor didn't get intercepted"); vanilla.marker = "error"; vanilla.someMethod(); if (!vanilla.marker.equals("interceptMethod")) throw new RuntimeException("vanilla.someMethod() didn't get intercepted"); vanilla.marker = "error"; vanilla.field = 5; if (!vanilla.marker.equals("interceptField")) throw new RuntimeException("vanilla.field didn't get intercepted"); } catch (Throwable ex) { ex.printStackTrace(); throw new RuntimeException(ex); } } public void testConstructorInterception() { System.out.println("RUNNING CONSTRUCTOR INTERCEPTION"); try { POJO pojo = new POJO(); POJOChild child = new POJOChild(); POJORef ref = new POJORef(); ref.constructPOJO(); POJOWildCardConstructorTest wild; wild = new POJOWildCardConstructorTest(); if (wild == null) throw new RuntimeException("wild was null!"); if (wild.data.equals("error")) throw new RuntimeException("wild() didn't intercept"); wild = new POJOWildCardConstructorTest(1); if (wild.data.equals("error")) throw new RuntimeException("wild(int) didn't intercept"); POJOConstructorTest vanilla; vanilla = new POJOConstructorTest(); if (vanilla == null) throw new RuntimeException("vanilla was null!"); if (vanilla.data.equals("error")) throw new RuntimeException("vanilla() didn't intercept"); if (!vanilla.data.equals("empty")) throw new RuntimeException("vanilla() didn't get correct constructor metadata"); vanilla = new POJOConstructorTest(1, 1); if (vanilla.data.equals("error")) throw new RuntimeException("vanilla(int, int) didn't intercept"); if (!vanilla.data.equals("int, int")) throw new RuntimeException("vanilla(int, int) didn't get correct constructor metadata"); vanilla = new POJOConstructorTest(1); if (!vanilla.data.equals("error")) throw new RuntimeException("vanilla(int) did intercept when it shouldn't have"); } catch (Throwable ex) { ex.printStackTrace(); throw new RuntimeException(ex.getMessage()); } } public void testExceptions() { log.info("TEST AOP EXCEPTIONS"); try { NoInterceptorsPOJO pojo = new NoInterceptorsPOJO(); pojo.throwException(); } catch (SomeException ignored) { log.info("caught SomeException successfully"); } try { POJO pojo = new POJO(); pojo.throwException(); } catch (SomeException ignored) { log.info("caught SomeException successfully"); } } public void testMixin() { try { log.info("TEST MIXIN"); POJO pojo = new POJO(); log.info("TEST Introduction"); Introduction intro = (Introduction) pojo; log.info(intro.helloWorld("world")); log.info("TEST Introduction2"); Introduction2 intro2 = (Introduction2) pojo; log.info(intro2.goodbye("world")); log.info("TEST InterfaceMixin"); InterfaceMixin mixin = (InterfaceMixin) pojo; log.info(mixin.whazup()); POJOChild child = new POJOChild(); log.info("TEST child Introduction"); intro = (Introduction) child; log.info(intro.helloWorld("world")); log.info("TEST child Introduction2"); intro2 = (Introduction2) child; log.info(intro2.goodbye("world")); log.info("TEST child AnotherIntroduction"); SubclassIntroduction sub = (SubclassIntroduction) child; log.info(sub.subclassHelloWorld("world")); log.info("TEST metadata introduction pointcut"); NoInterceptorsPOJO nopojo = new NoInterceptorsPOJO(); intro = (Introduction) nopojo; } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } } public void testCallerPointcut() { log.info("TEST CALLER"); CallingPOJO callingPOJO = new CallingPOJO(); callingPOJO.callSomeMethod(); callingPOJO.nocallSomeMethod(); callingPOJO.callUnadvised(); } public void testIntroducedAnnotation() { OverriddenAnnotationInterceptor.intercepted = false; OverriddenAnnotationInterceptor.overriddenAnnotation = null; POJO pojo = new POJO(); pojo.overriddenAnnotatedMethod(); if (!OverriddenAnnotationInterceptor.intercepted) throw new RuntimeException("!IntroducedAnnotationInterceptor.intercepted"); if (OverriddenAnnotationInterceptor.overriddenAnnotation == null) throw new RuntimeException("IntroducedAnnotationInterceptor.overriddenAnnotation == null"); } // Inner classes ------------------------------------------------- }