From cdb493b0a47bcf64e8e670b94fa399fcd731f531 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 30 Oct 2021 13:48:52 +0200 Subject: chore(web): refactor xtext client --- .../main/js/xtext/services/ContentAssistService.js | 132 ---------- .../main/js/xtext/services/FormattingService.js | 52 ---- .../main/js/xtext/services/HighlightingService.js | 33 --- .../src/main/js/xtext/services/HoverService.js | 59 ----- .../main/js/xtext/services/LoadResourceService.js | 42 ---- .../main/js/xtext/services/OccurrencesService.js | 39 --- .../main/js/xtext/services/SaveResourceService.js | 32 --- .../src/main/js/xtext/services/UpdateService.js | 159 ------------ .../main/js/xtext/services/ValidationService.js | 33 --- .../src/main/js/xtext/services/XtextService.js | 280 --------------------- 10 files changed, 861 deletions(-) delete mode 100644 language-web/src/main/js/xtext/services/ContentAssistService.js delete mode 100644 language-web/src/main/js/xtext/services/FormattingService.js delete mode 100644 language-web/src/main/js/xtext/services/HighlightingService.js delete mode 100644 language-web/src/main/js/xtext/services/HoverService.js delete mode 100644 language-web/src/main/js/xtext/services/LoadResourceService.js delete mode 100644 language-web/src/main/js/xtext/services/OccurrencesService.js delete mode 100644 language-web/src/main/js/xtext/services/SaveResourceService.js delete mode 100644 language-web/src/main/js/xtext/services/UpdateService.js delete mode 100644 language-web/src/main/js/xtext/services/ValidationService.js delete mode 100644 language-web/src/main/js/xtext/services/XtextService.js (limited to 'language-web/src/main/js/xtext/services') diff --git a/language-web/src/main/js/xtext/services/ContentAssistService.js b/language-web/src/main/js/xtext/services/ContentAssistService.js deleted file mode 100644 index 1686570d..00000000 --- a/language-web/src/main/js/xtext/services/ContentAssistService.js +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for content assist proposals. The proposals are returned as promise of - * a Deferred object. - */ - function ContentAssistService(serviceUrl, resourceId, updateService) { - this.initialize(serviceUrl, 'assist', resourceId, updateService); - } - - ContentAssistService.prototype = new XtextService(); - - ContentAssistService.prototype.invoke = function(editorContext, params, deferred) { - if (deferred === undefined) { - deferred = jQuery.Deferred(); - } - var serverData = { - contentType: params.contentType - }; - if (params.offset) - serverData.caretOffset = params.offset; - else - serverData.caretOffset = editorContext.getCaretOffset(); - var selection = params.selection ? params.selection : editorContext.getSelection(); - if (selection.start != serverData.caretOffset || selection.end != serverData.caretOffset) { - serverData.selectionStart = selection.start; - serverData.selectionEnd = selection.end; - } - var currentText; - var httpMethod = 'GET'; - var onComplete = undefined; - var knownServerState = editorContext.getServerState(); - if (params.sendFullText) { - serverData.fullText = editorContext.getText(); - httpMethod = 'POST'; - } else { - serverData.requiredStateId = knownServerState.stateId; - if (this._updateService) { - if (knownServerState.text === undefined || knownServerState.updateInProgress) { - var self = this; - this._updateService.addCompletionCallback(function() { - self.invoke(editorContext, params, deferred); - }); - return deferred.promise(); - } - knownServerState.updateInProgress = true; - onComplete = this._updateService.onComplete.bind(this._updateService); - currentText = editorContext.getText(); - this._updateService.computeDelta(knownServerState.text, currentText, serverData); - if (serverData.deltaText !== undefined) { - httpMethod = 'POST'; - } - } - } - - var self = this; - self.sendRequest(editorContext, { - type: httpMethod, - data: serverData, - - success: function(result) { - if (result.conflict) { - // The server has lost its session state and the resource is loaded from the server - if (self._increaseRecursionCount(editorContext)) { - if (onComplete) { - delete knownServerState.updateInProgress; - delete knownServerState.text; - delete knownServerState.stateId; - self._updateService.addCompletionCallback(function() { - self.invoke(editorContext, params, deferred); - }); - self._updateService.invoke(editorContext, params); - } else { - var paramsCopy = {}; - for (var p in params) { - if (params.hasOwnProperty(p)) - paramsCopy[p] = params[p]; - } - paramsCopy.sendFullText = true; - self.invoke(editorContext, paramsCopy, deferred); - } - } else { - deferred.reject(result.conflict); - } - return false; - } - if (onComplete && result.stateId !== undefined && result.stateId != editorContext.getServerState().stateId) { - var listeners = editorContext.updateServerState(currentText, result.stateId); - for (var i = 0; i < listeners.length; i++) { - self._updateService.addCompletionCallback(listeners[i], params); - } - } - deferred.resolve(result.entries); - }, - - error: function(xhr, textStatus, errorThrown) { - if (onComplete && xhr.status == 404 && !params.loadFromServer && knownServerState.text !== undefined) { - // The server has lost its session state and the resource is not loaded from the server - delete knownServerState.updateInProgress; - delete knownServerState.text; - delete knownServerState.stateId; - self._updateService.addCompletionCallback(function() { - self.invoke(editorContext, params, deferred); - }); - self._updateService.invoke(editorContext, params); - return true; - } - deferred.reject(errorThrown); - }, - - complete: onComplete - }, !params.sendFullText); - var result = deferred.promise(); - if (onComplete) { - result.always(function() { - knownServerState.updateInProgress = false; - }); - } - return result; - }; - - return ContentAssistService; -}); diff --git a/language-web/src/main/js/xtext/services/FormattingService.js b/language-web/src/main/js/xtext/services/FormattingService.js deleted file mode 100644 index f59099ee..00000000 --- a/language-web/src/main/js/xtext/services/FormattingService.js +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for formatting text. - */ - function FormattingService(serviceUrl, resourceId, updateService) { - this.initialize(serviceUrl, 'format', resourceId, updateService); - }; - - FormattingService.prototype = new XtextService(); - - FormattingService.prototype._initServerData = function(serverData, editorContext, params) { - var selection = params.selection ? params.selection : editorContext.getSelection(); - if (selection.end > selection.start) { - serverData.selectionStart = selection.start; - serverData.selectionEnd = selection.end; - } - return { - httpMethod: 'POST' - }; - }; - - FormattingService.prototype._processResult = function(result, editorContext) { - // The text update may be asynchronous, so we have to compute the new text ourselves - var newText; - if (result.replaceRegion) { - var fullText = editorContext.getText(); - var start = result.replaceRegion.offset; - var end = result.replaceRegion.offset + result.replaceRegion.length; - editorContext.setText(result.formattedText, start, end); - newText = fullText.substring(0, start) + result.formattedText + fullText.substring(end); - } else { - editorContext.setText(result.formattedText); - newText = result.formattedText; - } - var listeners = editorContext.updateServerState(newText, result.stateId); - for (var i = 0; i < listeners.length; i++) { - listeners[i]({}); - } - }; - - return FormattingService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/HighlightingService.js b/language-web/src/main/js/xtext/services/HighlightingService.js deleted file mode 100644 index 5a5ac8ba..00000000 --- a/language-web/src/main/js/xtext/services/HighlightingService.js +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for semantic highlighting. - */ - function HighlightingService(serviceUrl, resourceId) { - this.initialize(serviceUrl, 'highlight', resourceId); - }; - - HighlightingService.prototype = new XtextService(); - - HighlightingService.prototype._checkPreconditions = function(editorContext, params) { - return this._state === undefined; - } - - HighlightingService.prototype._onConflict = function(editorContext, cause) { - this.setState(undefined); - return { - suppressForcedUpdate: true - }; - }; - - return HighlightingService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/HoverService.js b/language-web/src/main/js/xtext/services/HoverService.js deleted file mode 100644 index 03c5a52b..00000000 --- a/language-web/src/main/js/xtext/services/HoverService.js +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for hover information. - */ - function HoverService(serviceUrl, resourceId, updateService) { - this.initialize(serviceUrl, 'hover', resourceId, updateService); - }; - - HoverService.prototype = new XtextService(); - - HoverService.prototype._initServerData = function(serverData, editorContext, params) { - // In order to display hover info for a selected completion proposal while the content - // assist popup is shown, the selected proposal is passed as parameter - if (params.proposal && params.proposal.proposal) - serverData.proposal = params.proposal.proposal; - if (params.offset) - serverData.caretOffset = params.offset; - else - serverData.caretOffset = editorContext.getCaretOffset(); - var selection = params.selection ? params.selection : editorContext.getSelection(); - if (selection.start != serverData.caretOffset || selection.end != serverData.caretOffset) { - serverData.selectionStart = selection.start; - serverData.selectionEnd = selection.end; - } - }; - - HoverService.prototype._getSuccessCallback = function(editorContext, params, deferred) { - var delay = params.mouseHoverDelay; - if (!delay) - delay = 500; - var showTime = new Date().getTime() + delay; - return function(result) { - if (result.conflict || !result.title && !result.content) { - deferred.reject(); - } else { - var remainingTimeout = Math.max(0, showTime - new Date().getTime()); - setTimeout(function() { - if (!params.sendFullText && result.stateId !== undefined - && result.stateId != editorContext.getServerState().stateId) - deferred.reject(); - else - deferred.resolve(result); - }, remainingTimeout); - } - }; - }; - - return HoverService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/LoadResourceService.js b/language-web/src/main/js/xtext/services/LoadResourceService.js deleted file mode 100644 index b5a315c3..00000000 --- a/language-web/src/main/js/xtext/services/LoadResourceService.js +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for loading resources. The resulting text is passed to the editor context. - */ - function LoadResourceService(serviceUrl, resourceId, revert) { - this.initialize(serviceUrl, revert ? 'revert' : 'load', resourceId); - }; - - LoadResourceService.prototype = new XtextService(); - - LoadResourceService.prototype._initServerData = function(serverData, editorContext, params) { - return { - suppressContent: true, - httpMethod: this._serviceType == 'revert' ? 'POST' : 'GET' - }; - }; - - LoadResourceService.prototype._getSuccessCallback = function(editorContext, params, deferred) { - return function(result) { - editorContext.setText(result.fullText); - editorContext.clearUndoStack(); - editorContext.setDirty(result.dirty); - var listeners = editorContext.updateServerState(result.fullText, result.stateId); - for (var i = 0; i < listeners.length; i++) { - listeners[i](params); - } - deferred.resolve(result); - } - } - - return LoadResourceService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/OccurrencesService.js b/language-web/src/main/js/xtext/services/OccurrencesService.js deleted file mode 100644 index 2e2d0b1a..00000000 --- a/language-web/src/main/js/xtext/services/OccurrencesService.js +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for marking occurrences. - */ - function OccurrencesService(serviceUrl, resourceId, updateService) { - this.initialize(serviceUrl, 'occurrences', resourceId, updateService); - }; - - OccurrencesService.prototype = new XtextService(); - - OccurrencesService.prototype._initServerData = function(serverData, editorContext, params) { - if (params.offset) - serverData.caretOffset = params.offset; - else - serverData.caretOffset = editorContext.getCaretOffset(); - }; - - OccurrencesService.prototype._getSuccessCallback = function(editorContext, params, deferred) { - return function(result) { - if (result.conflict || !params.sendFullText && result.stateId !== undefined - && result.stateId != editorContext.getServerState().stateId) - deferred.reject(); - else - deferred.resolve(result); - } - } - - return OccurrencesService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/SaveResourceService.js b/language-web/src/main/js/xtext/services/SaveResourceService.js deleted file mode 100644 index 66cdaff5..00000000 --- a/language-web/src/main/js/xtext/services/SaveResourceService.js +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for saving resources. - */ - function SaveResourceService(serviceUrl, resourceId) { - this.initialize(serviceUrl, 'save', resourceId); - }; - - SaveResourceService.prototype = new XtextService(); - - SaveResourceService.prototype._initServerData = function(serverData, editorContext, params) { - return { - httpMethod: 'POST' - }; - }; - - SaveResourceService.prototype._processResult = function(result, editorContext) { - editorContext.setDirty(false); - }; - - return SaveResourceService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/UpdateService.js b/language-web/src/main/js/xtext/services/UpdateService.js deleted file mode 100644 index b78d846d..00000000 --- a/language-web/src/main/js/xtext/services/UpdateService.js +++ /dev/null @@ -1,159 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for updating the server-side representation of a resource. - * This service only makes sense with a stateful server, where an update request is sent - * after each modification. This can greatly improve response times compared to the - * stateless alternative, where the full text content is sent with each service request. - */ - function UpdateService(serviceUrl, resourceId) { - this.initialize(serviceUrl, 'update', resourceId, this); - this._completionCallbacks = []; - }; - - UpdateService.prototype = new XtextService(); - - /** - * Compute a delta between two versions of a text. If a difference is found, the result - * contains three properties: - * deltaText - the text to insert into s1 - * deltaOffset - the text insertion offset - * deltaReplaceLength - the number of characters that shall be replaced by the inserted text - */ - UpdateService.prototype.computeDelta = function(s1, s2, result) { - var start = 0, s1length = s1.length, s2length = s2.length; - while (start < s1length && start < s2length && s1.charCodeAt(start) === s2.charCodeAt(start)) { - start++; - } - if (start === s1length && start === s2length) { - return; - } - result.deltaOffset = start; - if (start === s1length) { - result.deltaText = s2.substring(start, s2length); - result.deltaReplaceLength = 0; - return; - } else if (start === s2length) { - result.deltaText = ''; - result.deltaReplaceLength = s1length - start; - return; - } - - var end1 = s1length - 1, end2 = s2length - 1; - while (end1 >= start && end2 >= start && s1.charCodeAt(end1) === s2.charCodeAt(end2)) { - end1--; - end2--; - } - result.deltaText = s2.substring(start, end2 + 1); - result.deltaReplaceLength = end1 - start + 1; - }; - - /** - * Invoke all completion callbacks and clear the list afterwards. - */ - UpdateService.prototype.onComplete = function(xhr, textStatus) { - var callbacks = this._completionCallbacks; - this._completionCallbacks = []; - for (var i = 0; i < callbacks.length; i++) { - var callback = callbacks[i].callback; - var params = callbacks[i].params; - callback(params); - } - } - - /** - * Add a callback to be invoked when the service call has completed. - */ - UpdateService.prototype.addCompletionCallback = function(callback, params) { - this._completionCallbacks.push({callback: callback, params: params}); - } - - UpdateService.prototype.invoke = function(editorContext, params, deferred) { - if (deferred === undefined) { - deferred = jQuery.Deferred(); - } - var knownServerState = editorContext.getServerState(); - if (knownServerState.updateInProgress) { - var self = this; - this.addCompletionCallback(function() { self.invoke(editorContext, params, deferred) }); - return deferred.promise(); - } - - var serverData = { - contentType: params.contentType - }; - var currentText = editorContext.getText(); - if (params.sendFullText || knownServerState.text === undefined) { - serverData.fullText = currentText; - } else { - this.computeDelta(knownServerState.text, currentText, serverData); - if (serverData.deltaText === undefined) { - if (params.forceUpdate) { - serverData.deltaText = ''; - serverData.deltaOffset = editorContext.getCaretOffset(); - serverData.deltaReplaceLength = 0; - } else { - deferred.resolve(knownServerState); - this.onComplete(); - return deferred.promise(); - } - } - serverData.requiredStateId = knownServerState.stateId; - } - - knownServerState.updateInProgress = true; - var self = this; - self.sendRequest(editorContext, { - type: 'PUT', - data: serverData, - - success: function(result) { - if (result.conflict) { - // The server has lost its session state and the resource is loaded from the server - if (knownServerState.text !== undefined) { - delete knownServerState.updateInProgress; - delete knownServerState.text; - delete knownServerState.stateId; - self.invoke(editorContext, params, deferred); - } else { - deferred.reject(result.conflict); - } - return false; - } - var listeners = editorContext.updateServerState(currentText, result.stateId); - for (var i = 0; i < listeners.length; i++) { - self.addCompletionCallback(listeners[i], params); - } - deferred.resolve(result); - }, - - error: function(xhr, textStatus, errorThrown) { - if (xhr.status == 404 && !params.loadFromServer && knownServerState.text !== undefined) { - // The server has lost its session state and the resource is not loaded from the server - delete knownServerState.updateInProgress; - delete knownServerState.text; - delete knownServerState.stateId; - self.invoke(editorContext, params, deferred); - return true; - } - deferred.reject(errorThrown); - }, - - complete: self.onComplete.bind(self) - }, true); - return deferred.promise().always(function() { - knownServerState.updateInProgress = false; - }); - }; - - return UpdateService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/ValidationService.js b/language-web/src/main/js/xtext/services/ValidationService.js deleted file mode 100644 index 85c9953d..00000000 --- a/language-web/src/main/js/xtext/services/ValidationService.js +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['xtext/services/XtextService', 'jquery'], function(XtextService, jQuery) { - - /** - * Service class for validation. - */ - function ValidationService(serviceUrl, resourceId) { - this.initialize(serviceUrl, 'validate', resourceId); - }; - - ValidationService.prototype = new XtextService(); - - ValidationService.prototype._checkPreconditions = function(editorContext, params) { - return this._state === undefined; - } - - ValidationService.prototype._onConflict = function(editorContext, cause) { - this.setState(undefined); - return { - suppressForcedUpdate: true - }; - }; - - return ValidationService; -}); \ No newline at end of file diff --git a/language-web/src/main/js/xtext/services/XtextService.js b/language-web/src/main/js/xtext/services/XtextService.js deleted file mode 100644 index d3a4842f..00000000 --- a/language-web/src/main/js/xtext/services/XtextService.js +++ /dev/null @@ -1,280 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015, 2017 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ - -define(['jquery'], function(jQuery) { - - var globalState = {}; - - /** - * Generic service implementation that can serve as superclass for specialized services. - */ - function XtextService() {}; - - /** - * Initialize the request metadata for this service class. Two variants: - * - initialize(serviceUrl, serviceType, resourceId, updateService) - * - initialize(xtextServices, serviceType) - */ - XtextService.prototype.initialize = function() { - this._serviceType = arguments[1]; - if (typeof(arguments[0]) === 'string') { - this._requestUrl = arguments[0] + '/' + this._serviceType; - var resourceId = arguments[2]; - if (resourceId) - this._encodedResourceId = encodeURIComponent(resourceId); - this._updateService = arguments[3]; - } else { - var xtextServices = arguments[0]; - if (xtextServices.options) { - this._requestUrl = xtextServices.options.serviceUrl + '/' + this._serviceType; - var resourceId = xtextServices.options.resourceId; - if (resourceId) - this._encodedResourceId = encodeURIComponent(resourceId); - } - this._updateService = xtextServices.updateService; - } - } - - XtextService.prototype.setState = function(state) { - this._state = state; - } - - /** - * Invoke the service with default service behavior. - */ - XtextService.prototype.invoke = function(editorContext, params, deferred, callbacks) { - if (deferred === undefined) { - deferred = jQuery.Deferred(); - } - if (jQuery.isFunction(this._checkPreconditions) && !this._checkPreconditions(editorContext, params)) { - deferred.reject(); - return deferred.promise(); - } - var serverData = { - contentType: params.contentType - }; - var initResult; - if (jQuery.isFunction(this._initServerData)) - initResult = this._initServerData(serverData, editorContext, params); - var httpMethod = 'GET'; - if (initResult && initResult.httpMethod) - httpMethod = initResult.httpMethod; - var self = this; - if (!(initResult && initResult.suppressContent)) { - if (params.sendFullText) { - serverData.fullText = editorContext.getText(); - httpMethod = 'POST'; - } else { - var knownServerState = editorContext.getServerState(); - if (knownServerState.updateInProgress) { - if (self._updateService) { - self._updateService.addCompletionCallback(function() { - self.invoke(editorContext, params, deferred); - }); - } else { - deferred.reject(); - } - return deferred.promise(); - } - if (knownServerState.stateId !== undefined) { - serverData.requiredStateId = knownServerState.stateId; - } - } - } - - var onSuccess; - if (jQuery.isFunction(this._getSuccessCallback)) { - onSuccess = this._getSuccessCallback(editorContext, params, deferred); - } else { - onSuccess = function(result) { - if (result.conflict) { - if (self._increaseRecursionCount(editorContext)) { - var onConflictResult; - if (jQuery.isFunction(self._onConflict)) { - onConflictResult = self._onConflict(editorContext, result.conflict); - } - if (!(onConflictResult && onConflictResult.suppressForcedUpdate) && !params.sendFullText - && result.conflict == 'invalidStateId' && self._updateService) { - self._updateService.addCompletionCallback(function() { - self.invoke(editorContext, params, deferred); - }); - var knownServerState = editorContext.getServerState(); - delete knownServerState.stateId; - delete knownServerState.text; - self._updateService.invoke(editorContext, params); - } else { - self.invoke(editorContext, params, deferred); - } - } else { - deferred.reject(); - } - return false; - } - if (jQuery.isFunction(self._processResult)) { - var processedResult = self._processResult(result, editorContext); - if (processedResult) { - deferred.resolve(processedResult); - return true; - } - } - deferred.resolve(result); - }; - } - - var onError = function(xhr, textStatus, errorThrown) { - if (xhr.status == 404 && !params.loadFromServer && self._increaseRecursionCount(editorContext)) { - var onConflictResult; - if (jQuery.isFunction(self._onConflict)) { - onConflictResult = self._onConflict(editorContext, errorThrown); - } - var knownServerState = editorContext.getServerState(); - if (!(onConflictResult && onConflictResult.suppressForcedUpdate) - && knownServerState.text !== undefined && self._updateService) { - self._updateService.addCompletionCallback(function() { - self.invoke(editorContext, params, deferred); - }); - delete knownServerState.stateId; - delete knownServerState.text; - self._updateService.invoke(editorContext, params); - return true; - } - } - deferred.reject(errorThrown); - } - - self.sendRequest(editorContext, { - type: httpMethod, - data: serverData, - success: onSuccess, - error: onError - }, !params.sendFullText); - return deferred.promise().always(function() { - self._recursionCount = undefined; - }); - } - - /** - * Send an HTTP request to invoke the service. - */ - XtextService.prototype.sendRequest = function(editorContext, settings, needsSession) { - var self = this; - self.setState('started'); - var corsEnabled = editorContext.xtextServices.options['enableCors']; - if(corsEnabled) { - settings.crossDomain = true; - settings.xhrFields = {withCredentials: true}; - } - var onSuccess = settings.success; - settings.success = function(result) { - var accepted = true; - if (jQuery.isFunction(onSuccess)) { - accepted = onSuccess(result); - } - if (accepted || accepted === undefined) { - self.setState('finished'); - if (editorContext.xtextServices) { - var successListeners = editorContext.xtextServices.successListeners; - if (successListeners) { - for (var i = 0; i < successListeners.length; i++) { - var listener = successListeners[i]; - if (jQuery.isFunction(listener)) { - listener(self._serviceType, result); - } - } - } - } - } - }; - - var onError = settings.error; - settings.error = function(xhr, textStatus, errorThrown) { - var resolved = false; - if (jQuery.isFunction(onError)) { - resolved = onError(xhr, textStatus, errorThrown); - } - if (!resolved) { - self.setState(undefined); - self._reportError(editorContext, textStatus, errorThrown, xhr); - } - }; - - settings.async = true; - var requestUrl = self._requestUrl; - if (!settings.data.resource && self._encodedResourceId) { - if (requestUrl.indexOf('?') >= 0) - requestUrl += '&resource=' + self._encodedResourceId; - else - requestUrl += '?resource=' + self._encodedResourceId; - } - - if (needsSession && globalState._initPending) { - // We have to wait until the initial request has finished to make sure the client has - // received a valid session id - if (!globalState._waitingRequests) - globalState._waitingRequests = []; - globalState._waitingRequests.push({requestUrl: requestUrl, settings: settings}); - } else { - if (needsSession && !globalState._initDone) { - globalState._initPending = true; - var onComplete = settings.complete; - settings.complete = function(xhr, textStatus) { - if (jQuery.isFunction(onComplete)) { - onComplete(xhr, textStatus); - } - delete globalState._initPending; - globalState._initDone = true; - if (globalState._waitingRequests) { - for (var i = 0; i < globalState._waitingRequests.length; i++) { - var request = globalState._waitingRequests[i]; - jQuery.ajax(request.requestUrl, request.settings); - } - delete globalState._waitingRequests; - } - } - } - jQuery.ajax(requestUrl, settings); - } - } - - /** - * Use this in case of a conflict before retrying the service invocation. If the number - * of retries exceeds the limit, an error is reported and the function returns false. - */ - XtextService.prototype._increaseRecursionCount = function(editorContext) { - if (this._recursionCount === undefined) - this._recursionCount = 1; - else - this._recursionCount++; - - if (this._recursionCount >= 10) { - this._reportError(editorContext, 'warning', 'Xtext service request failed after 10 attempts.', {}); - return false; - } - return true; - }, - - /** - * Report an error to the listeners. - */ - XtextService.prototype._reportError = function(editorContext, severity, message, requestData) { - if (editorContext.xtextServices) { - var errorListeners = editorContext.xtextServices.errorListeners; - if (errorListeners) { - for (var i = 0; i < errorListeners.length; i++) { - var listener = errorListeners[i]; - if (jQuery.isFunction(listener)) { - listener(this._serviceType, severity, message, requestData); - } - } - } - } - } - - return XtextService; -}); -- cgit v1.2.3-70-g09d2