Merge branch 'master' of ssh://git.eclipse.org/gitroot/virgo/org.eclipse.virgo.osgi-extensions
diff --git a/org.eclipse.virgo.osgi.extensions.equinox/src/main/java/org/eclipse/virgo/osgi/extensions/equinox/hooks/MetaInfResourceClassLoaderDelegateHook.java b/org.eclipse.virgo.osgi.extensions.equinox/src/main/java/org/eclipse/virgo/osgi/extensions/equinox/hooks/MetaInfResourceClassLoaderDelegateHook.java
index dfd0fd9..1449535 100644
--- a/org.eclipse.virgo.osgi.extensions.equinox/src/main/java/org/eclipse/virgo/osgi/extensions/equinox/hooks/MetaInfResourceClassLoaderDelegateHook.java
+++ b/org.eclipse.virgo.osgi.extensions.equinox/src/main/java/org/eclipse/virgo/osgi/extensions/equinox/hooks/MetaInfResourceClassLoaderDelegateHook.java
@@ -193,23 +193,35 @@
}
return true;
}
-
+
private boolean isDelegatedResolverCall() {
- StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+ Class<?>[] stackTrace = new SecurityManagerExecutionStackAccessor().getExecutionStack();
return isSpringDmDelegatedResolverCall(stackTrace) || isBlueprintDelegatedResolverCall(stackTrace);
}
- private boolean isSpringDmDelegatedResolverCall(StackTraceElement[] stackTrace) {
+ private final class SecurityManagerExecutionStackAccessor extends SecurityManager {
+
+ public Class<?>[] getExecutionStack() {
+ Class<?>[] classes = super.getClassContext();
+ Class<?>[] executionStack = new Class<?>[classes.length - 1];
+
+ System.arraycopy(classes, 1, executionStack, 0, executionStack.length);
+
+ return executionStack;
+ }
+ }
+
+ private boolean isSpringDmDelegatedResolverCall(Class<?>[] stackTrace) {
return isDelegatedResolverCall(stackTrace, SPRINGDM_DELEGATED_NAMESPACE_HANDLER_RESOLVER_CLASS_NAME, SPRINGDM_DELEGATED_ENTITY_RESOLVER_CLASS_NAME);
}
- private boolean isBlueprintDelegatedResolverCall(StackTraceElement[] stackTrace) {
+ private boolean isBlueprintDelegatedResolverCall(Class<?>[] stackTrace) {
return isDelegatedResolverCall(stackTrace, BLUEPRINT_DELEGATED_NAMESPACE_HANDLER_RESOLVER_CLASS_NAME, BLUEPRINT_DELEGATED_ENTITY_RESOLVER_CLASS_NAME);
}
- private boolean isDelegatedResolverCall(StackTraceElement[] stackTrace, String namespaceResolver, String entityResolver) {
- for (StackTraceElement element : stackTrace) {
- String className = element.getClassName();
+ private boolean isDelegatedResolverCall(Class<?>[] stackTrace, String namespaceResolver, String entityResolver) {
+ for (Class<?> clazz : stackTrace) {
+ String className = clazz.getName();
if (namespaceResolver.equals(className) || entityResolver.equals(className)) {
return true;
}