sourceError.html 7.4 KB
Newer Older
1
<!-- can not use doctype -->
2
<!--
3
Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, Version 1.0,
4 5
and under the Eclipse Public License, Version 1.0
(http://h2database.com/html/license.html).
6 7
Initial Developer: H2 Group
-->
8 9
<html><head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
10
<title>Error Analyzer</title>
11
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
12
<style type="text/css">
13 14
body {
    max-width: none;
Thomas Mueller's avatar
Thomas Mueller committed
15
    width: inherit;
16
}
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
a {
    text-decoration: underline;
    font-weight: normal;
    color: #0000ff;
}
a.selected {
    text-decoration: none;
    font-weight: bold;
    color: #000000;
}
a.disabled {
    text-decoration: none;
    font-weight: normal;
    color: lightGray;
}
32
input {
33
    vertical-align: middle;
34
}
35 36 37 38 39
</style>

<script type="text/javascript">
//<!--

Thomas Mueller's avatar
Thomas Mueller committed
40 41 42 43 44 45 46 47 48 49 50 51 52
function getVersion(build) {
    if (build == 64) {
        return '1.0.' + build;
    } else if (build >= 146 && build != 147) {
        return '1.3.' + build;
    } else if (build >= 120) {
        return '1.2.' + build;
    } else if (build >= 100) {
        return '1.1.' + build;
    }
    return '1.0.' + build;
}

53
function get(id) {
54
    return document.getElementById(id);
55 56
}

57 58 59
var lastError = '';
var hasData = false;
var errorCode = '0';
60
var build = 100;
61

62
function goDetails(code) {
63 64 65 66 67
    code = code.replace('21S', '210');
    code = code.replace('42S', '421');
    code = code.replace('HY', '50');
    code = code.replace('C', '1');
    code = code.replace('T', '2');
68
    get('more').src = 'http://h2database.com/javadoc/org/h2/constant/ErrorCode.html#c' + code;
69 70
}

71
function go(file, line) {
72
    var url;
73
    if (get('rawSource').checked == true) {
74 75 76 77 78 79
        url = "source.html?file=";
        url += file;
        url += "&line=";
        url += line;
        url += "&build=";
        url += build;
80
    } else {
81 82 83 84 85
        if (build && build > 0) {
            var tag = 'tags/version-' + getVersion(build) + '/h2';
        } else {
            var tag = 'trunk/h2';
        }
86 87 88 89 90 91 92
        url = 'http://code.google.com/p/h2database/source/browse/';
        url += tag;
        url += '/src/main/';
        url += file;
        url += '#';
        url += line;
    }
93 94
    get('file').innerHTML = file;
    get('code').src = url;
95 96 97
}

function convert() {
98
    try {
99
        var s = get('error').value;
100 101 102 103 104 105 106 107
        if(lastError == s) {
            return;
        }
        lastError = s;
        var result = '';
        hasData = false;
        var idx = s.lastIndexOf("[");
        if (idx >= 0) {
108
            get('message').innerHTML = s.substring(0, idx);
109 110 111 112
            var end = s.indexOf("]", idx);
            errorCode = s.substring(idx + 1, end);
            hasData = true;
            idx = errorCode.indexOf("-");
113
            build = parseInt(errorCode.substring(idx + 1));
Thomas Mueller's avatar
Thomas Mueller committed
114
            get('version').innerHTML = getVersion(build);
115 116 117 118
            errorCode = errorCode.substring(0, idx);
            while (errorCode.length > 1 && errorCode.charAt(0) == '0') {
                errorCode = errorCode.substring(1);
            }
119
            get('errorCode').innerHTML = errorCode;
120 121 122 123
            goDetails(errorCode);
            s = s.substring(end + 1);
        }
        idx = 0;
124 125
        s = s.replace(/\t/g, " ");
        s = s.replace(/ +/g, " ");
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
        while (true) {
            var start = s.indexOf("at org.h2.", idx);
            if (start < 0) {
                result += s.substring(idx);
                break;
            }
            start += 3; // skip 'at '
            if (idx > 0) {
                result += s.substring(idx, start);
            }
            var end = s.indexOf(')', start);
            if (end < 0) {
                result += s.substring(idx);
                break;
            }
            var element = s.substring(start, end + 1);
            var open = element.lastIndexOf('(');
            var dotMethod = element.lastIndexOf('.', open - 1);
            var dotClass = element.lastIndexOf('.', dotMethod - 1);
            var packageName = element.substring(0, dotClass);
            var colon = element.lastIndexOf(':');
            var file = element.substring(open + 1, colon);
            var lineNumber = element.substring(colon + 1, element.length - 1);
            var fullFileName = packageName.replace(/\./g, '/') + "/" + file;
            result += "<a href='javascript:go(\"";
            result += fullFileName;
            result += "\",";
            result += lineNumber;
            result += ")'>";
            result += element;
156
            result += "<" + "/a>";
157 158 159 160 161
            hasData = true;
            idx = end + 1;
        }
        result = result.replace(/[\n\r]+/g, "<br/>");
        result = result.replace(/ at /g, "");
162
        get('links').innerHTML = result;
163
        select('input');
164
    } catch(e) {
165 166
        hasData = false;
        alert('Can not parse the stack trace: ' + e);
167 168 169 170 171
    }

}

function select(id) {
172 173 174 175 176 177 178 179
    get('input').style.display = 'none';
    get('details').style.display = 'none';
    get('source').style.display = 'none';
    get('inputTab').className = '';
    get('detailsTab').className = hasData ? '' : 'disabled';
    get('sourceTab').className = hasData ? '' : 'disabled';
    get(id + 'Tab').className = 'selected';
    get(id).style.display = '';
180 181 182 183
    if(id=='details') {
        goDetails(errorCode);
    }
    sizeTextArea();
184 185 186 187
}

function sizeTextArea() {
    var height=document.body.clientHeight;
188
    var error = get('error');
189
    error.style.height = (height - error.offsetTop - 25) + 'px';
190
    var more = get('more');
191
    more.style.height = (height - more.offsetTop - 25) + 'px';
192 193
    var code = get('code');
    code.style.height = (height - get('sourceTable').offsetTop - code.offsetTop - 30) + 'px';
194 195 196 197 198
}

//-->
</script>

199 200 201
</head>
<body style="margin:20px" onresize="sizeTextArea();" onload="sizeTextArea();" >

202
<h1>Error Analyzer</h1>
203
<b><a href="../html/main.html">Home</a></b><br />
204
<h2>
Thomas Mueller's avatar
Thomas Mueller committed
205 206 207
    <a href="javascript:select('input')" id = "inputTab">Input</a>&nbsp;
    <a href="javascript:select('details')" id = "detailsTab">Details</a>&nbsp;
    <a href="javascript:select('source')" id = "sourceTab">Source Code</a>
208 209
</h2>
<hr/>
Thomas Mueller's avatar
Thomas Mueller committed
210
<div id = "input">
211
    <p>Paste the error message and stack trace below and click on 'Details' or 'Source Code': </p>
Thomas Mueller's avatar
Thomas Mueller committed
212
    <textarea id = "error" cols="100" style="width: 100%; overflow: auto;" rows="20"
213 214 215 216 217 218 219 220
        onChange="convert()"
        onSelect="convert()"
        onKeyUp="convert()"
        onKeyPress="convert()"
        onFocus="convert()"
        onBlur="convert()"
    >
    </textarea>
221
</div>
Thomas Mueller's avatar
Thomas Mueller committed
222 223 224
<div id = "details">
    <p><b>Error Code: </b><span id = "errorCode"></span></p>
    <p><b>Product Version: </b><span id = "version"></span></p>
225
    <p><b>Message: </b></p>
Thomas Mueller's avatar
Thomas Mueller committed
226
    <p id = "message"></p>
227
    <p><b>More Information:</b></p>
Thomas Mueller's avatar
Thomas Mueller committed
228
    <iframe id = "more" frameborder="0" marginwidth="0" marginheight="0" width="100%" height="100px" src="">
229
    </iframe>
230
</div>
Thomas Mueller's avatar
Thomas Mueller committed
231 232
<div id = "source">
    <table id = "sourceTable" style="border:0px" width="100%"><tr>
233 234
    <td style="border:0px" width="30px">
        <p><b>Stack Trace: </b></p>
Thomas Mueller's avatar
Thomas Mueller committed
235
        <p id = "links"></p>
236
    </td><td style="border:0px" width="90%">
Thomas Mueller's avatar
Thomas Mueller committed
237 238 239
        <p><b>Source File: </b><span id = "file"></span><br />
        Raw file <input type="checkbox" id = "rawSource" /> (fast; only Firefox)</p>
        <iframe id = "code" frameborder="0" marginwidth="0" marginheight="0" width="100%" height="100px" src="">
240 241 242
        </iframe>
    </td>
    </tr></table>
243 244 245 246 247 248
</div>
<script type="text/javascript">
//<!--
select('input');
//-->
</script>
249 250
<!-- analytics -->
</body></html>