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.
5 package org.ibex.nestedvm.util;
11 import java.text.DateFormatSymbols;
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>
20 public abstract class Platform {
22 private static final Platform p;
27 if(getProperty("java.vm.name").equals("SableVM"))
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");
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)");
43 p = (Platform) Class.forName(Platform.class.getName() + "$" + platformClass).newInstance();
44 } catch(Exception e) {
46 throw new Error("Error instansiating platform class");
50 public static String getProperty(String key) {
52 return System.getProperty(key);
53 } catch(SecurityException e) {
59 abstract boolean _atomicCreateFile(File f) throws IOException;
60 public static boolean atomicCreateFile(File f) throws IOException { return p._atomicCreateFile(f); }
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); }
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); }
68 abstract InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException;
69 public static InetAddress inetAddressFromBytes(byte[] a) throws UnknownHostException { return p._inetAddressFromBytes(a); }
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()); }
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); }
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();
85 void _socketHalfClose(Socket s, boolean output) throws IOException {
86 throw new IOException("half closing sockets not supported");
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));
92 void _socketSetKeepAlive(Socket s, boolean on) throws SocketException {
93 if(on) throw new SocketException("keepalive not supported");
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; }
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();
111 RandomAccessFile _truncatedRandomAccessFile(File f, String mode) throws IOException {
112 new FileOutputStream(f).close();
113 return new RandomAccessFile(f,mode);
117 static class Jdk12 extends Jdk11 {
118 boolean _atomicCreateFile(File f) throws IOException {
119 return f.createNewFile();
122 String _timeZoneGetDisplayName(TimeZone tz, boolean dst, boolean showlong, Locale l) {
123 return tz.getDisplayName(dst,showlong ? TimeZone.LONG : TimeZone.SHORT, l);
126 RandomAccessFile _truncatedRandomAccessFile(File f, String mode) throws IOException {
127 RandomAccessFile raf = new RandomAccessFile(f,mode);
133 static class Jdk13 extends Jdk12 {
134 void _socketHalfClose(Socket s, boolean output) throws IOException {
135 if(output) s.shutdownOutput();
136 else s.shutdownInput();
139 void _socketSetKeepAlive(Socket s, boolean on) throws SocketException {
144 static class Jdk14 extends Jdk13 {
145 InetAddress _inetAddressFromBytes(byte[] a) throws UnknownHostException { return InetAddress.getByAddress(a); }