Skip to content
Snippets Groups Projects
Commit de3930aa authored by Bekerle, Patrizio's avatar Bekerle, Patrizio :fire: Committed by Reiter, Christoph
Browse files

Moved JSONLD to git sub-module

parent d9cf8ab4
No related branches found
No related tags found
No related merge requests found
[submodule "vendor/common"]
path = vendor/common
url = git@gitlab.tugraz.at:VPU/WebComponents/Common.git
"use strict";
let instances = {};
let successFunctions = {};
let failureFunctions = {};
let initStarted = {};
module.exports = class JSONLD {
constructor(baseApiUrl, entities) {
this.entities = entities;
this.baseApiUrl = baseApiUrl;
let idToEntityNameMatchList = {};
for (const entityName in entities) {
const id = entities[entityName]["@id"];
idToEntityNameMatchList[id] = entityName;
}
this.idToEntityNameMatchList = idToEntityNameMatchList;
}
static initialize(apiUrl, successFnc, failureFnc) {
// if init api call was already successfully finished execute the success function
if (instances[apiUrl] !== undefined) {
if (typeof successFnc == 'function') successFnc(instances[apiUrl]);
return;
}
// init the arrays
if (successFunctions[apiUrl] === undefined) successFunctions[apiUrl] = [];
if (failureFunctions[apiUrl] === undefined) failureFunctions[apiUrl] = [];
// add success and failure functions
if (typeof successFnc == 'function') successFunctions[apiUrl].push(successFnc);
if (typeof failureFnc == 'function') failureFunctions[apiUrl].push(failureFnc);
// check if api call was already started
if (initStarted[apiUrl] !== undefined) {
return;
}
initStarted[apiUrl] = true;
// window.VPUAuthToken will be set by on vpu-auth-init
document.addEventListener("vpu-auth-init", function(e)
{
const xhr = new XMLHttpRequest();
xhr.open("GET", apiUrl, true);
xhr.setRequestHeader('Authorization', 'Bearer ' + window.VPUAuthToken);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && 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 && 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 {
for (const fnc of failureFunctions[apiUrl]) if (typeof fnc == 'function') fnc();
failureFunctions[apiUrl] = [];
}
};
docXhr.send();
} else {
for (const fnc of failureFunctions[apiUrl]) if (typeof fnc == 'function') fnc();
failureFunctions[apiUrl] = [];
}
} else {
for (const fnc of failureFunctions[apiUrl]) if (typeof fnc == 'function') fnc();
failureFunctions[apiUrl] = [];
}
};
xhr.send();
});
}
static getInstance(apiUrl) {
return instances[apiUrl];
}
getEntityForIdentifier(identifier) {
let entityName = this.getEntityNameForIdentifier(identifier);
return this.getEntityForEntityName(entityName);
}
getEntityForEntityName(entityName) {
return this.entities[entityName];
}
getApiUrlForIdentifier(identifier) {
return this.getEntityForIdentifier(identifier)["@entryPoint"];
}
getApiUrlForEntityName(entityName) {
return this.getEntityForEntityName(entityName)["@entryPoint"];
}
getEntityNameForIdentifier(identifier) {
return this.idToEntityNameMatchList[identifier];
}
getApiIdentifierList() {
let keys = [];
for (const property in this.idToEntityNameMatchList) {
keys.push(property);
}
return keys;
}
/**
* Expands a member of a list to a object with schema.org properties
*
* @param member
*/
expandMember(member) {
const type = member["@type"];
const entity = this.getEntityForIdentifier(type);
let result = {"@id": member["@id"]};
entity["hydra:supportedProperty"].forEach(function (property) {
const id = property["hydra:property"]["@id"];
const title = property["hydra:title"];
result[id] = member[title];
});
return result;
}
/**
* Compacts an expanded member of a list to a object with local properties
*
* @param member
* @param localContext
*/
static compactMember(member, localContext) {
let result = {};
for (const property in localContext) {
const value = member[localContext[property]];
if (value !== undefined) {
result[property] = value;
}
}
return result;
}
/**
* Transforms hydra members to a local context
*
* @param data
* @param localContext
* @returns {Array}
*/
transformMembers(data, localContext) {
const members = data['hydra:member'];
if (members === undefined || members.length === 0) {
return [];
}
let results = [];
let that = this;
members.forEach(function (member) {
results.push(JSONLD.compactMember(that.expandMember(member), localContext));
});
return results;
}
};
...@@ -16,8 +16,9 @@ ...@@ -16,8 +16,9 @@
}, },
"dependencies": { "dependencies": {
"@webcomponents/webcomponentsjs": "^2.2.10", "@webcomponents/webcomponentsjs": "^2.2.10",
"i18next": "^17.0.3",
"lit-element": "^2.1.0", "lit-element": "^2.1.0",
"i18next": "^17.0.3" "vpu-common": "file:./vendor/common"
}, },
"scripts": { "scripts": {
"clean": "rm dist/*", "clean": "rm dist/*",
......
import {i18n} from './i18n.js'; import {i18n} from './i18n.js';
import {html, LitElement} from 'lit-element'; import {html, LitElement} from 'lit-element';
import JSONLD from "./jsonld"; import JSONLD from 'vpu-common/jsonld'
import utils from "./utils"; import utils from "./utils";
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment