1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package tests.support;
19
20import java.io.FileInputStream;
21import java.io.IOException;
22import java.io.InputStream;
23import java.util.Hashtable;
24
25/**
26 * This class is responsible for providing the dynamic names and addresses for
27 * the java.net classes. There are two directories which need to be placed on an
28 * ftp server and an http server which should accompany this source. The
29 * ftp-files have to be placed on an ftp server and have to be the root of a
30 * user jcltest with password jclpass. The testres files must be available on an
31 * HTTP server and the name and location can be configured below.
32 */
33public class Support_Configuration {
34
35	public static String DomainAddress = "apache.org";
36
37	public static String WebName = "jcltest.";
38
39	public static final String HomeAddress;
40
41	public static String TestResourcesDir = "/testres231";
42
43	public static final String TestResources;
44
45	public static String HomeAddressResponse = "HTTP/1.1 200 OK";
46
47	public static String HomeAddressSoftware = "Jetty(6.0.x)";
48
49	public static String ProxyServerTestHost = "jcltest.apache.org";
50
51	public static String SocksServerTestHost = "jcltest.apache.org";
52
53	public static int SocksServerTestPort = 1080;
54
55	// Need an IP address that does not resolve to a host name
56	public static String UnresolvedIP = "192.168.99.99";
57
58	// the bytes for an address which represents an address which is not
59	// one of the addresses for any of our machines on which tests will run
60	// it is used to verify we get the expected error when we try to bind
61	// to an address that is not one of the machines local addresses
62	public static byte nonLocalAddressBytes[] = { 1, 0, 0, 0 };
63
64	public static String InetTestIP = "127.0.0.1";
65
66	public static String InetTestIP2 = "127.0.0.1";
67
68	public static final String HomeAddress6 = "jcltest6.apache.org";
69
70	public static String ProxyServerTestHostIPv6 = "jcltest6.apache.org";
71
72	// ip address that resolves to a host that is not present on the local
73	// network
74	// this allows us to check the timeouts for connect
75	public static String ResolvedNotExistingHost = "9.26.194.72";
76
77	/**
78	 * You can compute the hash code with the following code: try { String name =
79	 * "whatever.xxx.com";
80	 * System.out.println(InetAddress.getByName(name).hashCode()); } catch
81	 * (UnknownHostException e) {}
82	 */
83
84	public static String FTPTestAddress = "jcltest:jclpass@localhost";
85
86	public static String URLConnectionLastModifiedString = "Mon, 14 Jun 1999 21:06:22 GMT";
87
88	public static long URLConnectionLastModified = 929394382000L;
89
90	public static boolean RunCommTests = false;
91
92	public static String Port1 = "COM1";
93
94	public static String Port2 = "COM2";
95
96	static Hashtable<String, String> props = null;
97	static {
98		loadProperties();
99		HomeAddress = WebName + DomainAddress;
100		TestResources = HomeAddress + TestResourcesDir;
101	}
102
103	static void loadProperties() {
104		InputStream in = null;
105		Hashtable<String, String> props = new Hashtable<String, String>();
106
107		String iniName = System.getProperty("test.ini.file", "JCLAuto.ini");
108		if (System.getProperty("test.comm") != null) {
109			RunCommTests = true;
110		}
111
112		try {
113			in = new FileInputStream(iniName);
114		} catch (IOException e) {
115		} catch (Exception e) {
116			System.out.println("SupportConfiguration.loadProperties()");
117			System.out.println(e);
118			e.printStackTrace();
119		}
120		if (in == null) {
121			try {
122				Class<?> cl = Class
123						.forName("com.ibm.support.Support_Configuration");
124				in = cl.getResourceAsStream(iniName);
125			} catch (ClassNotFoundException e) {
126			}
127		}
128		try {
129			if (in != null) {
130				load(in, props);
131			}
132		} catch (IOException e) {
133		}
134		if (props.size() == 0) {
135            return;
136        }
137		String value;
138
139		value = props.get("DomainAddress");
140		if (value != null) {
141            DomainAddress = value;
142        }
143
144		value = props.get("WebName");
145		if (value != null) {
146            WebName = value;
147        }
148
149		value = props.get("TestResourcesDir");
150		if (value != null) {
151            TestResourcesDir = value;
152        }
153		value = props.get("HomeAddressResponse");
154		if (value != null) {
155            HomeAddressResponse = value;
156        }
157
158		value = props.get("HomeAddressSoftware");
159		if (value != null) {
160            HomeAddressSoftware = value;
161        }
162
163		value = props.get("ProxyServerTestHost");
164		if (value != null) {
165            ProxyServerTestHost = value;
166        }
167
168		value = props.get("SocksServerTestHost");
169		if (value != null) {
170            SocksServerTestHost = value;
171        }
172
173		value = props.get("SocksServerTestPort");
174		if (value != null) {
175            SocksServerTestPort = Integer.parseInt(value);
176        }
177
178		value = props.get("UnresolvedIP");
179		if (value != null) {
180            UnresolvedIP = value;
181        }
182
183		value = props.get("FTPTestAddress");
184		if (value != null) {
185            FTPTestAddress = value;
186        }
187
188		value = props.get("URLConnectionLastModifiedString");
189		if (value != null) {
190            URLConnectionLastModifiedString = value;
191        }
192
193		value = props.get("URLConnectionLastModified");
194		if (value != null) {
195            URLConnectionLastModified = Long.parseLong(value);
196        }
197
198		value = props.get("Port1");
199		if (value != null) {
200            Port1 = value;
201        }
202
203		value = props.get("Port2");
204		if (value != null) {
205            Port2 = value;
206        }
207
208		value = props.get("ProxyServerTestHostIPv6");
209		if (value != null) {
210            ProxyServerTestHostIPv6 = value;
211        }
212
213		value = props.get("ResolvedNotExistingHost");
214		if (value != null) {
215            ResolvedNotExistingHost = value;
216        }
217
218	}
219
220	static void load(InputStream in, Hashtable<String, String> result) throws IOException {
221		int NONE = 0, SLASH = 1, UNICODE = 2, CONTINUE = 3, DONE = 4, IGNORE = 5;
222		int mode = NONE, unicode = 0, count = 0, nextChar;
223		StringBuffer key = new StringBuffer(), value = new StringBuffer(), buffer = key;
224		boolean firstChar = true;
225
226		while ((nextChar = in.read()) != -1) {
227			if (mode == UNICODE) {
228				int digit = Character.digit((char) nextChar, 16);
229				if (digit >= 0) {
230					unicode = (unicode << 4) + digit;
231					if (++count < 4) {
232                        continue;
233                    }
234				}
235				mode = NONE;
236				buffer.append((char) unicode);
237				if (nextChar != '\n') {
238                    continue;
239                }
240			}
241			if (mode == SLASH) {
242				mode = NONE;
243				switch (nextChar) {
244				case '\r':
245					mode = CONTINUE; // Look for a following \n
246					continue;
247				case '\n':
248					mode = IGNORE; // Ignore whitespace on the next line
249					continue;
250				case 'b':
251					nextChar = '\b';
252					break;
253				case 'f':
254					nextChar = '\f';
255					break;
256				case 'n':
257					nextChar = '\n';
258					break;
259				case 'r':
260					nextChar = '\r';
261					break;
262				case 't':
263					nextChar = '\t';
264					break;
265				case 'u':
266					mode = UNICODE;
267					unicode = count = 0;
268					continue;
269				}
270			} else {
271				switch (nextChar) {
272				case '#':
273				case '!':
274					if (firstChar) {
275						while ((nextChar = in.read()) != -1) {
276                            if (nextChar == '\r' || nextChar == '\n') {
277                                break;
278                            }
279                        }
280						continue;
281					}
282					break;
283				case '\n':
284					if (mode == CONTINUE) { // Part of a \r\n sequence
285						mode = IGNORE; // Ignore whitespace on the next line
286						continue;
287					}
288					// fall into the next case
289				case '\r':
290					mode = NONE;
291					firstChar = true;
292					if (key.length() > 0 || buffer == value) {
293                        result.put(key.toString(), value.toString());
294                    }
295					key.setLength(0);
296					value.setLength(0);
297					buffer = key;
298					continue;
299				case '\\':
300					mode = SLASH;
301					continue;
302				case ':':
303				case '=':
304					if (buffer == key) {
305						buffer = value;
306						continue;
307					}
308					break;
309				}
310				char c = (char) nextChar;
311				if ((c >= 0x1c && c <= 0x20) || (c >= 0x9 && c <= 0xd)) {
312					if (mode == CONTINUE) {
313                        mode = IGNORE;
314                    }
315					if (buffer.length() == 0 || mode == IGNORE) {
316                        continue;
317                    }
318					if (buffer == key) {
319						mode = DONE;
320						continue;
321					}
322				}
323				if (mode == IGNORE || mode == CONTINUE) {
324                    mode = NONE;
325                }
326			}
327			firstChar = false;
328			if (mode == DONE) {
329				buffer = value;
330				mode = NONE;
331			}
332			buffer.append((char) nextChar);
333		}
334		if (key.length() > 0 || buffer == value) {
335            result.put(key.toString(), value.toString());
336        }
337	}
338
339}
340