gcclass hints (YOU NEED TO UPDATE upstream/build/gcclass)
[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 /*
10  GCCLASS_HINT: org.ibex.nestedvm.util.Platform.<clinit> org.ibex.nestedvm.util.Platform$Jdk11.<init>
11  GCCLASS_HINT: org.ibex.nestedvm.util.Platform.<clinit> org.ibex.nestedvm.util.Platform$Jdk12.<init>
12  GCCLASS_HINT: org.ibex.nestedvm.util.Platform.<clinit> org.ibex.nestedvm.util.Platform$Jdk13.<init>
13  GCCLASS_HINT: org.ibex.nestedvm.util.Platform.<clinit> org.ibex.nestedvm.util.Platform$Jdk14.<init>
14 */
15
16 public abstract class Platform {
17     Platform() { }
18     private static final Platform p;
19     
20     static {
21         float version;
22         try {
23             if(getProperty("java.vm.name").equals("SableVM"))
24                 version = 1.2f;
25             else
26                 version = Float.valueOf(getProperty("java.specification.version")).floatValue();
27         } catch(Exception e) {
28             System.err.println("WARNING: " + e + " while trying to find jvm version -  assuming 1.1");
29             version = 1.1f;
30         }
31         String platformClass;
32         if(version >= 1.4f) platformClass = "Jdk14";
33         else if(version >= 1.3f) platformClass = "Jdk13";
34         else if(version >= 1.2f) platformClass = "Jdk12";
35         else if(version >= 1.1f) platformClass = "Jdk11";
36         else throw new Error("JVM Specification version: " + version + " is too old. (see org.ibex.util.Platform to add support)");
37         
38         try {
39             p = (Platform) Class.forName(Platform.class.getName() + "$" + platformClass).newInstance();
40         } catch(Exception e) {
41             e.printStackTrace();
42             throw new Error("Error instansiating platform class");
43         }
44     }
45     
46     public static String getProperty(String key) {
47         try {
48             return System.getProperty(key);
49         } catch(SecurityException e) {
50             return null;
51         }
52     }
53     
54     
55     abstract boolean _atomicCreateFile(File f) throws IOException;
56     public static boolean atomicCreateFile(File f) throws IOException { return p._atomicCreateFile(f); }
57     
58     abstract void _socketHalfClose(Socket s, boolean output) throws IOException;
59     public static void socketHalfClose(Socket s, boolean output) throws IOException { p._socketHalfClose(s,output); }
60     
61     abstract void _socketSetKeepAlive(Socket s, boolean on) throws SocketException;
62     public static void socketSetKeepAlive(Socket s, boolean on) throws SocketException { p._socketSetKeepAlive(s,on); }
63     
64     abstract InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException;
65     public static InetAddress inetAddressFromBytes(byte[] a) throws UnknownHostException { return p._inetAddressFromBytes(a); }
66     
67     abstract String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l);
68     public static String timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) { return p._timeZoneGetDisplayName(tz,dst,showlong,l); }
69     public static String timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong) { return timeZoneGetDisplayName(tz,dst,showlong,Locale.getDefault()); }
70     
71     abstract RandomAccessFile _truncatedRandomAccessFile(File f, String mode) throws IOException;
72     public static RandomAccessFile truncatedRandomAccessFile(File f, String mode) throws IOException { return p._truncatedRandomAccessFile(f,mode); }
73     
74     static class Jdk11 extends Platform {
75         boolean _atomicCreateFile(File f) throws IOException {
76             // This is not atomic, but its the best we can do on jdk 1.1
77             if(f.exists()) return false;
78             new FileOutputStream(f).close();
79             return true;
80         }
81         void _socketHalfClose(Socket s, boolean output) throws IOException {
82             throw new IOException("half closing sockets not supported");
83         }
84         InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException {
85             if(a.length != 4) throw new UnknownHostException("only ipv4 addrs supported");
86             return InetAddress.getByName(""+(a[0]&0xff)+"."+(a[1]&0xff)+"."+(a[2]&0xff)+"."+(a[3]&0xff));
87         }
88         void _socketSetKeepAlive(Socket s, boolean on) throws SocketException {
89             if(on) throw new SocketException("keepalive not supported");
90         }
91         String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) {
92             String[][] zs  = new DateFormatSymbols(l).getZoneStrings();
93             String id = tz.getID();
94             for(int i=0;i<zs.length;i++)
95                 if(zs[i][0].equals(id))
96                     return zs[i][dst ? (showlong ? 3 : 4) : (showlong ? 1 : 2)];
97             StringBuffer sb = new StringBuffer("GMT");
98             int off = tz.getRawOffset() / 1000;
99             if(off < 0) { sb.append("-"); off = -off; }
100             else sb.append("+");
101             sb.append(off/3600); off = off%3600;
102             if(off > 0) sb.append(":").append(off/60); off=off%60;
103             if(off > 0) sb.append(":").append(off);
104             return sb.toString();
105         }
106         
107         RandomAccessFile _truncatedRandomAccessFile(File f, String mode) throws IOException {
108             new FileOutputStream(f).close();
109             return new RandomAccessFile(f,mode);
110         }
111     }
112     
113     static class Jdk12 extends Jdk11 {
114         boolean _atomicCreateFile(File f) throws IOException {
115             return f.createNewFile();
116         }
117         
118         String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) {
119             return tz.getDisplayName(dst,showlong ? TimeZone.LONG : TimeZone.SHORT, l);
120         }
121         
122         RandomAccessFile _truncatedRandomAccessFile(File f, String mode) throws IOException {
123             RandomAccessFile raf = new RandomAccessFile(f,mode);
124             raf.setLength(0);
125             return raf;
126         }       
127     }
128     
129     static class Jdk13 extends Jdk12 {
130         void _socketHalfClose(Socket s, boolean output) throws IOException {
131             if(output) s.shutdownOutput();
132             else s.shutdownInput();
133         }
134         
135         void _socketSetKeepAlive(Socket s, boolean on) throws SocketException {
136             s.setKeepAlive(on);
137         }
138     }
139     
140     static class Jdk14 extends Jdk13 {
141         InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException { return InetAddress.getByAddress(a); } 
142     }
143 }