001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/enterprise/control/RPCWebEvent.java $
002
003 package org.deegree.enterprise.control;
004
005 import java.io.BufferedReader;
006 import java.io.StringReader;
007
008 import javax.servlet.ServletRequest;
009 import javax.servlet.http.HttpServletRequest;
010
011 /**
012 * @author Administrator
013 */
014
015 public class RPCWebEvent extends WebEvent {
016
017 /**
018 *
019 */
020 private static final long serialVersionUID = 1L;
021 /**
022 *
023 */
024 private RPCMethodCall mc = null;
025
026
027 /** Creates a new instance of RPCWebEvent */
028 public RPCWebEvent(HttpServletRequest request) {
029 super( request );
030 }
031
032 /** Creates a new instance of RPCWebEvent */
033 public RPCWebEvent(HttpServletRequest request, RPCMethodCall mc) {
034 super( request );
035 this.mc = mc;
036 }
037
038 /** Creates a new instance of RPCWebEvent */
039 public RPCWebEvent(FormEvent parent, RPCMethodCall mc) {
040 super( (HttpServletRequest)parent.getSource() );
041 this.mc = mc;
042 }
043
044 /**
045 * returns the the RPC methodcall extracted from the <tt>HttpServletRequest</tt>
046 * passed to the first constructor.
047 */
048 public RPCMethodCall getRPCMethodCall() {
049 if ( mc == null ) {
050 try {
051 mc = getMethodCall( (ServletRequest)this.getSource() );
052 } catch (Exception e) {
053 e.printStackTrace();
054 }
055 }
056 return mc;
057 }
058
059 /**
060 * extracts the RPC method call from the
061 * @param request
062 * @throws RPCException
063 */
064 private RPCMethodCall getMethodCall(ServletRequest request ) throws RPCException {
065
066 StringBuffer sb = new StringBuffer(1000);
067 try {
068 BufferedReader br = request.getReader();
069 String line = null;
070 while ( (line = br.readLine() ) != null ) {
071 sb.append( line );
072 }
073 br.close();
074 } catch (Exception e) {
075 throw new RPCException( "Error reading stream from servlet\n" + e.toString() );
076 }
077
078 String s = sb.toString();
079 int pos1 = s.indexOf( "<methodCall>" );
080 int pos2 = s.indexOf( "</methodCall>" );
081 if ( pos1 < 0 ) {
082 throw new RPCException( "request doesn't contain a RPC methodCall" );
083 }
084 s = s.substring( pos1, pos2 + 13 );
085
086 StringReader reader = new StringReader( s );
087 RPCMethodCall mc = RPCFactory.createRPCMethodCall( reader );
088
089 return mc;
090 }
091 }