1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.feedparser.network;
18
19 import java.net.URL;
20 import java.util.ArrayList;
21 import java.util.HashMap;
22 import java.util.Iterator;
23
24 import org.apache.log4j.Logger;
25
26
27
28
29
30
31
32
33 public class ResourceRequestFactory {
34
35 private static Logger log = Logger.getLogger( ResourceRequestFactory.class.getName() );
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public static int NETWORKADDRESS_CACHE_TTL = 5 * 60;
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 public static int DEFAULT_CONNECT_TIMEOUT = 1 * 60 * 1000;
69
70 public static int DEFAULT_READ_TIMEOUT = DEFAULT_CONNECT_TIMEOUT;
71
72
73
74
75 public static int DEFAULT_MAX_REDIRECTS = 5;
76
77
78 private static ArrayList listeners = new ArrayList( 30 );
79
80 private static HashMap schemeMap = null;
81
82 private static boolean transparentHTCacheEnabled = false;
83
84
85
86
87
88
89 private static boolean offline = false;
90
91 public static ResourceRequest getResourceRequest( String resource,
92 long ifModifiedSince ) throws NetworkException {
93
94 return getResourceRequest( resource, ifModifiedSince, null );
95
96 }
97
98
99
100
101
102
103
104
105 public static ResourceRequest getResourceRequest( String resource,
106 long ifModifiedSince,
107 String etag ) throws NetworkException {
108
109
110
111
112 ResourceRequestFactory.init();
113
114
115
116 int schemeIndex = resource.indexOf( ":" );
117
118 if ( schemeIndex == -1 )
119 throw new NetworkException( "Unknown scheme: '" + resource + "'" );
120
121 String scheme = resource.substring( 0, schemeIndex );
122
123 if ( scheme == null || scheme.equals( "" ) )
124 throw new MalformedResourceException( "Not supported: " + resource );
125
126 Class clazz = (Class)schemeMap.get( scheme );
127
128 if ( clazz == null ) {
129 throw new MalformedResourceException( "Scheme not supported: " + scheme );
130 }
131
132 try {
133
134 ResourceRequest request = (ResourceRequest)clazz.newInstance();
135
136 request.setResource( resource );
137
138
139 request.setIfModifiedSince( ifModifiedSince );
140
141
142 request.setEtag( etag );
143
144 request.init();
145
146 return request;
147
148 } catch ( Throwable t ) {
149 throw new NetworkException( t );
150 }
151
152 }
153
154
155
156
157
158
159 public static ResourceRequest getResourceRequest( String resource ) throws NetworkException {
160 return getResourceRequest( resource, -1 );
161 }
162
163
164
165
166
167
168 public static ResourceRequest getResourceRequest( URL resource ) throws NetworkException {
169 return getResourceRequest( resource.toString() );
170 }
171
172
173
174
175
176
177
178 public static void addEventListener( NetworkEventListener listener ) {
179
180 listeners.add( listener );
181
182 }
183
184
185
186
187
188
189 public static Iterator getNetworkEventListeners() {
190
191 return listeners.iterator();
192
193 }
194
195
196
197
198
199
200 private synchronized static void init() {
201
202
203
204
205
206
207
208
209
210
211 System.setProperty( "sun.net.inetaddr.ttl",
212 Integer.toString( NETWORKADDRESS_CACHE_TTL ) );
213
214 System.setProperty( "networkaddress.cache.ttl",
215 Integer.toString( NETWORKADDRESS_CACHE_TTL ) );
216
217 System.setProperty( "sun.net.client.defaultReadTimeout",
218 Integer.toString( DEFAULT_READ_TIMEOUT ) );
219
220 System.setProperty( "sun.net.client.defaultConnectTimeout",
221 Integer.toString( DEFAULT_CONNECT_TIMEOUT ) );
222
223 System.setProperty( "http.maxRedirects",
224 Integer.toString( DEFAULT_MAX_REDIRECTS ) );
225
226 if ( schemeMap == null ) {
227
228 schemeMap = new HashMap();
229
230 schemeMap.put( "file", URLResourceRequest.class );
231 schemeMap.put( "http", URLResourceRequest.class );
232 schemeMap.put( "https", URLResourceRequest.class );
233 schemeMap.put( BlockingResourceRequest.SCHEME, BlockingResourceRequest.class );
234
235 }
236
237 }
238
239
240
241
242
243
244
245 public static boolean isSupportedScheme( String scheme ) {
246
247 return schemeMap.get( scheme ) != null;
248
249 }
250
251
252
253
254
255
256
257
258 public static void setTransparentHTCacheEnabled( boolean enabled ) {
259 transparentHTCacheEnabled = enabled;
260 }
261
262
263
264
265
266
267 public static boolean isTransparentHTCacheEnabled() {
268 return transparentHTCacheEnabled;
269 }
270
271
272
273
274
275
276 public static void setOffline( boolean offline ) {
277 ResourceRequestFactory.offline = offline;
278 }
279
280
281
282
283
284
285 public static boolean isOffline() {
286 return offline;
287 }
288
289 }