You're probably right. It did work for the handful of
servers we used it on, but if we continued porting,
we'd probably find one it did not work on.

Thanks for the tip. I will incorporate next release
cycle.

//Nicholas


--- Evan Ireland <[EMAIL PROTECTED]> wrote:
> Nicholas,
>
> Your PortableRemoteObject.narrow call narrows to
> EJBHome.class.
> Then you call 'create' using reflection. Although it
> will work
> with some products (including Sybase EAServer) this
> is not portable.
> After narrowing to EJBHome.class, you should get the
> EJB meta data,
> and narrow to md.getHomeinterfaceClass().
>
> Nicholas wrote:
>
> > Here is some code from a servlet we wrote that
> accepts
> > the bean name, a method name and an array of
> objects
> > as parameters and invokes against the EJB. It was
> used
> > to access functionality in EJBs through HTTP in
> lieu
> > of IIOP, and I have to say, it was much faster !
> >
> >  public void doPost(HttpServletRequest request,
> > HttpServletResponse response)  {
> >     dumpAttributes(request);
> >     ObjectOutputStream out = null;
> >     try {
> >       out = new
> > ObjectOutputStream(response.getOutputStream());
> >       response.setHeader("Content-Type",
> "no-cache");
> >       response.setHeader("Pragma", "no-cache");
> >       response.setHeader("Expires", "Tue, 1 Jan
> 1980
> > 10:00:00 GMT");
> >       LOG.debug("---------------  EJB Router
> Request
> > v" + version + "--------------");
> >       response.setContentType("application/java");
> >       LOG.debug("Opening Input Stream");
> >       ObjectInputStream ois = new
> > ObjectInputStream(request.getInputStream());
> >       LOG.debug("Requesting Object From Input
> > Stream");
> >       Object obj = ois.readObject();
> >       LOG.debug("Extracted Object From Input
> Stream:"
> > + obj.getClass().getName());
> >       LOG.debug("Casting To EJBRouterRequest...");
> >       EJBRouterRequest ejbRequest =
> > (EJBRouterRequest)obj;
> >       LOG.debug("Cast.");
> >       LOG.debug("Looking Up Home:" +
> > ejbRequest.getBeanName());
> >       EJBObject remote =
> > (EJBObject)remotes.get(ejbRequest.getBeanName());
> >       Class[] classMethodParams = null;
> >       Method method = null;
> >       if(remote==null) {
> >         obj =
> ctx.lookup(ejbRequest.getBeanName());
> >         LOG.debug("Home Looked Up:" +
> > obj.getClass().getName());
> >         LOG.debug("Narrowing to EJBHome....");
> >         EJBHome home =
> > (EJBHome)PortableRemoteObject.narrow(obj,
> > EJBHome.class);
> >         LOG.debug("EJBHome Narrowed.");
> >         classMethodParams = new Class[0];
> >         LOG.debug("Creating create() method...");
> >         method =
> home.getClass().getMethod("create",
> > classMethodParams);
> >         LOG.debug("create() method created.
> > Invoking...");
> >         remote = (EJBObject) method.invoke(home,
> > classMethodParams);
> >         remotes.put(ejbRequest.getBeanName(),
> remote);
> >         LOG.debug("Remote Created.");
> >       } else {
> >         LOG.info("Remote Found In Cache:" +
> > remote.getClass().getName());
> >       }
> >       classMethodParams = new
> > Class[ejbRequest.getArgs().length];
> >       for(int i=0; i < classMethodParams.length;
> i++)
> > {
> >         classMethodParams[i] =
> > ejbRequest.getArgs()[i].getClass();
> >       }
> >       LOG.debug("Getting Requested Method.....");
> >       method =
> >
>
remote.getClass().getMethod(ejbRequest.getMethodName(),
> > classMethodParams);
> >       LOG.debug("Got Requested Method:" + method +
> ".
> > Invoking....");
> >       obj = method.invoke(remote,
> > ejbRequest.getArgs());
> >       LOG.debug("Invoked. Object Is:" +
> > obj.getClass().getName());
> >       LOG.debug("Returning Result...");
> >       LOG.debug("ObjectValue:" + obj.toString());
> >       out.writeObject(obj);
> >       LOG.debug("---------------  END Router
> Request
> > --------------");
> >     } catch (Throwable erx) {
> >       if(erx instanceof InvocationTargetException)
> {
> >         Throwable thr =
> >
>
((InvocationTargetException)erx).getTargetException();
> >         LOG.error("EJBRouter Service Invocation
> > Exception:" + thr);
> >         Exception newEx = new Exception("EJBRouter
> > Invocation Exception:" + thr.getClass().getName()
> +
> > ":" + thr.getMessage());
> >         try {
> >           out.writeObject(newEx);
> >         } catch (Throwable ioex) {
> >           LOG.error("EJBRouter Could Not Write
> > Exception Object To Output Stream:" + ioex);
> >         }
> >         //throw new ServletException(thr);
> >       } else {
> >         LOG.error("EJBRouter Service Unknown
> > Exception:" + erx);
> >         Exception newEx = new Exception("EJBRouter
> > Invocation Exception:" + erx.getClass().getName()
> +
> > ":" + erx.getMessage());
> >         try {
> >           out.writeObject(newEx);
> >         } catch (Throwable ioex) {
> >           LOG.error("EJBRouter Could Not Write
> > Exception Object To Output Stream:" + ioex);
> >         }
> >         //throw new ServletException(erx);
> >       }
> >     } finally {
> >       try { out.flush(); } catch (Exception e) {};
> >       try { out.close(); } catch (Exception e) {};
> >     }
> >   }
> >
> > //Nicholas
> >
> > --- Gene Chuang <[EMAIL PROTECTED]> wrote:
> >
> >>Hi Anthony,
> >>
> >>You cannot "dynamically cast" in Java (doesn't
> make
> >>sense!), but you CAN dynamically
> >>evoke methods using reflection.
> >>
> >>So, just reflectively evoke "create" on the Object
> >>retreived from JNDI to get the
> >>EJBObject, and once again reflectively evoke the
> >>business method of your choosing on the
> >>resulting Object to achieve your goal.
> >>
> >>Gene
> >>--- Catalfano Anthony
> >><[EMAIL PROTECTED]> wrote:
> >>
> >>>I'm writing a diagnostic utility servlet that
> will
> >>>
> >>allow our operations
> >>
> >>>people to enter 3 parameters: PROVIDER_URL,
> >>>
> >>JNDIHomeName, and BeanName. The
> >>
> >>>servlet needs to dynamically look up the home,
> >>>
> >>dynamically cast it to the
> >>
> >>>JNDIHomeName param, call create() on the Home,
> >>>
> >>dynamically cast the bean the
> >>
> >>>the BeanName. Wondering if anyone has code that
> >>>
> >>will do this.
> >>
> >>>Thanks
> >>>
> >>>Anthony Catalfano
> >>>Information Technology Analyst
> >>>Deere & Company
> >>>309-748-5201
> >>>
>
=== message truncated ===


=====
Nicholas Whitehead
Home: (973) 377 9335
Cell: (973) 615 9646
Work(@ JP Morgan): (212) 235 5783
[EMAIL PROTECTED]

__________________________________________________
Do You Yahoo!?
Make a great connection at Yahoo! Personals.
http://personals.yahoo.com

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff EJB-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to