summaryrefslogtreecommitdiffstats
path: root/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/delta.js
diff options
context:
space:
mode:
Diffstat (limited to 'simple/simple-http/src/test/java/org/simpleframework/http/socket/table/delta.js')
-rw-r--r--simple/simple-http/src/test/java/org/simpleframework/http/socket/table/delta.js344
1 files changed, 344 insertions, 0 deletions
diff --git a/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/delta.js b/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/delta.js
new file mode 100644
index 0000000..ee1178a
--- /dev/null
+++ b/simple/simple-http/src/test/java/org/simpleframework/http/socket/table/delta.js
@@ -0,0 +1,344 @@
+var templates = new Array();
+var records = new Array();
+var schema = new Array();
+var connections = 0;
+var attempts = 0;
+var total = 1;
+
+function connect() {
+ socket = new WebSocket("ws://localhost:6060/update");
+
+ socket.onopen = function() {
+ attempts = 1;
+ connections++;
+ reportStatus(this, "success.png", "0", "0", "0", "0", "0", "");
+ };
+
+ socket.onerror = function(message) {
+ reportStatus(this, "failure.png", "0", "0", "0", "0", "0", "");
+ };
+
+ socket.onclose = function(message) {
+ var exponent = Math.pow(2, attempts++);
+ var interval = (exponent - 1) * 1000;
+ var reference = connect();
+
+ if (interval > 30 * 1000) {
+ interval = 30 * 1000;
+ }
+ setTimeout(reference, interval);
+ reportStatus(this, "pending.png", "0", "0", "0", "0", "0", "");
+ };
+
+ socket.onmessage = function(message) {
+ var data = message.data.substring(1);
+ var table = w2ui['mainGrid'];
+
+ if (message.data.charAt(0) == 'T') {
+ deltaUpdate(this, table, data, updateTable);
+ } else if (message.data.charAt(0) == 'H') {
+ deltaUpdate(this, table, data, highlightTable);
+ } else if (message.data.charAt(0) == 'S') {
+ schemaUpdate(this, table, data);
+ }
+ };
+}
+
+function reportStatus(socket, status, height, delta, change, duration, sequence, method) {
+ var image = '<img src="';
+
+ image += status;
+ image += '"';
+ image += 'style="';
+ image += ' max-width: 100%;';
+ image += ' max-height: 100%;';
+ image += ' padding-top: 4px;';
+ image += ' padding-bottom: 4px;';
+ image += ' padding-left: 4px;';
+ image += ' padding-right: 8px;';
+ image += '"/>';
+
+ document.getElementById("connection").innerHTML = image;
+ document.getElementById("rows").innerHTML = height;
+ document.getElementById("changes").innerHTML = change;
+ document.getElementById("duration").innerHTML = duration;
+ socket.send("status:rows="+height+",change="+change+",duration="+duration+",sequence="+sequence+",method="+method);
+
+}
+
+function schemaUpdate(socket, table, message) {
+ var cells = message.split('|');
+ var minimum = cells.length;
+ var width = schema.length;
+
+ for ( var i = 0; i < cells.length; i++) {
+ var values = cells[i].split(',');
+ var name = values[0];
+ var caption = decodeValue(values[1]);
+ var template = decodeValue(values[2]);
+ var resizable = values[3];
+ var sortable = values[4];
+ var style = {};
+
+ style['name'] = name;
+ style['caption'] = caption;
+ style['template'] = template;
+ style['resizable'] = resizable;
+ style['sortable'] = sortable;
+
+ schema[i] = style;
+ }
+ if(width < minimum) {
+ expandWidth(table);
+ requestRefresh(socket, 'schemaUpdate');
+ }
+}
+
+function requestRefresh(socket, message) {
+ socket.send('refresh:everything=true,message='+message);
+}
+
+function deltaUpdate(socket, table, message, method) {
+ var header = message.indexOf(':');
+ var sequence = 0;
+
+ if(header > 0) {
+ sequence = message.substring(0, header);
+ message = message.substring(header + 1);
+ }
+ var rows = message.split('|');
+ var length = message.length;
+ var start = currentTime();
+
+ if(schema.length > 0) {
+ method(socket, table, rows);
+ }
+ var finish = currentTime();
+ var duration = finish - start;
+ var height = table.total;
+ var change = rows.length;
+ var operation = method.name;
+
+ reportStatus(socket, "success.png", height, length, change, duration, sequence, operation);
+}
+
+function currentTime() {
+ var date = new Date()
+ return date.getTime();
+}
+
+function findRow(table, row) {
+ var record = table.find({ recid: row });
+ var height = table.total;
+ var index = 0;
+
+ if(record.length > 0) {
+ index = record[0];
+ } else {
+ index = height + 1;
+ }
+ return index;
+}
+
+function highlightTable(socket, table, rows) {
+ for ( var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var pair = row.split(':');
+ var index = pair[0];
+
+ if (index > 0) {
+ index = findRow(table, index);
+
+ if (pair != null && pair.length > 1) {
+ var cells = pair[1].split(',');
+
+ if (cells.length > 0) {
+ highlightRow(table, index, cells);
+ }
+ }
+ }
+ }
+}
+
+function updateTable(socket, table, rows) {
+ for ( var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var pair = row.split(':');
+ var index = pair[0];
+
+ if (index > 0) {
+ index = findRow(table, index);
+
+ if (pair != null && pair.length > 1) {
+ var cells = pair[1].split(',');
+
+ if (cells.length > 0) {
+ updateRow(socket, table, index, cells);
+ }
+ }
+ }
+ }
+}
+
+function findCell(table, row, column) {
+ var height = table.total;
+ var width = schema.length;
+
+ if(row <= height && column <= width) {
+ var expression = "#mainGrid_";
+
+ expression += table.name;
+ expression += "_rec_";
+ expression += row;
+ expression += " td[col=";
+ expression += column;
+ expression += "]";
+
+ return $(expression)[0];
+ }
+ return null;
+}
+
+function highlightRow(table, row, cells) {
+ var height = table.total;
+
+ if (height <= row) {
+ expandHeight(table, row);
+ }
+ var record = records[row];
+
+ for ( var i = 0; i < cells.length; i++) {
+ var cell = cells[i].split('=');
+ var column = cell[0];
+ var value = cell[1];
+ var style = schema[column];
+ var decoded = decodeValue(value);
+
+ record.style[column] = decoded;
+ }
+}
+
+function updateRow(socket, table, row, cells) {
+ var height = table.total;
+
+ if (height <= row) {
+ expandHeight(table, row);
+ }
+ var record = records[row];
+ var template = templates[row];
+
+ for ( var i = 0; i < cells.length; i++) {
+ var cell = cells[i].split('=');
+ var column = cell[0];
+ var value = cell[1];
+ var style = schema[column];
+ var decoded = decodeValue(value);
+
+ record[style.name] = decoded;
+ }
+ interpolateRow(record, template);
+ table.set(record.recid, template, false);
+ reconcileRow(socket, table, row);
+}
+
+function interpolateRow(record, template) {
+ for ( var i = 0; i < schema.length; i++) {
+ var style = schema[i];
+ var name = style.name;
+ var text = style.template;
+
+ for( var j = 0; j < schema.length; j++) {
+ var index = text.indexOf('{');
+
+ if(index == -1) {
+ break;
+ }
+ var key = schema[j].name;
+ var token = "{" + key + "}";
+ var value = record[key];
+
+ text = text.replace(token, value);
+ }
+ template.style[i] = record.style[i];
+ template[name] = text;
+ }
+}
+
+function reconcileRow(socket, table, row) {
+ var template = templates[row];
+ var index = findRow(table, row);
+ var row = table.get(index);
+
+ for( var i = 0; i < schema.length; i++) {
+ var style = schema[i];
+ var name = style.name;
+ var actual = row[name];
+ var expect = template[name];
+
+ if(actual != expect) {
+ requestRefresh(socket, 'reconcileFailure');
+ }
+ }
+}
+
+function decodeValue(value) {
+ var text = value.substring(1);
+
+ if (value.charAt(0) == '<') {
+ var encoded = text.toString();
+ var decoded = '';
+
+ for ( var i = 0; i < encoded.length; i += 2) {
+ var char = encoded.substr(i, 2);
+ var decimal = parseInt(char, 16);
+
+ decoded += String.fromCharCode(decimal);
+ }
+ return decoded;
+ }
+ return text;
+}
+
+function expandWidth(table) {
+ var width = table.columns.length;
+ var height = table.total;
+
+ for ( var i = width; i < schema.length; i++) {
+ var style = schema[i];
+ var column = {};
+
+ column['field'] = style.name;
+ column['caption'] = style.caption;
+ column['resizable'] = style.resizable;
+ column['sortable'] = style.sortable;
+ column['size'] = '50px';
+
+ for( var j = 0; j < height; j++) {
+ templates[i][name] = '';
+ records[i][name] = '';
+ }
+ table.addColumn(column);
+ }
+}
+
+function expandHeight(table, row) {
+ var height = table.total;
+
+ for ( var i = height; i < row; i++) {
+ var index = i + 1;
+ var record = {recid : index, id: index, style: []};
+ var template = {recid : index, id: index, style: []};
+
+ for( var j = 0; j < schema.length; j++) {
+ var name = schema[j].name;
+
+ template[name] = '';
+ record[name] = '';
+ }
+ templates[row] = template;
+ records[row] = record;
+ table.add(template);
+ }
+}
+
+window.addEventListener("load", connect, false); \ No newline at end of file