001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/enterprise/control/RPCWebEvent.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     
043     ---------------------------------------------------------------------------*/
044    package org.deegree.enterprise.control;
045    
046    import java.io.BufferedReader;
047    import java.io.StringReader;
048    
049    import javax.servlet.ServletRequest;
050    import javax.servlet.http.HttpServletRequest;
051    
052    /**
053     * @author  Administrator
054     */
055    
056    public class RPCWebEvent extends WebEvent {
057    
058        /**
059         * 
060         */
061        private static final long serialVersionUID = 1L;
062        /**
063         * 
064         */
065        private RPCMethodCall mc = null;
066    
067        
068        /** Creates a new instance of RPCWebEvent */
069        public RPCWebEvent(HttpServletRequest request) {
070            super( request );
071        }
072        
073        /** Creates a new instance of RPCWebEvent */
074        public RPCWebEvent(HttpServletRequest request, RPCMethodCall mc) {
075            super( request );
076            this.mc = mc;
077        }
078        
079        /** Creates a new instance of RPCWebEvent */
080        public RPCWebEvent(FormEvent parent, RPCMethodCall mc) {
081            super( (HttpServletRequest)parent.getSource() );
082            this.mc = mc;
083        }
084        
085        /**
086         * returns the the RPC methodcall extracted from the <tt>HttpServletRequest</tt>
087         * passed to the first constructor.
088         */
089        public RPCMethodCall getRPCMethodCall() {
090            if ( mc == null ) {
091                try {
092                    mc = getMethodCall( (ServletRequest)this.getSource() );
093                } catch (Exception e) {
094                    e.printStackTrace();
095                }
096            }
097            return mc;
098        }
099        
100        /**
101         * extracts the RPC method call from the 
102         * @param request
103         * @throws RPCException
104         */
105        private RPCMethodCall getMethodCall(ServletRequest request ) throws RPCException {
106            
107            StringBuffer sb = new StringBuffer(1000);
108            try {
109                BufferedReader br = request.getReader();
110                String line = null;
111                while ( (line = br.readLine() ) != null ) {
112                    sb.append( line );
113                }
114                br.close();
115            } catch (Exception e) {
116                throw new RPCException( "Error reading stream from servlet\n" + e.toString() );
117            }
118            
119            String s = sb.toString();
120            int pos1 = s.indexOf( "<methodCall>" );
121            int pos2 = s.indexOf( "</methodCall>" );
122            if ( pos1 < 0 ) {
123                throw new RPCException( "request doesn't contain a RPC methodCall" );
124            }
125            s = s.substring( pos1, pos2 + 13 );
126            
127            StringReader reader = new StringReader( s );
128            RPCMethodCall mc = RPCFactory.createRPCMethodCall( reader );
129            
130            return mc;
131        }
132    }