001    package railo.runtime.net.rpc.server;
002    
003    import java.lang.reflect.Method;
004    
005    import javax.xml.rpc.encoding.TypeMapping;
006    
007    import org.apache.axis.MessageContext;
008    import org.apache.axis.providers.java.RPCProvider;
009    
010    import railo.runtime.Component;
011    import railo.runtime.PageContext;
012    import railo.runtime.exp.PageException;
013    import railo.runtime.net.rpc.AxisCaster;
014    
015    public final class ComponentProvider extends RPCProvider {
016    
017            public static final String PAGE_CONTEXT = PageContext.class.getName();
018            public static final String COMPONENT = Component.class.getName();
019     
020            
021            /**
022             * @see org.apache.axis.providers.java.RPCProvider#invokeMethod(org.apache.axis.MessageContext, java.lang.reflect.Method, java.lang.Object, java.lang.Object[])
023             */
024            protected Object invokeMethod(MessageContext mc, Method method, Object trg, Object[] args) throws Exception {
025                    PageContext pc=(PageContext) mc.getProperty(Constants.PAGE_CONTEXT);
026                    Component c= (Component) mc.getProperty(Constants.COMPONENT);
027            
028                    RPCServer server = RPCServer.getInstance(pc.getId(),pc.getServletContext());
029                    TypeMapping tm = server.getEngine().getTypeMappingRegistry().getDefaultTypeMapping();
030                    
031                    return AxisCaster.toAxisType(tm,c.call(pc,method.getName(),toRailoType(pc,args)),null);
032            }
033    
034            private Object[] toRailoType(PageContext pc,Object[] args) throws PageException {
035                    Object[] trgs=new Object[args.length];
036                    for(int i=0;i<trgs.length;i++) {
037                            trgs[i]=AxisCaster.toRailoType(pc,args[i]);
038                    }
039                    return trgs;
040            }
041            
042    
043    }