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