User: oberg   
  Date: 00/06/16 06:10:27

  Modified:    src/main/org/jboss/ejb/plugins/jrmp/server
                        JRMPContainerInvoker.java
  Log:
  Added configuration service
  Changed interceptors to be messagebased
  Added mini webserver
  Changed server bootstrap process
  
  Revision  Changes    Path
  1.7       +94 -60    
jboss/src/main/org/jboss/ejb/plugins/jrmp/server/JRMPContainerInvoker.java
  
  Index: JRMPContainerInvoker.java
  ===================================================================
  RCS file: 
/products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/jrmp/server/JRMPContainerInvoker.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- JRMPContainerInvoker.java 2000/06/04 23:19:02     1.6
  +++ JRMPContainerInvoker.java 2000/06/16 13:10:27     1.7
  @@ -28,31 +28,41 @@
   import javax.ejb.EJBHome;
   import javax.ejb.EJBObject;
   import javax.naming.Name;
  +import javax.naming.InitialContext;
  +import javax.naming.Context;
  +import javax.naming.NamingException;
  +import javax.naming.NameNotFoundException;
  +import javax.transaction.Transaction;
   
  +import org.jboss.ejb.MethodInvocation;
   import org.jboss.ejb.deployment.jBossEntity;
   import org.jboss.ejb.deployment.jBossSession;
   import org.jboss.ejb.deployment.ContainerConfiguration;
   import org.jboss.ejb.deployment.JRMPContainerInvokerConfiguration;
   
   import org.jboss.ejb.Container;
  +import org.jboss.ejb.ContainerInvokerContainer;
   import org.jboss.ejb.Interceptor;
   import org.jboss.ejb.ContainerInvoker;
  +import org.jboss.ejb.plugins.jrmp.interfaces.RemoteMethodInvocation;
   import org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy;
   import org.jboss.ejb.plugins.jrmp.interfaces.StatelessSessionProxy;
   import org.jboss.ejb.plugins.jrmp.interfaces.StatefulSessionProxy;
   import org.jboss.ejb.plugins.jrmp.interfaces.EntityProxy;
  -import org.jboss.ejb.plugins.jrmp.interfaces.EntityProxy;
  +import org.jboss.ejb.plugins.jrmp.interfaces.GenericProxy;
   import org.jboss.ejb.plugins.jrmp.interfaces.ContainerRemote;
  -import org.jboss.ejb.plugins.jrmp.interfaces.MethodInvocation;
   import org.jboss.ejb.plugins.jrmp.interfaces.IteratorImpl;
   import org.jboss.ejb.plugins.jrmp.interfaces.EJBMetaDataImpl;
  +import org.jboss.ejb.plugins.jrmp.interfaces.SecureSocketFactory;
  +
  +import org.jboss.logging.Logger;
   
   /**
    *      <description> 
    *      
    *      @see <related>
    *      @author Rickard �berg ([EMAIL PROTECTED])
  - *      @version $Revision: 1.6 $
  + *      @version $Revision: 1.7 $
    */
   public abstract class JRMPContainerInvoker
      extends RemoteServer
  @@ -62,10 +72,13 @@
       
      // Attributes ----------------------------------------------------
      protected boolean optimize = false;
  -   protected Container con;
  +   protected Container container;
      protected String jndiName;
      protected EJBMetaDataImpl ejbMetaData;
      protected EJBHome home;
  +     
  +     protected HashMap beanMethodInvokerMap;
  +     protected HashMap homeMethodInvokerMap;
      
      // Static --------------------------------------------------------
      
  @@ -98,109 +111,106 @@
      public abstract Collection getEntityCollection(Collection ids);
      
      // ContainerRemote implementation --------------------------------
  -   public Object invokeHome(MarshalledObject mimo, Object tx, Principal user)
  +   public Object invokeHome(MarshalledObject mimo)
         throws Exception
      {
         ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  -      Thread.currentThread().setContextClassLoader(con.getClassLoader());
  -      
  -      MethodInvocation mi = (MethodInvocation)mimo.get();
  -      
  +      Thread.currentThread().setContextClassLoader(container.getClassLoader());
  +             
         try
         {
  -              
  -               Method m = mi.getMethod();
  -              System.out.println("In invoke Home 
"+m.getDeclaringClass()+m.getName()+m.getParameterTypes().length);
  -        
  -         return con.invokeHome(mi.getMethod(), mi.getArguments());
  -//         return new MarshalledObject(con.invoke(mi.getId(), mi.getMethod(), 
mi.getArguments()));
  +           RemoteMethodInvocation rmi = (RemoteMethodInvocation)mimo.get();
  +           rmi.setMethodMap(homeMethodInvokerMap);
  +             
  +                     return invokeHome(rmi.getMethod(), rmi.getArguments(), 
rmi.getTransaction(), rmi.getPrincipal());
  +      } catch (Exception e)
  +      {
  +             e.printStackTrace();
  +                     throw e;
         } finally
         {
            Thread.currentThread().setContextClassLoader(oldCl);
         }
      }
         
  -   public Object invoke(MarshalledObject mimo, Object tx, Principal user)
  +   public Object invoke(MarshalledObject mimo)
         throws Exception
      {
         ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  -      Thread.currentThread().setContextClassLoader(con.getClassLoader());
  +      Thread.currentThread().setContextClassLoader(container.getClassLoader());
  +             
         try
  -      {
  -         
  -         MethodInvocation mi = (MethodInvocation)mimo.get();
  -      
  -         return con.invoke(mi.getId(), mi.getMethod(), mi.getArguments());
  -//         return new MarshalledObject(con.invoke(mi.getId(), mi.getMethod(), 
mi.getArguments()));
  -      } catch (Throwable e)
         {
  -         e.printStackTrace();
  -         throw (Exception)e;
  +         RemoteMethodInvocation rmi = (RemoteMethodInvocation)mimo.get();
  +         rmi.setMethodMap(beanMethodInvokerMap);
  +                     
  +         return invoke(rmi.getId(), rmi.getMethod(), rmi.getArguments(), 
rmi.getTransaction(), rmi.getPrincipal());
         } finally
         {
            Thread.currentThread().setContextClassLoader(oldCl);
         }
      }
       
  -   public Object invokeHome(Method m, Object[] args, Object tx, Principal user)
  +   public Object invokeHome(Method m, Object[] args, Transaction tx, Principal 
identity)
         throws Exception
      {
  -      ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  -      Thread.currentThread().setContextClassLoader(con.getClassLoader());
  -      
  -      try
  -      {
  -         return con.invokeHome(m, args);
  -      } finally
  -      {
  -         Thread.currentThread().setContextClassLoader(oldCl);
  -      }
  +        return container.invokeHome(new MethodInvocation(null , m, args, tx, 
identity));
      }
         
  -   public Object invoke(Object id, Method m, Object[] args, Object tx, Principal 
user)
  +   public Object invoke(Object id, Method m, Object[] args, Transaction tx, 
Principal identity)
         throws Exception
      {
  -      ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  -      Thread.currentThread().setContextClassLoader(con.getClassLoader());
  -      
  -      try
  -      {
  -         return con.invoke(id, m, args);
  -      } finally
  -      {
  -         Thread.currentThread().setContextClassLoader(oldCl);
  -      }
  -      
  +        return container.invoke(new MethodInvocation(id, m, args, tx, identity));
      }
      
      // ContainerService implementation -------------------------------
      public void setContainer(Container con)
      {
  -      this.con = con;
  -      jndiName = con.getMetaData().getJndiName();
  +      this.container = con;
  +      jndiName = container.getMetaData().getJndiName();
      }
      
      public void init()
         throws Exception
      {
  -      ContainerConfiguration conConf = 
con.getMetaData().getContainerConfiguration();
  +             // Set transaction manager
  +      GenericProxy.setTransactionManager(container.getTransactionManager());
  +      // Unfortunately this be a problem if many TM's are to be used
  +      // How to solve???
  +             
  +      ContainerConfiguration conConf = 
container.getMetaData().getContainerConfiguration();
         if (conConf != null)
         {
            JRMPContainerInvokerConfiguration conf = 
(JRMPContainerInvokerConfiguration)conConf.getContainerInvokerConfiguration();
            optimize = conf.isOptimized();
         }
         
  +      // Create method mappings for container invoker
  +      Method[] methods = 
((ContainerInvokerContainer)container).getRemoteClass().getMethods();
  +      beanMethodInvokerMap = new HashMap();
  +      for (int i = 0; i < methods.length; i++)
  +      {
  +         beanMethodInvokerMap.put(new 
Integer(RemoteMethodInvocation.calculateHash(methods[i])), methods[i]);
  +      }
  +             
  +      methods = ((ContainerInvokerContainer)container).getHomeClass().getMethods();
  +      homeMethodInvokerMap = new HashMap();
  +      for (int i = 0; i < methods.length; i++)
  +      {
  +         homeMethodInvokerMap.put(new 
Integer(RemoteMethodInvocation.calculateHash(methods[i])), methods[i]);
  +      }
  +             
         // Create metadata
  -      if (con.getMetaData() instanceof jBossEntity)
  +      if (container.getMetaData() instanceof jBossEntity)
         {
  -         ejbMetaData = new EJBMetaDataImpl(con.getRemoteClass(), 
con.getHomeClass(), 
con.getClassLoader().loadClass(((jBossEntity)con.getMetaData()).getPrimaryKeyClass()), 
false, false, getEJBHome());
  +         ejbMetaData = new 
EJBMetaDataImpl(((ContainerInvokerContainer)container).getRemoteClass(), 
((ContainerInvokerContainer)container).getHomeClass(), 
container.getClassLoader().loadClass(((jBossEntity)container.getMetaData()).getPrimaryKeyClass()),
 false, false, getEJBHome());
         }
         else
         {
  -         if (((jBossSession)con.getMetaData()).getSessionType().equals("Stateless"))
  -            ejbMetaData = new EJBMetaDataImpl(con.getRemoteClass(), 
con.getHomeClass(), null, true, false, getEJBHome());
  +         if 
(((jBossSession)container.getMetaData()).getSessionType().equals("Stateless"))
  +            ejbMetaData = new 
EJBMetaDataImpl(((ContainerInvokerContainer)container).getRemoteClass(), 
((ContainerInvokerContainer)container).getHomeClass(), null, true, false, 
getEJBHome());
            else
  -            ejbMetaData = new EJBMetaDataImpl(con.getRemoteClass(), 
con.getHomeClass(), null, true, true, getEJBHome());
  +            ejbMetaData = new 
EJBMetaDataImpl(((ContainerInvokerContainer)container).getRemoteClass(), 
((ContainerInvokerContainer)container).getHomeClass(), null, true, true, getEJBHome());
         }      
   
      }
  @@ -215,9 +225,12 @@
                                             new SecureSocketFactory(), 
                                             new SecureSocketFactory());
   */         
  -         UnicastRemoteObject.exportObject(this);
  -         MethodInvocation.addLocal(con.getMetaData().getJndiName(), this);
  +         UnicastRemoteObject.exportObject(this,4444);
  +         GenericProxy.addLocal(container.getMetaData().getJndiName(), this);
            
  +           rebind(new InitialContext(), container.getMetaData().getJndiName(), 
((ContainerInvokerContainer)container).getContainerInvoker().getEJBHome());
  +                     
  +                     Logger.log("Bound "+container.getMetaData().getEjbName() + " 
to " + container.getMetaData().getJndiName());
         } catch (IOException e)
         {
            throw new ServerException("Could not create secure socket factory", e);
  @@ -226,7 +239,7 @@
      
      public void stop()
      {
  -      MethodInvocation.removeLocal(con.getMetaData().getJndiName());
  +      GenericProxy.removeLocal(container.getMetaData().getJndiName());
      }
   
      public void destroy()
  @@ -236,6 +249,27 @@
      // Package protected ---------------------------------------------
       
      // Protected -----------------------------------------------------
  +   protected void rebind(Context ctx, String name, Object val)
  +   throws NamingException
  +   {
  +     // Bind val to name in ctx, and make sure that all intermediate contexts exist
  +     
  +     Name n = ctx.getNameParser("").parse(name);
  +     while (n.size() > 1)
  +     {
  +             String ctxName = n.get(0);
  +             try
  +             {
  +                     ctx = (Context)ctx.lookup(ctxName);
  +             } catch (NameNotFoundException e)
  +             {
  +                     ctx = ctx.createSubcontext(ctxName);
  +             }
  +             n = n.getSuffix(1);
  +     }
  +     
  +     ctx.rebind(n.get(0), val);
  +   }
       
      // Private -------------------------------------------------------
    
  
  
  

Reply via email to