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