make jdk 1.1 compliant part 2
[nestedvm.git] / src / org / ibex / nestedvm / util / Platform.java
1 package org.ibex.nestedvm.util;
2
3 import java.io.*;
4 import java.net.*;
5 import java.util.*;
6
7 import java.text.DateFormatSymbols;
8
9 public abstract class Platform {
10     Platform() { }
11     private static final Platform p=null;
12     
13     abstract boolean _atomicCreateFile(File f) throws IOException;
14     public static boolean atomicCreateFile(File f) throws IOException { return p._atomicCreateFile(f); }
15     
16     abstract void _socketHalfClose(Socket s, boolean output) throws IOException;
17     public static void socketHalfClose(Socket s, boolean output) throws IOException { p._socketHalfClose(s,output); }
18     
19     abstract void _socketSetKeepAlive(Socket s, boolean on) throws SocketException;
20     public static void socketSetKeepAlive(Socket s, boolean on) throws SocketException { p._socketSetKeepAlive(s,on); }
21     
22     abstract InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException;
23     public static InetAddress inetAddressFromBytes(byte[] a) throws UnknownHostException { return p._inetAddressFromBytes(a); }
24     
25     abstract String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l);
26     public static String timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) { return p._timeZoneGetDisplayName(tz,dst,showlong,l); }
27     public static String timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong) { return timeZoneGetDisplayName(tz,dst,showlong,Locale.getDefault()); }
28     
29     static class Jdk11 extends Platform {
30         boolean _atomicCreateFile(File f) throws IOException {
31             throw new Error("FIXME");
32         }
33         void _socketHalfClose(Socket s, boolean output) throws IOException {
34             throw new IOException("half closing sockets not supported");
35         }
36         InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException {
37             if(a.length != 4) throw new UnknownHostException("only ipv4 addrs supported");
38             return InetAddress.getByName(""+(a[0]&0xff)+"."+(a[1]&0xff)+"."+(a[2]&0xff)+"."+(a[3]&0xff));
39         }
40         void _socketSetKeepAlive(Socket s, boolean on) throws SocketException {
41             if(on) throw new SocketException("keepalive not supported");
42         }
43         String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) {
44             String[][] zs  = new DateFormatSymbols(l).getZoneStrings();
45             String id = tz.getID();
46             for(int i=0;i<zs.length;i++)
47                 if(zs[i][0].equals(id))
48                     return zs[i][dst ? (showlong ? 3 : 4) : (showlong ? 1 : 2)];
49             StringBuffer sb = new StringBuffer("GMT");
50             int off = tz.getRawOffset() / 1000;
51             if(off < 0) { sb.append("-"); off = -off; }
52             else sb.append("+");
53             sb.append(off/3600); off = off%3600;
54             if(off > 0) sb.append(":").append(off/60); off=off%60;
55             if(off > 0) sb.append(":").append(off);
56             return sb.toString();
57         }
58     }
59     
60     static class Jdk12 extends Jdk11 {
61         boolean _atomicCreateFile(File f) throws IOException {
62             return f.createNewFile();
63         }
64         
65         String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) {
66             return tz.getDisplayName(dst,showlong ? TimeZone.LONG : TimeZone.SHORT, l);
67         }
68     }
69     
70     static class Jdk13 extends Jdk12 {
71         void _socketHalfClose(Socket s, boolean output) throws IOException {
72             if(output) s.shutdownOutput();
73             else s.shutdownInput();
74         }
75         
76         void _socketSetKeepAlive(Socket s, boolean on) throws SocketException {
77             s.setKeepAlive(on);
78         }
79     }
80     
81     static class Jdk14 extends Jdk13 {
82         InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException { return InetAddress.getByAddress(a); } 
83     }
84 }