import {HostedByCollectedFrom, Journal, Project, RelationResult} from "../../utils/result-preview/result-preview"; import {Context, Reference} from "../../utils/entities/resultLandingInfo"; import {Injectable} from '@angular/core'; import {properties} from "../../../../environments/environment"; import {StringUtils} from "../../utils/string-utils.class"; @Injectable({ providedIn: 'root' }) export class ParsingFunctions { public eoscSubjects = [ {label: 'EOSC::Jupyter Notebook', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'marketplace.eosc-portal.eu/services?tag=EOSC%3A%3AJupyter+Notebook', value: 'Jupyter Notebook'}, {label: 'EOSC::RO-crate', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'marketplace.eosc-portal.eu/services?tag=EOSC%3A%3ARO-crate', value: 'RO-crate'}, {label: 'EOSC::Galaxy Workflow', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'marketplace.eosc-portal.eu/services?tag=EOSC%3A%3AGalaxy+Workflow', value: 'Galaxy Workflow'}, {label: 'EOSC::Twitter Data', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'marketplace.eosc-portal.eu/services?tag=EOSC%3A%3ATwitter+Data', value: 'Twitter Data'} ] public notebookInSubjects: boolean = false; private notebookKeyword: string = "eosc jupyter notebook"; private notebook_label: string = "EOSC"; private notebook_value: string = "EOSC Jupyter Notebook"; public open = 'lock_open'; public closed = 'lock'; public unknown = 'question_mark'; private instanceWithDoiExists: boolean = false; constructor() { } public ngOnDestroy() { } public parseFundingByProjects(fundedByProjects: Project[], relation: any): Project[] { if (fundedByProjects == undefined) { fundedByProjects = []; } let fundedByProject: Project = { "id": "", "acronym": "", "title": "", "funderShortname": "", "funderName": "", "funding": "", "code": "", "provenanceAction": "", "validated": false }; if (relation.title != 'unidentified') { fundedByProject['id'] = relation['to'].content; fundedByProject['acronym'] = relation.acronym; fundedByProject['title'] = relation.title; fundedByProject['code'] = relation.code; if(relation.validated && relation.validated.date) { fundedByProject['validated'] = true; } fundedByProject['provenanceAction'] = relation.provenanceaction; } else { fundedByProject['id'] = ""; fundedByProject['acronym'] = ""; fundedByProject['title'] = ""; fundedByProject['code'] = ""; fundedByProject['provenanceAction'] = ""; } if (relation.hasOwnProperty("funding")) { let funding: { "funderName": string, "funderShortname": string, "stream": string }; funding = this.parseFundingTrees(relation.funding); if (funding.funderName) { fundedByProject['funderName'] = funding.funderName; } if (funding.funderShortname) { fundedByProject['funderShortname'] = funding.funderShortname; } if (funding.stream) { fundedByProject['funding'] = funding.stream; } } fundedByProjects.push(fundedByProject); return fundedByProjects; } // publication & research data : for fundedByProjects | project landing : for funding public parseFundingTrees(fundingTree: any): { "funderName": string, "funderShortname": string, "stream": string } { let funding: { "funderName": string, "funderShortname": string, "stream": string } = { "funderName": "", "funderShortname": "", "stream": "" }; let length = Array.isArray(fundingTree) ? fundingTree.length : 1; for (let i = 0; i < length; i++) { let fundingData = Array.isArray(fundingTree) ? fundingTree[i] : fundingTree; if (fundingData.hasOwnProperty("funder")) { funding.funderShortname = fundingData['funder'].shortname; funding.funderName = fundingData['funder'].name; } funding.stream = this.addFundingLevel0(fundingData, funding.stream); funding.stream = this.addFundingLevel1(fundingData, funding.stream); funding.stream = this.addFundingLevel2(fundingData, funding.stream); } return funding; } addFundingLevel0(parent: string, fundingStream: string): string { if (parent.hasOwnProperty("funding_level_0")) { let level0 = parent['funding_level_0']; fundingStream += (fundingStream) ? " ; " : ""; fundingStream += level0.name; } return fundingStream; } addFundingLevel1(parent: string, fundingStream: string): string { if (parent.hasOwnProperty("funding_level_1")) { let level1 = parent['funding_level_1']; // For projects' parsing if (level1.hasOwnProperty("parent")) { fundingStream = this.addFundingLevel0(level1.parent, fundingStream); } fundingStream += (fundingStream) ? " | " : ""; fundingStream += level1.name; } return fundingStream; } addFundingLevel2(parent: string, fundingStream: string): string { if (parent.hasOwnProperty("funding_level_2")) { let level2 = parent['funding_level_2']; // For projects' parsing if (level2.hasOwnProperty("parent")) { fundingStream = this.addFundingLevel1(level2.parent, fundingStream); } fundingStream += (fundingStream) ? " | " : ""; fundingStream += level2.name; } return fundingStream; } // publication & dataset landing : for collectedFrom parseCollectedFrom(collectedFrom: { "name": string, "id": string }[], _collectedFrom: any) { let length: number = collectedFrom.length; collectedFrom[length] = {"name": "", "id": ""}; collectedFrom[length]['name'] = _collectedFrom.name; collectedFrom[length]['id'] = _collectedFrom.id; } // publication & dataset landing : for downloadFrom addPublisherToHostedBy_collectedFrom(hostedBy_collectedFrom: HostedByCollectedFrom[], publisher: string, journal: Journal, identifiers: Map/*, title: { "name": string, "url": string, "accessMode": string}*/) { if (!this.instanceWithDoiExists && publisher && identifiers != null && identifiers.has('doi')) { if (hostedBy_collectedFrom == null) { hostedBy_collectedFrom = []; } let available: HostedByCollectedFrom = { downloadNames: [], downloadUrl: "", collectedNamesAndIds: null, accessRight: "", types: [], years: [], accessRightIcon: "" }; if (journal && journal.journal) { available.downloadNames.push(publisher + "/ " + journal['journal']); } else { available.downloadNames.push(publisher); } available.downloadUrl = properties.doiURL + identifiers.get("doi")[0];; available.accessRightIcon = this.unknown; /* if(title != undefined && title['url'] == "") { title['url'] = url; } */ hostedBy_collectedFrom.push(available); } return hostedBy_collectedFrom; } // publication & dataset landing : for downloadFrom parseDownloadFrom(downloadFrom: Map, instance: any, url: string) { let key: string = instance['hostedby'].name; if (key) { this.addUrlAndAccessMode(downloadFrom, instance, key, url); } } // publication & dataset landing : for publishedIn parsePublishedIn(publishedIn: Map, instance: any, result: any, url: string, counter: number): number { if (result != null && result.hasOwnProperty("source")) { let key: string; if (Array.isArray(result.source)) { if (counter == result.source.length) { counter--; } key = result['source'][counter]; } else { key = result['source']; } if (key) { this.addUrlAndAccessMode(publishedIn, instance, key, url); counter++; } } return counter; } // publication & dataset landing : for downloadFrom and publishedIn addUrlAndAccessMode(mapStructure: Map, instance: any, key: string, url: string) { if (!mapStructure.has(key)) { mapStructure.set(key, {"url": null, "accessMode": null, "bestAccessMode": null}); } if (mapStructure.get(key)['url'] == null) { mapStructure.get(key)['url'] = new Array(); } if (url) { mapStructure.get(key)['url'].push(url); } if (mapStructure.get(key)['accessMode'] == null) { mapStructure.get(key)['accessMode'] = new Array(); } if (instance.hasOwnProperty("accessright")) { if (url) { mapStructure.get(key)['accessMode'].push(instance['accessright'].classname); } if (this.changeBestAccessMode(mapStructure.get(key)['bestAccessMode'], instance['accessright'])) { mapStructure.get(key)['bestAccessMode'] = instance['accessright'].classname; } } else if (url) { mapStructure.get(key)['accessMode'].push(""); } } parseHostedBy_collectedFrom(hostedBy_collectedFrom: HostedByCollectedFrom[], instance: any, url: string, globalAccessRight: string) { if(!url) { return; } let available: HostedByCollectedFrom = { "downloadNames": [], "downloadUrl": null, "collectedNamesAndIds": new Map(), "accessRight": null, "accessRightIcon": "", "types": [], "years": [], "license": "" }; if (instance.hasOwnProperty("hostedby")) { let downloadNames: Set = new Set(); let length = Array.isArray(instance['hostedby']) ? instance['hostedby'].length : 1; for (let i = 0; i < length; i++) { let hostedBy = Array.isArray(instance['hostedby']) ? instance['hostedby'][i] : instance['hostedby']; if (hostedBy.name && hostedBy.name != "other resources" && hostedBy.name != "Unknown Repository") { downloadNames.add(String(hostedBy.name)); } } available.downloadNames = Array.from(downloadNames); if (available.downloadNames.length == 0) { available.downloadNames.push(url.substring(0, 30) + '...'); // substring(from, to); } } if (instance.hasOwnProperty("collectedfrom")) { let length = Array.isArray(instance['collectedfrom']) ? instance['collectedfrom'].length : 1; for (let i = 0; i < length; i++) { let collectedFrom = Array.isArray(instance['collectedfrom']) ? instance['collectedfrom'][i] : instance['collectedfrom']; if(collectedFrom.name && collectedFrom.id) { available.collectedNamesAndIds.set(String(collectedFrom.name), collectedFrom.id); } } } if (instance.hasOwnProperty("instancetype")) { let types: Set = new Set(); let length = Array.isArray(instance['instancetype']) ? instance['instancetype'].length : 1; for (let i = 0; i < length; i++) { let instanceType = Array.isArray(instance['instancetype']) ? instance['instancetype'][i] : instance['instancetype']; if(instanceType.classname && instanceType.classname.toLowerCase() !== "unknown") { types.add(instanceType.classname); } } available.types = Array.from(types); } if (instance.hasOwnProperty("dateofacceptance")) { let years: Set = new Set(); let length = Array.isArray(instance['dateofacceptance']) ? instance['dateofacceptance'].length : 1; for (let i = 0; i < length; i++) { let dateOfAcceptance = Array.isArray(instance['dateofacceptance']) ? instance['dateofacceptance'][i] : instance['dateofacceptance']; let date: string = (dateOfAcceptance) + ""; // transform to string in case it is an integer years.add((date && (date).indexOf('-') !== -1) ? date.split('-')[0] : date); } available.years = Array.from(years); } available['downloadUrl'] = url; if(url.includes("doi.org/")) { this.instanceWithDoiExists = true; } if (instance.hasOwnProperty("accessright")) { let length = Array.isArray(instance['accessright']) ? instance['accessright'].length : 1; for (let i = 0; i < length; i++) { let accessRight = Array.isArray(instance['accessright']) ? instance['accessright'][i] : instance['accessright']; if (this.changeBestAccessMode(available.accessRight, accessRight)) { available.accessRight = accessRight.classname; if (this.changeBestAccessMode(globalAccessRight, accessRight)) { globalAccessRight = accessRight.classname; } } } } if (available.accessRight) { if (available.accessRight.toLowerCase().indexOf('open') !== -1) { available.accessRightIcon = this.open; } else if (available.accessRight.toLowerCase().indexOf('not available') !== -1) { available.accessRightIcon = this.unknown; } else { available.accessRightIcon = this.closed; } } else { available.accessRightIcon = this.unknown; } if(instance.hasOwnProperty("license")) { available.license = Array.isArray(instance['license']) ? instance['license'][0] : instance['license']; } hostedBy_collectedFrom.push(available); } // publication & dataset landing : for downloadFrom and publishedIn changeBestAccessMode(currentAccessMode: string, accessMode: any): boolean { if (!accessMode) { return false; } accessMode = accessMode.classid; switch (currentAccessMode) { case null: if (accessMode != "UNKNOWN") { return true; } return false; case "CLOSED": if (accessMode == "OPEN" || accessMode == "OPEN SOURCE" || accessMode == "EMBARGO" || accessMode == "RESTRICTED") { return true; } return false; case "RESTRICTED": if (accessMode == "OPEN" || accessMode == "OPEN SOURCE" || accessMode == "EMBARGO") { return true; } return false; case "EMBARGO": if (accessMode == "OPEN" || accessMode == "OPEN SOURCE") { return true; } return false; case "OPEN SOURCE": if (accessMode == "OPEN") { return true; } return false; } return false; } // publication & dataset & software & orp landing : for relatedResearchResults parseResults(researchResults: RelationResult[], relation, provenanceAction: string, relationName: string): RelationResult[] { if (researchResults == undefined) { researchResults = []; } let researchResult: RelationResult = { name: "", id: "", date: "", percentage: null, percentageName: null, class: "", provenanceAction: provenanceAction, relationName: relationName }; // researchResult.relationName = relation.to.class; if(relation['resulttype']) { if (relation['resulttype'].classname == "publication") { researchResult['class'] = "publication"; } else if (relation['resulttype'].classname == "dataset") { researchResult['class'] = "dataset"; } else if (relation['resulttype'].classname == "software") { researchResult['class'] = "software"; } else if (relation['resulttype'].classname == "other") { researchResult['class'] = "other"; } } researchResult['id'] = relation['to'].content; if(Array.isArray(relation['title'])) { for(let i=0; i { let identifiers = new Map(); if (pid.hasOwnProperty("classid") && pid['classid'] != "") { if (pid.classid == "doi" || pid.classid == "pmc" || pid.classid == "handle" || pid.classid == "pmid" || pid.classid == "re3data") { if (!identifiers.has(pid.classid)) { identifiers.set(pid.classid, new Array()); } identifiers.get(pid.classid).push(pid.content+""); } } else { for (let i = 0; i < pid.length; i++) { if (pid[i].classid == "doi" || pid[i].classid == "pmc" || pid[i].classid == "handle" || pid[i].classid == "pmid" || pid[i].classid == "re3data") { if (!identifiers.has(pid[i].classid)) { identifiers.set(pid[i].classid, new Array()); } identifiers.get(pid[i].classid).push(pid[i].content+""); } } } return identifiers; } // publication & dataset landing : for subjects and otherSubjects and classifiedSubjects parseEoscSubjects(_subjects: any): any[] { let eoscSubjectsFound = []; let setOfEoscSubjects: Set = new Set(); let subject; let length = Array.isArray(_subjects) ? _subjects.length : 1; for (let i = 0; i < length; i++) { subject = Array.isArray(_subjects) ? _subjects[i] : _subjects; let content: string = subject.code+""; let checkAndAddEoscSubjectResp = this.checkAndAddEoscSubject(setOfEoscSubjects, eoscSubjectsFound, subject, content); let found: boolean = checkAndAddEoscSubjectResp["found"]; if(found) { setOfEoscSubjects = checkAndAddEoscSubjectResp["setOfEoscSubject"]; eoscSubjectsFound = checkAndAddEoscSubjectResp["eoscSubjectsFound"]; } } return eoscSubjectsFound; } // publication & dataset landing : for subjects and otherSubjects and classifiedSubjects parseAllSubjects(_subjects: any, vocabulary: any): [string[], Map, Map, string[], string[], any[]] { let eoscSubjectsFound = []; let subjects: string[]; let otherSubjects: Map; let classifiedSubjects: Map; let fos: string[]; let sdg: string[]; let setOfEoscSubjects: Set = new Set(); let subject; let length = Array.isArray(_subjects) ? _subjects.length : 1; for (let i = 0; i < length; i++) { subject = Array.isArray(_subjects) ? _subjects[i] : _subjects; if (subject.classid != "") { if (subject.classid == "keyword") { let content: string = subject.content+""; let checkAndAddEoscSubjectResp = this.checkAndAddEoscSubject(setOfEoscSubjects, eoscSubjectsFound, subject, content); let found: boolean = checkAndAddEoscSubjectResp["found"]; if(found) { setOfEoscSubjects = checkAndAddEoscSubjectResp["setOfEoscSubject"]; eoscSubjectsFound = checkAndAddEoscSubjectResp["eoscSubjectsFound"]; } else { if (subjects == undefined) { subjects = new Array(); } subjects.push(content); } } else if (!vocabulary || vocabulary[subject.classid] || subject.classid === "SDG" || subject.classid === "FOS") { // if (subject.inferred && subject.inferred == true) { if(subject.classid === "SDG") { if (sdg == undefined) { sdg = new Array(); } sdg.push(subject.content+""); } else if(subject.classid === "FOS") { if (fos == undefined) { fos = new Array(); } fos.push(subject.content+""); } else { if (classifiedSubjects == undefined) { classifiedSubjects = new Map(); } let content: string = subject.content+""; let checkAndAddEoscSubjectResp = this.checkAndAddEoscSubject(setOfEoscSubjects, eoscSubjectsFound, subject, content); let found: boolean = checkAndAddEoscSubjectResp["found"]; if(found) { setOfEoscSubjects = checkAndAddEoscSubjectResp["setOfEoscSubject"]; eoscSubjectsFound = checkAndAddEoscSubjectResp["eoscSubjectsFound"]; } else { if (!classifiedSubjects.has(subject.classname)) { classifiedSubjects.set(subject.classname, new Array()); } classifiedSubjects.get(subject.classname).push(content); } } } else { let content: string = subject.content+""; let checkAndAddEoscSubjectResp = this.checkAndAddEoscSubject(setOfEoscSubjects, eoscSubjectsFound, subject, content); let found: boolean = checkAndAddEoscSubjectResp["found"]; if(found) { setOfEoscSubjects = checkAndAddEoscSubjectResp["setOfEoscSubject"]; eoscSubjectsFound = checkAndAddEoscSubjectResp["eoscSubjectsFound"]; } else { let classname: string = subject.classname + ""; if (subjects == undefined) { subjects = new Array(); } subjects.push(content); } } } } return [subjects, otherSubjects, classifiedSubjects, fos, sdg, eoscSubjectsFound]; } checkAndAddEoscSubject(setOfEoscSubjects: Set, eoscSubjectsFound, subject, content) { let found: boolean = false; if(!setOfEoscSubjects.has(content)) { // looping through our declared array this.eoscSubjects.forEach(item => { if (content && content == item.label) { found = true; eoscSubjectsFound.push(item); setOfEoscSubjects.add(content); } }); } return {"found": found, "setOfEoscSubject": setOfEoscSubjects, "eoscSubjectsFound": eoscSubjectsFound}; } parseContexts(_contexts: any): Context[] { let contexts = new Array(); let position = 0; let labels = ""; let context; let length = Array.isArray(_contexts) ? _contexts.length : 1; for (let i = 0; i < length; i++) { let numOfCategories: number = 0; // count categories with label context = Array.isArray(_contexts) ? _contexts[i] : _contexts; if (context.label && context.hasOwnProperty("type") && (context['type'] == "community" || context['type'] == "ri")) { if (context.hasOwnProperty("category")) { let category; let length2 = Array.isArray(context['category']) ? context['category'].length : 1; for (let z = 0; z < length2; z++) { let numOfConcepts: number = 0; // count category concepts with label category = Array.isArray(context['category']) ? context['category'][z] : context['category']; if (category.label && category.hasOwnProperty("concept")) { let categoryConcept; let length1 = Array.isArray(category['concept']) ? category['concept'].length : 1; for (let j = 0; j < length1; j++) { categoryConcept = Array.isArray(category['concept']) ? category['concept'][j] : category['concept']; // initalize if there is concept label or this is the last concept of the category and there were no concepts // otherwise we could have multiple entries for the same category but without concepts if(categoryConcept.label || (numOfConcepts == 0 && j == (length1 - 1))) { contexts[position] = { "labelContext": "", "idContext": "", "labelCategory": "", "idCategory": "", "labelConcept": "", "idConcept": "" }; contexts[position]['labelContext'] = context.label; contexts[position]['idContext'] = context.id; contexts[position]['labelCategory'] = category.label; contexts[position]['idCategory'] = category.id; contexts[position]['labelConcept'] = categoryConcept.label ? categoryConcept.label : null; contexts[position]['idConcept'] = categoryConcept.label ? categoryConcept.id : null; position++; numOfConcepts++; } } } else if(category.label || (numOfCategories == 0 && z == (length2 - 1))) { contexts[position] = {"labelContext": "", "idContext": "", "labelCategory": "", "idCategory": "", "labelConcept": "", "idConcept": ""}; contexts[position]['labelContext'] = context.label; contexts[position]['idContext'] = context.id; contexts[position]['labelCategory'] = category.label ? category.label : null; contexts[position]['idCategory'] = category.label ? category.id : null; contexts[position]['labelConcept'] = null; contexts[position]['idConcept'] = null; position++; numOfCategories++; } } } else { contexts[position] = {"labelContext": "", "idContext": "", "labelCategory": "", "idCategory": "", "labelConcept": "", "idConcept": ""}; contexts[position]['labelContext'] = context.label; contexts[position]['idContext'] = context.id; contexts[position]['labelCategory'] = null; contexts[position]['idCategory'] = null; contexts[position]['labelConcept'] = null; contexts[position]['idConcept'] = null; contexts[position]['new'] = false; position++; } } } return contexts; } public static getEnermapsConceptId(contexts: any): string{ let enermapsconcepts = contexts.filter(c=> {return c.idCategory == "enermaps::selection" && c.idConcept}); return enermapsconcepts && enermapsconcepts.length > 0?enermapsconcepts[0].idConcept.split("enermaps::selection::")[1]:null; // return "hotmaps_heat_tot_curr_density" } parseTypes(types: string[], uniqueTypes: Set, instance: any) { if (instance && instance.hasOwnProperty("instancetype") && instance['instancetype'].classname) { if (!uniqueTypes.has(instance['instancetype'].classname)) { types.push(instance['instancetype'].classname); uniqueTypes.add(instance['instancetype'].classname); } } } parseLanguages(_languages: any) { var languages = new Array(); if (!Array.isArray(_languages)) { if (_languages.classname != "Undetermined" && _languages.classname) { languages.push(_languages.classname); } } else { for (let i = 0; i < _languages.length; i++) { if (_languages[i].classname != "Undetermined" && _languages[i].classname) { languages.push(_languages[i].classname); } } } return languages; } parseCountries(_countries: any) { var countries = new Array(); if (!Array.isArray(_countries)) { if (_countries.classname != "Undetermined" && _countries.classname) { countries.push(_countries.classname); } } else { for (let i = 0; i < countries.length; i++) { if (_countries[i].classname != "Undetermined" && _countries[i].classname) { countries.push(_countries[i].classname); } } } return countries; } parseProgrammingLanguages(_pLanguages) { var pLanguages = new Array(); if (!Array.isArray(_pLanguages)) { if (_pLanguages.classname != "Undetermined" && _pLanguages.classname) { pLanguages.push(_pLanguages.classname); } } else { for (let i = 0; i < _pLanguages.length; i++) { if (_pLanguages[i].classname != "Undetermined" && _pLanguages[i].classname) { pLanguages.push(_pLanguages[i].classname); } } } return pLanguages; } parseReferences(citations: any): Reference[] { let references: Reference[] = []; citations = Array.isArray(citations) ? citations : [citations]; citations.forEach(citation => { let reference: Reference = {name: null, ids: []}; if(citation.rawText) { reference.name = citation.rawText; } if(citation.id) { let ids: any[] = Array.isArray(citation.id) ? citation.id : [citation.id]; ids.forEach(id => { reference.ids.push({ type: id.type, value: id.value, trust: id.confidenceLevel }); }); } references[citation.position - 1] = reference; }); return references; } static parseRelCanonicalId(record, type){ try{ if(record["result"]["metadata"]["oaf:entity"][("oaf:"+type)]["children"] && record["result"]["metadata"]["oaf:entity"][("oaf:"+type)]["children"][type]){ for(let child of record["result"]["metadata"]["oaf:entity"][("oaf:"+type)]["children"][type]){ return child["objidentifier"]; } } }catch(e){ // console.error(e); } return record["result"]["header"]["dri:objIdentifier"]; } parseDescription(description):string[] { let abstracts = []; if(!Array.isArray(description)) { abstracts = [description ? String(description) : ""]; } else { abstracts = description.map( x => String(x)); } try{ abstracts = abstracts.map( x => StringUtils.HTMLToString(x)); } catch (e) {} abstracts =abstracts.sort((a,b) => b.length - a.length); return abstracts; } }