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            @Override
022            protected Object invokeMethod(MessageContext mc, Method method, Object trg, Object[] args) throws Exception {
023                    PageContext pc=(PageContext) mc.getProperty(Constants.PAGE_CONTEXT);
024                    Component c= (Component) mc.getProperty(Constants.COMPONENT);
025            
026                    RPCServer server = RPCServer.getInstance(pc.getId(),pc.getServletContext());
027                    TypeMapping tm = server.getEngine().getTypeMappingRegistry().getDefaultTypeMapping();
028                    
029                    return AxisCaster.toAxisType(tm,c.call(pc,method.getName(),toRailoType(pc,args)),null);
030            }
031    
032            private Object[] toRailoType(PageContext pc,Object[] args) throws PageException {
033                    Object[] trgs=new Object[args.length];
034                    for(int i=0;i<trgs.length;i++) {
035                            trgs[i]=AxisCaster.toRailoType(pc,args[i]);
036                    }
037                    return trgs;
038            }
039            
040    
041    }