rt/emul/compact/src/main/java/java/lang/System.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 17 Jan 2017 07:04:06 +0100
changeset 1985 cd1cc103a03c
parent 1711 35157f2e7f4d
permissions -rw-r--r--
Implementation of ClassValue for bck2brwsr
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package java.lang;
    19 
    20 import java.io.BufferedOutputStream;
    21 import java.io.ByteArrayInputStream;
    22 import java.io.IOException;
    23 import java.io.InputStream;
    24 import java.io.OutputStream;
    25 import java.io.PrintStream;
    26 import java.util.Properties;
    27 import org.apidesign.bck2brwsr.core.JavaScriptBody;
    28 
    29 /** Poor man's re-implementation of most important System methods.
    30  *
    31  * @author Jaroslav Tulach <jtulach@netbeans.org>
    32  */
    33 public class System {
    34     private System() {
    35     }
    36     
    37     public static void arraycopy(Object value, int srcBegin, Object dst, int dstBegin, int count) {
    38         org.apidesign.bck2brwsr.emul.lang.System.arraycopy(value, srcBegin, dst, dstBegin, count);
    39     }
    40     
    41     public static long currentTimeMillis() {
    42         return org.apidesign.bck2brwsr.emul.lang.System.currentTimeMillis();
    43     }
    44     
    45     public static long nanoTime() {
    46         return org.apidesign.bck2brwsr.emul.lang.System.nanoTime();
    47         
    48     }
    49     
    50     public static int identityHashCode(Object obj) {
    51         return Class.defaultHashCode(obj);
    52     }
    53 
    54     public static String getProperty(String name) {
    55         if ("os.name".equals(name)) {
    56             return userAgent();
    57         }
    58         return null;
    59     }
    60     
    61     @JavaScriptBody(args = {}, body = "return (typeof navigator !== 'undefined') ? navigator.userAgent : 'unknown';")
    62     private static native String userAgent();
    63     
    64     public static String getProperty(String key, String def) {
    65         return def;
    66     }
    67     
    68     public static Properties getProperties() {
    69         throw new SecurityException();
    70     }
    71     
    72     public static void setProperties(Properties p) {
    73         throw new SecurityException();
    74     }
    75     
    76     /**
    77      * Returns the system-dependent line separator string.  It always
    78      * returns the same value - the initial value of the {@linkplain
    79      * #getProperty(String) system property} {@code line.separator}.
    80      *
    81      * <p>On UNIX systems, it returns {@code "\n"}; on Microsoft
    82      * Windows systems it returns {@code "\r\n"}.
    83      */
    84     public static String lineSeparator() {
    85         return "\n";
    86     }
    87 
    88     @JavaScriptBody(args = { "exitCode" }, body = ""
    89         + "var xhttp = new XMLHttpRequest();\n"
    90         + "xhttp.open('GET', '/?exit=' + exitCode, true);\n"
    91         + "xhttp.send();\n"
    92         + "window.close();\n"
    93     )
    94     public static void exit(int exitCode) {
    95     }
    96     
    97     public final static InputStream in;
    98 
    99     public final static PrintStream out;
   100 
   101     public final static PrintStream err;
   102     
   103     public static void setOut(PrintStream out) {
   104         throw new SecurityException();
   105     }
   106 
   107     public static void setIn(InputStream in) {
   108         throw new SecurityException();
   109     }
   110 
   111     public static void setErr(PrintStream err) {
   112         throw new SecurityException();
   113     }
   114     
   115     static {
   116         in = new ByteArrayInputStream(new byte[0]);
   117         out = new PrintStream(new BufferedOutputStream(new SystemStream("log")));
   118         err = new PrintStream(new BufferedOutputStream(new SystemStream("warn")));
   119     }
   120 
   121     private static final class SystemStream extends OutputStream {
   122         private final String method;
   123 
   124         public SystemStream(String method) {
   125             this.method = method;
   126         }
   127 
   128         @Override
   129         public void write(byte b[], int off, int len) throws IOException {
   130             write(method, new String(b, off, len, "UTF-8"));
   131         }
   132 
   133         @JavaScriptBody(args = { "method", "b" }, body = "if (typeof console !== 'undefined') console[method](b.toString());")
   134         private static native void write(String method, String b);
   135 
   136         @Override
   137         public void write(int b) throws IOException {
   138             write(new byte[] { (byte)b });
   139         }
   140     } // end of SystemStream
   141 }