diff --git a/akka-spring/lib/commons-logging.jar b/akka-spring/lib/commons-logging.jar new file mode 100644 index 0000000000..1deef144cb Binary files /dev/null and b/akka-spring/lib/commons-logging.jar differ diff --git a/akka-spring/lib/spring.jar b/akka-spring/lib/spring.jar new file mode 100644 index 0000000000..34a79fb349 Binary files /dev/null and b/akka-spring/lib/spring.jar differ diff --git a/akka-spring/pom.xml b/akka-spring/pom.xml new file mode 100644 index 0000000000..a61ad68c2b --- /dev/null +++ b/akka-spring/pom.xml @@ -0,0 +1,82 @@ + + 4.0.0 + + + akka-spring + Akka Spring Module + + jar + + + akka + se.scalablesolutions.akka + 0.6 + ../pom.xml + + + + + + junit + junit + 3.8.1 + test + + + org.springframework + spring + 2.5.5 + + + akka-actors + se.scalablesolutions.akka + 0.6 + + + akka-util-java + se.scalablesolutions.akka + 0.6 + + + org.scala-lang + scala-library + 2.7.5 + + + org.codehaus.aspectwerkz + aspectwerkz-nodeps-jdk5 + 2.1 + + + org.codehaus.aspectwerkz + aspectwerkz-jdk5 + 2.1 + + + + + src/main/java + src/test/java + + + src/test/resources + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + **/* + + + + + + diff --git a/akka-spring/src/main/java/AkkaAppConfig.xml b/akka-spring/src/main/java/AkkaAppConfig.xml new file mode 100644 index 0000000000..2f298ea172 --- /dev/null +++ b/akka-spring/src/main/java/AkkaAppConfig.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + interceptor + + + + + \ No newline at end of file diff --git a/akka-spring/src/main/java/se/scalablesolutions/akka/interceptor/AkkaSpringInterceptor.java b/akka-spring/src/main/java/se/scalablesolutions/akka/interceptor/AkkaSpringInterceptor.java new file mode 100644 index 0000000000..8da81a2df8 --- /dev/null +++ b/akka-spring/src/main/java/se/scalablesolutions/akka/interceptor/AkkaSpringInterceptor.java @@ -0,0 +1,84 @@ +package se.scalablesolutions.akka.interceptor; + + +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import se.scalablesolutions.akka.actor.ActiveObjectAspect; +import se.scalablesolutions.akka.actor.AspectInit; +import se.scalablesolutions.akka.actor.AspectInitRegistry; +import se.scalablesolutions.akka.actor.Dispatcher; +import se.scalablesolutions.akka.util.AkkaSpringJoinPointWrapper; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.PlatformTransactionManager; + + +public class AkkaSpringInterceptor extends ActiveObjectAspect implements MethodInterceptor,BeanPostProcessor{ + + private final static String CLASSNAME = "org.springframework.transaction.support.TransactionSynchronizationManager"; + + + @Override + public Object invoke(MethodInvocation methodInvocation) throws Throwable { + + //Determine transactional status + boolean transactional = getTransactionStatus(); + + + Dispatcher dispatcher = new Dispatcher(transactional); + dispatcher.start(); + AspectInitRegistry.register(methodInvocation.getThis(), new AspectInit( + methodInvocation.getThis().getClass(), + dispatcher, + 1000)); + + AkkaSpringJoinPointWrapper asjp = AkkaSpringJoinPointWrapper.createSpringAkkaAspectWerkzWrapper(methodInvocation); + System.out.println("AkkaSpringInterceptor = " + Thread.currentThread()); + + Object obj = this.invoke(asjp); + + dispatcher.stop(); + + return obj; + + + + } + + @Override + public Object postProcessAfterInitialization(Object bean, String arg1) + throws BeansException { + + return bean; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String arg1) + throws BeansException { + + return bean; + } + + /* + * Checks if intercepted Spring bean is in a transaction + * + */ + + private boolean getTransactionStatus() { + String status = null; + Boolean hasTransaction = null; + try { + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + if (contextClassLoader != null) { + Class tsmClass = contextClassLoader.loadClass(CLASSNAME); + hasTransaction = (Boolean) tsmClass.getMethod("isActualTransactionActive", null).invoke(null, null); + } else { + return false; + } + } catch (Exception e) { + e.printStackTrace(); + } + return hasTransaction; + } +} diff --git a/akka-spring/src/main/java/se/scalablesolutions/akka/main/Main.java b/akka-spring/src/main/java/se/scalablesolutions/akka/main/Main.java new file mode 100644 index 0000000000..36533d6ff7 --- /dev/null +++ b/akka-spring/src/main/java/se/scalablesolutions/akka/main/Main.java @@ -0,0 +1,19 @@ +package se.scalablesolutions.akka.main; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import se.scalablesolutions.akka.service.MyService; + +public class Main { + public static void main(String[] args) { + + ApplicationContext context = new ClassPathXmlApplicationContext("AkkaAppConfig.xml"); + + MyService myService = (MyService)context.getBean("interceptedService"); + + System.out.println(Thread.currentThread()); + + myService.getNumbers(777,"vfsh"); + + } +} diff --git a/akka-spring/src/main/java/se/scalablesolutions/akka/service/MyService.java b/akka-spring/src/main/java/se/scalablesolutions/akka/service/MyService.java new file mode 100644 index 0000000000..5834ec4de3 --- /dev/null +++ b/akka-spring/src/main/java/se/scalablesolutions/akka/service/MyService.java @@ -0,0 +1,23 @@ +package se.scalablesolutions.akka.service; + +import org.springframework.transaction.annotation.Transactional; + + +//import se.scalablesolutions.akka.annotation.oneway; + +public class MyService { + + public Integer getNumbers(int aTestNumber, String aText) { + System.out.println("MyService : " + Thread.currentThread()); + return new Integer(aTestNumber); + } + + //@oneway + public void calculate() { + for (int i = 1; i < 10000; i++) { + System.out.println("i=" + i); + } + } + +} + diff --git a/akka-spring/src/main/java/se/scalablesolutions/akka/util/AkkaSpringJoinPointWrapper.java b/akka-spring/src/main/java/se/scalablesolutions/akka/util/AkkaSpringJoinPointWrapper.java new file mode 100644 index 0000000000..d80126a76b --- /dev/null +++ b/akka-spring/src/main/java/se/scalablesolutions/akka/util/AkkaSpringJoinPointWrapper.java @@ -0,0 +1,130 @@ +package se.scalablesolutions.akka.util; + + +import org.aopalliance.intercept.MethodInvocation; +import org.codehaus.aspectwerkz.joinpoint.*; +import org.codehaus.aspectwerkz.joinpoint.management.JoinPointType; + + +public class AkkaSpringJoinPointWrapper implements JoinPoint{ + + private MethodInvocation methodInvocation = null; + + public MethodInvocation getMethodInvocation() { + return methodInvocation; + } + + public void setMethodInvocation(MethodInvocation methodInvocation) { + this.methodInvocation = methodInvocation; + } + + public static AkkaSpringJoinPointWrapper createSpringAkkaAspectWerkzWrapper(MethodInvocation methodInvocation){ + AkkaSpringJoinPointWrapper asjp = new AkkaSpringJoinPointWrapper(); + asjp.setMethodInvocation(methodInvocation); + return asjp; + } + + @Override + public Object getCallee() { + System.out.println("public Object getCallee()"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getCaller() { + System.out.println("public Object getCaller() "); + // TODO Auto-generated method stub + return null; + } + + @Override + public Rtti getRtti() { + System.out.println("public Rtti getRtti()"); + AkkaSpringRttiWrapper asrw = new AkkaSpringRttiWrapper(methodInvocation); + return asrw; + } + + @Override + public Object getTarget() { + System.out.println("public Object getTarget() "); + return methodInvocation.getThis(); + } + + @Override + public Object getThis() { + System.out.println("public Object getThis()"); + return methodInvocation.getThis(); + } + + @Override + public void addMetaData(Object arg0, Object arg1) { + System.out.println("public void addMetaData(Object arg0, Object arg1)"); + // TODO Auto-generated method stub + + } + + @Override + public Class getCalleeClass() { + System.out.println("public Class getCalleeClass()"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Class getCallerClass() { + System.out.println("public Class getCallerClass() "); + // TODO Auto-generated method stub + return null; + } + + @Override + public EnclosingStaticJoinPoint getEnclosingStaticJoinPoint() { + System.out.println("public EnclosingStaticJoinPoint getEnclosingStaticJoinPoint()"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getMetaData(Object arg0) { + System.out.println("public Object getMetaData(Object arg0) "); + // TODO Auto-generated method stub + return null; + } + + @Override + public Signature getSignature() { + System.out.println("public Signature getSignature() "); + // TODO Auto-generated method stub + return null; + } + + @Override + public Class getTargetClass() { + System.out.println("public Class getTargetClass() "); + // TODO Auto-generated method stub + return null; + } + + @Override + public JoinPointType getType() { + System.out.println("public JoinPointType getType()"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Object proceed() throws Throwable { + System.out.println("public Object proceed()"); + + return methodInvocation.proceed(); + } + + + public StaticJoinPoint copy() { + // TODO Auto-generated method stub + return null; + } + + +} diff --git a/akka-spring/src/main/java/se/scalablesolutions/akka/util/AkkaSpringRttiWrapper.java b/akka-spring/src/main/java/se/scalablesolutions/akka/util/AkkaSpringRttiWrapper.java new file mode 100644 index 0000000000..62c12ac4de --- /dev/null +++ b/akka-spring/src/main/java/se/scalablesolutions/akka/util/AkkaSpringRttiWrapper.java @@ -0,0 +1,95 @@ +package se.scalablesolutions.akka.util; + + +import org.aopalliance.intercept.MethodInvocation; +import org.codehaus.aspectwerkz.joinpoint.MethodRtti; +import org.codehaus.aspectwerkz.joinpoint.Rtti; + +import java.lang.reflect.Method; + +public class AkkaSpringRttiWrapper implements MethodRtti { + + private MethodInvocation methodInvocation = null; + + public AkkaSpringRttiWrapper(MethodInvocation methodInvocation){ + this.methodInvocation = methodInvocation; + + } + + @Override + public Method getMethod() { + return methodInvocation.getMethod(); + } + + @Override + public Class getReturnType() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getReturnValue() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class[] getExceptionTypes() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class[] getParameterTypes() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object[] getParameterValues() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setParameterValues(Object[] arg0) { + // TODO Auto-generated method stub + + } + + @Override + public Rtti cloneFor(Object arg0, Object arg1) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class getDeclaringType() { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getModifiers() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public String getName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getTarget() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getThis() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/akka-spring/src/main/java/spring-config.xml b/akka-spring/src/main/java/spring-config.xml new file mode 100644 index 0000000000..142def25af --- /dev/null +++ b/akka-spring/src/main/java/spring-config.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/akka-spring/src/test/java/se/scalablesolutions/akka/AppTest.java b/akka-spring/src/test/java/se/scalablesolutions/akka/AppTest.java new file mode 100644 index 0000000000..fd7dabe952 --- /dev/null +++ b/akka-spring/src/test/java/se/scalablesolutions/akka/AppTest.java @@ -0,0 +1,49 @@ +package se.scalablesolutions.akka; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import se.scalablesolutions.akka.service.MyService; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + + public void testApp() + { + + ApplicationContext context = new ClassPathXmlApplicationContext("spring-test-config.xml"); + + MyService myService = (MyService)context.getBean("interceptedService"); + + System.out.println(Thread.currentThread()); + + Object obj = myService.getNumbers(12,"vfsh"); + + assertEquals(new Integer(12), obj); + + } +} diff --git a/akka-spring/src/test/resources/spring-test-config.xml b/akka-spring/src/test/resources/spring-test-config.xml new file mode 100644 index 0000000000..2f298ea172 --- /dev/null +++ b/akka-spring/src/test/resources/spring-test-config.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + interceptor + + + + + \ No newline at end of file