diff --git a/js/editor/server/ServerFactory.js b/js/editor/server/ServerFactory.js new file mode 100644 index 00000000..4673a0e4 --- /dev/null +++ b/js/editor/server/ServerFactory.js @@ -0,0 +1,66 @@ +/** + * @license + * Copyright (C) 2013 KO GmbH + * + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/webodf/webodf/ + */ + +/*global ops, SessionList*/ + +/** + * @interface + */ +ServerFactory = function Server() {"use strict"; }; + +/** + * @return {!ops.Server} + */ +ServerFactory.prototype.createServer = function () {"use strict"; }; + +/** + * @param {!string} sessionId + * @param {!string} memberId + * @param {!ops.Server} server + * @return {!ops.OperationRouter} + */ +ServerFactory.prototype.createOperationRouter = function (sessionId, memberId, server) {"use strict"; }; + +/** + * @param {!ops.Server} server + * @return {!ops.UserModel} + */ +ServerFactory.prototype.createUserModel = function (server) {"use strict"; }; + +/** + * @param {!ops.Server} server + * @return {!SessionList} + */ +ServerFactory.prototype.createSessionList = function (server) {"use strict"; }; diff --git a/js/editor/server/nowjs/serverFactory.js b/js/editor/server/nowjs/serverFactory.js new file mode 100644 index 00000000..dee230e4 --- /dev/null +++ b/js/editor/server/nowjs/serverFactory.js @@ -0,0 +1,65 @@ +/** + * @license + * Copyright (C) 2013 KO GmbH + * + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/webodf/webodf/ + */ + +/*global define, document, require, runtime, core, ops */ + +define("webodf/editor/server/nowjs/serverFactory", [ + "webodf/editor/server/nowjs/sessionList"], + function (NowjsSessionList) { + "use strict"; + + runtime.loadClass("ops.NowjsServer"); + runtime.loadClass("ops.NowjsUserModel"); + runtime.loadClass("ops.NowjsOperationRouter"); + + /** + * @constructor + * @implements ServerFactory + */ + return function NowjsServerFactory() { + this.createServer = function (args) { + return new ops.NowjsServer(args); + }; + this.createOperationRouter = function (sid, mid, server) { + return new ops.NowjsOperationRouter(sid, mid, server); + }; + this.createUserModel = function (server) { + return new ops.NowjsUserModel(server); + }; + this.createSessionList = function (server) { + return new NowjsSessionList(server); + }; + }; +}); diff --git a/js/editor/server/nowjs/sessionList.js b/js/editor/server/nowjs/sessionList.js new file mode 100644 index 00000000..4b04d563 --- /dev/null +++ b/js/editor/server/nowjs/sessionList.js @@ -0,0 +1,124 @@ +/** + * @license + * Copyright (C) 2012-2013 KO GmbH + * + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/webodf/webodf/ + */ + +/*global define, ops, runtime */ + +define("webodf/editor/server/nowjs/sessionList", [], function () { + "use strict"; + + return function NowjsSessionList(nowjsServer) { + + var cachedSessionData = {}, + subscribers = []; + + function onSessionData(sessionData) { + var i, + isNew = ! cachedSessionData.hasOwnProperty(sessionData.id); + + // cache + cachedSessionData[sessionData.id] = sessionData; + runtime.log("get session data for:"+sessionData.title+", is new:"+isNew); + + for (i = 0; i < subscribers.length; i += 1) { + if (isNew) { + subscribers[i].onCreated(sessionData); + } else { + subscribers[i].onUpdated(sessionData); + } + } + } + + function onSessionRemoved(sessionId) { + var i; + + if (cachedSessionData.hasOwnProperty(sessionId)) { + delete cachedSessionData[sessionId]; + + for (i = 0; i < subscribers.length; i += 1) { + subscribers[i].onRemoved(sessionId); + } + } + } + + this.getSessions = function (subscriber) { + var i, + sessionList = []; + + if (subscriber) { + subscribers.push(subscriber); + } + + for (i in cachedSessionData) { + if (cachedSessionData.hasOwnProperty(i)) { + sessionList.push(cachedSessionData[i]); + } + } + + return sessionList; + }; + + this.unsubscribe = function (subscriber) { + var i; + + for (i=0; i + * + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/webodf/webodf/ + */ + +/*global define, document, require, runtime, core, ops */ + +define("webodf/editor/server/pullbox/serverFactory", [ + "webodf/editor/server/pullbox/sessionList"], + function (PullBoxSessionList) { + "use strict"; + + runtime.loadClass("ops.PullBoxServer"); + runtime.loadClass("ops.PullBoxUserModel"); + runtime.loadClass("ops.PullBoxOperationRouter"); + + /** + * @constructor + * @implements ServerFactory + */ + return function PullBoxServerFactory() { + this.createServer = function (args) { + return new ops.PullBoxServer(args); + }; + this.createOperationRouter = function (sid, mid, server) { + return new ops.PullBoxOperationRouter(sid, mid, server); + }; + this.createUserModel = function (server) { + return new ops.PullBoxUserModel(server); + }; + this.createSessionList = function (server) { + return new PullBoxSessionList(server); + }; + }; +}); diff --git a/js/editor/server/pullbox/sessionList.js b/js/editor/server/pullbox/sessionList.js new file mode 100644 index 00000000..04f24cff --- /dev/null +++ b/js/editor/server/pullbox/sessionList.js @@ -0,0 +1,161 @@ +/** + * @license + * Copyright (C) 2013 KO GmbH + * + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/webodf/webodf/ + */ + +/*global define, ops, runtime */ + +define("webodf/editor/server/pullbox/sessionList", [], function () { + "use strict"; + + return function PullBoxSessionList(server) { + var cachedSessionData = {}, + subscribers = [], + /** HACK: allow to stop pulling, so that does not mess up the logs + * Remove before merging to master */ + pullingActive = true; + + function onSessionData(sessionData) { + var i, + isNew = ! cachedSessionData.hasOwnProperty(sessionData.id); + + // cache + cachedSessionData[sessionData.id] = sessionData; + runtime.log("get session data for:"+sessionData.title+", is new:"+isNew); + + for (i = 0; i < subscribers.length; i += 1) { + if (isNew) { + subscribers[i].onCreated(sessionData); + } else { + subscribers[i].onUpdated(sessionData); + } + } + } + + function onSessionRemoved(sessionId) { + var i; + + if (cachedSessionData.hasOwnProperty(sessionId)) { + delete cachedSessionData[sessionId]; + + for (i = 0; i < subscribers.length; i += 1) { + subscribers[i].onRemoved(sessionId); + } + } + } + + function pullSessionList() { + if (!pullingActive) { return; } + + server.call("session-list", function(responseData) { + var response = runtime.fromJson(responseData), + sessionList, i, + unupdatedSessions = {}; + + runtime.log("session-list reply: " + responseData); + + if (response.hasOwnProperty("session_list")) { + // collect known sessions + for (i in cachedSessionData) { + if (cachedSessionData.hasOwnProperty(i)) { + unupdatedSessions[i] = ""; // some dummy value, unused + } + } + + // add/update with all delivered sessions + sessionList = response.session_list; + for (i = 0; i < sessionList.length; i++) { + if (unupdatedSessions.hasOwnProperty(sessionList[i].id)) { + delete unupdatedSessions[sessionList[i].id]; + } + onSessionData(sessionList[i]); + } + + // remove unupdated sessions + for (i in unupdatedSessions) { + if (unupdatedSessions.hasOwnProperty(i)) { + onSessionRemoved(i); + } + } + + // next update in 5 secs + runtime.getWindow().setTimeout(pullSessionList, 5000); + } else { + runtime.log("Meh, sessionlist data broken: " + responseData); + } + }); + } + + this.getSessions = function (subscriber) { + var i, + sessionList = []; + + if (subscriber) { + subscribers.push(subscriber); + } + + for (i in cachedSessionData) { + if (cachedSessionData.hasOwnProperty(i)) { + sessionList.push(cachedSessionData[i]); + } + } + + return sessionList; + }; + + this.unsubscribe = function (subscriber) { + var i; + + for (i=0; i