maguro 2004/09/08 22:49:27
Modified: modules/core/src/java/org/openejb GenericEJBContainer.java
Log:
Insert a default subject interceptor if there is a default subject declared.
Revision Changes Path
1.20 +69 -25
openejb/modules/core/src/java/org/openejb/GenericEJBContainer.java
Index: GenericEJBContainer.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/GenericEJBContainer.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- GenericEJBContainer.java 8 Sep 2004 03:57:20 -0000 1.19
+++ GenericEJBContainer.java 9 Sep 2004 02:49:27 -0000 1.20
@@ -47,10 +47,6 @@
*/
package org.openejb;
-import java.lang.reflect.Method;
-import java.rmi.RemoteException;
-import java.security.Permissions;
-import java.util.Iterator;
import javax.ejb.EJBHome;
import javax.ejb.EJBLocalHome;
import javax.ejb.EJBLocalObject;
@@ -61,9 +57,15 @@
import javax.security.jacc.PolicyConfiguration;
import javax.security.jacc.PolicyConfigurationFactory;
import javax.security.jacc.PolicyContextException;
+import java.lang.reflect.Method;
+import java.rmi.RemoteException;
+import java.security.Permissions;
+import java.util.Iterator;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.geronimo.core.service.Interceptor;
import org.apache.geronimo.core.service.Invocation;
import org.apache.geronimo.core.service.InvocationResult;
@@ -74,10 +76,12 @@
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.security.ContextManager;
import org.apache.geronimo.security.GeronimoSecurityException;
+import org.apache.geronimo.security.jacc.RoleMappingConfiguration;
import org.apache.geronimo.timer.ThreadPooledTimer;
import org.apache.geronimo.transaction.TrackedConnectionAssociator;
import org.apache.geronimo.transaction.UserTransactionImpl;
import org.apache.geronimo.transaction.context.TransactionContextManager;
+
import org.openejb.cache.InstancePool;
import org.openejb.client.EJBObjectHandler;
import org.openejb.client.EJBObjectProxy;
@@ -93,6 +97,7 @@
* @version $Revision$ $Date$
*/
public class GenericEJBContainer implements EJBContainer, GBeanLifecycle {
+
private static Log log = LogFactory.getLog(GenericEJBContainer.class);
private final ClassLoader classLoader;
@@ -114,23 +119,23 @@
public GenericEJBContainer(Object containerId,
- String ejbName,
- ProxyInfo proxyInfo,
- InterfaceMethodSignature[] signatures,
- InstanceContextFactory contextFactory,
- InterceptorBuilder interceptorBuilder,
- InstancePool pool,
- UserTransactionImpl userTransaction,
- String[] jndiNames,
- String[] localJndiNames,
- TransactionContextManager transactionContextManager,
- TrackedConnectionAssociator trackedConnectionAssociator,
- ThreadPooledTimer timer,
- String objectName,
- Kernel kernel,
- SecurityConfiguration securityConfiguration,
- Subject defaultSubject,
- ClassLoader classLoader) throws Exception {
+ String ejbName,
+ ProxyInfo proxyInfo,
+ InterfaceMethodSignature[] signatures,
+ InstanceContextFactory contextFactory,
+ InterceptorBuilder interceptorBuilder,
+ InstancePool pool,
+ UserTransactionImpl userTransaction,
+ String[] jndiNames,
+ String[] localJndiNames,
+ TransactionContextManager transactionContextManager,
+ TrackedConnectionAssociator
trackedConnectionAssociator,
+ ThreadPooledTimer timer,
+ String objectName,
+ Kernel kernel,
+ SecurityConfiguration securityConfiguration,
+ Subject defaultSubject,
+ ClassLoader classLoader) throws Exception {
assert (containerId != null);
assert (ejbName != null && ejbName.length() > 0);
@@ -163,7 +168,11 @@
interceptorBuilder.setTrackedConnectionAssociator(trackedConnectionAssociator);
interceptorBuilder.setInstancePool(pool);
TwoChains chains = interceptorBuilder.buildInterceptorChains();
- interceptor = chains.getUserChain();
+ if (defaultSubject != null) {
+ interceptor = new DefaultSubjectInterceptor(chains.getUserChain());
+ } else {
+ interceptor = chains.getUserChain();
+ }
contextFactory.setSystemChain(chains.getSystemChain());
if (timer != null) {
@@ -186,7 +195,6 @@
setupJndi();
}
-
public InvocationResult invoke(Invocation invocation) throws Throwable {
return interceptor.invoke(invocation);
}
@@ -331,7 +339,7 @@
if (defaultSubject != null) ContextManager.registerSubject(defaultSubject);
- if (this.securityConfiguration != null) {
+ if (securityConfiguration != null) {
/**
* Get the JACC policy configuration that's associated with this
* EJB container and configure it with the geronimo security
@@ -352,6 +360,16 @@
policyConfiguration.addToRole(role, (Permissions)
securityConfiguration.getRolePolicies().get(role));
}
+ if (policyConfiguration instanceof RoleMappingConfiguration) {
+ Iterator iter =
securityConfiguration.getRoleMapping().keySet().iterator();
+ while (iter.hasNext()) {
+ String roleName = (String) iter.next();
+ Set principalSet = (Set)
securityConfiguration.getRoleMapping().get(roleName);
+ ((RoleMappingConfiguration)
policyConfiguration).addRoleMapping(roleName, principalSet);
+ }
+ }
+
+
policyConfiguration.commit();
} catch (ClassNotFoundException e) {
// do nothing
@@ -461,4 +479,30 @@
return GBEAN_INFO;
}
+ private class DefaultSubjectInterceptor implements Interceptor {
+
+ private final Interceptor interceptor;
+
+ public DefaultSubjectInterceptor(Interceptor interceptor) {
+ this.interceptor = interceptor;
+ }
+
+ public InvocationResult invoke(Invocation invocation) throws Throwable {
+ boolean clearCurrentCaller = false;
+
+ if (ContextManager.getCurrentCaller() == null) {
+ ContextManager.setCurrentCaller(defaultSubject);
+ ContextManager.setNextCaller(defaultSubject);
+ clearCurrentCaller = true;
+ }
+ try {
+ return interceptor.invoke(invocation);
+ } finally {
+ if (clearCurrentCaller) {
+ ContextManager.setCurrentCaller(null);
+ ContextManager.setNextCaller(null);
+ }
+ }
+ }
+ }
}