KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > soap > transport > FilterTransport


1 /*
2  * The Apache Software License, Version 1.1
3  *
4  *
5  * Copyright (c) 2000 The Apache Software Foundation. All rights
6  * reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in
17  * the documentation and/or other materials provided with the
18  * distribution.
19  *
20  * 3. The end-user documentation included with the redistribution,
21  * if any, must include the following acknowledgment:
22  * "This product includes software developed by the
23  * Apache Software Foundation (http://www.apache.org/)."
24  * Alternately, this acknowledgment may appear in the software itself,
25  * if and wherever such third-party acknowledgments normally appear.
26  *
27  * 4. The names "SOAP" and "Apache Software Foundation" must
28  * not be used to endorse or promote products derived from this
29  * software without prior written permission. For written
30  * permission, please contact apache@apache.org.
31  *
32  * 5. Products derived from this software may not be called "Apache",
33  * nor may "Apache" appear in their name, without prior written
34  * permission of the Apache Software Foundation.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  * ====================================================================
49  *
50  * This software consists of voluntary contributions made by many
51  * individuals on behalf of the Apache Software Foundation and was
52  * originally based on software copyright (c) 2000, International
53  * Business Machines, Inc., http://www.apache.org. For more
54  * information on the Apache Software Foundation, please see
55  * <http://www.apache.org/>.
56  */

57
58 /*
59  * Begin Transport-Hook-Extension
60  */

61 package org.apache.soap.transport;
62
63 import java.io.*;
64 import java.net.*;
65 import java.util.*;
66 import javax.xml.parsers.*;
67 import org.w3c.dom.*;
68 import org.xml.sax.*;
69 import org.apache.soap.util.net.*;
70 import org.apache.soap.util.xml.*;
71 import org.apache.soap.*;
72 import org.apache.soap.rpc.SOAPContext;
73 import org.apache.soap.encoding.*;
74 import org.apache.soap.transport.*;
75
76 /**
77  * <code>SOAPHTTPConnection</code> is an implementation of the
78  * <code>SOAPTransport</code> interface for <em>HTTP</em>.
79  *
80  * @author Ryo Neyama (neyama@jp.ibm.com)
81  */

82 public class FilterTransport implements SOAPTransport {
83   private EnvelopeEditor editor;
84   private SOAPTransport transport;
85
86   public FilterTransport(EnvelopeEditor editor, SOAPTransport transport) {
87     this.editor = editor;
88     this.transport = transport;
89   }
90
91   /**
92    * This method is used to request that an envelope be posted to the
93    * given URL. The response (if any) must be gotten by calling the
94    * receive() function.
95    *
96    * @param sendTo the URL to send the envelope to
97    * @param action the SOAPAction header field value
98    * @param headers any other header fields to go to as protocol headers
99    * @param env the envelope to send
100    * @param smr the XML<->Java type mapping registry (passed on)
101    * @param ctx the request SOAPContext
102    *
103    * @exception SOAPException with appropriate reason code if problem
104    */

105   public void send(URL sendTo,
106                    String JavaDoc action,
107                    Hashtable headers,
108                    Envelope env,
109                    SOAPMappingRegistry
110                    smr,
111                    SOAPContext ctx) throws SOAPException
112   {
113     try {
114       StringWriter sout = new StringWriter();
115       env.marshall (sout, smr, ctx);
116
117       StringReader sin = new StringReader(sout.getBuffer().toString());
118       if (editor != null) {
119         sout = new StringWriter();
120         editor.editOutgoing(sin, sout);
121         sout.flush();
122         sin = new StringReader(sout.getBuffer().toString());
123       }
124
125       DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder();
126       Element docElem = xdb.parse(new InputSource(sin)).getDocumentElement();
127
128       Envelope env2 = Envelope.unmarshall(docElem);
129       transport.send(sendTo, action, headers, env2, smr, ctx);
130     } catch (IllegalArgumentException JavaDoc e) {
131       throw new SOAPException (Constants.FAULT_CODE_CLIENT,
132                                e.getMessage(),
133                                e);
134     } catch (SAXException e) {
135       throw new SOAPException (Constants.FAULT_CODE_CLIENT,
136                                e.getMessage(),
137                                e);
138     } catch (IOException e) {
139       throw new SOAPException (Constants.FAULT_CODE_CLIENT,
140                                e.getMessage(),
141                                e);
142     }
143   }
144
145   /**
146    * Return a buffered reader to receive back the response to whatever
147    * was sent to whatever.
148    *
149    * @return a reader to read the results from or null if that's not
150    * possible.
151    */

152   public BufferedReader receive () {
153     try {
154       BufferedReader in = transport.receive();
155       if (editor == null || in == null)
156         return in;
157       else {
158         StringWriter sout = new StringWriter();
159         editor.editIncoming(in, sout);
160         sout.flush();
161         StringReader sin = new StringReader(sout.getBuffer().toString());
162         return new BufferedReader(sin);
163       }
164     } catch (SOAPException e) {
165       e.printStackTrace();
166       // This exception should be thrown to the application.
167
return null;
168     }
169   }
170
171   /**
172    * Return access to headers generated by the protocol.
173    *
174    * @return a hashtable containing all the headers
175    */

176   public Hashtable getHeaders () {
177     return transport.getHeaders();
178   }
179
180   /**
181    * Return the SOAPContext associated with the response.
182    *
183    * @return response SOAPContext
184    */

185   public SOAPContext getResponseSOAPContext () {
186       return transport.getResponseSOAPContext();
187   }
188 }
189 /*
190  * End Transport-Hook-Extension
191  */

192
Popular Tags