Updated Branches: refs/heads/javelin ad3e98c1e -> c272cf6b6
add TransactionContextBuilder based on Spring AOP Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/c272cf6b Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/c272cf6b Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/c272cf6b Branch: refs/heads/javelin Commit: c272cf6b69a8d067b6d361be5aea8353ded2bfcf Parents: ad3e98c Author: Kelven Yang <[email protected]> Authored: Thu Oct 25 15:01:12 2012 -0700 Committer: Kelven Yang <[email protected]> Committed: Thu Oct 25 15:01:12 2012 -0700 ---------------------------------------------------------------------- pom.xml | 15 ++++ .../cloud/utils/db/TransactionContextBuilder.java | 61 +++++++++++++++ utils/test/com/cloud/utils/db/DbAnnotatedBase.java | 30 +++++++ .../com/cloud/utils/db/DbAnnotatedBaseDerived.java | 27 +++++++ .../utils/db/TransactionContextBuilderTest.java | 25 ++++++ .../resources/transactionContextBuilderTest.xml | 30 +++++++ 6 files changed, 188 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c272cf6b/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 9a633a1..b242238 100644 --- a/pom.xml +++ b/pom.xml @@ -251,6 +251,21 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjrt</artifactId> + <version>1.7.1</version> + </dependency> + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjweaver</artifactId> + <version>1.7.1</version> + </dependency> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + </dependency> </dependencies> <build> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c272cf6b/utils/src/com/cloud/utils/db/TransactionContextBuilder.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/db/TransactionContextBuilder.java b/utils/src/com/cloud/utils/db/TransactionContextBuilder.java new file mode 100644 index 0000000..054ddcd --- /dev/null +++ b/utils/src/com/cloud/utils/db/TransactionContextBuilder.java @@ -0,0 +1,61 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.utils.db; + +import java.lang.reflect.Method; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; + +public class TransactionContextBuilder { + public TransactionContextBuilder() { + } + + public Object AroundAnyMethod(ProceedingJoinPoint call) throws Throwable { + MethodSignature methodSignature = (MethodSignature)call.getSignature(); + Method targetMethod = methodSignature.getMethod(); + if(needToIntercept(targetMethod)) { + Transaction txn = Transaction.open(call.getSignature().getName()); + Object ret = null; + try { + ret = call.proceed(); + } finally { + txn.close(); + } + return ret; + } + return call.proceed(); + } + + private boolean needToIntercept(Method method) { + DB db = method.getAnnotation(DB.class); + if (db != null) { + return db.txn(); + } + + Class<?> clazz = method.getDeclaringClass(); + do { + db = clazz.getAnnotation(DB.class); + if (db != null) { + return db.txn(); + } + clazz = clazz.getSuperclass(); + } while (clazz != Object.class && clazz != null); + + return false; + } +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c272cf6b/utils/test/com/cloud/utils/db/DbAnnotatedBase.java ---------------------------------------------------------------------- diff --git a/utils/test/com/cloud/utils/db/DbAnnotatedBase.java b/utils/test/com/cloud/utils/db/DbAnnotatedBase.java new file mode 100644 index 0000000..c9b77b7 --- /dev/null +++ b/utils/test/com/cloud/utils/db/DbAnnotatedBase.java @@ -0,0 +1,30 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.utils.db; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +@Component +@DB +public class DbAnnotatedBase { + private static final Logger s_logger = Logger.getLogger(DbAnnotatedBase.class); + + public void MethodWithClassDbAnnotated() { + s_logger.info("called"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c272cf6b/utils/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java ---------------------------------------------------------------------- diff --git a/utils/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java b/utils/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java new file mode 100644 index 0000000..2b845bc --- /dev/null +++ b/utils/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java @@ -0,0 +1,27 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.utils.db; + +import org.springframework.stereotype.Component; + +@Component +public class DbAnnotatedBaseDerived { + + @DB + public void DbAnnotatedMethod() { + } +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c272cf6b/utils/test/com/cloud/utils/db/TransactionContextBuilderTest.java ---------------------------------------------------------------------- diff --git a/utils/test/com/cloud/utils/db/TransactionContextBuilderTest.java b/utils/test/com/cloud/utils/db/TransactionContextBuilderTest.java new file mode 100644 index 0000000..74e0ab9 --- /dev/null +++ b/utils/test/com/cloud/utils/db/TransactionContextBuilderTest.java @@ -0,0 +1,25 @@ +package com.cloud.utils.db; + +import javax.inject.Inject; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations="classpath:/transactioncontextBuilderTest.xml") +public class TransactionContextBuilderTest { + + @Inject + DbAnnotatedBaseDerived _derived; + + @Inject + DbAnnotatedBase _base; + + @Test + public void test() { + _derived.DbAnnotatedMethod(); + _base.MethodWithClassDbAnnotated(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c272cf6b/utils/test/resources/transactionContextBuilderTest.xml ---------------------------------------------------------------------- diff --git a/utils/test/resources/transactionContextBuilderTest.xml b/utils/test/resources/transactionContextBuilderTest.xml new file mode 100644 index 0000000..4672343 --- /dev/null +++ b/utils/test/resources/transactionContextBuilderTest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:tx="http://www.springframework.org/schema/tx" + xmlns:aop="http://www.springframework.org/schema/aop" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/tx + http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/aop + http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + <context:annotation-config /> + + <context:component-scan base-package="org.apache.cloudstack, com.cloud" /> + + <aop:config proxy-target-class="true"> + <aop:aspect id="dbContextBuilder" ref="transactionContextBuilder"> + <aop:pointcut id="captureAnyMethod" + expression="execution(* *(..))" /> + <aop:around pointcut-ref="captureAnyMethod" method="AroundAnyMethod"/> + </aop:aspect> + </aop:config> + + <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" /> + +</beans>
