001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.ejb.txtimer;
023:
024: // $Id: TimedObjectInvokerImpl.java 57209 2006-09-26 12:21:57Z dimitris@jboss.org $
025:
026: import org.jboss.ejb.Container;
027: import org.jboss.invocation.Invocation;
028: import org.jboss.invocation.InvocationKey;
029: import org.jboss.invocation.InvocationType;
030: import org.jboss.invocation.PayloadKey;
031: import org.jboss.security.RunAsIdentity;
032: import org.jboss.metadata.BeanMetaData;
033: import org.jboss.metadata.SecurityIdentityMetaData;
034: import org.jboss.metadata.AssemblyDescriptorMetaData;
035: import org.jboss.metadata.ApplicationMetaData;
036:
037: import javax.ejb.TimedObject;
038: import javax.ejb.Timer;
039: import java.lang.reflect.Method;
040: import java.util.Set;
041:
042: /**
043: * An implementation of a TimedObjectInvoker, that can invoke deployed
044: * EB, SLSB, and MDB
045: *
046: * @author Thomas.Diesler@jboss.org
047: * @author Scott.Stark@jboss.org
048: * @version $Revision: 57209 $
049: * @since 07-Apr-2004
050: */
051: public class TimedObjectInvokerImpl implements TimedObjectInvoker {
052: private Container container;
053: private TimedObjectId timedObjectId;
054: private Method method;
055:
056: public TimedObjectInvokerImpl(TimedObjectId timedObjectId,
057: Container container) {
058: try {
059: this .container = container;
060: this .timedObjectId = timedObjectId;
061: this .method = TimedObject.class.getMethod("ejbTimeout",
062: new Class[] { Timer.class });
063:
064: } catch (NoSuchMethodException ignore) {
065: }
066: }
067:
068: /**
069: * Invokes the ejbTimeout method on the TimedObject with the given id.
070: *
071: * @param timer The Timer that is passed to ejbTimeout
072: */
073: public void callTimeout(Timer timer) throws Exception {
074: ClassLoader callerClassLoader = SecurityActions
075: .getContextClassLoader();
076: SecurityActions.setContextClassLoader(container
077: .getClassLoader());
078: try {
079: Invocation inv = new Invocation(timedObjectId
080: .getInstancePk(), method, new Object[] { timer },
081: null, null, null);
082: inv.setValue(InvocationKey.INVOKER_PROXY_BINDING, null,
083: PayloadKey.AS_IS);
084: inv.setType(InvocationType.LOCAL);
085: BeanMetaData bmd = container.getBeanMetaData();
086: SecurityIdentityMetaData ejbTimeoutIdentity = bmd
087: .getEjbTimeoutIdentity();
088: if (ejbTimeoutIdentity != null
089: && ejbTimeoutIdentity.getUseCallerIdentity() == false) {
090: ApplicationMetaData applicationMetaData = bmd
091: .getApplicationMetaData();
092: AssemblyDescriptorMetaData assemblyDescriptor = applicationMetaData
093: .getAssemblyDescriptor();
094: String roleName = ejbTimeoutIdentity.getRunAsRoleName();
095: String principalName = ejbTimeoutIdentity
096: .getRunAsPrincipalName();
097: // the run-as principal might have extra roles mapped in the assembly-descriptor
098: Set extraRoleNames = assemblyDescriptor
099: .getSecurityRoleNamesByPrincipal(principalName);
100: RunAsIdentity runAsIdentity = new RunAsIdentity(
101: roleName, principalName, extraRoleNames);
102: SecurityActions.pushRunAsIdentity(runAsIdentity);
103: }
104: container.invoke(inv);
105: } finally {
106: SecurityActions.popRunAsIdentity();
107: SecurityActions.setContextClassLoader(callerClassLoader);
108: }
109: }
110: }
|