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
358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String DomainAddress = "apache.org";
36e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String WebName = "jcltest.";
38e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static final String HomeAddress;
40e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String TestResourcesDir = "/testres231";
42e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static final String TestResources;
44e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String HomeAddressResponse = "HTTP/1.1 200 OK";
46e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String HomeAddressSoftware = "Jetty(6.0.x)";
48e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String ProxyServerTestHost = "jcltest.apache.org";
50e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String SocksServerTestHost = "jcltest.apache.org";
52e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static int SocksServerTestPort = 1080;
54e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // Need an IP address that does not resolve to a host name
568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String UnresolvedIP = "192.168.99.99";
57e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // the bytes for an address which represents an address which is not
598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // one of the addresses for any of our machines on which tests will run
608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // it is used to verify we get the expected error when we try to bind
618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // to an address that is not one of the machines local addresses
628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static byte nonLocalAddressBytes[] = { 1, 0, 0, 0 };
63e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String InetTestIP = "127.0.0.1";
65e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String InetTestIP2 = "127.0.0.1";
67e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static final String HomeAddress6 = "jcltest6.apache.org";
69e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String ProxyServerTestHostIPv6 = "jcltest6.apache.org";
71e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // ip address that resolves to a host that is not present on the local
738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // network
748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // this allows us to check the timeouts for connect
758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String ResolvedNotExistingHost = "9.26.194.72";
76e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * You can compute the hash code with the following code: try { String name =
798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * "whatever.xxx.com";
808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * System.out.println(InetAddress.getByName(name).hashCode()); } catch
818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * (UnknownHostException e) {}
828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
83e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String FTPTestAddress = "jcltest:jclpass@localhost";
85e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String URLConnectionLastModifiedString = "Mon, 14 Jun 1999 21:06:22 GMT";
87e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static long URLConnectionLastModified = 929394382000L;
89e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static boolean RunCommTests = false;
91e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String Port1 = "COM1";
93e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public static String Port2 = "COM2";
95e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    static Hashtable<String, String> props = null;
97e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    static {
998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        loadProperties();
1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        HomeAddress = WebName + DomainAddress;
1018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        TestResources = HomeAddress + TestResourcesDir;
1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
103e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    static void loadProperties() {
1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        InputStream in = null;
1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        Hashtable<String, String> props = new Hashtable<String, String>();
107e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String iniName = System.getProperty("test.ini.file", "JCLAuto.ini");
1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (System.getProperty("test.comm") != null) {
1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            RunCommTests = true;
1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        try {
1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            in = new FileInputStream(iniName);
1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IOException e) {
1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (Exception e) {
1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            System.out.println("SupportConfiguration.loadProperties()");
1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            System.out.println(e);
1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            e.printStackTrace();
1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (in == null) {
1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            try {
1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                Class<?> cl = Class
1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        .forName("com.ibm.support.Support_Configuration");
1258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                in = cl.getResourceAsStream(iniName);
1268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } catch (ClassNotFoundException e) {
1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        try {
1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            if (in != null) {
1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                load(in, props);
1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IOException e) {
1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (props.size() == 0) {
136e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            return;
137e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String value;
139e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("DomainAddress");
1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
142e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            DomainAddress = value;
143e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
144e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("WebName");
1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
147e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            WebName = value;
148e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
149e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("TestResourcesDir");
1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
152e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            TestResourcesDir = value;
153e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("HomeAddressResponse");
1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
156e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            HomeAddressResponse = value;
157e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
158e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("HomeAddressSoftware");
1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
161e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            HomeAddressSoftware = value;
162e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
163e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("ProxyServerTestHost");
1658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
166e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            ProxyServerTestHost = value;
167e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
168e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("SocksServerTestHost");
1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
171e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            SocksServerTestHost = value;
172e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
173e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("SocksServerTestPort");
1758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
176e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            SocksServerTestPort = Integer.parseInt(value);
177e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
178e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("UnresolvedIP");
1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
181e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            UnresolvedIP = value;
182e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
183e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("FTPTestAddress");
1858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
186e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            FTPTestAddress = value;
187e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
188e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("URLConnectionLastModifiedString");
1908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
191e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            URLConnectionLastModifiedString = value;
192e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
193e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("URLConnectionLastModified");
1958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
196e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            URLConnectionLastModified = Long.parseLong(value);
197e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
198e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
1998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("Port1");
2008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
201e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Port1 = value;
202e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
203e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("Port2");
2058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
206e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            Port2 = value;
207e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
208e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("ProxyServerTestHostIPv6");
2108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
211e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            ProxyServerTestHostIPv6 = value;
212e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
213e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        value = props.get("ResolvedNotExistingHost");
2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (value != null) {
216e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            ResolvedNotExistingHost = value;
217e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
218e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
220e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    static void load(InputStream in, Hashtable<String, String> result) throws IOException {
2228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        int NONE = 0, SLASH = 1, UNICODE = 2, CONTINUE = 3, DONE = 4, IGNORE = 5;
2238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        int mode = NONE, unicode = 0, count = 0, nextChar;
2248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        StringBuffer key = new StringBuffer(), value = new StringBuffer(), buffer = key;
2258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        boolean firstChar = true;
226e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        while ((nextChar = in.read()) != -1) {
2288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            if (mode == UNICODE) {
2298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                int digit = Character.digit((char) nextChar, 16);
2308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                if (digit >= 0) {
2318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    unicode = (unicode << 4) + digit;
2328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    if (++count < 4) {
233e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                        continue;
234e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    }
2358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
2368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                mode = NONE;
2378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                buffer.append((char) unicode);
2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                if (nextChar != '\n') {
239e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    continue;
240e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                }
2418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
2428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            if (mode == SLASH) {
2438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                mode = NONE;
2448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                switch (nextChar) {
2458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '\r':
2468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        mode = CONTINUE; // Look for a following \n
2478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        continue;
2488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '\n':
2498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        mode = IGNORE; // Ignore whitespace on the next line
2508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        continue;
2518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case 'b':
2528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        nextChar = '\b';
2538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
2548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case 'f':
2558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        nextChar = '\f';
2568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
2578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case 'n':
2588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        nextChar = '\n';
2598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
2608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case 'r':
2618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        nextChar = '\r';
2628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
2638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case 't':
2648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        nextChar = '\t';
2658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
2668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case 'u':
2678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        mode = UNICODE;
2688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        unicode = count = 0;
2698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        continue;
2708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
2718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } else {
2728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                switch (nextChar) {
2738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '#':
2748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '!':
2758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        if (firstChar) {
2768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            while ((nextChar = in.read()) != -1) {
2778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                if (nextChar == '\r' || nextChar == '\n') {
2788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                    break;
2798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                }
280e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                            }
2818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            continue;
282e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                        }
2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
2848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '\n':
2858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        if (mode == CONTINUE) { // Part of a \r\n sequence
2868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            mode = IGNORE; // Ignore whitespace on the next line
2878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            continue;
2888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        }
2898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        // fall into the next case
2908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '\r':
2918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        mode = NONE;
2928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        firstChar = true;
2938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        if (key.length() > 0 || buffer == value) {
2948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            result.put(key.toString(), value.toString());
2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        }
2968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        key.setLength(0);
2978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        value.setLength(0);
2988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        buffer = key;
2998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        continue;
3008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '\\':
3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        mode = SLASH;
3028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        continue;
3038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case ':':
3048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    case '=':
3058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        if (buffer == key) {
3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            buffer = value;
3078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            continue;
3088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        }
3098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        break;
3108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                char c = (char) nextChar;
3128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                if ((c >= 0x1c && c <= 0x20) || (c >= 0x9 && c <= 0xd)) {
3138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    if (mode == CONTINUE) {
314e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                        mode = IGNORE;
315e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    }
3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    if (buffer.length() == 0 || mode == IGNORE) {
3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        continue;
3188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    if (buffer == key) {
3208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        mode = DONE;
321e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                        continue;
322e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    }
3238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                if (mode == IGNORE || mode == CONTINUE) {
325e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    mode = NONE;
326e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                }
3278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
3288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            firstChar = false;
3298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            if (mode == DONE) {
3308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                buffer = value;
3318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                mode = NONE;
3328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
3338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            buffer.append((char) nextChar);
3348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
3358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        if (key.length() > 0 || buffer == value) {
336e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            result.put(key.toString(), value.toString());
337e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
3388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
339e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
340e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes}
341