Project

General

Profile

1
package eu.dnetlib.data.transform.xml;
2

    
3
import java.nio.charset.Charset;
4
import java.security.MessageDigest;
5
import java.util.*;
6
import java.util.function.Function;
7
import java.util.stream.Collectors;
8

    
9
import com.google.common.base.Predicate;
10
import com.google.common.base.Splitter;
11
import com.google.common.collect.Lists;
12
import com.google.common.collect.Maps;
13
import com.google.common.collect.Sets;
14
import com.google.protobuf.Descriptors.Descriptor;
15
import com.google.protobuf.Descriptors.FieldDescriptor;
16
import com.google.protobuf.InvalidProtocolBufferException;
17
import com.google.protobuf.Message;
18
import com.google.protobuf.Message.Builder;
19
import com.google.protobuf.ProtocolMessageEnum;
20
import eu.dnetlib.data.proto.DatasourceOrganizationProtos.DatasourceOrganization;
21
import eu.dnetlib.data.proto.DatasourceOrganizationProtos.DatasourceOrganization.Provision;
22
import eu.dnetlib.data.proto.DedupProtos.Dedup;
23
import eu.dnetlib.data.proto.DedupSimilarityProtos.DedupSimilarity;
24
import eu.dnetlib.data.proto.FieldTypeProtos.*;
25
import eu.dnetlib.data.proto.FieldTypeProtos.OAIProvenance.OriginDescription;
26
import eu.dnetlib.data.proto.KindProtos.Kind;
27
import eu.dnetlib.data.proto.OafProtos.Oaf;
28
import eu.dnetlib.data.proto.OafProtos.OafEntity;
29
import eu.dnetlib.data.proto.OafProtos.OafRel;
30
import eu.dnetlib.data.proto.OrganizationOrganizationProtos.OrganizationOrganization;
31
import eu.dnetlib.data.proto.ProjectOrganizationProtos.ProjectOrganization;
32
import eu.dnetlib.data.proto.ProjectOrganizationProtos.ProjectOrganization.Participation;
33
import eu.dnetlib.data.proto.RelMetadataProtos.RelMetadata;
34
import eu.dnetlib.data.proto.RelTypeProtos.RelType;
35
import eu.dnetlib.data.proto.RelTypeProtos.SubRelType;
36
import eu.dnetlib.data.proto.ResultOrganizationProtos.ResultOrganization;
37
import eu.dnetlib.data.proto.ResultOrganizationProtos.ResultOrganization.Affiliation;
38
import eu.dnetlib.data.proto.ResultProjectProtos.ResultProject;
39
import eu.dnetlib.data.proto.ResultProjectProtos.ResultProject.Outcome;
40
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult;
41
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.Part;
42
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.PublicationDataset;
43
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.Similarity;
44
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.Supplement;
45
import eu.dnetlib.data.proto.TypeProtos.Type;
46
import eu.dnetlib.miscutils.collections.Pair;
47
import eu.dnetlib.miscutils.iterators.IterablePair;
48
import org.apache.commons.codec.binary.Base64;
49
import org.apache.commons.codec.binary.Hex;
50
import org.apache.commons.lang3.StringUtils;
51
import org.apache.commons.lang.math.NumberUtils;
52
import org.w3c.dom.NamedNodeMap;
53
import org.w3c.dom.Node;
54
import org.w3c.dom.NodeList;
55

    
56
public abstract class AbstractDNetXsltFunctions {
57

    
58
	public static final String URL_REGEX = "^(http|https|ftp)\\://.*";
59
	private static final int MAX_NSPREFIX_LEN = 12;
60
	public static Predicate<String> urlFilter = s -> s.trim().matches(URL_REGEX);
61
	public static Map<String, String> code2name = Maps.newHashMap();
62

    
63
	/*
64
	 * Obtained via COPY (select code, name from class) TO '/tmp/class_scheme.csv' (FORMAT csv, delimiter ',', FORCE_QUOTE *); on the
65
	 * relational db
66
	 */
67
	//code2name.put("openaire2.0_data","OpenAIRE Data (funded, referenced datasets)");
68
	static {
69
		code2name.put("MH","Marshall Islands");
70
		code2name.put("CF","Central African Republic");
71
		code2name.put("TD","Chad");
72
		code2name.put("CN","China (People's Republic of)");
73
		code2name.put("NG","Nigeria");
74
		code2name.put("NF","Norfolk Island");
75
		code2name.put("MP","Northern Mariana Islands");
76
		code2name.put("PS","Palestinian-administered areas");
77
		code2name.put("SZ","Swaziland");
78
		code2name.put("max","Manx");
79
		code2name.put("TW","Taiwan");
80
		code2name.put("TJ","Tajikistan");
81
		code2name.put("BSG","Research for the benefit of specific groups");
82
		code2name.put("CP","Collaborative project");
83
		code2name.put("12MONTHS","12 Months Embargo");
84
		code2name.put("ace","Achinese");
85
		code2name.put("egy","Ancient Egyptian");
86
		code2name.put("ara","Arabic");
87
		code2name.put("arc","Aramaic");
88
		code2name.put("arp","Arapaho");
89
		code2name.put("gon","Gondi");
90
		code2name.put("ine","Indo-European");
91
		code2name.put("ipk","Inupiaq");
92
		code2name.put("ira","Iranian");
93
		code2name.put("lim","Limburgan; Limburger; Limburgish");
94
		code2name.put("mni","Manipuri");
95
		code2name.put("mno","Manobo");
96
		code2name.put("men","Mende");
97
		code2name.put("CX","Christmas Island");
98
		code2name.put("CC","Cocos (Keeling) Islands");
99
		code2name.put("KM","Comoros");
100
		code2name.put("CG","Congo");
101
		code2name.put("CK","Cook Islands");
102
		code2name.put("HR","Croatia");
103
		code2name.put("arn","Araucanian");
104
		code2name.put("art","Artificial");
105
		code2name.put("nah","Aztec");
106
		code2name.put("bug","Buginese");
107
		code2name.put("chn","Chinook jargon");
108
		code2name.put("chv","Chuvash");
109
		code2name.put("mus","Creek");
110
		code2name.put("mic","Micmac");
111
		code2name.put("min","Minangkabau");
112
		code2name.put("fro","Old French");
113
		code2name.put("cpp","Portuguese-based Creoles and Pidgins");
114
		code2name.put("som","Somali");
115
		code2name.put("wen","Sorbian");
116
		code2name.put("hrv","Croatian");
117
		code2name.put("cus","Cushitic");
118
		code2name.put("sot","Sotho, Southern");
119
		code2name.put("sai","South American Indian");
120
		code2name.put("esl/spa","Spanish");
121
		code2name.put("CU","Cuba");
122
		code2name.put("CW","Curaçao");
123
		code2name.put("CZ","Czech Republic");
124
		code2name.put("DK","Denmark");
125
		code2name.put("ER","Eritrea");
126
		code2name.put("TF","French Southern Territories");
127
		code2name.put("GW","Guinea-Bissau");
128
		code2name.put("VA","Holy See (Vatican City State)");
129
		code2name.put("BO","Bolivia");
130
		code2name.put("KY","Cayman Islands");
131
		code2name.put("dra","Dravidian");
132
		code2name.put("cpe","English-based Creoles and Pidgins");
133
		code2name.put("oji","Ojibwa");
134
		code2name.put("CIP-EIP-TN","CIP-Eco-Innovation - CIP-Thematic Network");
135
		code2name.put("jav/jaw","Javanese");
136
		code2name.put("ach","Acoli");
137
		code2name.put("ada","Adangme");
138
		code2name.put("afh","Afrihili");
139
		code2name.put("afr","Afrikaans");
140
		code2name.put("afa","Afro-Asiatic");
141
		code2name.put("ale","Aleut");
142
		code2name.put("alg","Algonquian languages");
143
		code2name.put("arw","Arawak");
144
		code2name.put("asm","Assamese");
145
		code2name.put("ava","Avaric");
146
		code2name.put("ave","Avestan");
147
		code2name.put("bra","Braj");
148
		code2name.put("bua","Buriat");
149
		code2name.put("chr","Cherokee");
150
		code2name.put("chy","Cheyenne");
151
		code2name.put("jrb","Judeo-Arabic");
152
		code2name.put("jpr","Judeo-Persian");
153
		code2name.put("kab","Kabyle");
154
		code2name.put("kac","Kachin");
155
		code2name.put("kaa","Kara-Kalpak");
156
		code2name.put("loz","Lozi");
157
		code2name.put("mwr","Marwari");
158
		code2name.put("DJ","Djibouti");
159
		code2name.put("JM","Jamaica");
160
		code2name.put("JP","Japan");
161
		code2name.put("JE","Jersey");
162
		code2name.put("JO","Jordan");
163
		code2name.put("KZ","Kazakhstan");
164
		code2name.put("KE","Kenya");
165
		code2name.put("KI","Kiribati");
166
		code2name.put("KR","Korea (Republic of)");
167
		code2name.put("KP","Korea, Democatric People's Republic of");
168
		code2name.put("XK","Kosovo * UN resolution");
169
		code2name.put("KW","Kuwait");
170
		code2name.put("NL","Netherlands");
171
		code2name.put("PE","Peru");
172
		code2name.put("PH","Philippines");
173
		code2name.put("fre/fra","French");
174
		code2name.put("PL","Poland");
175
		code2name.put("PT","Portugal");
176
		code2name.put("PR","Puerto Rico");
177
		code2name.put("QA","Qatar");
178
		code2name.put("RO","Romania");
179
		code2name.put("RU","Russian Federation");
180
		code2name.put("RW","Rwanda");
181
		code2name.put("RE","Réunion");
182
		code2name.put("sve/swe","Swedish");
183
		code2name.put("myn","Mayan");
184
		code2name.put("dum","Middle Dutch");
185
		code2name.put("mun","Munda");
186
		code2name.put("nde","Ndebele, North");
187
		code2name.put("ndo","Ndonga");
188
		code2name.put("nyn","Nyankole");
189
		code2name.put("nzi","Nzima");
190
		code2name.put("oci","Occitan (post 1500); Provençal");
191
		code2name.put("GU","Guam");
192
		code2name.put("tut","Altaic");
193
		code2name.put("awa","Awadhi");
194
		code2name.put("ban","Balinese");
195
		code2name.put("bal","Baluchi");
196
		code2name.put("bai","Bamileke");
197
		code2name.put("bad","Banda");
198
		code2name.put("UK","United Kingdom");
199
		code2name.put("bas","Basa");
200
		code2name.put("tib/bod","Tibetan");
201
		code2name.put("ben","Bengali");
202
		code2name.put("ber","Berber");
203
		code2name.put("cho","Choctaw");
204
		code2name.put("cop","Coptic");
205
		code2name.put("crp","Creoles and Pidgins");
206
		code2name.put("dak","Dakota");
207
		code2name.put("del","Delaware");
208
		code2name.put("div","Divehi");
209
		code2name.put("kha","Khasi");
210
		code2name.put("khi","Khoisan");
211
		code2name.put("kho","Khotanese");
212
		code2name.put("osa","Osage");
213
		code2name.put("oss","Ossetian; Ossetic");
214
		code2name.put("oto","Otomian");
215
		code2name.put("GT","Guatemala");
216
		code2name.put("ota","Ottoman");
217
		code2name.put("GG","Guernsey");
218
		code2name.put("GY","Guyana");
219
		code2name.put("LA","Lao (People's Democratic Republic)");
220
		code2name.put("LB","Lebanon");
221
		code2name.put("LY","Libyan Arab Jamahiriya");
222
		code2name.put("LI","Liechtenstein");
223
		code2name.put("LT","Lithuania");
224
		code2name.put("LU","Luxembourg");
225
		code2name.put("PW","Palau");
226
		code2name.put("BL","Saint-Barthélemy");
227
		code2name.put("SM","San Marino");
228
		code2name.put("SX","Sint Maarten (Dutch Part)");
229
		code2name.put("TL","Timor-Leste");
230
		code2name.put("TK","Tokelau");
231
		code2name.put("TO","Tonga");
232
		code2name.put("TN","Tunisia");
233
		code2name.put("TC","Turks and Caicos Islands");
234
		code2name.put("TV","Tuvalu");
235
		code2name.put("GB","United Kingdom");
236
		code2name.put("VU","Vanuatu");
237
		code2name.put("pal","Pahlavi");
238
		code2name.put("pau","Palauan");
239
		code2name.put("pam","Pampanga");
240
		code2name.put("pag","Pangasinan");
241
		code2name.put("pap","Papiamento");
242
		code2name.put("fas/per","Persian");
243
		code2name.put("phn","Phoenician");
244
		code2name.put("sid","Sidamo");
245
		code2name.put("GA","Gabon");
246
		code2name.put("GL","Greenland");
247
		code2name.put("GD","Grenada");
248
		code2name.put("GP","Guadeloupe");
249
		code2name.put("IE","Ireland");
250
		code2name.put("spa","Spanish; Castilian");
251
		code2name.put("IM","Isle of Man");
252
		code2name.put("IT","Italy");
253
		code2name.put("ES","Spain");
254
		code2name.put("SR","Suriname");
255
		code2name.put("TZ","Tanzania (United Republic of)");
256
		code2name.put("TH","Thailand");
257
		code2name.put("TG","Togo");
258
		code2name.put("UG","Uganda");
259
		code2name.put("UZ","Uzbekistan");
260
		code2name.put("VE","Venezuela");
261
		code2name.put("VI","Virgin Islands, U.S.");
262
		code2name.put("WF","Wallis and Futuna");
263
		code2name.put("COFUND-PCP","COFUND (PCP)");
264
		code2name.put("amh","Amharic");
265
		code2name.put("map","Austronesian");
266
		code2name.put("aym","Aymara");
267
		code2name.put("bnt","Bantu");
268
		code2name.put("bak","Bashkir");
269
		code2name.put("bho","Bhojpuri");
270
		code2name.put("bik","Bikol");
271
		code2name.put("bul","Bulgarian");
272
		code2name.put("cor","Cornish");
273
		code2name.put("dua","Duala");
274
		code2name.put("dut/nld","Dutch; Flemish");
275
		code2name.put("isRelatedTo","isRelatedTo");
276
		code2name.put("coauthor","coauthor");
277
		code2name.put("dyu","Dyula");
278
		code2name.put("eka","Ekajuk");
279
		code2name.put("gil","Gilbertese");
280
		code2name.put("suk","Sukuma");
281
		code2name.put("sux","Sumerian");
282
		code2name.put("sun","Sundanese");
283
		code2name.put("sus","Susu");
284
		code2name.put("swa","Swahili");
285
		code2name.put("0010","Lecture");
286
		code2name.put("0007","Master thesis");
287
		code2name.put("0027","Model");
288
		code2name.put("0012","Newsletter");
289
		code2name.put("0020","Other ORP type");
290
		code2name.put("0038","Other literature type");
291
		code2name.put("0039","Other dataset type");
292
		code2name.put("0040","Other software type");
293
		code2name.put("0013","Part of book or chapter of book");
294
		code2name.put("0019","Patent");
295
		code2name.put("0028","PhysicalObject");
296
		code2name.put("0016","Preprint");
297
		code2name.put("DM","Dominica");
298
		code2name.put("DO","Dominican Republic");
299
		code2name.put("EC","Ecuador");
300
		code2name.put("EG","Egypt");
301
		code2name.put("GQ","Equatorial Guinea");
302
		code2name.put("EE","Estonia");
303
		code2name.put("ET","Ethiopia");
304
		code2name.put("GR","Greece");
305
		code2name.put("HM","Heard Island and McDonald Islands");
306
		code2name.put("got","Gothic");
307
		code2name.put("grb","Grebo");
308
		code2name.put("ell/gre","Greek");
309
		code2name.put("hat","Haitian; Haitian Creole");
310
		code2name.put("hau","Hausa");
311
		code2name.put("haw","Hawaiian");
312
		code2name.put("heb","Hebrew");
313
		code2name.put("gai/iri","Irish");
314
		code2name.put("kar","Karen");
315
		code2name.put("lui","Luiseno");
316
		code2name.put("goh","Old High German");
317
		code2name.put("abk","Abkhazian");
318
		code2name.put("aar","Afar");
319
		code2name.put("aggregator::pubsrepository::journals","Journal Aggregator/Publisher");
320
		code2name.put("pubsrepository::mock","Other");
321
		code2name.put("pubscatalogue::unknown","Publication Catalogue");
322
		code2name.put("BI","Burundi");
323
		code2name.put("CM","Cameroon");
324
		code2name.put("CD","Congo (Democratic Republic of)");
325
		code2name.put("CR","Costa Rica");
326
		code2name.put("CI","Cote d'Ivoire");
327
		code2name.put("arg","Aragonese");
328
		code2name.put("aze","Azerbaijani");
329
		code2name.put("EU","European Union");
330
		code2name.put("FK","Falkland Islands (Malvinas)");
331
		code2name.put("scr/hrv","Croatian");
332
		code2name.put("bam","Bambara");
333
		code2name.put("baq/eus","Basque");
334
		code2name.put("bih","Bihari");
335
		code2name.put("FO","Faroe Islands");
336
		code2name.put("FJ","Fiji");
337
		code2name.put("FI","Finland");
338
		code2name.put("ger/deu","German");
339
		code2name.put("MK","Former Yugoslav Republic of Macedonia");
340
		code2name.put("FR","France");
341
		code2name.put("bis","Bislama");
342
		code2name.put("cat","Catalan; Valencian");
343
		code2name.put("cha","Chamorro");
344
		code2name.put("che","Chechen");
345
		code2name.put("cos","Corsican");
346
		code2name.put("elx","Elamite");
347
		code2name.put("eng","English");
348
		code2name.put("est","Estonian");
349
		code2name.put("deu/ger","German");
350
		code2name.put("gle","Irish");
351
		code2name.put("gem","Germanic");
352
		code2name.put("GF","French Guiana");
353
		code2name.put("PF","French Polynesia");
354
		code2name.put("GM","Gambia");
355
		code2name.put("kik","Gikuyu; Kikuyu");
356
		code2name.put("gre/ell","Greek, Modern (1453-)");
357
		code2name.put("DE","Germany");
358
		code2name.put("mac/mkd","Macedonian");
359
		code2name.put("scc/srp","Serbian");
360
		code2name.put("grn","Guarani");
361
		code2name.put("ssw","Swati");
362
		code2name.put("swe","Swedish");
363
		code2name.put("syr","Syriac");
364
		code2name.put("tgl","Tagalog");
365
		code2name.put("tah","Tahitian");
366
		code2name.put("tgk","Tajik");
367
		code2name.put("tmh","Tamashek");
368
		code2name.put("tam","Tamil");
369
		code2name.put("tat","Tatar");
370
		code2name.put("aggregator::pubsrepository::institutional","Institutional Repository Aggregator");
371
		code2name.put("per/fas","Persian");
372
		code2name.put("FCT","Fundação para a Ciência e Tecnologia");
373
		code2name.put("user:claim:pid","user:claim:pid");
374
		code2name.put("entityregistry","Registry");
375
		code2name.put("hin","Hindi");
376
		code2name.put("NA","Namibia");
377
		code2name.put("ido","Ido");
378
		code2name.put("ibo","Igbo");
379
		code2name.put("orcid","Open Researcher and Contributor ID");
380
		code2name.put("TT","Trinidad and Tobago");
381
		code2name.put("TR","Turkey");
382
		code2name.put("TM","Turkmenistan");
383
		code2name.put("arXiv","arXiv");
384
		code2name.put("providedBy","provided by");
385
		code2name.put("EMBARGO","Embargo");
386
		code2name.put("dataset_dataset","dataset_dataset");
387
		code2name.put("publication_dataset","publication_dataset");
388
		code2name.put("publication_publication","publication_publication");
389
		code2name.put("coordinator","coordinator");
390
		code2name.put("participant","participant");
391
		code2name.put("subcontractor","subcontractor");
392
		code2name.put("principal investigating","principal investigating");
393
		code2name.put("exploitation","exploitation");
394
		code2name.put("OPEN","Open Access");
395
		code2name.put("OPEN SOURCE","Open Source");
396
		code2name.put("doi","doi");
397
		code2name.put("orcidworkid","orcid workid");
398
		code2name.put("MQ","Martinique");
399
		code2name.put("MR","Mauritania");
400
		code2name.put("jpn","Japanese");
401
		code2name.put("pubsrepository::unknown","Publication Repository");
402
		code2name.put("aggregator::pubsrepository::unknown","Publication Repository Aggregator");
403
		code2name.put("UA","Ukraine");
404
		code2name.put("YT","Mayotte");
405
		code2name.put("OTHER","Other");
406
		code2name.put("RESTRICTED","Restricted");
407
		code2name.put("AE","United Arab Emirates");
408
		code2name.put("aka","Akan");
409
		code2name.put("US","United States");
410
		code2name.put("author","author");
411
		code2name.put("isResultOf","isResultOf");
412
		code2name.put("kin","Kinyarwanda");
413
		code2name.put("kom","Komi");
414
		code2name.put("new","Newari");
415
		code2name.put("NR","Nauru");
416
		code2name.put("FM","Micronesia, Federated States of");
417
		code2name.put("NP","Nepal");
418
		code2name.put("MN","Mongolia");
419
		code2name.put("rum/ron","Romanian");
420
		code2name.put("submitted","submitted");
421
		code2name.put("driver-openaire2.0","OpenAIRE 2.0+ (DRIVER OA, EC funding)");
422
		code2name.put("result","result");
423
		code2name.put("roh","Raeto-Romance");
424
		code2name.put("run","Rundi");
425
		code2name.put("bin","Bini");
426
		code2name.put("bos","Bosnian");
427
		code2name.put("din","Dinka");
428
		code2name.put("tel","Telugu");
429
		code2name.put("MA","Morocco");
430
		code2name.put("MZ","Mozambique");
431
		code2name.put("ewo","Ewondo");
432
		code2name.put("ter","Tereno");
433
		code2name.put("fat","Fanti");
434
		code2name.put("fao","Faroese");
435
		code2name.put("hai","Haida");
436
		code2name.put("MM","Myanmar");
437
		code2name.put("NU","Niue");
438
		code2name.put("PK","Pakistan");
439
		code2name.put("PG","Papua New Guinea");
440
		code2name.put("file::WoS","file::WoS");
441
		code2name.put("metadata","metadata");
442
		code2name.put("file::hybrid","file::hybrid");
443
		code2name.put("nbl","Ndebele, South");
444
		code2name.put("akk","Akkadian");
445
		code2name.put("alb/sqi","Albanian");
446
		code2name.put("arm/hye","Armenian");
447
		code2name.put("ath","Athapascan");
448
		code2name.put("CA","Canada");
449
		code2name.put("CV","Cape Verde");
450
		code2name.put("CL","Chile");
451
		code2name.put("bat","Baltic");
452
		code2name.put("CO","Colombia");
453
		code2name.put("CY","Cyprus");
454
		code2name.put("SV","El Salvador");
455
		code2name.put("HT","Haiti");
456
		code2name.put("bej","Beja");
457
		code2name.put("HN","Honduras");
458
		code2name.put("HK","Hong Kong");
459
		code2name.put("HU","Hungary");
460
		code2name.put("bel","Belarusian");
461
		code2name.put("bem","Bemba");
462
		code2name.put("slo/slk","Slovak");
463
		code2name.put("bre","Breton");
464
		code2name.put("car","Carib");
465
		code2name.put("cau","Caucasian");
466
		code2name.put("ewe","Ewe");
467
		code2name.put("tha","Thai");
468
		code2name.put("fan","Fang");
469
		code2name.put("fij","Fijian");
470
		code2name.put("fin","Finnish");
471
		code2name.put("her","Herero");
472
		code2name.put("hil","Hiligaynon");
473
		code2name.put("bod/tib","Tibetan");
474
		code2name.put("tig","Tigre");
475
		code2name.put("tir","Tigrinya");
476
		code2name.put("tem","Timne");
477
		code2name.put("wel/cym","Welsh");
478
		code2name.put("KO","Kosovo * UN resolution");
479
		code2name.put("tiv","Tivi");
480
		code2name.put("tli","Tlingit");
481
		code2name.put("ton","Tonga (Tonga Islands)");
482
		code2name.put("tog","Tonga(Nyasa)");
483
		code2name.put("tru","Truk");
484
		code2name.put("tsi","Tsimshian");
485
		code2name.put("tso","Tsonga");
486
		code2name.put("tsn","Tswana");
487
		code2name.put("IsPreviousVersionOf","IsPreviousVersionOf");
488
		code2name.put("IsReferencedBy","IsReferencedBy");
489
		code2name.put("References","References");
490
		code2name.put("IS","Iceland");
491
		code2name.put("IN","India");
492
		code2name.put("ID","Indonesia");
493
		code2name.put("IL","Israel");
494
		code2name.put("NZ","New Zealand");
495
		code2name.put("NI","Nicaragua");
496
		code2name.put("NE","Niger");
497
		code2name.put("ARK","ARK");
498
		code2name.put("BW","Botswana");
499
		code2name.put("BR","Brazil");
500
		code2name.put("BF","Burkina Faso");
501
		code2name.put("KH","Cambodia");
502
		code2name.put("hmo","Hiri Motu");
503
		code2name.put("hun","Hungarian");
504
		code2name.put("ice/isl","Icelandic");
505
		code2name.put("ind","Indonesian");
506
		code2name.put("ile","Interlingue");
507
		code2name.put("kam","Kamba");
508
		code2name.put("lub","Luba-Katanga");
509
		code2name.put("nav","Navajo; Navaho");
510
		code2name.put("datasetsbyproject","datasetsbyproject");
511
		code2name.put("ISSN","ISSN");
512
		code2name.put("MC","Support for training and career development of researchers (Marie Curie)");
513
		code2name.put("nor","Norwegian");
514
		code2name.put("file","file");
515
		code2name.put("ISTC","ISTC");
516
		code2name.put("CSA-LS","CSA Lump sum");
517
		code2name.put("MX","Mexico");
518
		code2name.put("ME","Montenegro");
519
		code2name.put("ceb","Cebuano");
520
		code2name.put("nub","Nubian");
521
		code2name.put("nym","Nyamwezi");
522
		code2name.put("nyo","Nyoro");
523
		code2name.put("tum","Tumbuka");
524
		code2name.put("tur","Turkish");
525
		code2name.put("tuk","Turkmen");
526
		code2name.put("dnet:od_subjects","OpenDOAR subjects");
527
		code2name.put("wos","Web of Science Subject Areas");
528
		code2name.put("arxiv","arXiv");
529
		code2name.put("nsf:fieldOfApplication","Field of Application (NSF)");
530
		code2name.put("NetCDF","NetCDF");
531
		code2name.put("OpenDAP","OpenDAP");
532
		code2name.put("api","api");
533
		code2name.put("datasetsbyjournal","datasetsbyjournal");
534
		code2name.put("DOI","DOI");
535
		code2name.put("EAN13","EAN13");
536
		code2name.put("EISSN","EISSN");
537
		code2name.put("Handle","Handle");
538
		code2name.put("ISBN","ISBN");
539
		code2name.put("LISSN","LISSN");
540
		code2name.put("LSID","LSID");
541
		code2name.put("PURL","PURL");
542
		code2name.put("UPC","UPC");
543
		code2name.put("URL","URL");
544
		code2name.put("URN","URN");
545
		code2name.put("cel","Celtic");
546
		code2name.put("chg","Chagatai");
547
		code2name.put("chb","Chibcha");
548
		code2name.put("AF","Afghanistan");
549
		code2name.put("AL","Albania");
550
		code2name.put("PY","Paraguay");
551
		code2name.put("PN","Pitcairn");
552
		code2name.put("KN","Saint Kitts and Nevis");
553
		code2name.put("UY","Uruguay");
554
		code2name.put("VN","Viet Nam");
555
		code2name.put("VG","Virgin Islands (British)");
556
		code2name.put("EH","Western Sahara");
557
		code2name.put("YE","Yemen");
558
		code2name.put("YU","Yugoslavia");
559
		code2name.put("ZW","Zimbabwe");
560
		code2name.put("ec:hasprogram","hasprogram");
561
		code2name.put("ec:hasspecificprogram","hasspecificprogram");
562
		code2name.put("available","available");
563
		code2name.put("chi/zho","Chinese");
564
		code2name.put("ces/cze","Czech");
565
		code2name.put("guj","Gujarati");
566
		code2name.put("him","Himachali");
567
		code2name.put("hup","Hupa");
568
		code2name.put("iba","Iban");
569
		code2name.put("ijo","Ijo");
570
		code2name.put("ilo","Iloko");
571
		code2name.put("inc","Indic");
572
		code2name.put("kan","Kannada");
573
		code2name.put("DZ","Algeria");
574
		code2name.put("BT","Bhutan");
575
		code2name.put("kau","Kanuri");
576
		code2name.put("mul","Multiple languages");
577
		code2name.put("BA","Bosnia and Herzegovina");
578
		code2name.put("MU","Mauritius");
579
		code2name.put("CSA","Coordination and support action");
580
		code2name.put("fileCSV","fileCSV");
581
		code2name.put("AS","American Samoa");
582
		code2name.put("ERC","Support for frontier research (ERC)");
583
		code2name.put("IA","Innovation action");
584
		code2name.put("AD","Andorra");
585
		code2name.put("AO","Angola");
586
		code2name.put("AI","Anguilla");
587
		code2name.put("AQ","Antarctica");
588
		code2name.put("AG","Antigua and Barbuda");
589
		code2name.put("AR","Argentina");
590
		code2name.put("AM","Armenia");
591
		code2name.put("AW","Aruba");
592
		code2name.put("AU","Australia");
593
		code2name.put("AT","Austria");
594
		code2name.put("AZ","Azerbaijan");
595
		code2name.put("BS","Bahamas");
596
		code2name.put("BH","Bahrain");
597
		code2name.put("BE","Belgium");
598
		code2name.put("BZ","Belize");
599
		code2name.put("BJ","Benin");
600
		code2name.put("BM","Bermuda");
601
		code2name.put("GE","Georgia");
602
		code2name.put("GH","Ghana");
603
		code2name.put("GI","Gibraltar");
604
		code2name.put("GN","Guinea");
605
		code2name.put("IR","Iran (Islamic Republic of)");
606
		code2name.put("IQ","Iraq");
607
		code2name.put("6MONTHS","6 Months Embargo");
608
		code2name.put("CLOSED","Closed Access");
609
		code2name.put("ina","Auxiliary Language Association)");
610
		code2name.put("bur/mya","Burmese");
611
		code2name.put("cad","Caddo");
612
		code2name.put("cai","Central American Indian");
613
		code2name.put("chu","Church Slavic; Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic");
614
		code2name.put("kal","Greenlandic; Kalaallisut");
615
		code2name.put("iku","Inuktitut");
616
		code2name.put("iro","Iroquoian");
617
		code2name.put("ita","Italian");
618
		code2name.put("jav","Javanese");
619
		code2name.put("kua","Kuanyama; Kwanyama");
620
		code2name.put("kum","Kumyk");
621
		code2name.put("kru","Kurukh");
622
		code2name.put("kus","Kusaie");
623
		code2name.put("vie","Vietnamese");
624
		code2name.put("vol","Volapük");
625
		code2name.put("vot","Votic");
626
		code2name.put("wak","Wakashan");
627
		code2name.put("wal","Walamo");
628
		code2name.put("wln","Walloon");
629
		code2name.put("war","Waray");
630
		code2name.put("ST","São Tomé and Príncipe");
631
		code2name.put("endDate","endDate");
632
		code2name.put("issued","issued");
633
		code2name.put("startDate","startDate");
634
		code2name.put("FCH2-CSA","Coordination & support action");
635
		code2name.put("nic","Niger-Kordofanian");
636
		code2name.put("ssa","Nilo-Saharan");
637
		code2name.put("MSCA-RISE","RISE");
638
		code2name.put("RIA","Research and Innovation action");
639
		code2name.put("MSCA-IF-EF-ST","Standard EF");
640
		code2name.put("PendingRepositoryResources","Pending datasource");
641
		code2name.put("RepositoryServiceResources","Valid datasource");
642
		code2name.put("publication","publication");
643
		code2name.put("niu","Niuean");
644
		code2name.put("sysimport:crosswalk:aggregator","sysimport:crosswalk:aggregator");
645
		code2name.put("sysimport:crosswalk:cris","sysimport:crosswalk:cris");
646
		code2name.put("sysimport:crosswalk:datasetarchive","sysimport:crosswalk:datasetarchive");
647
		code2name.put("sysimport:crosswalk:entityregistry","sysimport:crosswalk:entityregistry");
648
		code2name.put("non","Norse");
649
		code2name.put("nai","North American Indian");
650
		code2name.put("sme","Northern Sami");
651
		code2name.put("nno","Norwegian Nynorsk; Nynorsk, Norwegian");
652
		code2name.put("yor","Yoruba");
653
		code2name.put("nob","Bokmål, Norwegian; Norwegian Bokmål");
654
		code2name.put("kaz","Kazakh");
655
		code2name.put("khm","Khmer");
656
		code2name.put("kor","Korean");
657
		code2name.put("ltz","Letzeburgesch; Luxembourgish");
658
		code2name.put("mar","Marathi");
659
		code2name.put("mas","Masai");
660
		code2name.put("enm","Middle English");
661
		code2name.put("frm","Middle French");
662
		code2name.put("mis","Miscellaneous");
663
		code2name.put("zap","Zapotec");
664
		code2name.put("zul","Zulu");
665
		code2name.put("KG","Kyrgyzstan");
666
		code2name.put("LV","Latvia");
667
		code2name.put("LS","Lesotho");
668
		code2name.put("LR","Liberia");
669
		code2name.put("MO","Macao");
670
		code2name.put("MG","Madagascar");
671
		code2name.put("MW","Malawi");
672
		code2name.put("MY","Malaysia");
673
		code2name.put("MD","Moldova (Republic of)");
674
		code2name.put("MS","Montserrat");
675
		code2name.put("AX","Åland Islands");
676
		code2name.put("moh","Mohawk");
677
		code2name.put("mol","Moldavian");
678
		code2name.put("mkh","Mon-Kmer");
679
		code2name.put("lol","Mongo");
680
		code2name.put("copyrighted","copyrighted");
681
		code2name.put("created","created");
682
		code2name.put("updated","updated");
683
		code2name.put("valid","valid");
684
		code2name.put("BBI-IA-DEMO","Bio-based Industries Innovation action - Demonstration");
685
		code2name.put("MSCA-IF-EF-CAR","CAR – Career Restart panel");
686
		code2name.put("MSCA-ITN-ETN","European Training Networks");
687
		code2name.put("interactiveResource","interactiveResource");
688
		code2name.put("model","model");
689
		code2name.put("ML","Mali");
690
		code2name.put("FCH2-RIA","FCH2 Research and Innovation action");
691
		code2name.put("MSCA-COFUND-FP","Fellowship programmes");
692
		code2name.put("physicalObject","physicalObject");
693
		code2name.put("MSCA-IF-GF","Global Fellowships");
694
		code2name.put("sysimport:crosswalk:infospace","sysimport:crosswalk:infospace");
695
		code2name.put("sysimport:crosswalk:repository","sysimport:crosswalk:repository");
696
		code2name.put("sysimport:mining:aggregator","sysimport:mining:aggregator");
697
		code2name.put("fry","Frisian");
698
		code2name.put("gaa","Ga");
699
		code2name.put("gae/gdh","Gaelic");
700
		code2name.put("service","service");
701
		code2name.put("software","software");
702
		code2name.put("sound","sound");
703
		code2name.put("glg","Galician");
704
		code2name.put("lug","Ganda");
705
		code2name.put("gay","Gayo");
706
		code2name.put("gez","Geez");
707
		code2name.put("MT","Malta");
708
		code2name.put("text","text");
709
		code2name.put("AN","Netherlands Antilles");
710
		code2name.put("NC","New Caledonia");
711
		code2name.put("NO","Norway");
712
		code2name.put("OC","Oceania");
713
		code2name.put("user:claim:search","user:claim:search");
714
		code2name.put("OM","Oman");
715
		code2name.put("PA","Panama");
716
		code2name.put("user:insert","user:insert");
717
		code2name.put("171","Article 171 of the Treaty");
718
		code2name.put("nya","Chewa; Chichewa; Nyanja");
719
		code2name.put("cre","Cree");
720
		code2name.put("geo/kat","Georgian");
721
		code2name.put("dan","Danish");
722
		code2name.put("MV","Maldives");
723
		code2name.put("dzo","Dzongkha");
724
		code2name.put("efi","Efik");
725
		code2name.put("LC","Saint Lucia");
726
		code2name.put("zun","Zuni");
727
		code2name.put("sga","old Irish");
728
		code2name.put("file::EuropePMC","file::EuropePMC");
729
		code2name.put("MF","Saint Martin (French Part)");
730
		code2name.put("openaire2.0_data","OpenAIRE Data (funded, referenced datasets)");
731
		code2name.put("file::PDF","file::PDF");
732
		code2name.put("esk","Eskimo");
733
		code2name.put("ec:program","program");
734
		code2name.put("epo","Esperanto");
735
		code2name.put("fct:program","fct:program");
736
		code2name.put("ec:specificprogram","specificprogram");
737
		code2name.put("collection","collection");
738
		code2name.put("ERC-ADG","Advanced Grant");
739
		code2name.put("ERA-NET-Cofund","ERA-NET Cofund");
740
		code2name.put("dataset","dataset");
741
		code2name.put("event","event");
742
		code2name.put("ERC-LVG","ERC low value grant");
743
		code2name.put("film","film");
744
		code2name.put("image","image");
745
		code2name.put("SL","Sierra Leone");
746
		code2name.put("ec:hasframeworkprogram","hasframeworkprogram");
747
		code2name.put("ERC-POC","Proof of Concept Grant");
748
		code2name.put("sysimport:mining:cris","sysimport:mining:cris");
749
		code2name.put("sysimport:mining:datasetarchive","sysimport:mining:datasetarchive");
750
		code2name.put("CP-CSA","Combination of CP & CSA");
751
		code2name.put("NoE","Network of Excellence");
752
		code2name.put("grc","Ancient Greek");
753
		code2name.put("lat","Latin");
754
		code2name.put("ori","Oriya");
755
		code2name.put("orm","Oromo");
756
		code2name.put("nso","Sotho");
757
		code2name.put("ddc","Dewey Decimal Classification");
758
		code2name.put("zen","Zenaga");
759
		code2name.put("ec:h2020topics","Horizon 2020 Topics");
760
		code2name.put("alternative title","alternative title");
761
		code2name.put("mesheuropmc","Medical Subject Headings");
762
		code2name.put("apa","Apache");
763
		code2name.put("SH","Saint Helena, Ascension and Tristan da Cunha");
764
		code2name.put("PM","Saint Pierre and Miquelon");
765
		code2name.put("MSCA-COFUND-DP","Doctoral programmes");
766
		code2name.put("VC","Saint Vincent and the Grenadines");
767
		code2name.put("ECSEL-IA","ECSEL Innovation Action");
768
		code2name.put("kpe","Kpelle");
769
		code2name.put("ECSEL-RIA","ECSEL Research and Innovation Actions");
770
		code2name.put("MSCA-ITN-EID","European Industrial Doctorates");
771
		code2name.put("sysimport:mining:entityregistry","sysimport:mining:entityregistry");
772
		code2name.put("sysimport:mining:infospace","sysimport:mining:infospace");
773
		code2name.put("sysimport:mining:repository","sysimport:mining:repository");
774
		code2name.put("main title","main title");
775
		code2name.put("subtitle","subtitle");
776
		code2name.put("translated title","translated title");
777
		code2name.put("lav","Latvian");
778
		code2name.put("kro","Kru");
779
		code2name.put("kur","Kurdish");
780
		code2name.put("kut","Kutenai");
781
		code2name.put("pli","Pali");
782
		code2name.put("pan","Panjabi; Punjabi");
783
		code2name.put("paa","Papuan-Australian");
784
		code2name.put("peo","Persian, Old (ca 600 - 400 B.C.)");
785
		code2name.put("zha","Zhuang; Chuang");
786
		code2name.put("pmc","pmc");
787
		code2name.put("pmid","pmid");
788
		code2name.put("urn","urn");
789
		code2name.put("IO","British Indian Ocean Territory");
790
		code2name.put("WS","Samoa");
791
		code2name.put("SA","Saudi Arabia");
792
		code2name.put("SN","Senegal");
793
		code2name.put("RS","Serbia");
794
		code2name.put("MSCA-ITN-EJD","European Joint Doctorates");
795
		code2name.put("wt:hasParentFunding","wt:hasParentFunding");
796
		code2name.put("lad","Ladino");
797
		code2name.put("bla","Siksika");
798
		code2name.put("lah","Lahnda");
799
		code2name.put("lam","Lamba");
800
		code2name.put("lao","Lao");
801
		code2name.put("snd","Sindhi");
802
		code2name.put("son","Songhai");
803
		code2name.put("DFG","DFG Classification");
804
		code2name.put("SC","Seychelles");
805
		code2name.put("SG","Singapore");
806
		code2name.put("SK","Slovakia");
807
		code2name.put("SI","Slovenia");
808
		code2name.put("lez","Lezghian");
809
		code2name.put("SB","Solomon Islands");
810
		code2name.put("SO","Somalia");
811
		code2name.put("ZA","South Africa");
812
		code2name.put("GS","South Georgia and the South Sandwich Islands");
813
		code2name.put("fiu","Finno-Ugrian");
814
		code2name.put("fon","Fon");
815
		code2name.put("fra/fre","French");
816
		code2name.put("cpf","French-based Creoles and Pidgins");
817
		code2name.put("SS","South Sudan");
818
		code2name.put("ful","Fulah");
819
		code2name.put("gla","Gaelic; Scottish Gaelic");
820
		code2name.put("kas","Kashmiri");
821
		code2name.put("LK","Sri Lanka");
822
		code2name.put("SD","Sudan");
823
		code2name.put("SJ","Svalbard and Jan Mayen");
824
		code2name.put("SE","Sweden");
825
		code2name.put("CH","Switzerland");
826
		code2name.put("SY","Syrian Arab Republic");
827
		code2name.put("fct:hasParentFunding","fct:hasParentFunding");
828
		code2name.put("FCH2-IA","FCH2 Innovation action");
829
		code2name.put("MSCA-IF-EF-RI","RI – Reintegration panel");
830
		code2name.put("kaw","Kawi");
831
		code2name.put("kir","Kirghiz");
832
		code2name.put("kon","Kongo");
833
		code2name.put("kok","Konkani");
834
		code2name.put("lin","Lingala");
835
		code2name.put("lit","Lithuanian");
836
		code2name.put("lun","Lunda");
837
		code2name.put("luo","Luo");
838
		code2name.put("mac/mak","Macedonian");
839
		code2name.put("mak","Makasar");
840
		code2name.put("mlt","Maltese");
841
		code2name.put("pol","Polish");
842
		code2name.put("pon","Ponape");
843
		code2name.put("por","Portuguese");
844
		code2name.put("pra","Prakrit");
845
		code2name.put("pro","Provencal");
846
		code2name.put("pus","Pushto");
847
		code2name.put("que","Quechua");
848
		code2name.put("raj","Rajasthani");
849
		code2name.put("rar","Rarotongan");
850
		code2name.put("roa","Romance");
851
		code2name.put("ron/rum","Romanian");
852
		code2name.put("rom","Romany");
853
		code2name.put("rus","Russian");
854
		code2name.put("sit","Sino-Tibetan");
855
		code2name.put("sio","Siouan");
856
		code2name.put("fileGzip","fileGzip");
857
		code2name.put("files_by_rpc","files_by_rpc");
858
		code2name.put("files_from_mdstore","files_from_mdstore");
859
		code2name.put("files_from_metadata","files_from_metadata");
860
		code2name.put("scr","Serbo-Croatian");
861
		code2name.put("mad","Madurese");
862
		code2name.put("mag","Magahi");
863
		code2name.put("mai","Maithili");
864
		code2name.put("mlg","Malagasy");
865
		code2name.put("may/msa","Malay");
866
		code2name.put("mal","Malayalam");
867
		code2name.put("man","Mandingo");
868
		code2name.put("glv","Manx");
869
		code2name.put("mao/mri","Maori");
870
		code2name.put("chm","Mari");
871
		code2name.put("srr","Serer");
872
		code2name.put("shn","Shan");
873
		code2name.put("sna","Shona");
874
		code2name.put("iii","Sichuan Yi");
875
		code2name.put("sin","Sinhala; Sinhalese");
876
		code2name.put("sla","Slavic");
877
		code2name.put("slk/slo","Slovak");
878
		code2name.put("slv","Slovenian");
879
		code2name.put("sog","Sogdian");
880
		code2name.put("Contract","Contract");
881
		code2name.put("Contract Interagency Agreement","Contract Interagency Agreement");
882
		code2name.put("Cooperative Agreement","Cooperative Agreement");
883
		code2name.put("Fellowship","Fellowship");
884
		code2name.put("Fixed Price Award","Fixed Price Award");
885
		code2name.put("Interagency Agreement","Interagency Agreement");
886
		code2name.put("Intergovernmental Personnel Award","Intergovernmental Personnel Award");
887
		code2name.put("Personnel Agreement","Personnel Agreement");
888
		code2name.put("Standard Grant","Standard Grant");
889
		code2name.put("GAA","GAA");
890
		code2name.put("mah","Marshallese");
891
		code2name.put("gmh","Middle High German");
892
		code2name.put("mga","Middle Irish");
893
		code2name.put("filesystem","filesystem");
894
		code2name.put("ftp","ftp");
895
		code2name.put("http","http");
896
		code2name.put("SME-1","SME instrument phase 1");
897
		code2name.put("SME-2","SME instrument phase 2");
898
		code2name.put("SGA-CSA","Specific Grant agreement and Coordination and Support Action");
899
		code2name.put("mon","Mongolian");
900
		code2name.put("mos","Mossi");
901
		code2name.put("nau","Nauru");
902
		code2name.put("nep","Nepali");
903
		code2name.put("ang","Old English");
904
		code2name.put("sal","Salishan");
905
		code2name.put("sam","Samaritan");
906
		code2name.put("smi","Sami");
907
		code2name.put("smo","Samoan");
908
		code2name.put("sad","Sandawe");
909
		code2name.put("sag","Sango");
910
		code2name.put("san","Sanskrit");
911
		code2name.put("srd","Sardinian");
912
		code2name.put("sco","Scots");
913
		code2name.put("sel","Selkup");
914
		code2name.put("sem","Semitic");
915
		code2name.put("srp","Serbian");
916
		code2name.put("tyv","Tuvinian");
917
		code2name.put("twi","Twi");
918
		code2name.put("uga","Ugaritic");
919
		code2name.put("uig","Uighur; Uyghur");
920
		code2name.put("ukr","Ukrainian");
921
		code2name.put("umb","Umbundu");
922
		code2name.put("und","Undetermined");
923
		code2name.put("urd","Urdu");
924
		code2name.put("uzb","Uzbek");
925
		code2name.put("vai","Vai");
926
		code2name.put("ven","Venda");
927
		code2name.put("was","Washo");
928
		code2name.put("cym/wel","Welsh");
929
		code2name.put("wol","Wolof");
930
		code2name.put("xho","Xhosa");
931
		code2name.put("sah","Yakut");
932
		code2name.put("yao","Yao");
933
		code2name.put("yap","Yap");
934
		code2name.put("yid","Yiddish");
935
		code2name.put("httpCSV","httpCSV");
936
		code2name.put("httpList","httpList");
937
		code2name.put("jdbc","jdbc");
938
		code2name.put("oai","oai");
939
		code2name.put("oai_sets","oai_sets");
940
		code2name.put("other","other");
941
		code2name.put("re3data","re3data");
942
		code2name.put("rest","rest");
943
		code2name.put("sftp","sftp");
944
		code2name.put("soap","soap");
945
		code2name.put("sparql","sparql");
946
		code2name.put("sword","sword");
947
		code2name.put("targz","targz");
948
		code2name.put("ec:frameworkprogram","frameworkprogram");
949
		code2name.put("UNKNOWN","UNKNOWN");
950
		code2name.put("0021","Dataset");
951
		code2name.put("0006","Doctoral thesis");
952
		code2name.put("0023","Event");
953
		code2name.put("0009","External research report");
954
		code2name.put("0024","Film");
955
		code2name.put("0025","Image");
956
		code2name.put("0026","InteractiveResource");
957
		code2name.put("0011","Internal report");
958
		code2name.put("0017","Report");
959
		code2name.put("0014","Research");
960
		code2name.put("0015","Review");
961
		code2name.put("0029","Software");
962
		code2name.put("0032","Software Paper");
963
		code2name.put("0030","Sound");
964
		code2name.put("0000","Unknown");
965
		code2name.put("0034","Project deliverable");
966
		code2name.put("0035","Project proposal");
967
		code2name.put("0036","Project milestone");
968
		code2name.put("0037","Clinical Trial");
969
		code2name.put("crissystem","CRIS System");
970
		code2name.put("datarepository::unknown","Data Repository");
971
		code2name.put("aggregator::datarepository","Data Repository Aggregator");
972
		code2name.put("infospace","Information Space");
973
		code2name.put("pubsrepository::institutional","Institutional Repository");
974
		code2name.put("pubsrepository::journal","Journal");
975
		code2name.put("scholarcomminfra","Scholarly Comm. Infrastructure");
976
		code2name.put("pubsrepository::thematic","Thematic Repository");
977
		code2name.put("websource","Web Source");
978
		code2name.put("entityregistry::projects","Funder database");
979
		code2name.put("entityregistry::repositories","Registry of repositories");
980
		code2name.put("wt:fundingStream","Wellcome Trust: Funding Stream");
981
		code2name.put("IsCitedBy","IsCitedBy");
982
		code2name.put("IsNewVersionOf","IsNewVersionOf");
983
		code2name.put("IsPartOf","IsPartOf");
984
		code2name.put("COFUND-EJP","COFUND (European Joint Programme)");
985
		code2name.put("COFUND-PPI","COFUND (PPI)");
986
		code2name.put("CS2-IA","CS2 Innovation Action");
987
		code2name.put("CS2-RIA","CS2 Research and Innovation action");
988
		code2name.put("files","files");
989
		code2name.put("ERC-COG","Consolidator Grant");
990
		code2name.put("SESAR-RIA","SESAR: Research and Innovation action");
991
		code2name.put("SGA-RIA","SGA Research and Innovation action");
992
		code2name.put("ERC-STG","Starting Grant");
993
		code2name.put("BOA/Task Order","BOA/Task Order");
994
		code2name.put("0018","Annotation");
995
		code2name.put("0001","Article");
996
		code2name.put("0033","Audiovisual");
997
		code2name.put("0008","Bachelor thesis");
998
		code2name.put("Continuing grant","Continuing grant");
999
		code2name.put("0002","Book");
1000
		code2name.put("0022","Collection");
1001
		code2name.put("0004","Conference object");
1002
		code2name.put("0005","Contribution for newspaper or weekly magazine");
1003
		code2name.put("0031","Data Paper");
1004
		code2name.put("BD","Bangladesh");
1005
		code2name.put("BB","Barbados");
1006
		code2name.put("BY","Belarus");
1007
		code2name.put("BQ","Bonaire, Sint Eustatius and Saba");
1008
		code2name.put("BV","Bouvet Island");
1009
		code2name.put("BN","Brunei Darussalam");
1010
		code2name.put("BG","Bulgaria");
1011
		code2name.put("UM","United States Minor Outlying Islands");
1012
		code2name.put("ZM","Zambia");
1013
		code2name.put("openaire2.0","OpenAIRE 2.0 (EC funding)");
1014
		code2name.put("openaire3.0","OpenAIRE 3.0 (OA, funding)");
1015
		code2name.put("driver","OpenAIRE Basic (DRIVER OA)");
1016
		code2name.put("native","proprietary");
1017
		code2name.put("hostedBy","collected from a compatible aggregator");
1018
		code2name.put("notCompatible","under validation");
1019
		code2name.put("BBI-IA-FLAG","Bio-based Industries Innovation action - Flagship");
1020
		code2name.put("BBI-RIA","Bio-based Industries Research and Innovation action");
1021
	}
1022

    
1023
	protected static String getDefaultResulttype(final Element cobjcategory) {
1024
		switch (cobjcategory.getText()) {
1025
		case "0029":
1026
		case "0040":
1027
			return "software";
1028
		case "0021":
1029
		case "0024":
1030
		case "0025":
1031
		case "0030":
1032
		case "0039":
1033
			return "dataset";
1034
		case "0000":
1035
		case "0010":
1036
		case "0018":
1037
		case "0020":
1038
		case "0022":
1039
		case "0023":
1040
		case "0026":
1041
		case "0027":
1042
		case "0028":
1043
		case "0037":
1044
			return "other";
1045
		case "0001":
1046
		case "0002":
1047
		case "0004":
1048
		case "0005":
1049
		case "0006":
1050
		case "0007":
1051
		case "0008":
1052
		case "0009":
1053
		case "0011":
1054
		case "0012":
1055
		case "0013":
1056
		case "0014":
1057
		case "0015":
1058
		case "0016":
1059
		case "0017":
1060
		case "0019":
1061
		case "0031":
1062
		case "0032":
1063
        case "0034":
1064
        case "0035":
1065
        case "0036":
1066
		case "0038":
1067
			return "publication";
1068
		default:
1069
			return "publication";
1070
		}
1071
	}
1072

    
1073
	protected static OafRel.Builder getRelBuilder(final RelType rType, final SubRelType subRelType, OafRel.Builder rel, final Builder subRel) {
1074

    
1075
		switch(rType) {
1076

    
1077
		case datasourceOrganization:
1078
			return rel.setDatasourceOrganization(DatasourceOrganization.newBuilder().setProvision((Provision.Builder) subRel));
1079
		case projectOrganization:
1080
			return rel.setProjectOrganization(ProjectOrganization.newBuilder().setParticipation((Participation.Builder) subRel));
1081
		case resultOrganization:
1082
			return rel.setResultOrganization(ResultOrganization.newBuilder().setAffiliation((Affiliation.Builder) subRel));
1083
		case resultProject:
1084
			return rel.setResultProject(ResultProject.newBuilder().setOutcome((Outcome.Builder) subRel));
1085
		case resultResult:
1086
			final ResultResult.Builder rr = ResultResult.newBuilder();
1087
			switch (subRelType) {
1088

    
1089
			case similarity:
1090
				return rel.setResultResult(rr.setSimilarity((Similarity.Builder) subRel));
1091
			case publicationDataset:
1092
				return rel.setResultResult(rr.setPublicationDataset((PublicationDataset.Builder) subRel));
1093
			case dedup:
1094
				return rel.setResultResult(rr.setDedup((Dedup.Builder) subRel));
1095
			case dedupSimilarity:
1096
				return rel.setResultResult(rr.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1097
			case supplement:
1098
				return rel.setResultResult(rr.setSupplement((Supplement.Builder) subRel));
1099
			case part:
1100
				return rel.setResultResult(rr.setPart((Part.Builder) subRel));
1101
			default:
1102
				throw new IllegalArgumentException("invalid subRelType for result_result relations: " + subRelType.toString());
1103
			}
1104
		case organizationOrganization:
1105
			final OrganizationOrganization.Builder oo = OrganizationOrganization.newBuilder();
1106
			switch (subRelType) {
1107
			case dedup:
1108
				return rel.setOrganizationOrganization(oo.setDedup((Dedup.Builder) subRel));
1109
			case dedupSimilarity:
1110
				return rel.setOrganizationOrganization(oo.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1111
			default:
1112
				throw new IllegalArgumentException("invalid subRelType for organization_organization relations: " + subRelType.toString());
1113
			}
1114
		}
1115
		throw new IllegalArgumentException("invalid relation type " + rType.toString());
1116
	}
1117

    
1118
	protected static Builder getSubRelBuilder(final RelMetadata.Builder metadata, final SubRelType subRelType, final Map<String, String> params) {
1119

    
1120
		switch (subRelType) {
1121

    
1122
		case provision:
1123
			return Provision.newBuilder().setRelMetadata(metadata);
1124
		case outcome:
1125
			return Outcome.newBuilder().setRelMetadata(metadata);
1126
		case similarity:
1127
			return Similarity.newBuilder().setRelMetadata(metadata);
1128
		case publicationDataset:
1129
			return PublicationDataset.newBuilder().setRelMetadata(metadata);
1130
		case affiliation:
1131
			return Affiliation.newBuilder().setRelMetadata(metadata);
1132
		case dedup:
1133
			return Dedup.newBuilder().setRelMetadata(metadata);
1134
		case dedupSimilarity:
1135
			return DedupSimilarity.newBuilder().setRelMetadata(metadata);
1136
		case supplement:
1137
			return Supplement.newBuilder().setRelMetadata(metadata);
1138
		case part:
1139
			return Part.newBuilder().setRelMetadata(metadata);
1140
		}
1141
		throw new IllegalArgumentException("invalid relation type " + subRelType.toString());
1142
	}
1143

    
1144
	protected static String getVocabularyName(final RelType relType) {
1145
		switch (relType) {
1146

    
1147
		case datasourceOrganization:
1148
			return "dnet:datasource_organization_relations";
1149
		case projectOrganization:
1150
			return "dnet:project_organization_relations";
1151
		case resultOrganization:
1152
			return "dnet:result_organization_relations";
1153
		case resultProject:
1154
			return "dnet:result_project_relations";
1155
		case resultResult:
1156
			return "dnet:result_result_relations";
1157
		case organizationOrganization:
1158
			return "dnet:organization_organization_relations";
1159
		}
1160
		throw new IllegalArgumentException("invalid relation type " + relType.toString());
1161
	}
1162

    
1163

    
1164
	// Builder for Entities
1165
	protected static Oaf getOaf(final OafEntity.Builder entity, final DataInfo.Builder info) {
1166
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.entity).setEntity(entity).build();
1167
	}
1168

    
1169
	// Builder for Rels
1170
	protected static Oaf getOaf(final OafRel.Builder rel, final DataInfo.Builder info) {
1171
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.relation).setRel(rel).build();
1172
	}
1173

    
1174
	private static Oaf.Builder _getOaf(final Oaf.Builder oaf, final DataInfo.Builder info) {
1175
		if (info != null) {
1176
			return oaf.setDataInfo(ensureDataInfo(info));
1177
		} else return oaf;
1178
	}
1179

    
1180
	protected static DataInfo.Builder ensureDataInfo(final DataInfo.Builder info) {
1181
		if (info.isInitialized()) return info;
1182
		return getDataInfo(false, null, "UNKNOWN", "0.9", false, false);
1183
	}
1184

    
1185
	protected static List<KeyValue> getKeyValues(final ValueMap values, final String fieldName, final Type type) {
1186
		final ElementList collectedFroms = values.get(fieldName);
1187
		if (collectedFroms == null) {
1188
			throw new IllegalArgumentException("missing field " + fieldName);
1189
		}
1190
		return collectedFroms.stream()
1191
				.filter(e -> StringUtils.isNotBlank(e.getAttributeValue("id")))
1192
				.filter(e -> StringUtils.isNotBlank(e.getAttributeValue("name")))
1193
				.map(e -> getKV(oafSplitId(type.name(), e.getAttributeValue("id")), e.getAttributeValue("name")))
1194
				.collect(Collectors.toList());
1195
	}
1196

    
1197
	protected static KeyValue getKV(final String id, final String name) {
1198
		return KeyValue.newBuilder().setKey(id).setValue(name).build();
1199
	}
1200

    
1201
	protected static OafRel.Builder getRel(final String sourceId,
1202
			final String targetId,
1203
			final RelType relType,
1204
			final SubRelType subRelType,
1205
			final String relClass,
1206
			final List<KeyValue> collectedFrom,
1207
			final boolean isChild) {
1208
		final OafRel.Builder oafRel = OafRel.newBuilder().setSource(sourceId)
1209
				.setTarget(targetId)
1210
				.setRelType(relType)
1211
				.setSubRelType(subRelType)
1212
				.setRelClass(relClass)
1213
				.setChild(isChild);
1214

    
1215
		if (collectedFrom != null) {
1216
			oafRel.addAllCollectedfrom(collectedFrom);
1217
		}
1218
		return oafRel;
1219
	}
1220

    
1221
	protected static OafEntity.Builder getEntity(final Type type,
1222
			final String id,
1223
			final List<KeyValue> collectedFrom,
1224
			final Collection<String> originalIds,
1225
			final String dateOfCollection,
1226
			final String dateOfTransformation,
1227
			final List<StructuredProperty> pids) {
1228
		final OafEntity.Builder builder = OafEntity.newBuilder().setType(type).setId(id);
1229
		if (collectedFrom != null) builder.addAllCollectedfrom(collectedFrom);
1230
		builder.setDateoftransformation(StringUtils.isBlank(dateOfTransformation) ? "" : dateOfTransformation);
1231
		builder.setDateofcollection(StringUtils.isBlank(dateOfCollection) ? "" : dateOfCollection);
1232

    
1233
		if ((originalIds != null) && !originalIds.isEmpty()) {
1234
			builder.addAllOriginalId(originalIds.stream()
1235
					.filter(StringUtils::isNotBlank)
1236
					.collect(Collectors.toList()));
1237
		}
1238

    
1239
		if ((pids != null) && !pids.isEmpty()) {
1240
			builder.addAllPid(
1241
			        pids.stream().filter(Objects::nonNull)
1242
                            .collect(Collectors.toList()));
1243
		}
1244

    
1245
		return builder;
1246
	}
1247

    
1248
	public static DataInfo.Builder getDataInfo(
1249
			final NodeList about,
1250
			final String provenanceaction,
1251
			final String trust,
1252
			final boolean deletedbyinference,
1253
			final boolean inferred) {
1254
		return getDataInfo(false, about, provenanceaction, trust, deletedbyinference, inferred);
1255
	}
1256

    
1257
	public static DataInfo.Builder getDataInfo(
1258
			final boolean invisible,
1259
			final NodeList about,
1260
			final String provenanceaction,
1261
			final String trust,
1262
			final boolean deletedbyinference,
1263
			final boolean inferred) {
1264

    
1265
		final DataInfo.Builder dataInfoBuilder = DataInfo.newBuilder();
1266
		dataInfoBuilder.setInvisible(invisible);
1267
		dataInfoBuilder.setInferred(inferred);
1268
		dataInfoBuilder.setDeletedbyinference(deletedbyinference);
1269
		dataInfoBuilder.setTrust(trust);
1270
		dataInfoBuilder.setProvenanceaction(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1271

    
1272
		// checking instanceof because when receiving an empty <oaf:datainfo> we don't want to parse it.
1273
		if (((about != null) && (about.getLength() > 0)) /* && (dataInfo instanceof org.w3c.dom.Element) */) {
1274

    
1275
			final org.w3c.dom.Element dataInfoElement = getDirectChild((org.w3c.dom.Element) about.item(0), "datainfo");
1276
			if (dataInfoElement != null) {
1277
				org.w3c.dom.Element elem = getDirectChild(dataInfoElement, "inferred");
1278
				dataInfoBuilder.setInferred(Boolean.valueOf(getStringValue(elem, String.valueOf(inferred))));
1279

    
1280
				elem = getDirectChild(dataInfoElement, "deletedbyinference");
1281
				dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(getStringValue(elem, String.valueOf(deletedbyinference))));
1282

    
1283
				elem = getDirectChild(dataInfoElement, "trust");
1284
				dataInfoBuilder.setTrust(getStringValue(elem, trust));
1285

    
1286
				elem = getDirectChild(dataInfoElement, "invisible");
1287
				dataInfoBuilder.setInvisible(getBooleanValue(elem, invisible));
1288

    
1289
				elem = getDirectChild(dataInfoElement, "inferenceprovenance");
1290
				dataInfoBuilder.setInferenceprovenance(getStringValue(elem));
1291

    
1292
				elem = getDirectChild(dataInfoElement, "provenanceaction");
1293
				final Qualifier.Builder pBuilder = Qualifier.newBuilder();
1294
				if (elem.hasAttributes()) {
1295
					final NamedNodeMap attributes = elem.getAttributes();
1296
					pBuilder.setClassid(getAttributeValue(attributes, "classid"));
1297
					pBuilder.setClassname(getAttributeValue(attributes, "classname"));
1298
					pBuilder.setSchemeid(getAttributeValue(attributes, "schemeid"));
1299
					pBuilder.setSchemename(getAttributeValue(attributes, "schemename"));
1300
				} else {
1301
					pBuilder.mergeFrom(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1302
				}
1303
				dataInfoBuilder.setProvenanceaction(pBuilder);
1304
			}
1305
		}
1306

    
1307
		return dataInfoBuilder;
1308
	}
1309

    
1310
	protected static OAIProvenance getOAIProvenance(final NodeList about) {
1311

    
1312
		OAIProvenance.Builder oaiProv = OAIProvenance.newBuilder();
1313

    
1314
		if (((about != null) && (about.getLength() > 0))) {
1315

    
1316
			final org.w3c.dom.Element provenance = getDirectChild((org.w3c.dom.Element) about.item(0), "provenance");
1317

    
1318
			if (provenance != null) {
1319
				final org.w3c.dom.Element origDesc = getDirectChild(provenance, "originDescription");
1320
				oaiProv.setOriginDescription(buildOriginDescription(origDesc, OriginDescription.newBuilder()));
1321
			}
1322
		}
1323

    
1324
		return oaiProv.build();
1325
	}
1326

    
1327
	private static OriginDescription buildOriginDescription(final org.w3c.dom.Element origDesc, final OriginDescription.Builder od) {
1328
		od.setHarvestDate(origDesc.getAttribute("harvestDate")).setAltered(Boolean.valueOf(origDesc.getAttribute("altered")));
1329

    
1330
		org.w3c.dom.Element elem = getDirectChild(origDesc, "baseURL");
1331
		od.setBaseURL(getStringValue(elem));
1332

    
1333
		elem = getDirectChild(origDesc, "identifier");
1334
		od.setIdentifier(getStringValue(elem));
1335

    
1336
		elem = getDirectChild(origDesc, "datestamp");
1337
		od.setDatestamp(getStringValue(elem));
1338

    
1339
		elem = getDirectChild(origDesc, "metadataNamespace");
1340
		od.setMetadataNamespace(getStringValue(elem));
1341

    
1342
		elem = getDirectChild(origDesc, "originDescription");
1343

    
1344
		if (elem != null) {
1345

    
1346
			od.setOriginDescription(buildOriginDescription(elem, OriginDescription.newBuilder()));
1347
		}
1348

    
1349
		return od.build();
1350
	}
1351

    
1352
	private static boolean getBooleanValue(final org.w3c.dom.Element elem, final boolean defaultValue) {
1353
		return (elem != null && elem.getTextContent() != null) ? Boolean.valueOf(elem.getTextContent()) : defaultValue;
1354
	}
1355

    
1356
	private static String getStringValue(final org.w3c.dom.Element elem, final String defaultValue) {
1357
		return (elem != null && elem.getTextContent() != null) ? elem.getTextContent() : defaultValue;
1358
	}
1359

    
1360
	private static String getStringValue(final org.w3c.dom.Element elem) {
1361
		return getStringValue(elem, "");
1362
	}
1363

    
1364
	protected static String getAttributeValue(final NamedNodeMap attributes, final String name) {
1365
		final Node attr = attributes.getNamedItem(name);
1366
		if (attr == null) return "";
1367
		final String value = attr.getNodeValue();
1368
		return value != null ? value : "";
1369
	}
1370

    
1371
	protected static org.w3c.dom.Element getDirectChild(final org.w3c.dom.Element parent, final String name) {
1372
		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
1373
			if ((child instanceof org.w3c.dom.Element) && name.equals(child.getLocalName())) return (org.w3c.dom.Element) child;
1374
		}
1375
		return null;
1376
	}
1377

    
1378
	protected static Qualifier.Builder getSimpleQualifier(final String classname, final String schemename) {
1379
		return getQualifier(classname, classname, schemename, schemename);
1380
	}
1381

    
1382
	protected static Qualifier.Builder getSimpleQualifier(final ProtocolMessageEnum classname, final String schemename) {
1383
		return getQualifier(classname.toString(), classname.toString(), schemename, schemename);
1384
	}
1385

    
1386
	protected static Qualifier.Builder getQualifier(final String classid, final String classname, final String schemeid, final String schemename) {
1387
		return Qualifier.newBuilder().setClassid(classid).setClassname(classname).setSchemeid(schemeid).setSchemename(schemename);
1388
	}
1389

    
1390
	protected static Qualifier.Builder setQualifier(final Qualifier.Builder qualifier, final List<String> fields) {
1391
		if ((fields == null) || fields.isEmpty() || fields.get(0).isEmpty()) return null;
1392

    
1393
		if ((fields != null) && !fields.isEmpty() && (fields.get(0) != null)) {
1394
			qualifier.setClassid(fields.get(0));
1395
			qualifier.setClassname(getClassName(fields.get(0)));
1396
		}
1397
		return qualifier;
1398
	}
1399

    
1400
	protected static void addStructuredProps(final Builder builder,
1401
			final FieldDescriptor fd,
1402
			final ElementList values,
1403
			final String defaultClass,
1404
			final String defaultScheme) {
1405
		if (values != null) {
1406
			for (final Element s : values) {
1407
				final String classId = s.getAttributeValue("classid") != null ? s.getAttributeValue("classid") : defaultClass;
1408
				final String className = s.getAttributeValue("classname") != null ? s.getAttributeValue("classname") : defaultClass;
1409
				final String schemeId = s.getAttributeValue("schemeid") != null ? s.getAttributeValue("schemeid") : defaultScheme;
1410
				final String schemeName = s.getAttributeValue("schemename") != null ? s.getAttributeValue("schemename") : defaultScheme;
1411
				addField(builder, fd, getStructuredProperty(s.getText(), classId, className, schemeId, schemeName));
1412
			}
1413
		}
1414
	}
1415

    
1416
	private static final Set<String> invalidPidTypes = Sets.newHashSet("distributionlocation", "url");
1417

    
1418
	protected static List<StructuredProperty> parsePids(final NodeList nodelist) {
1419

    
1420
		final List<StructuredProperty> pids = Lists.newArrayList();
1421

    
1422
		for (int i = 0; i < nodelist.getLength(); i++) {
1423
			final Node node = nodelist.item(i);
1424
			Node pidType = null;
1425
			if (node.getNodeType() == Node.ELEMENT_NODE) {
1426
				if (node.getLocalName().equalsIgnoreCase("identifier")) {
1427
					pidType = node.getAttributes().getNamedItem("identifierType");
1428
				}
1429
				//this is to handle dataset pids
1430
				if (node.getLocalName().equalsIgnoreCase("alternateIdentifier")) {
1431
					pidType = node.getAttributes().getNamedItem("alternateIdentifierType");
1432
				}
1433

    
1434
				for (int j = 0; j < node.getChildNodes().getLength(); j++) {
1435
					final Node child = node.getChildNodes().item(j);
1436

    
1437
					if ((child.getNodeType() == Node.TEXT_NODE) && (pidType != null) && (pidType.getNodeValue() != null) && !pidType.getNodeValue().isEmpty()) {
1438

    
1439
						final String type = pidType.getNodeValue().toLowerCase();
1440

    
1441
						if (invalidPidTypes.contains(type)) {
1442
							break;
1443
						}
1444

    
1445
						final String value = child.getTextContent();
1446

    
1447
						pids.add(getStructuredProperty(value, type, getClassName(type), "dnet:pid_types", "dnet:pid_types"));
1448
						break;
1449
					}
1450
				}
1451
			}
1452
		}
1453

    
1454
		final Map<String, StructuredProperty> pidMap = pids.stream()
1455
				.collect(Collectors.toMap(
1456
						p -> getStructuredPropertyKey(p),
1457
						Function.identity(),
1458
						(oldValue, newValue) -> newValue));
1459

    
1460
		return Lists.newArrayList(pidMap.values());
1461
	}
1462

    
1463
	private static String getStructuredPropertyKey(final StructuredProperty p) {
1464
		return StringUtils.lowerCase(p.getQualifier().getClassid()) + StringUtils.lowerCase(p.getValue());
1465
	}
1466

    
1467
	@SuppressWarnings("unchecked")
1468
	protected static void addField(final Builder builder, final FieldDescriptor descriptor, Object value) {
1469

    
1470
		if (value == null) return;
1471

    
1472
		if (value instanceof List<?>) {
1473
			for (final Object o : (List<Object>) value) {
1474
				addField(builder, descriptor, o);
1475
			}
1476
		} else {
1477
			Object fieldValue = value;
1478
			switch (descriptor.getType()) {
1479
			case BOOL:
1480
				fieldValue = Boolean.valueOf(value.toString());
1481
				break;
1482
			case BYTES:
1483
				fieldValue = value.toString().getBytes(Charset.forName("UTF-8"));
1484
				break;
1485
			case DOUBLE:
1486
				fieldValue = Double.valueOf(value.toString());
1487
				break;
1488
			case FLOAT:
1489
				fieldValue = Float.valueOf(value.toString());
1490
				break;
1491
			case INT32:
1492
			case INT64:
1493
			case SINT32:
1494
			case SINT64:
1495
				fieldValue = Integer.valueOf(value.toString());
1496
				break;
1497
			case MESSAGE:
1498
				final Builder q = builder.newBuilderForField(descriptor);
1499

    
1500
				if (value instanceof Builder) {
1501
					value = ((Builder) value).build();
1502
					final byte[] b = ((Message) value).toByteArray();
1503
					try {
1504
						q.mergeFrom(b);
1505
					} catch (final InvalidProtocolBufferException e) {
1506
						throw new IllegalArgumentException("Unable to merge value: " + value + " with builder: " + q.getDescriptorForType().getName());
1507
					}
1508
				} else if (Qualifier.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1509
					if (value instanceof Qualifier) {
1510
						q.mergeFrom((Qualifier) value);
1511
					} else {
1512

    
1513
						List<String> split = Lists.newArrayList(Splitter
1514
								.on("@@@").trimResults().split(value.toString()));
1515
						if (split.size() == 4) {
1516
							parseMessage(q, Qualifier.getDescriptor(), value.toString(), "@@@");
1517
						} else {
1518
							final String classid = split.get(0);
1519
							final String schemeid = split.get(1);
1520
							final Qualifier qualifier = Qualifier.newBuilder()
1521
									.setClassid(classid)
1522
									.setClassname(getClassName(classid))
1523
									.setSchemeid(schemeid)
1524
									.setSchemename(schemeid).build();
1525
							q.mergeFrom(qualifier);
1526
						}
1527
					}
1528
				} else if (StructuredProperty.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1529
					if (value instanceof StructuredProperty) {
1530
						q.mergeFrom((StructuredProperty) value);
1531
					} else {
1532
						parseMessage(q, StructuredProperty.getDescriptor(), value.toString(), "###");
1533
					}
1534
				} else if (KeyValue.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1535
					if (value instanceof KeyValue) {
1536
						q.mergeFrom((KeyValue) value);
1537
					} else {
1538
						parseMessage(q, KeyValue.getDescriptor(), value.toString(), "&&&");
1539
					}
1540
				} else if (StringField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1541
					if (value instanceof StringField) {
1542
						q.mergeFrom((StringField) value);
1543
					} else {
1544
						q.setField(StringField.getDescriptor().findFieldByName("value"), value);
1545
					}
1546
				} else if (BoolField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1547
					if (value instanceof BoolField) {
1548
						q.mergeFrom((BoolField) value);
1549
					} else if (value instanceof String) {
1550
						q.setField(BoolField.getDescriptor().findFieldByName("value"), Boolean.valueOf((String) value));
1551
					} else {
1552
						q.setField(BoolField.getDescriptor().findFieldByName("value"), value);
1553
					}
1554
				} else if (IntField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1555
					if (value instanceof IntField) {
1556
						q.mergeFrom((IntField) value);
1557
					} else if (value instanceof String) {
1558
						q.setField(IntField.getDescriptor().findFieldByName("value"), NumberUtils.toInt((String) value));
1559
					} else {
1560
						q.setField(IntField.getDescriptor().findFieldByName("value"), value);
1561
					}
1562
				}
1563

    
1564
				fieldValue = q.buildPartial();
1565
				break;
1566
			default:
1567
				break;
1568
			}
1569

    
1570
			doAddField(builder, descriptor, fieldValue);
1571
		}
1572

    
1573
	}
1574

    
1575
	protected static void doAddField(final Builder builder, final FieldDescriptor fd, final Object value) {
1576
		if (value != null) {
1577
			if (fd.isRepeated()) {
1578
				builder.addRepeatedField(fd, value);
1579
			} else if (fd.isOptional() || fd.isRequired()) {
1580
				builder.setField(fd, value);
1581
			}
1582
		}
1583
	}
1584

    
1585
	protected static void parseMessage(final Builder builder, final Descriptor descriptor, final String value, final String split) {
1586
		final IterablePair<FieldDescriptor, String> iterablePair =
1587
				new IterablePair<FieldDescriptor, String>(descriptor.getFields(), Lists.newArrayList(Splitter
1588
						.on(split).trimResults().split(value)));
1589

    
1590
		for (final Pair<FieldDescriptor, String> p : iterablePair) {
1591
			addField(builder, p.getKey(), p.getValue());
1592
		}
1593
	}
1594

    
1595
	protected static String base64(final byte[] data) {
1596
		return new String(Base64.encodeBase64(data));
1597
	}
1598

    
1599
	public static String replace(final String s, final String regex, final String replacement) {
1600
		return s.replaceAll(regex, replacement);
1601
	}
1602

    
1603
	public static String trim(final String s) {
1604
		return s.trim();
1605
	}
1606

    
1607
	protected static String removePrefix(final Type type, final String s) {
1608
		return removePrefix(type.toString(), s);
1609
	}
1610

    
1611
	private static String removePrefix(final String prefix, final String s) {
1612
		return StringUtils.removeStart("" + s, prefix + "|");
1613
	}
1614

    
1615
	protected static Qualifier.Builder getDefaultQualifier(final String scheme) {
1616
		final Qualifier.Builder qualifier = Qualifier.newBuilder().setSchemeid(scheme).setSchemename(scheme);
1617
		return qualifier;
1618
	}
1619

    
1620
	protected static StructuredProperty getStructuredProperty(final String value,
1621
			final String classid,
1622
			final String classname,
1623
			final String schemeid,
1624
			final String schemename) {
1625
		if ((value == null) || value.isEmpty()) return null;
1626
		return StructuredProperty.newBuilder().setValue(value).setQualifier(getQualifier(classid, classname, schemeid, schemename)).build();
1627
	}
1628

    
1629
	protected static StringField.Builder sf(final String s) {
1630
		return StringField.newBuilder().setValue(s);
1631
	}
1632

    
1633
	public static String generateNsPrefix(final String prefix, final String externalId) {
1634
		return StringUtils.substring(prefix + StringUtils.leftPad(externalId, MAX_NSPREFIX_LEN - prefix.length(), "_"), 0, MAX_NSPREFIX_LEN);
1635
	}
1636

    
1637
	public static String md5(final String s) {
1638
		try {
1639
			final MessageDigest md = MessageDigest.getInstance("MD5");
1640
			md.update(s.getBytes("UTF-8"));
1641
			return new String(Hex.encodeHex(md.digest()));
1642
		} catch (final Exception e) {
1643
			System.err.println("Error creating id");
1644
			return null;
1645
		}
1646
	}
1647

    
1648
	public static String oafId(final String entityType, final String prefix, final String id) {
1649
		if (id.isEmpty() || prefix.isEmpty()) return "";
1650
		return oafSimpleId(entityType, prefix + "::" + md5(id));
1651
	}
1652

    
1653
	public static String oafSimpleId(final String entityType, final String id) {
1654
		return (Type.valueOf(entityType).getNumber() + "|" + id).replaceAll("\\s|\\n", "");
1655
	}
1656

    
1657
	public static String oafSplitId(final String entityType, final String fullId) {
1658
		return oafId(entityType, StringUtils.substringBefore(fullId, "::"), StringUtils.substringAfter(fullId, "::"));
1659
	}
1660

    
1661
	/**
1662
	 * Gets the classname of the given class code
1663
	 *
1664
	 * @param code class code.
1665
	 * @return the class name, if the code is a key of the map. The code itself otherwise.
1666
	 */
1667
	public static String getClassName(final String code) {
1668
		final String classname = code2name.get(code);
1669
		if (StringUtils.isBlank(classname)) return code;
1670
		return classname;
1671
	}
1672

    
1673
	/**
1674
	 * Utility method, allows to perform param based map lookups in xsl
1675
	 *
1676
	 * @param map
1677
	 * @param key
1678
	 * @return value associated to the key.
1679
	 */
1680
	public static Object lookupValue(final Map<String, Object> map, final String key) {
1681
		return map.get(key);
1682
	}
1683

    
1684
	/**
1685
	 * Utility method, allows to perform param based map lookups in xsl
1686
	 *
1687
	 * @param map
1688
	 * @param key
1689
	 * @return value associated to the key.
1690
	 */
1691
	public static int mustMerge(final Map<String, Object> map, final String key) {
1692
		final Object val = lookupValue(map, key);
1693
		return (val != null) && (val instanceof String) && val.equals("true") ? 1 : 0;
1694
	}
1695

    
1696
	public static String[] split(String name, String token){
1697
		return name.split(token);
1698
	}
1699

    
1700
}
(1-1/10)