Project

General

Profile

1
import {OpenaireProperties} from '../../utils/properties/openaireProperties';
2

    
3
export class ParsingFunctions {
4

    
5
  constructor () {}
6

    
7
  public ngOnDestroy() {}
8

    
9
  public parseFundingByProjects(fundedByProjects: { "id": string, "acronym": string, "title": string,
10
                                                    "funderShortname": string, "funderName": string,
11
                                                    "funding": string, "code": string,
12
                                                    "provenanceAction": string, "inline": boolean
13
                                                  }[],
14
                                relation: any, projectsProvenanceVocabulary: any):
15
                            { "id": string, "acronym": string, "title": string,
16
                              "funderShortname": string, "funderName": string,
17
                              "funding": string, "code": string,
18
                              "provenanceAction": string, "inline": boolean
19
                            }[] {
20
    if(fundedByProjects == undefined) {
21
      fundedByProjects = new Array<{"id": string, "acronym": string, "title": string,
22
                                    "funderShortname": string, "funderName": string,
23
                                    "funding": string, "code": string,
24
                                    "provenanceAction": string, "inline": boolean
25
                                  }>();
26
    }
27

    
28
    let fundedByProject:  { "id": string, "acronym": string, "title": string,
29
                            "funderShortname": string, "funderName": string,
30
                            "funding": string, "code": string,
31
                            "provenanceAction": string, "inline": boolean
32
                          } = { "id": "", "acronym": "", "title": "",
33
                                "funderShortname": "", "funderName": "",
34
                                "funding": "", "code": "", "provenanceAction": "", "inline": false
35
                          };
36

    
37
    if(relation.title != 'unidentified') {
38
      fundedByProject['id'] = relation['to'].content;
39
      fundedByProject['acronym'] = relation.acronym;
40
      fundedByProject['title'] = relation.title;
41
      fundedByProject['code'] = relation.code;
42

    
43
      if(relation.provenanceaction in projectsProvenanceVocabulary) {
44
        fundedByProject['provenanceAction'] = projectsProvenanceVocabulary[relation.provenanceaction];
45
      }
46
    } else {
47
      fundedByProject['id'] = "";
48
      fundedByProject['acronym'] = "";
49
      fundedByProject['title'] = "";
50
      fundedByProject['code'] = "";
51
      fundedByProject['provenanceAction'] = "";
52
    }
53

    
54
    if(relation.hasOwnProperty("funding")) {
55
      let funding: {"funderName": string, "funderShortname": string, "stream": string};
56
      funding = this.parseFundingTrees(relation.funding);
57

    
58
      if(funding.funderName) {
59
        fundedByProject['funderName'] = funding.funderName;
60
      }
61
      if(funding.funderShortname) {
62
        fundedByProject['funderShortname'] = funding.funderShortname;
63
      }
64
      if(funding.stream) {
65
        fundedByProject['funding'] = funding.stream;
66
      }
67
    }
68
    fundedByProjects.push(fundedByProject);
69
    return fundedByProjects;
70
  }
71

    
72
  // publication & dataset : for fundedByProjects | project landing : for funding
73
  public parseFundingTrees(fundingTree: any): {"funderName": string, "funderShortname": string, "stream": string} {
74
    let funding: {"funderName": string, "funderShortname": string, "stream": string} = {"funderName": "", "funderShortname": "", "stream": ""};
75
    let length = Array.isArray(fundingTree) ? fundingTree.length : 1;
76

    
77
    for(let i=0; i<length; i++) {
78
      let fundingData = Array.isArray(fundingTree) ? fundingTree[i] : fundingTree;
79

    
80
      if(fundingData.hasOwnProperty("funder")) {
81
        funding.funderShortname = fundingData['funder'].shortname;
82
        funding.funderName = fundingData['funder'].name;
83
      }
84

    
85
      funding.stream = this.addFundingLevel0(fundingData, funding.stream);
86

    
87
      funding.stream = this.addFundingLevel1(fundingData, funding.stream);
88

    
89
      funding.stream = this.addFundingLevel2(fundingData, funding.stream);
90
    }
91
    return funding;
92
  }
93

    
94
  addFundingLevel0(parent: string, fundingStream: string) : string {
95
    if(parent.hasOwnProperty("funding_level_0")) {
96
      let level0 = parent['funding_level_0'];
97

    
98
      fundingStream += (fundingStream) ? " ; " : "";
99
      fundingStream += level0.name;
100
    }
101
    return fundingStream;
102
  }
103

    
104
  addFundingLevel1(parent: string, fundingStream: string): string {
105
    if(parent.hasOwnProperty("funding_level_1")) {
106
      let level1 = parent['funding_level_1'];
107

    
108
      // For projects' parsing
109
      if(level1.hasOwnProperty("parent")) {
110
        fundingStream = this.addFundingLevel0(level1.parent, fundingStream);
111
      }
112

    
113
      fundingStream += (fundingStream) ? " | " : "";
114
      fundingStream += level1.name;
115
    }
116
    return fundingStream;
117
  }
118

    
119
  addFundingLevel2(parent: string, fundingStream: string): string {
120
    if(parent.hasOwnProperty("funding_level_2")) {
121
      let level2 = parent['funding_level_2'];
122

    
123
      // For projects' parsing
124
      if(level2.hasOwnProperty("parent")) {
125
        fundingStream = this.addFundingLevel1(level2.parent, fundingStream);
126
      }
127

    
128
      fundingStream += (fundingStream) ? " | " : "";
129
      fundingStream += level2.name;
130
    }
131
    return fundingStream;
132
  }
133

    
134
  // publication & dataset landing : for collectedFrom
135
  parseCollectedFrom(_collectedFrom: any): {"name": string, "id": string}[] {
136
    let collectedFrom = new Array<{"name": string, "id": string}>();
137

    
138
    let collected;
139
    let length = Array.isArray(_collectedFrom) ? _collectedFrom.length : 1;
140
    for(let i=0; i<length; i++) {
141
      collected = Array.isArray(_collectedFrom) ? _collectedFrom[i] : _collectedFrom;
142
      collectedFrom[i] = {"name": "", "id": ""};
143
      collectedFrom[i]['name'] = collected.name;
144
      collectedFrom[i]['id'] = collected.id;
145
    }
146

    
147
    return collectedFrom;
148
  }
149

    
150
  // publication & dataset landing : for downloadFrom
151
  addPublisherToDownloadFrom( downloadFrom: Map<string, {"url": string[], "accessMode": string[], "bestAccessMode": string}>,
152
                              publisher: string, journal:{"journal": string, "issn": string, "lissn": string},
153
                              identifiers: Map<string, string[]>, title: { "name": string, "url": string, "accessMode": string}) {
154
    if( publisher && identifiers != null && identifiers.has('doi')) {
155
      if( downloadFrom == null) {
156
        downloadFrom = new Map<string, {"url": string[], "accessMode": string[], "bestAccessMode": string}>();
157
      }
158

    
159
      let key: string;
160
      if(journal && journal.journal) {
161
        key = publisher + "/ "+journal['journal'];
162
      } else {
163
        key = publisher;
164
      }
165
      downloadFrom.set(key, {"url": null, "accessMode": null, "bestAccessMode": null});
166

    
167
      let url = OpenaireProperties.getDoiURL()+identifiers.get("doi")[0];
168

    
169
      downloadFrom.get(key)['url'] = new Array<string>();
170
      downloadFrom.get(key)['accessMode'] = new Array<string>();
171

    
172
      downloadFrom.get(key)['url'][0] = url;
173
      downloadFrom.get(key)['accessMode'][0] = "";
174

    
175
      if(title != undefined && title['url'] == "") {
176
        title['url'] = url;
177
      }
178
    }
179
    return downloadFrom;
180
  }
181

    
182
  // publication & dataset landing : for downloadFrom
183
  parseDownloadFrom(downloadFrom: Map<string, {"url": string[], "accessMode": string[], "bestAccessMode": string}>, instance: any, url: string)
184
  {
185
    let key: string = instance['hostedby'].name;
186

    
187
    if(key) {
188
      this.addUrlAndAccessMode(downloadFrom, instance, key, url);
189
    }
190
  }
191

    
192
  // publication & dataset landing : for publishedIn
193
  parsePublishedIn(publishedIn: Map<string, {"url": string[], "accessMode": string[], "bestAccessMode": string}>, instance: any, result: any, url: string, counter: number): number {
194
    if(result != null && result.hasOwnProperty("source")) {
195
      let key: string;
196
      if(Array.isArray(result.source)) {
197
        if(counter==result.source.length) {
198
          counter--;
199
        }
200
        key = result['source'][counter];
201
      } else {
202
        key = result['source'];
203
      }
204

    
205
      if(key) {
206
        this.addUrlAndAccessMode(publishedIn, instance, key, url);
207
        counter++;
208
      }
209
    }
210
    return counter;
211
  }
212

    
213
  // publication & dataset landing : for downloadFrom and publishedIn
214
  addUrlAndAccessMode(mapStructure: Map<string, {"url": string[], "accessMode": string[], "bestAccessMode": string}>, instance: any, key: string, url: string) {
215
    if(!mapStructure.has(key)) {
216
      mapStructure.set(key, {"url": null, "accessMode": null, "bestAccessMode": null});
217
    }
218

    
219
    if(mapStructure.get(key)['url'] == null) {
220
      mapStructure.get(key)['url'] = new Array<string>();
221
    }
222

    
223
    if(url) {
224
      mapStructure.get(key)['url'].push(url);
225
    }
226

    
227
    if(mapStructure.get(key)['accessMode'] == null) {
228
      mapStructure.get(key)['accessMode'] = new Array<string>();
229
    }
230

    
231
    if(instance.hasOwnProperty("licence")) {
232
      if(url) {
233
        mapStructure.get(key)['accessMode'].push(instance['licence'].classid);
234
      }
235

    
236
      if(this.changeBestAccessMode(mapStructure.get(key)['bestAccessMode'], instance['licence'])) {
237
        mapStructure.get(key)['bestAccessMode'] = instance['licence'].classid;
238
      }
239
    } else if(url) {
240
      mapStructure.get(key)['accessMode'].push("");
241
    }
242
  }
243

    
244
  // publication & dataset landing : for downloadFrom and publishedIn
245
  changeBestAccessMode(currentAccessMode: string, accessMode: any): boolean {
246
    if(!accessMode) {
247
      return false;
248
    }
249
    accessMode = accessMode.classid;
250

    
251
    switch (currentAccessMode) {
252
      case null:
253
        return true;
254
      case "CLOSED":
255
        if( accessMode == "OPEN" ||
256
            accessMode == "EMBARGO" ||
257
            accessMode == "RESTRICTED") {
258
              return true;
259
        }
260
        return false;
261
      case "RESTRICTED":
262
        if( accessMode == "OPEN" ||
263
            accessMode == "EMBARGO") {
264
              return true;
265
        }
266
        return false;
267
      case "EMBARGO":
268
        if(accessMode == "OPEN") {
269
          return true;
270
      }
271
      return false;
272
    }
273
    return false;
274
  }
275

    
276
  // publication & dataset landing : for relatedResearchResults
277
  parseRelatedResearchResults(relatedResearchResults: Map<string, { "name": string, "id": string, "date": string,
278
                    "trust": number, "class": string}[]>, relation: any, provenanceAction: string) :
279
                        Map<string, { "name": string, "id": string, "date": string,
280
                                      "trust": number, "class": string}[]> {
281
    if(relatedResearchResults == undefined) {
282
      relatedResearchResults = new Map<string, {"name": string, "id": string, "date": string,
283
                                                "trust": number, "class": string }[]>();
284
    }
285

    
286
    if(!relatedResearchResults.has(provenanceAction)) {
287
      relatedResearchResults.set(provenanceAction,
288
                        new Array<{ "name": string, "id": string, "date": string,
289
                                    "trust": number, "class": string }>());
290
    }
291
    relatedResearchResults.get(provenanceAction).push(this.parseRelatedOrSimilarResearchResult(relation));
292

    
293
    return relatedResearchResults;
294
  }
295

    
296
  // publication & dataset landing : for similarResearchResults
297
  parseSimilarResearchResults(similarResearchResults: { "name": string, "id": string, "date": string,
298
                                                        "trust": number, "class": string}[], relation: any) :
299
                { "name": string, "id": string, "date": string, "trust": number, "class": string }[] {
300
    if(similarResearchResults == undefined) {
301
      similarResearchResults = new Array<{"name": string, "id": string, "date": string,
302
                                          "trust": number, "class": string}>();
303
    }
304
    similarResearchResults.push(this.parseRelatedOrSimilarResearchResult(relation));
305
    return similarResearchResults;
306
  }
307

    
308
  // publication & dataset landing : for relatedResearchResults and similarResearchResults
309
  parseRelatedOrSimilarResearchResult(relation: any): {"name": string, "id": string, "date": string, "trust": number, "class": string} {
310
    let researchResult: {"name": string, "id": string, "date": string, "trust": number, "class": string}
311
                              = {"name": "", "id": "", "date": "", "trust": null, "class": ""}
312

    
313
    if(relation['resulttype'].classname == "publication") {
314
      researchResult['class'] = "publication";
315
    } else {
316
      researchResult['class'] = "dataset";
317
    }
318

    
319
    researchResult['id'] = relation['to'].content;
320
    let titleName = Array.isArray(relation['title']) ? relation['title'][0].content : relation['title'].content;
321
    researchResult['name'] = titleName;
322
    researchResult['date'] = relation.dateofacceptance.substring(0,4);;
323
    researchResult['trust'] = Math.round(relation.trust*100);
324
    return researchResult;
325
  }
326

    
327
  // publication & dataset landing : for identifiers
328
  parseIdentifiers(pid: any): Map<string, string[]> {
329
    let identifiers = new Map<string, string[]>();
330

    
331
    if(pid.hasOwnProperty("classname") && pid['classname'] != "") {
332
      if(pid.classname == "doi" || pid.classname == "pmc" || pid.classname == "handle") {
333
        if(!identifiers.has(pid.classname)) {
334
          identifiers.set(pid.classname, new Array<string>());
335
        }
336

    
337
        identifiers.get(pid.classname).push(pid.content);
338
      }
339
    } else {
340
      for(let i=0; i<pid.length; i++) {
341
        if(pid[i].classname == "doi" || pid[i].classname == "pmc" || pid[i].classname == "handle") {
342
          if(!identifiers.has(pid[i].classname)) {
343
            identifiers.set(pid[i].classname, new Array<string>());
344
          }
345
          identifiers.get(pid[i].classname).push(pid[i].content);
346
        }
347
      }
348
    }
349
    return identifiers;
350
  }
351

    
352
  // publication & dataset landing : for subjects and otherSubjects and classifiedSubjects
353
  parseAllSubjects(_subjects: any): [string[], Map<string, string[]>, Map<string, string[]>] {
354
    let subjects: string[];
355
    let otherSubjects: Map<string, string[]>;
356
    let classifiedSubjects: Map<string, string[]>;
357

    
358
    let subject;
359
    let length = Array.isArray(_subjects) ? _subjects.length : 1;
360

    
361
    for(let i=0; i<length; i++) {
362
      subject = Array.isArray(_subjects) ? _subjects[i] : _subjects;
363

    
364
      if(subject.classid != "") {
365
        if(subject.inferred == true) {
366
          if(classifiedSubjects == undefined) {
367
            classifiedSubjects = new Map<string, string[]>();
368
          }
369

    
370
          if(!classifiedSubjects.has(subject.classname)) {
371
            classifiedSubjects.set(subject.classname, new Array<string>());
372
          }
373

    
374
          classifiedSubjects.get(subject.classname).push(subject.content);
375
        } else {
376
          if(subject.classid == "keyword") {
377
            if(subjects == undefined) {
378
              subjects = new Array<string>();
379
            }
380

    
381
            subjects.push(subject.content);
382
          } else {
383
            if(otherSubjects == undefined) {
384
              otherSubjects = new Map<string, string[]>();
385
            }
386

    
387
            if(!otherSubjects.has(subject.classname)) {
388
              otherSubjects.set(subject.classname, new Array<string>());
389
            }
390
            otherSubjects.get(subject.classname).push(subject.content);
391
          }
392
        }
393
      }
394
    }
395
    return [subjects, otherSubjects, classifiedSubjects];
396
  }
397

    
398
  parseContexts(_contexts: any): {"labelContext": string, "labelCategory": string,
399
                                  "labelConcept": string, inline:boolean}[] {
400
    let contexts = new Array<{"labelContext": string, "labelCategory": string,
401
                              "labelConcept": string, inline:boolean}>();
402

    
403
    let position = 0;
404
    let labels = "";
405
    let context;
406
    let length = Array.isArray(_contexts) ? _contexts.length : 1;
407
    for(let i=0; i<length; i++) {
408
      context = Array.isArray(_contexts) ? _contexts[i] : _contexts;
409

    
410
      if(context.hasOwnProperty("type") && context['type'] == "community") {
411
        if(context.hasOwnProperty("category")) {
412
          if(context['category'].hasOwnProperty("concept")) {
413
            let categoryConcept;
414
            let length1 = Array.isArray(context['category']['concept']) ? context['category']['concept'].length : 1;
415
            for(let j=0; j<length1; j++) {
416
              categoryConcept = Array.isArray(context['category']['concept']) ? context['category']['concept'][j] : context['category']['concept'];
417

    
418
              contexts[position] = {"labelContext": "", "labelCategory": "", "labelConcept": "", inline: false };
419
              contexts[position]['labelContext'] = context.label;
420
              contexts[position]['labelCategory'] = context['category'].label;
421
              contexts[position]['labelConcept'] = categoryConcept.label;
422

    
423
              position++;
424
            }
425
          } else {
426
            contexts[position] = {"labelContext": "", "labelCategory": "", "labelConcept": "", inline: false};
427
            contexts[position]['labelContext'] = context.label;
428
            contexts[position]['labelCategory'] = context['category'].label;
429
            contexts[position]['labelConcept'] = null;
430
          }
431
        } else {
432
          contexts[position] = {"labelContext": "", "labelCategory": "", "labelConcept": "", inline: false};
433
          contexts[position]['labelContext'] = context.label;
434
          contexts[position]['labelCategory'] = null;
435
          contexts[position]['labelConcept'] = null;
436
          contexts[position]['new'] = false;
437
        }
438
      }
439
    }
440
    return contexts;
441
  }
442

    
443
  parseTypes(types: string[], uniqueTypes: Set<string>, instance: any) {
444
    if(instance.hasOwnProperty("instancetype") && instance['instancetype'].classname) {
445
      if(!uniqueTypes.has(instance['instancetype'].classname)) {
446
        types.push(instance['instancetype'].classname);
447
        uniqueTypes.add(instance['instancetype'].classname);
448
      }
449
    }
450
  }
451
}
    (1-1/1)