001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/framework/util/NetWorker.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.framework.util;
037
038 import java.io.ByteArrayOutputStream;
039 import java.io.IOException;
040 import java.io.InputStream;
041 import java.io.OutputStreamWriter;
042 import java.io.PrintWriter;
043 import java.net.URL;
044 import java.net.URLConnection;
045
046 import org.deegree.framework.log.ILogger;
047 import org.deegree.framework.log.LoggerFactory;
048
049 /**
050 * Performs a HTTP request using the service URL submitted to the constructor
051 *
052 * @version $Revision: 18195 $
053 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
054 */
055 public class NetWorker {
056
057 private static final ILogger LOG = LoggerFactory.getLogger( NetWorker.class );
058
059 private static final int GET = 0;
060
061 private static final int POST = 1;
062
063 private String contentType = null;
064
065 private String request = null;
066
067 private URL url = null;
068
069 private int reqType = -1;
070
071 private String encoding = null;
072
073 /**
074 * constructor for initializing a HTTP GET connection with with default character encoding
075 *
076 * @param url
077 * URL to the net resource containing the URI
078 */
079 public NetWorker( URL url ) {
080
081 this.reqType = GET;
082 this.url = url;
083 this.encoding = CharsetUtils.getSystemCharset();
084
085 }
086
087 /**
088 * constructor for initializing a HTTP GET connection with a user defined encoding
089 *
090 * @param encoding
091 * desired character encoding
092 * @param url
093 * URL to the net resource containing the URI
094 */
095 public NetWorker( String encoding, URL url ) {
096 this.reqType = GET;
097 this.url = url;
098 this.encoding = encoding;
099
100 }
101
102 /**
103 * constructor for initializing a HTTP POST connection with UTF-8 as character encoding
104 *
105 * @param url
106 * URL to the net resource (without URI parameters)
107 * @param request
108 * request that shall be posted to the net resource
109 */
110 public NetWorker( URL url, String request ) {
111
112 this.reqType = POST;
113 this.url = url;
114 this.request = request;
115 this.encoding = "UTF-8";
116
117 }
118
119 /**
120 * constructor for initializing a HTTP POST connection with a user defined encoding
121 *
122 * @param encoding
123 * desired character encoding
124 * @param url
125 * URL to the net resource (without URI parameters)
126 * @param request
127 * request that shall be posted to the net resource
128 */
129 public NetWorker( String encoding, URL url, String request ) {
130 this.reqType = POST;
131 this.url = url;
132 this.request = request;
133 this.encoding = encoding;
134
135 }
136
137 /**
138 * @return the content type of the response from the connected net resource. this method shall
139 * be called after <tt>getInputStream</tt> or <tt>getDataAsByteArr</tt> has been
140 * called.
141 *
142 */
143 public String getContentType() {
144 return contentType;
145 }
146
147 /**
148 * sends the request that have been passed to the constructor without expecting to receive a
149 * response.
150 *
151 * @throws IOException
152 */
153 public void sendRequest()
154 throws IOException {
155
156 LOG.logDebug( "Trying to send request " + request + " via POST with encoding " + encoding );
157
158 // open connection to the requested host
159 URLConnection connection = url.openConnection();
160
161 connection.setDoInput( false );
162
163 // sets the content type of the request
164 connection.setRequestProperty( "Content-Type", "text/xml" );
165
166 if ( ( reqType == POST ) && ( request != null ) ) {
167 connection.setDoOutput( true );
168
169 // get connection stream
170 OutputStreamWriter osw = new OutputStreamWriter( connection.getOutputStream(), encoding );
171 PrintWriter os = new PrintWriter( osw );
172
173 // write post request into stream
174 os.print( request );
175 os.close();
176 } else {
177 connection.setDoOutput( false );
178 }
179
180 LOG.logDebug( "Sent request." );
181 }
182
183 /**
184 * returns an <tt>InputStream</tt> from the et resource
185 *
186 * @return InputStream accessing the net resource
187 *
188 * @throws IOException
189 */
190 public InputStream getInputStream()
191 throws IOException {
192
193 // open connection to the requested host
194 URLConnection connection = url.openConnection();
195
196 connection.setDoInput( true );
197
198 // sets the content type of the request
199 connection.setRequestProperty( "Content-Type", "text/xml" );
200
201 // provide result stream
202 InputStream is = null;
203
204 if ( ( reqType == POST ) && ( request != null ) ) {
205 connection.setDoOutput( true );
206
207 // get connection stream
208 OutputStreamWriter osw = new OutputStreamWriter( connection.getOutputStream(), encoding );
209 PrintWriter os = new PrintWriter( osw );
210
211 // write post request into stream
212 os.print( request );
213 os.close();
214 } else {
215 connection.setDoOutput( false );
216 }
217
218 // reads the content type of the connected net resource
219 try {
220 contentType = connection.getHeaderField( "Content-Type" );
221 } catch ( Exception e ) {
222 e.printStackTrace();
223 }
224
225 // get result of the request
226 try {
227 is = connection.getInputStream();
228 } catch ( Exception e ) {
229 e.printStackTrace();
230 throw new IOException( "could not provide data: " + e );
231 }
232
233 return is;
234 }
235
236 /**
237 * performs the request and returns the result as a byte array.
238 *
239 * @param expectedDataSize
240 * size a the data in bytes expected to be returned from the net resource. this value
241 * will be replaced if the resource is able to return the available data size.
242 * @return a byte array containing the content of the net resource
243 *
244 * @throws IOException
245 */
246 public byte[] getDataAsByteArr( int expectedDataSize )
247 throws IOException {
248
249 InputStream is = getInputStream();
250
251 if ( expectedDataSize <= 0 ) {
252 expectedDataSize = 10000;
253 }
254
255 ByteArrayOutputStream bos = new ByteArrayOutputStream( expectedDataSize );
256
257 int v = 0;
258
259 // write result to a ByteArrayOutputStream
260 while ( ( v = is.read() ) > -1 ) {
261 bos.write( v );
262 }
263
264 bos.flush();
265 bos.close();
266
267 is.close();
268
269 // return result as byte array
270 return bos.toByteArray();
271 }
272
273 /**
274 * Returns the original form of a <tt>URL</tt> as as <tt>String</tt>. Handles local
275 * filenames correctly, C:/foo is formatted as file:///C:/foo (and not as file:/C:/foo as
276 * returned by the toString () method of the <tt<URL</tt> object.
277 * <p>
278 *
279 * @param url
280 * <tt>URL</tt> to be converted
281 * @return <tt>String</tt> representation of the given <tt>URL</tt>
282 */
283 public static synchronized String url2String( URL url ) {
284 String port = "";
285
286 if ( url.getPort() != -1 ) {
287 port = ":" + url.getPort();
288 }
289
290 String s = url.getProtocol() + "://" + url.getHost() + port + url.getPath();
291
292 return s;
293 }
294
295 /**
296 * @param url
297 * @return true if a connection to the submitted <tt>URL</tt> can be opend
298 */
299 public static synchronized boolean existsURL( URL url ) {
300 try {
301 URLConnection con = url.openConnection();
302 con.connect();
303 con.getContentType();
304 } catch ( Exception e ) {
305 return false;
306 }
307 return true;
308 }
309
310 }