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