From 5826a7a38e21640c4d2b96e098c435955d40cca9 Mon Sep 17 00:00:00 2001
From: Patrizio Bekerle <patrizio.bekerle@tugraz.at>
Date: Mon, 16 Sep 2019 11:17:45 +0200
Subject: [PATCH] Do JSONLD code refactoring

---
 packages/common/jsonld.js | 133 +++++++++++++++++++++-----------------
 1 file changed, 74 insertions(+), 59 deletions(-)

diff --git a/packages/common/jsonld.js b/packages/common/jsonld.js
index 2109d5b0..ca16e378 100644
--- a/packages/common/jsonld.js
+++ b/packages/common/jsonld.js
@@ -61,73 +61,88 @@ export default class JSONLD {
         xhr.setRequestHeader('Authorization', 'Bearer ' + window.VPUAuthToken);
 
         xhr.onreadystatechange = function () {
-            if (xhr.readyState === 4) {
-                if (xhr.status === 200) {
-                    const json = JSON.parse(xhr.responseText);
-
-                    let entryPoints = {};
-                    for (let property in json) {
-                        // for some reason the properties start with a lower case character
-                        if (!property.startsWith("@")) entryPoints[property.toLowerCase()] = json[property];
-                    }
-
-                    // read the link header of the api response
-                    //                const utils = require("./utils");
-                    const links = utils.parseLinkHeader(this.getResponseHeader("link"));
-
-                    // get the hydra apiDocumentation url
-                    const apiDocUrl = links["http://www.w3.org/ns/hydra/core#apiDocumentation"];
-
-                    if (apiDocUrl !== undefined) {
-                        // load the hydra apiDocumentation
-                        const docXhr = new XMLHttpRequest();
-                        docXhr.open("GET", apiDocUrl, true);
-                        docXhr.setRequestHeader("Content-Type", "application/json");
-                        docXhr.onreadystatechange = function () {
-                            if (docXhr.readyState === 4) {
-                                if (docXhr.status === 200) {
-                                    const json = JSON.parse(docXhr.responseText);
-                                    const supportedClasses = json["hydra:supportedClass"];
-
-                                    let entities = {};
-                                    const baseUrl = utils.parseBaseUrl(apiUrl);
-
-                                    // gather the entities
-                                    supportedClasses.forEach(function (classData) {
-                                        // add entry point url
-                                        const entityName = classData["hydra:title"];
-                                        let entryPoint = entryPoints[entityName.toLowerCase()];
-                                        if (entryPoint !== undefined && !entryPoint.startsWith("http")) entryPoint = baseUrl + entryPoint;
-                                        classData["@entryPoint"] = entryPoint;
-
-                                        entities[entityName] = classData;
-                                    });
-
-                                    const instance = new JSONLD(baseUrl, entities);
-                                    instances[apiUrl] = instance;
-
-                                    // return the initialized JSONLD object
-                                    for (const fnc of successFunctions[apiUrl]) if (typeof fnc == 'function') fnc(instance);
-                                    successFunctions[apiUrl] = [];
-                                } else {
-                                    JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.api-documentation-server', {apiUrl: apiDocUrl}));
-                                }
-                            }
-                        };
-
-                        docXhr.send();
-                    } else {
-                        JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-hydra-documentation-url-not-set', {apiUrl: apiUrl}));
-                    }
+            if (xhr.readyState !== 4) {
+                return;
+            }
+
+            if (xhr.status === 200) {
+                const json = JSON.parse(xhr.responseText);
+
+                let entryPoints = {};
+                for (let property in json) {
+                    // for some reason the properties start with a lower case character
+                    if (!property.startsWith("@")) entryPoints[property.toLowerCase()] = json[property];
+                }
+
+                // read the link header of the api response
+                //                const utils = require("./utils");
+                const links = utils.parseLinkHeader(this.getResponseHeader("link"));
+
+                // get the hydra apiDocumentation url
+                const apiDocUrl = links["http://www.w3.org/ns/hydra/core#apiDocumentation"];
+
+                if (apiDocUrl !== undefined) {
+                    // load the hydra apiDocumentation
+                    const docXhr = new XMLHttpRequest();
+                    docXhr.open("GET", apiDocUrl, true);
+                    docXhr.setRequestHeader("Content-Type", "application/json");
+                    docXhr.onreadystatechange = function () {
+                        if (docXhr.readyState !== 4) {
+                            return;
+                        }
+
+                        if (docXhr.status === 200) {
+                            JSONLD.gatherEntities(docXhr, apiUrl, entryPoints);
+                        } else {
+                            JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.api-documentation-server', {apiUrl: apiDocUrl}));
+                        }
+                    };
+
+                    docXhr.send();
                 } else {
-                    JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-api-server', {apiUrl: apiUrl}));
+                    JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-hydra-documentation-url-not-set', {apiUrl: apiUrl}));
                 }
+            } else {
+                JSONLD.executeFailureFunctions(apiUrl, i18n.t('jsonld.error-api-server', {apiUrl: apiUrl}));
             }
         };
 
         xhr.send();
     }
 
+    /**
+     * Gather the entities
+     *
+     * @param docXhr
+     * @param apiUrl
+     * @param entryPoints
+     */
+    static gatherEntities(docXhr, apiUrl, entryPoints) {
+        const json = JSON.parse(docXhr.responseText);
+        const supportedClasses = json["hydra:supportedClass"];
+
+        let entities = {};
+        const baseUrl = utils.parseBaseUrl(apiUrl);
+
+        // gather the entities
+        supportedClasses.forEach(function (classData) {
+            // add entry point url
+            const entityName = classData["hydra:title"];
+            let entryPoint = entryPoints[entityName.toLowerCase()];
+            if (entryPoint !== undefined && !entryPoint.startsWith("http")) entryPoint = baseUrl + entryPoint;
+            classData["@entryPoint"] = entryPoint;
+
+            entities[entityName] = classData;
+        });
+
+        const instance = new JSONLD(baseUrl, entities);
+        instances[apiUrl] = instance;
+
+        // return the initialized JSONLD object
+        for (const fnc of successFunctions[apiUrl]) if (typeof fnc == 'function') fnc(instance);
+        successFunctions[apiUrl] = [];
+    }
+
     /**
      * Execute failure functions and send general notification
      *
-- 
GitLab