added UserContext to context delegating
diff --git a/build.gradle b/build.gradle
index 6a14e06..deb397d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -16,6 +16,7 @@
ext.versions = [
frameworklang : '0.1.0-BUILD-SNAPSHOT',
+ frameworkapi : '0.1.0-BUILD-SNAPSHOT',
springcontext : '4.3.3.RELEASE',
springsecurity : '4.2.2.RELEASE',
springboot : '1.4.1.RELEASE',
@@ -42,6 +43,7 @@
dependencies {
compile(
[group: 'io.mifos.core', name: 'lang', version: versions.frameworklang],
+ [group: 'io.mifos.core', name: 'api', version: versions.frameworkapi],
[group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
[group: 'org.springframework.security', name: 'spring-security-web', version: versions.springsecurity],
[group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs]
diff --git a/src/main/java/io/mifos/core/async/config/AsyncProcessingJavaConfiguration.java b/src/main/java/io/mifos/core/async/config/AsyncProcessingJavaConfiguration.java
index 272f37f..b15e4cd 100644
--- a/src/main/java/io/mifos/core/async/config/AsyncProcessingJavaConfiguration.java
+++ b/src/main/java/io/mifos/core/async/config/AsyncProcessingJavaConfiguration.java
@@ -15,7 +15,7 @@
*/
package io.mifos.core.async.config;
-import io.mifos.core.async.core.DelegatingTenantContextExecutor;
+import io.mifos.core.async.core.DelegatingContextExecutor;
import io.mifos.core.async.util.AsyncConstants;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
@@ -55,7 +55,7 @@
this.env.getProperty(AsyncConstants.THREAD_NAME_PROP, AsyncConstants.THREAD_NAME_DEFAULT));
executor.initialize();
- return new DelegatingTenantContextExecutor(new DelegatingSecurityContextAsyncTaskExecutor(executor));
+ return new DelegatingContextExecutor(new DelegatingSecurityContextAsyncTaskExecutor(executor));
}
@Override
diff --git a/src/main/java/io/mifos/core/async/core/DelegatingContextCallable.java b/src/main/java/io/mifos/core/async/core/DelegatingContextCallable.java
new file mode 100644
index 0000000..2a7d050
--- /dev/null
+++ b/src/main/java/io/mifos/core/async/core/DelegatingContextCallable.java
@@ -0,0 +1,46 @@
+package io.mifos.core.async.core;
+
+import io.mifos.core.api.util.UserContext;
+import io.mifos.core.api.util.UserContextHolder;
+import io.mifos.core.lang.TenantContextHolder;
+
+import java.util.concurrent.Callable;
+
+public class DelegatingContextCallable<V> implements Callable<V> {
+
+ private final Callable<V> delegate;
+ private final String tenantIdentifier;
+ private final UserContext userContext;
+
+ DelegatingContextCallable(Callable<V> delegate) {
+ this.delegate = delegate;
+ this.tenantIdentifier = null;
+ this.userContext = null;
+ }
+
+ DelegatingContextCallable(final Callable<V> delegate, final String tenantIdentifier,
+ final UserContext userContext) {
+ super();
+ this.delegate = delegate;
+ this.tenantIdentifier = tenantIdentifier;
+ this.userContext = userContext;
+ }
+
+ @Override
+ public V call() throws Exception {
+ try {
+ TenantContextHolder.clear();
+ if(this.tenantIdentifier != null) {
+ TenantContextHolder.setIdentifier(this.tenantIdentifier);
+ }
+ UserContextHolder.clear();
+ if (this.userContext != null) {
+ UserContextHolder.setUserContext(this.userContext);
+ }
+ return this.delegate.call();
+ } finally {
+ TenantContextHolder.clear();
+ UserContextHolder.clear();
+ }
+ }
+}
diff --git a/src/main/java/io/mifos/core/async/core/DelegatingContextExecutor.java b/src/main/java/io/mifos/core/async/core/DelegatingContextExecutor.java
new file mode 100644
index 0000000..316fc1b
--- /dev/null
+++ b/src/main/java/io/mifos/core/async/core/DelegatingContextExecutor.java
@@ -0,0 +1,61 @@
+package io.mifos.core.async.core;
+
+import io.mifos.core.api.util.UserContextHolder;
+import io.mifos.core.lang.TenantContextHolder;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.security.task.DelegatingSecurityContextAsyncTaskExecutor;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+
+public class DelegatingContextExecutor implements AsyncTaskExecutor {
+
+ private final DelegatingSecurityContextAsyncTaskExecutor delegate;
+
+ public DelegatingContextExecutor(final DelegatingSecurityContextAsyncTaskExecutor delegate) {
+ super();
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void execute(final Runnable task, final long startTimeout) {
+ final Runnable taskWrapper = this.wrap(task);
+ this.delegate.execute(taskWrapper, startTimeout);
+ }
+
+ @Override
+ public Future<?> submit(final Runnable task) {
+ final Runnable taskWrapper = this.wrap(task);
+ return this.delegate.submit(taskWrapper);
+ }
+
+ @Override
+ public <T> Future<T> submit(final Callable<T> task) {
+ final Callable<T> taskWrapper = this.wrap(task);
+ return this.delegate.submit(taskWrapper);
+ }
+
+ @Override
+ public void execute(final Runnable task) {
+ final Runnable taskWrapper = this.wrap(task);
+ this.delegate.execute(taskWrapper);
+ }
+
+ private Runnable wrap(final Runnable task) {
+ if(TenantContextHolder.identifier().isPresent()
+ || UserContextHolder.getUserContext().isPresent()) {
+ return new DelegatingContextRunnable(task, TenantContextHolder.checkedGetIdentifier(),
+ UserContextHolder.getUserContext().get());
+ }
+ return new DelegatingContextRunnable(task);
+ }
+
+ private <T> Callable<T> wrap(final Callable<T> task) {
+ if(TenantContextHolder.identifier().isPresent()
+ || UserContextHolder.getUserContext().isPresent()) {
+ return new DelegatingContextCallable<>(task, TenantContextHolder.checkedGetIdentifier(),
+ UserContextHolder.getUserContext().get());
+ }
+ return new DelegatingContextCallable<>(task);
+ }
+}
diff --git a/src/main/java/io/mifos/core/async/core/DelegatingContextRunnable.java b/src/main/java/io/mifos/core/async/core/DelegatingContextRunnable.java
new file mode 100644
index 0000000..51d0e34
--- /dev/null
+++ b/src/main/java/io/mifos/core/async/core/DelegatingContextRunnable.java
@@ -0,0 +1,44 @@
+package io.mifos.core.async.core;
+
+import io.mifos.core.api.util.UserContext;
+import io.mifos.core.api.util.UserContextHolder;
+import io.mifos.core.lang.TenantContextHolder;
+
+public class DelegatingContextRunnable implements Runnable {
+
+ private final Runnable delegate;
+ private final String tenantIdentifier;
+ private final UserContext userContext;
+
+ DelegatingContextRunnable(final Runnable delegate) {
+ this.delegate = delegate;
+ this.tenantIdentifier = null;
+ this.userContext = null;
+ }
+
+ DelegatingContextRunnable(final Runnable delegate, final String tenantIdentifier,
+ final UserContext userContext) {
+ super();
+ this.delegate = delegate;
+ this.tenantIdentifier = tenantIdentifier;
+ this.userContext = userContext;
+ }
+
+ @Override
+ public void run() {
+ try {
+ TenantContextHolder.clear();
+ if(this.tenantIdentifier != null) {
+ TenantContextHolder.setIdentifier(this.tenantIdentifier);
+ }
+ UserContextHolder.clear();
+ if (this.userContext != null) {
+ UserContextHolder.setUserContext(this.userContext);
+ }
+ this.delegate.run();
+ } finally {
+ TenantContextHolder.clear();
+ UserContextHolder.clear();;
+ }
+ }
+}
diff --git a/src/main/java/io/mifos/core/async/core/DelegatingTenantContextCallable.java b/src/main/java/io/mifos/core/async/core/DelegatingTenantContextCallable.java
deleted file mode 100644
index 139c1ff..0000000
--- a/src/main/java/io/mifos/core/async/core/DelegatingTenantContextCallable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package io.mifos.core.async.core;
-
-import io.mifos.core.lang.TenantContextHolder;
-
-import java.util.concurrent.Callable;
-
-public class DelegatingTenantContextCallable<V> implements Callable<V> {
-
- private final Callable<V> delegate;
- private final String tenantIdentifier;
-
- DelegatingTenantContextCallable(Callable<V> delegate) {
- this.delegate = delegate;
- this.tenantIdentifier = null;
- }
-
- DelegatingTenantContextCallable(final Callable<V> delegate, final String tenantIdentifier) {
- super();
- this.delegate = delegate;
- this.tenantIdentifier = tenantIdentifier;
- }
-
- @Override
- public V call() throws Exception {
- try {
- TenantContextHolder.clear();
- if(this.tenantIdentifier != null) {
- TenantContextHolder.setIdentifier(this.tenantIdentifier);
- }
- return this.delegate.call();
- } finally {
- TenantContextHolder.clear();
- }
- }
-}
diff --git a/src/main/java/io/mifos/core/async/core/DelegatingTenantContextExecutor.java b/src/main/java/io/mifos/core/async/core/DelegatingTenantContextExecutor.java
deleted file mode 100644
index 1061822..0000000
--- a/src/main/java/io/mifos/core/async/core/DelegatingTenantContextExecutor.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.mifos.core.async.core;
-
-import io.mifos.core.lang.TenantContextHolder;
-import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.security.task.DelegatingSecurityContextAsyncTaskExecutor;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-
-public class DelegatingTenantContextExecutor implements AsyncTaskExecutor {
-
- private final DelegatingSecurityContextAsyncTaskExecutor delegate;
-
- public DelegatingTenantContextExecutor(final DelegatingSecurityContextAsyncTaskExecutor delegate) {
- super();
- this.delegate = delegate;
- }
-
- @Override
- public void execute(final Runnable task, final long startTimeout) {
- final Runnable taskWrapper = this.wrap(task);
- this.delegate.execute(taskWrapper, startTimeout);
- }
-
- @Override
- public Future<?> submit(final Runnable task) {
- final Runnable taskWrapper = this.wrap(task);
- return this.delegate.submit(taskWrapper);
- }
-
- @Override
- public <T> Future<T> submit(final Callable<T> task) {
- final Callable<T> taskWrapper = this.wrap(task);
- return this.delegate.submit(taskWrapper);
- }
-
- @Override
- public void execute(final Runnable task) {
- final Runnable taskWrapper = this.wrap(task);
- this.delegate.execute(taskWrapper);
- }
-
- private Runnable wrap(final Runnable task) {
- if(TenantContextHolder.identifier().isPresent()) {
- return new DelegatingTenantContextRunnable(task, TenantContextHolder.checkedGetIdentifier());
- }
- return new DelegatingTenantContextRunnable(task);
- }
-
- private <T> Callable<T> wrap(final Callable<T> task) {
- if(TenantContextHolder.identifier().isPresent()) {
- return new DelegatingTenantContextCallable<>(task, TenantContextHolder.checkedGetIdentifier());
- }
- return new DelegatingTenantContextCallable<>(task);
- }
-}
diff --git a/src/main/java/io/mifos/core/async/core/DelegatingTenantContextRunnable.java b/src/main/java/io/mifos/core/async/core/DelegatingTenantContextRunnable.java
deleted file mode 100644
index 37d8ba6..0000000
--- a/src/main/java/io/mifos/core/async/core/DelegatingTenantContextRunnable.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package io.mifos.core.async.core;
-
-import io.mifos.core.lang.TenantContextHolder;
-
-public class DelegatingTenantContextRunnable implements Runnable {
-
- private final Runnable delegate;
- private final String tenantIdentifier;
-
- DelegatingTenantContextRunnable(final Runnable delegate) {
- this.delegate = delegate;
- this.tenantIdentifier = null;
- }
-
- DelegatingTenantContextRunnable(final Runnable delegate, final String tenantIdentifier) {
- super();
- this.delegate = delegate;
- this.tenantIdentifier = tenantIdentifier;
- }
-
- @Override
- public void run() {
- try {
- TenantContextHolder.clear();
- if(this.tenantIdentifier != null) {
- TenantContextHolder.setIdentifier(this.tenantIdentifier);
- }
- this.delegate.run();
- } finally {
- TenantContextHolder.clear();
- }
- }
-}