package org.netxilia.server.js;
import static org.netxilia.server.js.NX.nx;
import static org.netxilia.server.jslib.NetxiliaGlobal.$;
import static org.stjs.javascript.Global.$map;
import static org.stjs.javascript.Global.eval;
import org.netxilia.server.js.data.DataSourceConfiguration;
import org.netxilia.server.js.data.DataSourceConfigurationId;
import org.netxilia.server.js.data.NetxiliaEvent;
import org.netxilia.server.js.data.StringHolder;
import org.netxilia.server.js.data.WindowIndex;
import org.netxilia.server.js.data.WindowInfo;
import org.stjs.javascript.Array;
import org.stjs.javascript.Map;
import org.stjs.javascript.functions.Callback0;
import org.stjs.javascript.functions.Callback1;
import org.stjs.javascript.functions.Callback3;
import org.stjs.javascript.functions.Function0;
import org.stjs.javascript.jquery.AjaxParams;
import org.stjs.javascript.jquery.JQueryXHR;
import org.stjs.javascript.utils.NameValue;
public class Resources {
private String restContext = "/netxilia/rest";
public Function0<Map<String, ? extends Object>> getHeaders;
public Callback0 disconnected;
public Resources() {
home = new Home();
events = new Events();
windows = new Windows();
cells = new Cells();
formatters = new Formatters();
workbooks = new Workbooks();
sheets = new Sheets();
ds = new Datasources();
rows = new Rows();
columns = new Columns();
charts = new Charts();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private <T> void ajax(final String paramType, final String paramUrl,
Map<? extends Object, ? extends Object> params, final Callback1<T> callback,
final Callback3<String, JQueryXHR, String> errorCallback, Map<? extends Object, ? extends Object> ajaxParams) {
@SuppressWarnings({ "rawtypes", "unchecked" })
final Map<String, Object> paramsWithMethod = params != null ? params : (Map) $map();
// cleanup params
for (String p : paramsWithMethod) {
if (paramsWithMethod.$get(p) == null) {
paramsWithMethod.$delete(p);
}
}
// this is the JBOSS RESTEasy way. is this standard !?
/*
* if (type=="PUT") { paramsWithMethod["_method"] = "put"; type="POST"; } else if (type=="DELETE") {
* paramsWithMethod["_method"] = "delete"; type="POST"; }
*/
final Resources that = this;
AjaxParams ajaxCall = new AjaxParams() {
{
url = that.restContext + paramUrl;
type = paramType;
data = paramsWithMethod;
dataType = "text";
beforeSend = new Callback1<JQueryXHR>() {
@Override
public void $invoke(JQueryXHR xhr) {
if (that.getHeaders != null) {
Map<String, ? extends Object> headers = that.getHeaders.$invoke();
if (headers != null) {
for (String h : headers) {
xhr.setRequestHeader(h, headers.$get(h));
}
}
xhr.setRequestHeader("ajax", "true");
xhr.setRequestHeader("Accept", "application/json");
}
}
};
success = new Callback3<Object, String, JQueryXHR>() {
@Override
public void $invoke(Object d, String status, JQueryXHR request) {
String data = (String) d;
if (callback != null) {
if (data == null || data == "") {
callback.$invoke(null);
} else if (data.charAt(0) != '{' && data.charAt(0) != '[') {
callback.$invoke((T) data);
} else {
callback.$invoke((T) eval("(" + data + ")"));
}
}
}
};
error = new Callback3<JQueryXHR, String, String>() {
@Override
public void $invoke(JQueryXHR request, String textStatus, String error) {
if (errorCallback != null) {
errorCallback.$invoke(textStatus, request, request.getResponseHeader("nx-error"));
}
if (request.status == 401 && nx.resources.disconnected != null) {
nx.resources.disconnected.$invoke();
}
}
};
}
};
if (ajaxParams != null) {
Map<Object, Object> mapAjaxCall = (Map) ajaxCall;
for (Object p : (Map) ajaxParams) {
mapAjaxCall.$put(p, ((Map) ajaxParams).$get(p));
}
}
$.ajax(ajaxCall);
}
<T> void get(String url, Map<? extends Object, ? extends Object> params, Callback1<T> callback,
Callback3<String, JQueryXHR, String> errorCallback, Map<? extends Object, ? extends Object> ajaxParams) {
this.ajax("GET", url, params, callback, errorCallback, ajaxParams);
}
<T> void post(String url, Map<? extends Object, ? extends Object> params, Callback1<T> callback,
Callback3<String, JQueryXHR, String> errorCallback, Map<? extends Object, ? extends Object> ajaxParams) {
this.ajax("POST", url, params, callback, errorCallback, ajaxParams);
}
<T> void put(String url, Map<? extends Object, ? extends Object> params, Callback1<T> callback,
Callback3<String, JQueryXHR, String> errorCallback, Map<? extends Object, ? extends Object> ajaxParams) {
this.ajax("PUT", url, params, callback, errorCallback, ajaxParams);
}
<T> void del(String url, Map<Object, Object> params, Callback1<T> callback,
Callback3<String, JQueryXHR, String> errorCallback, Map<? extends Object, ? extends Object> ajaxParams) {
this.ajax("DELETE", url, params, callback, errorCallback, ajaxParams);
}
// home
public Home home;
public class Home {
public void treeview(Callback1<StringHolder> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.get("/home/treeview", $map(), callback, errorCallback, null);
}
}
// events
public Events events;
public class Events {
public void poll(Long windowId, Callback1<Array<NetxiliaEvent>> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/events/" + windowId, $map(), callback, errorCallback, null);
}
}
// windows
public Windows windows;
public class Windows {
public void register(String workbook, String sheet, Callback1<WindowIndex> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/windows/" + workbook + "/" + sheet, $map(), callback, errorCallback, null);
}
public void terminate(Long windowId, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.del("/windows/" + windowId, $map(), callback, errorCallback, $map("async", false));
}
public void notifySelection(Long windowId, String areaRef, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/windows/" + windowId + "/notifySelection/" + areaRef, null, callback, errorCallback,
null);
}
public void getWindowsForSheet(String workbook, String sheet, Callback1<Array<WindowInfo>> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.get("/windows/" + workbook + "/" + sheet, $map(), callback, errorCallback, null);
}
public void undo(Long windowId, Callback1<Void> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/windows/" + windowId + "/undo", $map(), callback, errorCallback, null);
}
public void redo(Long windowId, Callback1<Void> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/windows/" + windowId + "/redo", $map(), callback, errorCallback, null);
}
}
// cells
public Cells cells;
public class Cells {
public void setValue(String workbook, String areaRef, String value, Callback1<Void> callback) {
nx.resources.post("/cells/" + workbook + "/" + areaRef + "/value", $map("value", value), callback, null,
null);
}
public void replicate(String workbook, String fromCell, String toArea, Callback1<Void> callback) {
nx.resources.post("/cells/" + workbook + "/replicate/" + fromCell + "/" + toArea, null, callback, null,
null);
}
public void paste(String workbook, String fromCell, String toCell, String value, Callback1<Void> callback) {
nx.resources.post("/cells/" + workbook + "/paste/" + fromCell + "/" + toCell, $map("value", value),
callback, null, null);
}
public void move(String workbook, String fromArea, String toCell, Callback1<Void> callback) {
nx.resources.put("/cells/" + workbook + "/move/" + fromArea + "/" + toCell, null, callback, null, null);
}
public void setStyle(String workbook, String areaRef, String style, Callback1<Void> callback) {
nx.resources.post("/cells/" + workbook + "/" + areaRef + "/style", $map("style", style), callback, null,
null);
}
public void applyStyle(String workbook, String areaRef, String style, String mode, Callback1<Void> callback) {
nx.resources.post("/cells/" + workbook + "/" + areaRef + "/style/apply",
$map("style", style, "mode", mode), callback, null, null);
}
public void setFormat(String workbook, String areaRef, String format, Callback1<Void> callback) {
nx.resources.post("/cells/" + workbook + "/" + areaRef + "/format", $map("format", format), callback, null,
null);
}
public void merge(String workbook, String areaRef, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/cells/" + workbook + "/" + areaRef + "/merge", null, callback, errorCallback, null);
}
public void append(String workbook, String sheetName, String value, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/cells/" + workbook + "/" + sheetName + "/append", $map("value", value), callback,
errorCallback, null);
}
public void find(String workbook, String sheetName, String startRef, String searchText,
Callback1<String> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.get("/cells/" + workbook + "/" + sheetName + "/find",
$map("startRef", startRef, "searchText", searchText), callback, errorCallback, null);
}
}
// formatters
public Formatters formatters;
public class Formatters {
public void getFormatValues(String workbook, String fmt, Callback1<Array<NameValue>> callback) {
nx.resources.get(nx.utils.url("/formatters/{}/{}/formatValues", workbook, fmt), null, callback, null, null);
}
public void getValues(String workbook, String formatterName, Callback1<Array<NameValue>> callback) {
nx.resources.get(nx.utils.url("/formatters/{}/{}/values", workbook, formatterName), null, callback, null,
null);
}
public void setFormatter(String workbook, String formatterName, String sourceWorkbookName, String nameRef,
String valueRef, Callback1<Void> callback) {
nx.resources.post(nx.utils.url("/formatters/{}/{}/{}/{}/{}", workbook, formatterName, sourceWorkbookName,
nameRef, valueRef), null, callback, null, null);
}
}
// workbooks
public Workbooks workbooks;
public class Workbooks {
public void newWorkbook(String workbook, String config, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/workbooks/" + workbook, $map("config", config), callback, errorCallback, null);
}
public void deleteWorkbook(String workbook, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.del("/workbooks/" + workbook, null, callback, errorCallback, null);
}
}
// sheets
public Sheets sheets;
public class Sheets {
public void newSheet(String workbook, String name, Callback1<String> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/sheets/" + workbook + "/" + name, null, callback, errorCallback, null);
}
public void del(String workbook, String name, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.del("/sheets/" + workbook + "/" + name, null, callback, errorCallback, null);
}
public void sort(String workbook, String name, String sortSpec, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/sheets/" + workbook + "/" + name + "/sort/" + sortSpec, null, callback, errorCallback,
null);
}
public void setAlias(String workbook, String name, String aliasName, String ref, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/sheets/" + workbook + "/" + name + "/alias/" + aliasName + "/" + ref, null, callback,
errorCallback, null);
}
public void deleteAlias(String workbook, String name, String aliasName, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.del("/sheets/" + workbook + "/" + name + "/alias/" + aliasName, null, callback, errorCallback,
null);
}
}
// rows
public Rows rows;
public class Rows {
public void insert(String workbook, String sheetName, int pos, Callback1<Void> callback) {
nx.resources.put("/rows/" + workbook + "/" + sheetName + "/" + pos, null, callback, null, null);
}
public void del(String workbook, String sheetName, int pos, Callback1<Void> callback) {
nx.resources.del("/rows/" + workbook + "/" + sheetName + "/" + pos, null, callback, null, null);
}
}
// columns
public Columns columns;
public class Columns {
public void insert(String workbook, String sheetName, int pos, Callback1<Void> callback) {
nx.resources.put("/columns/" + workbook + "/" + sheetName + "/" + pos, null, callback, null, null);
}
public void del(String workbook, String sheetName, int pos, Callback1<Void> callback) {
nx.resources.del("/columns/" + workbook + "/" + sheetName + "/" + pos, null, callback, null, null);
}
public void modify(String workbook, String sheetName, int pos, int width, Callback1<Void> callback) {
nx.resources.post("/columns/" + workbook + "/" + sheetName + "/" + pos, $map("width", width), callback,
null, null);
}
}
// charts
public Charts charts;
public class Charts {
public void add(String workbook, String sheetName, String areaRef, String title, String type,
Callback1<Void> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.put("/charts/" + workbook + "/" + sheetName,
$map("areaRef", areaRef, "title", title, "type", type), callback, errorCallback, null);
}
public void set(String workbook, String sheetName, int index, String areaRef, String title, String type,
Callback1<Void> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/charts/" + workbook + "/" + sheetName + "/" + index,
$map("areaRef", areaRef, "title", title, "type", type), callback, errorCallback, null);
}
public void del(String workbook, String sheetName, int index, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources
.del("/charts/" + workbook + "/" + sheetName + "/" + index, null, callback, errorCallback, null);
}
public void move(String workbook, String sheetName, int index, int left, int top, int width, int height,
Callback1<Void> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/charts/" + workbook + "/" + sheetName + "/" + index + "/move",
$map("left", left, "top", top, "width", width, "height", height), callback, errorCallback, null);
}
}
// data sources
public Datasources ds;
public class Datasources {
public void list(Callback1<Array<DataSourceConfiguration>> callback) {
nx.resources.get("/ds", null, callback, null, null);
}
public void add(String name, String description, String driver, String url, String username, String password,
Callback1<DataSourceConfigurationId> callback) {
nx.resources.put(
"/ds",
$map("name", name, "description", description, "driver", driver, "url", url, "username", username,
"password", password), callback, null, null);
}
public void save(long id, String name, String description, String driver, String url, String username,
String password, Callback1<Void> callback) {
nx.resources.post(
"/ds/" + id,
$map("name", name, "description", description, "driver", driver, "url", url, "username", username,
"password", password), callback, null, null);
}
public void remove(long id, Callback1<Void> callback) {
nx.resources.del("/ds/" + id, null, callback, null, null);
}
public void test(long id, Callback1<String> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.get("/ds/" + id + "/test", null, callback, errorCallback, null);
}
public void setConfigurationForWorkbook(String key, String config, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.post("/ds/workbooks/" + key, $map("config", config), callback, errorCallback, null);
}
public void deleteConfigurationForWorkbook(String key, Callback1<Void> callback,
Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.del("/ds/workbooks/" + key, null, callback, errorCallback, null);
}
public void edit(long id, Callback1<String> callback, Callback3<String, JQueryXHR, String> errorCallback) {
nx.resources.get("/ds/" + id + "/edit", null, callback, errorCallback, null);
}
}
}