From d33c7e90146d4926c646a6b98e4f4f8fb52ccadb Mon Sep 17 00:00:00 2001 From: oxixes Date: Tue, 28 May 2024 12:48:24 +0200 Subject: [PATCH] Improve MAC v2 loading --- src/js_tests/wirecloud/WidgetMetaSpec.js | 11 ++++++----- src/js_tests/wirecloud/wiring/OperatorMetaSpec.js | 4 ++-- src/wirecloud/commons/utils/template/parsers/json.py | 4 ++-- src/wirecloud/commons/utils/template/parsers/rdf.py | 2 +- src/wirecloud/commons/utils/template/parsers/xml.py | 10 +++++++--- src/wirecloud/commons/utils/template/writers/rdf.py | 2 +- src/wirecloud/commons/utils/template/writers/xml.py | 2 +- .../js/WirecloudAPI/WirecloudAPIV2Bootstrap.js | 12 ++++++++++++ src/wirecloud/platform/static/js/wirecloud/Widget.js | 7 ++++++- .../platform/static/js/wirecloud/WidgetMeta.js | 4 ---- .../platform/static/js/wirecloud/wiring/Operator.js | 7 ++++++- .../static/js/wirecloud/wiring/OperatorMeta.js | 4 ---- 12 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/js_tests/wirecloud/WidgetMetaSpec.js b/src/js_tests/wirecloud/WidgetMetaSpec.js index 180ac322b..6a949c4a2 100644 --- a/src/js_tests/wirecloud/WidgetMetaSpec.js +++ b/src/js_tests/wirecloud/WidgetMetaSpec.js @@ -68,21 +68,21 @@ }).toThrowError(TypeError); }); - it("throws a TypeError exception when the entrypoint is missing for mac version 2", () => { + it("does not throw a TypeError exception when the entrypoint is missing for mac version 2", () => { expect(() => { new Wirecloud.WidgetMeta({ vendor: "Wirecloud", name: "TestWidget", + preferences: [], + properties: [], version: "1.0", - type: "widget", - js_files: [], macversion: 2, - preferences: [], + js_files: [], contents: { src: "index.html" } }); - }).toThrowError(TypeError); + }).not.toThrow(); }); it("throws a TypeError exception when the js_files is missing for mac version 2", () => { @@ -95,6 +95,7 @@ macversion: 2, entrypoint: "Test", preferences: [], + properties: [], contents: { src: "index.html" } diff --git a/src/js_tests/wirecloud/wiring/OperatorMetaSpec.js b/src/js_tests/wirecloud/wiring/OperatorMetaSpec.js index e9304f1d7..ccca660aa 100644 --- a/src/js_tests/wirecloud/wiring/OperatorMetaSpec.js +++ b/src/js_tests/wirecloud/wiring/OperatorMetaSpec.js @@ -63,7 +63,7 @@ }).toThrowError(TypeError); }); - it("throws a TypeError exception when the entrypoint is missing for mac version 2", () => { + it("does not throw a TypeError exception when the entrypoint is missing for mac version 2", () => { expect(() => { new ns.OperatorMeta({ vendor: "Wirecloud", @@ -75,7 +75,7 @@ macversion: 2, js_files: ["Test"] }); - }).toThrowError(TypeError); + }).not.toThrow(); }); it("throws a TypeError exception when the js_files is missing for mac version 2", () => { diff --git a/src/wirecloud/commons/utils/template/parsers/json.py b/src/wirecloud/commons/utils/template/parsers/json.py index 444797a2c..2c8a2fc9c 100644 --- a/src/wirecloud/commons/utils/template/parsers/json.py +++ b/src/wirecloud/commons/utils/template/parsers/json.py @@ -217,7 +217,7 @@ def _init(self): if self._info['type'] == 'widget': if self._info['macversion'] > 1: - self._check_string_fields(('entrypoint', ), required=True) + self._check_string_fields(('entrypoint', ), required=False) self._check_array_fields(('altcontents',)) if self._info.get('contents', None) is None: @@ -231,7 +231,7 @@ def _init(self): elif self._info['type'] == 'operator': if self._info['macversion'] > 1: - self._check_string_fields(('entrypoint', ), required=True) + self._check_string_fields(('entrypoint', ), required=False) elif self._info['type'] == 'mashup': diff --git a/src/wirecloud/commons/utils/template/parsers/rdf.py b/src/wirecloud/commons/utils/template/parsers/rdf.py index a4324f6e3..f9bb295df 100644 --- a/src/wirecloud/commons/utils/template/parsers/rdf.py +++ b/src/wirecloud/commons/utils/template/parsers/rdf.py @@ -655,7 +655,7 @@ def _parse_component_info(self): raise TemplateParseException(_('Missing required field: Javascript files')) if self._info['macversion'] > 1: - self._info['entrypoint'] = self._get_field(WIRE, 'entryPoint', self._rootURI, required=True) + self._info['entrypoint'] = self._get_field(WIRE, 'entryPoint', self._rootURI, required=False) def _parse_translation_catalogue(self): self._info['default_lang'] = 'en' diff --git a/src/wirecloud/commons/utils/template/parsers/xml.py b/src/wirecloud/commons/utils/template/parsers/xml.py index 1146bdda7..f9bce9817 100644 --- a/src/wirecloud/commons/utils/template/parsers/xml.py +++ b/src/wirecloud/commons/utils/template/parsers/xml.py @@ -445,12 +445,14 @@ def _parse_widget_info(self): if self._info["macversion"] > 1: js_files = self._xpath(SCRIPT_XPATH, self._doc) - + self._info['js_files'] = [] for script in js_files: self._info['js_files'].append(str(script.get('src'))) - self._info["entrypoint"] = self.get_xpath(ENTRYPOINT_XPATH, self._doc, required=True).get('name') + entrypoint = self.get_xpath(ENTRYPOINT_XPATH, self._doc, required=False) + if entrypoint is not None: + self._info["entrypoint"] = entrypoint.get('name') else: js_files = self._xpath(SCRIPT_XPATH, self._doc) if len(js_files) > 0: @@ -467,7 +469,9 @@ def _parse_operator_info(self): self._info['js_files'].append(str(script.get('src'))) if self._info["macversion"] > 1: - self._info["entrypoint"] = self.get_xpath(ENTRYPOINT_XPATH, self._doc, required=True).get('name') + entrypoint = self.get_xpath(ENTRYPOINT_XPATH, self._doc, required=False) + if entrypoint is not None: + self._info["entrypoint"] = entrypoint.get('name') def _parse_component_preferences(self): diff --git a/src/wirecloud/commons/utils/template/writers/rdf.py b/src/wirecloud/commons/utils/template/writers/rdf.py index c2bd52da7..612e9d2b0 100644 --- a/src/wirecloud/commons/utils/template/writers/rdf.py +++ b/src/wirecloud/commons/utils/template/writers/rdf.py @@ -588,7 +588,7 @@ def build_rdf_graph(template_info): graph.add((js_node, WIRE['index'], rdflib.Literal(str(index)))) graph.add((resource_uri, USDL['utilizedResource'], js_node)) - if (template_info['type'] == 'operator' or template_info['type'] == 'widget') and template_info['macversion'] > 1: + if (template_info['type'] == 'operator' or template_info['type'] == 'widget') and template_info['macversion'] > 1 and 'entrypoint' in template_info: # Add entryPoint graph.add((resource_uri, WIRE['entryPoint'], rdflib.Literal(template_info.get('entrypoint')))) diff --git a/src/wirecloud/commons/utils/template/writers/xml.py b/src/wirecloud/commons/utils/template/writers/xml.py index 1f5b74963..ba957f884 100644 --- a/src/wirecloud/commons/utils/template/writers/xml.py +++ b/src/wirecloud/commons/utils/template/writers/xml.py @@ -319,7 +319,7 @@ def build_xml_document(options): for script in options['js_files']: etree.SubElement(scripts, 'script', src=script) - if (options['type'] == 'operator' or options['type'] == 'widget') and options['macversion'] > 1: + if (options['type'] == 'operator' or options['type'] == 'widget') and options['macversion'] > 1 and 'entrypoint' in options: # Add entrypoint etree.SubElement(template, 'entrypoint', name=options['entrypoint']) diff --git a/src/wirecloud/platform/static/js/WirecloudAPI/WirecloudAPIV2Bootstrap.js b/src/wirecloud/platform/static/js/WirecloudAPI/WirecloudAPIV2Bootstrap.js index 52f4fe0a2..4052d43c3 100644 --- a/src/wirecloud/platform/static/js/WirecloudAPI/WirecloudAPIV2Bootstrap.js +++ b/src/wirecloud/platform/static/js/WirecloudAPI/WirecloudAPIV2Bootstrap.js @@ -69,4 +69,16 @@ ComponentManagement: privates._ComponentManagementAPI }; + Wirecloud.APIComponents = {} + const registerWidgetClass = function registerWidgetClass(script, widgetClass) { + Wirecloud.APIComponents[script.dataset.id] = widgetClass; + }; + + const registerOperatorClass = function registerOperatorClass(script, operatorClass) { + Wirecloud.APIComponents[script.dataset.id] = operatorClass; + } + + Wirecloud.registerWidgetClass = registerWidgetClass; + Wirecloud.registerOperatorClass = registerOperatorClass; + })(window.Wirecloud); \ No newline at end of file diff --git a/src/wirecloud/platform/static/js/wirecloud/Widget.js b/src/wirecloud/platform/static/js/wirecloud/Widget.js index c6df31992..2c3f59274 100644 --- a/src/wirecloud/platform/static/js/wirecloud/Widget.js +++ b/src/wirecloud/platform/static/js/wirecloud/Widget.js @@ -208,6 +208,7 @@ const script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', js_file); + script.dataset.id = this.meta.uri; script.async = false; document.body.appendChild(script); this.loaded_scripts.push(script); @@ -312,7 +313,11 @@ // If this is a v2 or later widget, we need to instantiate it's entrypoint class _unloadScripts.call(this); _loadScripts.call(this).then(() => { - const entrypoint = window[this.meta.entrypoint]; + let entrypoint = Wirecloud.APIComponents[this.meta.uri]; + if (!entrypoint) { + entrypoint = window[this.meta.entrypoint]; + } + if (entrypoint === undefined) { this.logManager.log("Widget entrypoint class not found!", {console: false}); } else { diff --git a/src/wirecloud/platform/static/js/wirecloud/WidgetMeta.js b/src/wirecloud/platform/static/js/wirecloud/WidgetMeta.js index 4467b763a..dc073876d 100644 --- a/src/wirecloud/platform/static/js/wirecloud/WidgetMeta.js +++ b/src/wirecloud/platform/static/js/wirecloud/WidgetMeta.js @@ -51,10 +51,6 @@ if (!this.js_files) { throw new TypeError("missing js_files attribute in widget description"); } - - if (!this.entrypoint) { - throw new TypeError("missing entrypoint attribute in widget description"); - } } } if (this.codeurl.indexOf('?') === -1) { diff --git a/src/wirecloud/platform/static/js/wirecloud/wiring/Operator.js b/src/wirecloud/platform/static/js/wirecloud/wiring/Operator.js index 1da4e5ad5..358fe5279 100644 --- a/src/wirecloud/platform/static/js/wirecloud/wiring/Operator.js +++ b/src/wirecloud/platform/static/js/wirecloud/wiring/Operator.js @@ -55,6 +55,7 @@ const script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', js_file); + script.dataset.id = this.meta.uri; script.async = false; document.body.appendChild(script); this.loaded_scripts.push(script); @@ -203,7 +204,11 @@ this.wrapperElement.contentDocument.defaultView.addEventListener('unload', on_unload.bind(this), true); } else if (!this.meta.missing && this.meta.macversion > 1) { // If this is a v2 or later operator, we need to instantiate it's entrypoint class - const entrypoint = window[this.meta.entrypoint]; + let entrypoint = Wirecloud.APIComponents[this.meta.uri]; + if (!entrypoint) { + entrypoint = window[this.meta.entrypoint]; + } + if (entrypoint === undefined) { this.logManager.log("Operator entrypoint class not found!", {console: false}); } else { diff --git a/src/wirecloud/platform/static/js/wirecloud/wiring/OperatorMeta.js b/src/wirecloud/platform/static/js/wirecloud/wiring/OperatorMeta.js index cb7fd4707..0b8c891f1 100644 --- a/src/wirecloud/platform/static/js/wirecloud/wiring/OperatorMeta.js +++ b/src/wirecloud/platform/static/js/wirecloud/wiring/OperatorMeta.js @@ -58,10 +58,6 @@ if (!this.js_files) { throw new TypeError("missing js_files attribute in operator description"); } - - if (!this.entrypoint) { - throw new TypeError("missing entrypoint attribute in operator description"); - } } desc.properties.forEach((property_info) => {