javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/ConvertTypes.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 15 Apr 2013 18:30:30 +0200
branchfx
changeset 990 9ddce13e8ff9
parent 963 62d77cc38117
child 992 bae9b96bfd2c
permissions -rw-r--r--
Can call @OnFunction
jaroslav@813
     1
/**
jaroslav@813
     2
 * Back 2 Browser Bytecode Translator
jaroslav@813
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@813
     4
 *
jaroslav@813
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@813
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@813
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@813
     8
 *
jaroslav@813
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@813
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@813
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@813
    12
 * GNU General Public License for more details.
jaroslav@813
    13
 *
jaroslav@813
    14
 * You should have received a copy of the GNU General Public License
jaroslav@813
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@813
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@813
    17
 */
jaroslav@813
    18
package org.apidesign.bck2brwsr.htmlpage;
jaroslav@813
    19
jaroslav@990
    20
import netscape.javascript.JSObject;
jaroslav@813
    21
import org.apidesign.bck2brwsr.core.JavaScriptBody;
jaroslav@813
    22
jaroslav@813
    23
/**
jaroslav@813
    24
 *
jaroslav@813
    25
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@813
    26
 */
jaroslav@813
    27
public final class ConvertTypes {
jaroslav@813
    28
    ConvertTypes() {
jaroslav@813
    29
    }
jaroslav@813
    30
    
jaroslav@813
    31
    public static String toString(Object object, String property) {
jaroslav@813
    32
        Object ret = getProperty(object, property);
jaroslav@813
    33
        return ret == null ? null : ret.toString();
jaroslav@813
    34
    }
jaroslav@813
    35
jaroslav@813
    36
    public static double toDouble(Object object, String property) {
jaroslav@813
    37
        Object ret = getProperty(object, property);
jaroslav@813
    38
        return ret instanceof Number ? ((Number)ret).doubleValue() : Double.NaN;
jaroslav@813
    39
    }
jaroslav@813
    40
jaroslav@813
    41
    public static int toInt(Object object, String property) {
jaroslav@813
    42
        Object ret = getProperty(object, property);
jaroslav@813
    43
        return ret instanceof Number ? ((Number)ret).intValue() : Integer.MIN_VALUE;
jaroslav@813
    44
    }
jaroslav@906
    45
jaroslav@906
    46
    public static <T> T toModel(Class<T> modelClass, Object object, String property) {
jaroslav@906
    47
        Object ret = getProperty(object, property);
jaroslav@990
    48
        if (ret instanceof JSObject) {
jaroslav@990
    49
            Object real = ((JSObject)ret).getMember("koModel");
jaroslav@990
    50
            if (real != null) {
jaroslav@990
    51
                ret = real;
jaroslav@990
    52
            }
jaroslav@990
    53
        }
jaroslav@906
    54
        if (ret == null || modelClass.isInstance(ret)) {
jaroslav@906
    55
            return modelClass.cast(ret);
jaroslav@906
    56
        }
jaroslav@906
    57
        throw new IllegalStateException("Value " + ret + " is not of type " + modelClass);
jaroslav@906
    58
    }
jaroslav@813
    59
    
jaroslav@920
    60
    public static String toJSON(Object value) {
jaroslav@920
    61
        if (value == null) {
jaroslav@920
    62
            return "null";
jaroslav@920
    63
        }
jaroslav@920
    64
        if (value instanceof String) {
jaroslav@920
    65
            return '"' + 
jaroslav@920
    66
                ((String)value).
jaroslav@920
    67
                    replace("\"", "\\\"").
jaroslav@920
    68
                    replace("\n", "\\n").
jaroslav@920
    69
                    replace("\r", "\\r").
jaroslav@920
    70
                    replace("\t", "\\t")
jaroslav@920
    71
                + '"';
jaroslav@920
    72
        }
jaroslav@920
    73
        return value.toString();
jaroslav@920
    74
    }
jaroslav@920
    75
    
jaroslav@813
    76
    @JavaScriptBody(args = { "object", "property" },
jaroslav@879
    77
        body = "if (property === null) return object;\n"
jaroslav@879
    78
        + "var p = object[property]; return p ? p : null;"
jaroslav@813
    79
    )
jaroslav@813
    80
    private static Object getProperty(Object object, String property) {
jaroslav@990
    81
        if (property == null) {
jaroslav@990
    82
            return object;
jaroslav@990
    83
        } else {
jaroslav@990
    84
            if (object instanceof JSObject) {
jaroslav@990
    85
                JSObject jo = (JSObject)object;
jaroslav@990
    86
                return jo.getMember(property);
jaroslav@990
    87
            }
jaroslav@990
    88
            return null;
jaroslav@990
    89
        }
jaroslav@813
    90
    }
jaroslav@954
    91
    
jaroslav@954
    92
    public static String createJSONP(Object[] jsonResult, Runnable whenDone) {
jaroslav@954
    93
        int h = whenDone.hashCode();
jaroslav@954
    94
        String name;
jaroslav@954
    95
        for (;;) {
jaroslav@954
    96
            name = "jsonp" + Integer.toHexString(h);
jaroslav@954
    97
            if (defineIfUnused(name, jsonResult, whenDone)) {
jaroslav@954
    98
                return name;
jaroslav@954
    99
            }
jaroslav@954
   100
            h++;
jaroslav@954
   101
        }
jaroslav@954
   102
    }
jaroslav@934
   103
jaroslav@954
   104
    @JavaScriptBody(args = { "name", "arr", "run" }, body = 
jaroslav@954
   105
        "if (window[name]) return false;\n "
jaroslav@954
   106
      + "window[name] = function(data) {\n "
jaroslav@963
   107
      + "  delete window[name];\n"
jaroslav@963
   108
      + "  var el = window.document.getElementById(name);\n"
jaroslav@963
   109
      + "  el.parentNode.removeChild(el);\n"
jaroslav@954
   110
      + "  arr[0] = data;\n"
jaroslav@954
   111
      + "  run.run__V();\n"
jaroslav@963
   112
      + "};\n"
jaroslav@954
   113
      + "return true;\n"
jaroslav@954
   114
    )
jaroslav@954
   115
    private static boolean defineIfUnused(String name, Object[] arr, Runnable run) {
jaroslav@954
   116
        return true;
jaroslav@954
   117
    }
jaroslav@954
   118
    
jaroslav@934
   119
    @JavaScriptBody(args = { "url", "arr", "callback" }, body = ""
jaroslav@934
   120
        + "var request = new XMLHttpRequest();\n"
jaroslav@934
   121
        + "request.open('GET', url, true);\n"
jaroslav@934
   122
        + "request.setRequestHeader('Content-Type', 'application/json; charset=utf-8');\n"
jaroslav@934
   123
        + "request.onreadystatechange = function() {\n"
jaroslav@934
   124
        + "  if (this.readyState!==4) return;\n"
jaroslav@941
   125
        + "  try {\n"
jaroslav@941
   126
        + "    arr[0] = eval('(' + this.response + ')');\n"
jaroslav@941
   127
        + "  } catch (error) {;\n"
jaroslav@941
   128
        + "    throw 'Cannot parse' + error + ':' + this.response;\n"
jaroslav@941
   129
        + "  };\n"
jaroslav@934
   130
        + "  callback.run__V();\n"
jaroslav@934
   131
        + "};"
jaroslav@934
   132
        + "request.send();"
jaroslav@934
   133
    )
jaroslav@954
   134
    private static void loadJSON(
jaroslav@934
   135
        String url, Object[] jsonResult, Runnable whenDone
jaroslav@949
   136
    ) {
jaroslav@949
   137
    }
jaroslav@934
   138
    
jaroslav@954
   139
    public static void loadJSON(
jaroslav@954
   140
        String url, Object[] jsonResult, Runnable whenDone, String jsonp
jaroslav@954
   141
    ) {
jaroslav@954
   142
        if (jsonp == null) {
jaroslav@954
   143
            loadJSON(url, jsonResult, whenDone);
jaroslav@954
   144
        } else {
jaroslav@954
   145
            loadJSONP(url, jsonp);
jaroslav@954
   146
        }
jaroslav@954
   147
    }
jaroslav@954
   148
    
jaroslav@954
   149
    @JavaScriptBody(args = { "url", "jsonp" }, body = 
jaroslav@954
   150
        "var scrpt = window.document.createElement('script');\n "
jaroslav@954
   151
        + "scrpt.setAttribute('src', url);\n "
jaroslav@954
   152
        + "scrpt.setAttribute('id', jsonp);\n "
jaroslav@954
   153
        + "scrpt.setAttribute('type', 'text/javascript');\n "
jaroslav@954
   154
        + "var body = document.getElementsByTagName('body')[0];\n "
jaroslav@954
   155
        + "body.appendChild(scrpt);\n"
jaroslav@954
   156
    )
jaroslav@954
   157
    private static void loadJSONP(String url, String jsonp) {
jaroslav@954
   158
        
jaroslav@954
   159
    }
jaroslav@954
   160
    
jaroslav@934
   161
    public static void extractJSON(Object jsonObject, String[] props, Object[] values) {
jaroslav@934
   162
        for (int i = 0; i < props.length; i++) {
jaroslav@934
   163
            values[i] = getProperty(jsonObject, props[i]);
jaroslav@934
   164
        }
jaroslav@934
   165
    }
jaroslav@934
   166
    
jaroslav@813
   167
}