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