Commit 531ca1e8 authored by Sven Franck's avatar Sven Franck

jslint pass xwikistorage.js

parent bc17b228
(function ($,Base64) { /*jslint indent: 2, maxlen: 80, sloppy: true, nomen: true */
/*global toSend: true, jIO: true, jQuery: true, Base64: true */
/** /**
* JIO XWiki based storage. Type = 'xwiki'. * JIO XWiki based storage. Type = 'xwiki'.
* Edits XWiki documents as html using html editor. * Edits XWiki documents as html using html editor.
* Test this code using the following inputs: * Test this code using the following inputs:
* {"type":"xwiki","username":"Admin","password":"admin","xwikiurl":"http://127.0.0.1:8080/xwiki","space":"OfficeJS"} *
{"type":"xwiki","username":"Admin","password":"admin","xwikiurl":"http://127.0.0
.1:8080/xwiki","space":"OfficeJS"}
*/ */
var newXWikiStorage = function(spec, my)
{ (function ($, Base64) {
var newXWikiStorage = function (spec, my) {
var that, priv, escapeDocId, restoreDocId,
doWithFormToken, getDates, super_serialized;
/** The input configuration. */ /** The input configuration. */
spec = spec || {}; spec = spec || {};
/** The "public" object which will have methods called on it. */ /** The "public" object which will have methods called on it. */
var that = my.basicStorage(spec, my); that = my.basicStorage(spec, my);
/** "private" fields. */ /** "private" fields. */
var priv = { priv = {
username: spec.username || '', username: spec.username || '',
password: spec.password || '', password: spec.password || '',
xwikiurl: spec.xwikiurl || '', xwikiurl: spec.xwikiurl || '',
...@@ -23,64 +31,65 @@ var newXWikiStorage = function(spec, my) ...@@ -23,64 +31,65 @@ var newXWikiStorage = function(spec, my)
}; };
//--------------------- Private Functions ---------------------// //--------------------- Private Functions ---------------------//
/** Escape a document ID by URL escaping all '/' characters. */ /** Escape a document ID by URL escaping all '/' characters. */
var escapeDocId = function(docId) { escapeDocId = function (docId) {
return docId.replace(/.html$/, '').split('/').join('%2F'); // jslint: replaced "." with [\w\W]
return docId.replace(/[\w\W]html$/, '').split('/').join('%2F');
}; };
/** Restore a document id from the escaped form. */ /** Restore a document id from the escaped form. */
var restoreDocId = function(escapedDocId) { restoreDocId = function (escapedDocId) {
return escapedDocId.split('%2F').join('/') + '.html'; return escapedDocId.split('%2F').join('/') + '.html';
}; };
/** /**
* Get the Anti-CSRF token and do something with it. * Get the Anti-CSRF token and do something with it.
* *
* @param docId the document id of a document which you have permission to edit. * @param docId document id of document which you have permission to edit.
* @param whatToDo a function which will be called with the form token as the parameter. * @param whatToDo function which is called with form token as parameter.
*/ */
var doWithFormToken = function(docId, whatToDo) { doWithFormToken = function (docId, whatToDo) {
var url = priv.xwikiurl + '/bin/edit/' + priv.space + '/' + escapeDocId(docId) + var url = priv.xwikiurl + '/bin/edit/' + priv.space + '/' +
'?editor=wiki&cachebuster=' + Date.now(); escapeDocId(docId) + '?editor=wiki&cachebuster=' + Date.now();
$.ajax({ $.ajax({
url: url, url: url,
type: "GET", type: "GET",
async: true, async: true,
dataType: 'text', dataType: 'text',
headers: {'Authorization':'Basic ' + Base64.encode( headers: {
priv.username + ':' + priv.password )}, 'Authorization': 'Basic ' + Base64.encode(priv.username + ':' +
priv.password)
},
success: function (html) { success: function (html) {
whatToDo($(html).find('input[name=form_token]').attr('value')); whatToDo($(html).find('input[name=form_token]').attr('value'));
} }
}); });
}; };
/** /**
* Get the creation and modification dates for a page. * Get the creation and modification dates for a page.
* *
* @param docId the ID of the document. * @param docId the ID of the document.
* @param callWhenDone a callback which will be called when this function finishes. * @param callWhenDone callback, will be called when function finishes.
*/ */
var getDates = function(docId, callWhenDone) { getDates = function (docId, callWhenDone) {
// http://127.0.0.1:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/<pageName> // http://127.0.0.1:8080/xwiki/rest/wikis/xwiki/
// spaces/Main/pages/<pageName>
var map = {}; var map = {};
$.ajax ( { $.ajax({
url: priv.xwikiurl + '/rest/wikis/' + 'xwiki' + url: priv.xwikiurl + '/rest/wikis/' + 'xwiki' + '/spaces/' + priv.space
'/spaces/' + priv.space + + '/pages/' + escapeDocId(docId) + '?cachebuster=' + Date.now(),
'/pages/' + escapeDocId(docId) +
'?cachebuster=' + Date.now(),
type: "GET", type: "GET",
async: true, async: true,
dataType: 'xml', dataType: 'xml',
headers: {'Authorization':'Basic ' + Base64.encode( headers: {
priv.username + ':' + priv.password )}, 'Authorization': 'Basic ' + Base64.encode(priv.username + ':' +
priv.password)
},
success: function (xmlData) { success: function (xmlData) {
$(xmlData).find('modified').each(function() { $(xmlData).find('modified').each(function () {
map._last_modified = Date.parse($(this).text()); map._last_modified = Date.parse($(this).text());
}); });
$(xmlData).find('created').each(function() { $(xmlData).find('created').each(function () {
map._creation_date = Date.parse($(this).text()); map._creation_date = Date.parse($(this).text());
}); });
callWhenDone(); callWhenDone();
...@@ -90,52 +99,51 @@ var newXWikiStorage = function(spec, my) ...@@ -90,52 +99,51 @@ var newXWikiStorage = function(spec, my)
}; };
//--------------------- Public Functions ---------------------// //--------------------- Public Functions ---------------------//
/** Get a serialized form of the module state. */ /** Get a serialized form of the module state. */
var super_serialized = that.serialized; super_serialized = that.serialized;
that.serialized = function() { that.serialized = function () {
var o = super_serialized(); var o = super_serialized(), key;
for(var key in priv) { for (key in priv) {
if (priv.hasOwnProperty(key)) { if (priv.hasOwnProperty(key)) {
o[key] = priv[key]; o[key] = priv[key];
} }
} }
return o; return o;
}; };
/** Check that the storage module is properly setup. */ /** Check that the storage module is properly setup. */
that.validateState = function() { that.validateState = function () {
for(var key in priv) { var key;
for (key in priv) {
if (priv.hasOwnProperty(key) && !priv[key]) { if (priv.hasOwnProperty(key) && !priv[key]) {
return 'Must specify "' + key + '".'; return 'Must specify "' + key + '".';
} }
} }
return ''; return '';
}; };
/** Alias to put() */ /** Alias to put() */
that.post = function (command) { that.post = function (command) {
that.put(command); that.put(command);
}; };
/** /**
* Saves a document as an XWikiDocument. * Saves a document as an XWikiDocument.
* *
* @param command must contain document ID and document content. * @param command must contain document ID and document content.
*/ */
that.put = function (command) { that.put = function (command) {
doWithFormToken(command.getDocId(), function(formToken) { doWithFormToken(command.getDocId(), function (formToken) {
if (!formToken) { if (!formToken) {
throw Error("missing form token"); throw new Error("missing form token");
} }
$.ajax({ $.ajax({
url: priv.xwikiurl + '/bin/preview/' + priv.space + url: priv.xwikiurl + '/bin/preview/' + priv.space + '/' +
'/' + escapeDocId(command.getDocId()), escapeDocId(command.getDocId()),
type: "POST", type: "POST",
async: true, async: true,
dataType: 'text', dataType: 'text',
headers: {'Authorization':'Basic ' + Base64.encode( headers: {
priv.username + ':' + priv.password )}, 'Authorization': 'Basic ' + Base64.encode(priv.username + ':' +
priv.password)
},
data: { data: {
parent: '', parent: '',
title: '', title: '',
...@@ -153,7 +161,7 @@ var newXWikiStorage = function(spec, my) ...@@ -153,7 +161,7 @@ var newXWikiStorage = function(spec, my)
ajax: true, ajax: true,
form_token: formToken form_token: formToken
}, },
success: function(html) { success: function () {
that.success({ that.success({
ok: true, ok: true,
id: command.getDocId() id: command.getDocId()
...@@ -162,8 +170,6 @@ var newXWikiStorage = function(spec, my) ...@@ -162,8 +170,6 @@ var newXWikiStorage = function(spec, my)
}); });
}); });
}; // end put }; // end put
/** /**
* Loads a document from the XWiki storage. * Loads a document from the XWiki storage.
*/ */
...@@ -178,32 +184,34 @@ var newXWikiStorage = function(spec, my) ...@@ -178,32 +184,34 @@ var newXWikiStorage = function(spec, my)
* "_last_modified": 1348154789478 * "_last_modified": 1348154789478
* } * }
*/ */
var doc; var doc,
var pendingRequests = 2; pendingRequests = 2,
var finishedRequest = function() { finishedRequest = function () {
pendingRequests--; pendingRequests -= 1;
if (pendingRequests < 1) { if (pendingRequests < 1) {
that.success(doc); that.success(doc);
} }
}; };
doc = (function() { doc = (function () {
var resultMap = getDates(command.getDocId(), finishedRequest); var resultMap = getDates(command.getDocId(), finishedRequest);
$.ajax({ $.ajax({
url: priv.xwikiurl + '/bin/get/' + priv.space + url: priv.xwikiurl + '/bin/get/' + priv.space + '/' +
'/' + escapeDocId(command.getDocId()) + escapeDocId(command.getDocId()) + '?xpage=plain&cachebuster=' +
'?xpage=plain&cachebuster=' + Date.now(), Date.now(),
type: "GET", type: "GET",
async: true, async: true,
dataType: 'text', dataType: 'text',
headers: {'Authorization':'Basic ' + Base64.encode( headers: {
priv.username + ':' + priv.password )}, 'Authorization': 'Basic ' + Base64.encode(priv.username + ':' +
priv.password)
},
success: function (html) { success: function (html) {
resultMap.content = html; resultMap.content = html;
finishedRequest(); finishedRequest();
} }
}); });
return resultMap; return resultMap;
})(); }());
doc._id = command.getDocId(); doc._id = command.getDocId();
}; // end get }; // end get
...@@ -215,15 +223,16 @@ var newXWikiStorage = function(spec, my) ...@@ -215,15 +223,16 @@ var newXWikiStorage = function(spec, my)
*/ */
that.allDocs = function (command) { that.allDocs = function (command) {
// http://127.0.0.1:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages // http://127.0.0.1:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages
$.ajax ( { $.ajax({
url: priv.xwikiurl + '/rest/wikis/' + 'xwiki' url: priv.xwikiurl + '/rest/wikis/' + 'xwiki' + '/spaces/' +
+ '/spaces/' + priv.space priv.space + '/pages?cachebuster=' + Date.now(),
+ '/pages?cachebuster=' + Date.now(),
type: "GET", type: "GET",
async: true, async: true,
dataType: 'xml', dataType: 'xml',
headers: {'Authorization':'Basic ' + Base64.encode( headers: {
priv.username + ':' + priv.password )}, 'Authorization': 'Basic ' + Base64.encode(priv.username + ':' +
priv.password)
},
success: function (xmlData) { success: function (xmlData) {
/** Protocol definition: /** Protocol definition:
* { * {
...@@ -249,28 +258,27 @@ var newXWikiStorage = function(spec, my) ...@@ -249,28 +258,27 @@ var newXWikiStorage = function(spec, my)
* ] * ]
* } * }
*/ */
var totalRows = 0 var totalRows = 0,
var data = []; data = [],
// The number of async calls which are waiting to return. // The number of async calls which are waiting to return.
var outstandingCalls = 0; outstandingCalls = 0,
toSend;
$(xmlData).find('name').each(function() { $(xmlData).find('name').each(function () {
outstandingCalls++; outstandingCalls += 1;
var id = restoreDocId($(this).text()); var id = restoreDocId($(this).text()),
var entry = { entry = {
'id': id, 'id': id,
'key': id, 'key': id,
'value': getDates(id, function() { 'value': getDates(id, function () {
outstandingCalls--; outstandingCalls -= 1;
if (outstandingCalls < 1) { if (outstandingCalls < 1) {
that.success(toSend); that.success(toSend);
} }
}) })
}; };
data[totalRows++] = entry; data[totalRows += 1] = entry;
}); });
var toSend = { toSend = {
'total_rows': totalRows, 'total_rows': totalRows,
'rows': data 'rows': data
}; };
...@@ -285,38 +293,40 @@ var newXWikiStorage = function(spec, my) ...@@ -285,38 +293,40 @@ var newXWikiStorage = function(spec, my)
error: function (type) { error: function (type) {
if (type.status === 404) { if (type.status === 404) {
type.message = 'Cannot find "' + command.getDocId() + type.message = 'Cannot find "' + command.getDocId() +
'" informations.'; '"informations.';
type.reason = 'missing'; type.reason = 'missing';
that.error(type); that.error(type);
} else { } else {
type.reason = 'Cannot get "' + command.getDocId() + type.reason = 'Cannot get "' + command.getDocId() +
'" informations'; '"informations';
type.message = type.reason + '.'; type.message = type.reason + '.';
that.retry(type); that.retry(type);
} }
} }
} ); });
}; };
/** /**
* Removes a document from the XWiki storage. * Removes a document from the XWiki storage.
*/ */
that.remove = function (command) { that.remove = function (command) {
// http://127.0.0.1:8080/xwiki/bin/delete/Main/WebHomee?confirm=1&form_token=r7x0oGBSk2EFm2fxVULfFA // http://127.0.0.1:8080/xwiki/bin/delete/Main/WebHomee?
doWithFormToken(command.getDocId(), function(formToken) { // confirm=1&form_token= //r7x0oGBSk2EFm2fxVULfFA
doWithFormToken(command.getDocId(), function (formToken) {
$.ajax({ $.ajax({
url: priv.xwikiurl + '/bin/delete/' + priv.space + url: priv.xwikiurl + '/bin/delete/' + priv.space + '/' +
'/' + escapeDocId(command.getDocId()), escapeDocId(command.getDocId()),
type: "POST", type: "POST",
async: true, async: true,
dataType: 'text', dataType: 'text',
headers: {'Authorization':'Basic ' + Base64.encode( headers: {
priv.username + ':' + priv.password )}, 'Authorization': 'Basic ' + Base64.encode(priv.username + ':' +
priv.password)
},
data: { data: {
confirm: 1, confirm: 1,
form_token: formToken form_token: formToken
}, },
success: function(html) { success: function () {
that.success({ that.success({
ok: true, ok: true,
id: command.getDocId() id: command.getDocId()
...@@ -325,9 +335,7 @@ var newXWikiStorage = function(spec, my) ...@@ -325,9 +335,7 @@ var newXWikiStorage = function(spec, my)
}); });
}); });
}; // end remove }; // end remove
return that; return that;
}; };
jIO.addStorageType('xwiki', newXWikiStorage); jIO.addStorageType('xwiki', newXWikiStorage);
}(jQuery, Base64));
}(jQuery,Base64)); \ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment