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.Collection;
6
import java.util.List;
7
import java.util.Map;
8
import java.util.Objects;
9
import java.util.function.Function;
10
import java.util.stream.Collectors;
11

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

    
58
public abstract class AbstractDNetXsltFunctions {
59

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

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

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

    
1022
		switch(rType) {
1023

    
1024
		case datasourceOrganization:
1025
			return rel.setDatasourceOrganization(DatasourceOrganization.newBuilder().setProvision((Provision.Builder) subRel));
1026
		case projectOrganization:
1027
			return rel.setProjectOrganization(ProjectOrganization.newBuilder().setParticipation((Participation.Builder) subRel));
1028
		case resultOrganization:
1029
			return rel.setResultOrganization(ResultOrganization.newBuilder().setAffiliation((Affiliation.Builder) subRel));
1030
		case resultProject:
1031
			return rel.setResultProject(ResultProject.newBuilder().setOutcome((Outcome.Builder) subRel));
1032
		case resultResult:
1033
			final ResultResult.Builder rr = ResultResult.newBuilder();
1034
			switch (subRelType) {
1035

    
1036
			case similarity:
1037
				return rel.setResultResult(rr.setSimilarity((Similarity.Builder) subRel));
1038
			case publicationDataset:
1039
				return rel.setResultResult(rr.setPublicationDataset((PublicationDataset.Builder) subRel));
1040
			case dedup:
1041
				return rel.setResultResult(rr.setDedup((Dedup.Builder) subRel));
1042
			case dedupSimilarity:
1043
				return rel.setResultResult(rr.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1044
			case supplement:
1045
				return rel.setResultResult(rr.setSupplement((Supplement.Builder) subRel));
1046
			case part:
1047
				return rel.setResultResult(rr.setPart((Part.Builder) subRel));
1048
			default:
1049
				throw new IllegalArgumentException("invalid subRelType for result_result relations: " + subRelType.toString());
1050
			}
1051
		case organizationOrganization:
1052
			final OrganizationOrganization.Builder oo = OrganizationOrganization.newBuilder();
1053
			switch (subRelType) {
1054
			case dedup:
1055
				return rel.setOrganizationOrganization(oo.setDedup((Dedup.Builder) subRel));
1056
			case dedupSimilarity:
1057
				return rel.setOrganizationOrganization(oo.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1058
			default:
1059
				throw new IllegalArgumentException("invalid subRelType for organization_organization relations: " + subRelType.toString());
1060
			}
1061
		}
1062
		throw new IllegalArgumentException("invalid relation type " + rType.toString());
1063
	}
1064

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

    
1067
		switch (subRelType) {
1068

    
1069
		case provision:
1070
			return Provision.newBuilder().setRelMetadata(metadata);
1071
		case outcome:
1072
			return Outcome.newBuilder().setRelMetadata(metadata);
1073
		case similarity:
1074
			return Similarity.newBuilder().setRelMetadata(metadata);
1075
		case publicationDataset:
1076
			return PublicationDataset.newBuilder().setRelMetadata(metadata);
1077
		case affiliation:
1078
			return Affiliation.newBuilder().setRelMetadata(metadata);
1079
		case dedup:
1080
			return Dedup.newBuilder().setRelMetadata(metadata);
1081
		case dedupSimilarity:
1082
			return DedupSimilarity.newBuilder().setRelMetadata(metadata);
1083
		case supplement:
1084
			return Supplement.newBuilder().setRelMetadata(metadata);
1085
		case part:
1086
			return Part.newBuilder().setRelMetadata(metadata);
1087
		}
1088
		throw new IllegalArgumentException("invalid relation type " + subRelType.toString());
1089
	}
1090

    
1091
	protected static String getVocabularyName(final RelType relType) {
1092
		switch (relType) {
1093

    
1094
		case datasourceOrganization:
1095
			return "dnet:datasource_organization_relations";
1096
		case projectOrganization:
1097
			return "dnet:project_organization_relations";
1098
		case resultOrganization:
1099
			return "dnet:result_organization_relations";
1100
		case resultProject:
1101
			return "dnet:result_project_relations";
1102
		case resultResult:
1103
			return "dnet:result_result_relations";
1104
		case organizationOrganization:
1105
			return "dnet:organization_organization_relations";
1106
		}
1107
		throw new IllegalArgumentException("invalid relation type " + relType.toString());
1108
	}
1109

    
1110

    
1111
	// Builder for Entities
1112
	protected static Oaf getOaf(final OafEntity.Builder entity, final DataInfo.Builder info) {
1113
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.entity).setEntity(entity).build();
1114
	}
1115

    
1116
	// Builder for Rels
1117
	protected static Oaf getOaf(final OafRel.Builder rel, final DataInfo.Builder info) {
1118
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.relation).setRel(rel).build();
1119
	}
1120

    
1121
	private static Oaf.Builder _getOaf(final Oaf.Builder oaf, final DataInfo.Builder info) {
1122
		if (info != null) {
1123
			return oaf.setDataInfo(ensureDataInfo(info));
1124
		} else return oaf;
1125
	}
1126

    
1127
	protected static DataInfo.Builder ensureDataInfo(final DataInfo.Builder info) {
1128
		if (info.isInitialized()) return info;
1129
		return getDataInfo(false, null, "UNKNOWN", "0.9", false, false);
1130
	}
1131

    
1132
	protected static List<KeyValue> getKeyValues(final ValueMap values, final String fieldName, final Type type) {
1133
		final ElementList collectedFroms = values.get(fieldName);
1134
		if (collectedFroms == null) {
1135
			throw new IllegalArgumentException("missing field " + fieldName);
1136
		}
1137
		return collectedFroms.stream()
1138
				.filter(e -> StringUtils.isNotBlank(e.getAttributeValue("id")))
1139
				.filter(e -> StringUtils.isNotBlank(e.getAttributeValue("name")))
1140
				.map(e -> getKV(oafSplitId(type.name(), e.getAttributeValue("id")), e.getAttributeValue("name")))
1141
				.collect(Collectors.toList());
1142
	}
1143

    
1144
	protected static KeyValue getKV(final String id, final String name) {
1145
		return KeyValue.newBuilder().setKey(id).setValue(name).build();
1146
	}
1147

    
1148
	protected static OafRel.Builder getRel(final String sourceId,
1149
			final String targetId,
1150
			final RelType relType,
1151
			final SubRelType subRelType,
1152
			final String relClass,
1153
			final List<KeyValue> collectedFrom,
1154
			final boolean isChild) {
1155
		final OafRel.Builder oafRel = OafRel.newBuilder().setSource(sourceId)
1156
				.setTarget(targetId)
1157
				.setRelType(relType)
1158
				.setSubRelType(subRelType)
1159
				.setRelClass(relClass)
1160
				.setChild(isChild);
1161

    
1162
		if (collectedFrom != null) {
1163
			oafRel.addAllCollectedfrom(collectedFrom);
1164
		}
1165
		return oafRel;
1166
	}
1167

    
1168
	protected static OafEntity.Builder getEntity(final Type type,
1169
			final String id,
1170
			final List<KeyValue> collectedFrom,
1171
			final Collection<String> originalIds,
1172
			final String dateOfCollection,
1173
			final String dateOfTransformation,
1174
			final List<StructuredProperty> pids) {
1175
		final OafEntity.Builder builder = OafEntity.newBuilder().setType(type).setId(id);
1176
		if (collectedFrom != null) builder.addAllCollectedfrom(collectedFrom);
1177
		builder.setDateoftransformation(StringUtils.isBlank(dateOfTransformation) ? "" : dateOfTransformation);
1178
		builder.setDateofcollection(StringUtils.isBlank(dateOfCollection) ? "" : dateOfCollection);
1179

    
1180
		if ((originalIds != null) && !originalIds.isEmpty()) {
1181
			builder.addAllOriginalId(originalIds.stream()
1182
					.filter(StringUtils::isNotBlank)
1183
					.collect(Collectors.toList()));
1184
		}
1185

    
1186
		if ((pids != null) && !pids.isEmpty()) {
1187
			builder.addAllPid(
1188
			        pids.stream().filter(Objects::nonNull)
1189
                            .collect(Collectors.toList()));
1190
		}
1191

    
1192
		return builder;
1193
	}
1194

    
1195
	public static DataInfo.Builder getDataInfo(
1196
			final NodeList about,
1197
			final String provenanceaction,
1198
			final String trust,
1199
			final boolean deletedbyinference,
1200
			final boolean inferred) {
1201
		return getDataInfo(false, about, provenanceaction, trust, deletedbyinference, inferred);
1202
	}
1203

    
1204
	public static DataInfo.Builder getDataInfo(
1205
			final boolean invisible,
1206
			final NodeList about,
1207
			final String provenanceaction,
1208
			final String trust,
1209
			final boolean deletedbyinference,
1210
			final boolean inferred) {
1211

    
1212
		final DataInfo.Builder dataInfoBuilder = DataInfo.newBuilder();
1213
		dataInfoBuilder.setInvisible(invisible);
1214
		dataInfoBuilder.setInferred(inferred);
1215
		dataInfoBuilder.setDeletedbyinference(deletedbyinference);
1216
		dataInfoBuilder.setTrust(trust);
1217
		dataInfoBuilder.setProvenanceaction(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1218

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

    
1222
			final org.w3c.dom.Element dataInfoElement = getDirectChild((org.w3c.dom.Element) about.item(0), "datainfo");
1223
			if (dataInfoElement != null) {
1224
				org.w3c.dom.Element elem = getDirectChild(dataInfoElement, "inferred");
1225
				dataInfoBuilder.setInferred(Boolean.valueOf(getStringValue(elem, String.valueOf(inferred))));
1226

    
1227
				elem = getDirectChild(dataInfoElement, "deletedbyinference");
1228
				dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(getStringValue(elem, String.valueOf(deletedbyinference))));
1229

    
1230
				elem = getDirectChild(dataInfoElement, "trust");
1231
				dataInfoBuilder.setTrust(getStringValue(elem, trust));
1232

    
1233
				elem = getDirectChild(dataInfoElement, "invisible");
1234
				dataInfoBuilder.setInvisible(getBooleanValue(elem, invisible));
1235

    
1236
				elem = getDirectChild(dataInfoElement, "inferenceprovenance");
1237
				dataInfoBuilder.setInferenceprovenance(getStringValue(elem));
1238

    
1239
				elem = getDirectChild(dataInfoElement, "provenanceaction");
1240
				final Qualifier.Builder pBuilder = Qualifier.newBuilder();
1241
				if (elem.hasAttributes()) {
1242
					final NamedNodeMap attributes = elem.getAttributes();
1243
					pBuilder.setClassid(getAttributeValue(attributes, "classid"));
1244
					pBuilder.setClassname(getAttributeValue(attributes, "classname"));
1245
					pBuilder.setSchemeid(getAttributeValue(attributes, "schemeid"));
1246
					pBuilder.setSchemename(getAttributeValue(attributes, "schemename"));
1247
				} else {
1248
					pBuilder.mergeFrom(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1249
				}
1250
				dataInfoBuilder.setProvenanceaction(pBuilder);
1251
			}
1252
		}
1253

    
1254
		return dataInfoBuilder;
1255
	}
1256

    
1257
	protected static OAIProvenance getOAIProvenance(final NodeList about) {
1258

    
1259
		OAIProvenance.Builder oaiProv = OAIProvenance.newBuilder();
1260

    
1261
		if (((about != null) && (about.getLength() > 0))) {
1262

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

    
1265
			if (provenance != null) {
1266
				final org.w3c.dom.Element origDesc = getDirectChild(provenance, "originDescription");
1267
				oaiProv.setOriginDescription(buildOriginDescription(origDesc, OriginDescription.newBuilder()));
1268
			}
1269
		}
1270

    
1271
		return oaiProv.build();
1272
	}
1273

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

    
1277
		org.w3c.dom.Element elem = getDirectChild(origDesc, "baseURL");
1278
		od.setBaseURL(getStringValue(elem));
1279

    
1280
		elem = getDirectChild(origDesc, "identifier");
1281
		od.setIdentifier(getStringValue(elem));
1282

    
1283
		elem = getDirectChild(origDesc, "datestamp");
1284
		od.setDatestamp(getStringValue(elem));
1285

    
1286
		elem = getDirectChild(origDesc, "metadataNamespace");
1287
		od.setMetadataNamespace(getStringValue(elem));
1288

    
1289
		elem = getDirectChild(origDesc, "originDescription");
1290

    
1291
		if (elem != null) {
1292

    
1293
			od.setOriginDescription(buildOriginDescription(elem, OriginDescription.newBuilder()));
1294
		}
1295

    
1296
		return od.build();
1297
	}
1298

    
1299
	private static boolean getBooleanValue(final org.w3c.dom.Element elem, final boolean defaultValue) {
1300
		return (elem != null && elem.getTextContent() != null) ? Boolean.valueOf(elem.getTextContent()) : defaultValue;
1301
	}
1302

    
1303
	private static String getStringValue(final org.w3c.dom.Element elem, final String defaultValue) {
1304
		return (elem != null && elem.getTextContent() != null) ? elem.getTextContent() : defaultValue;
1305
	}
1306

    
1307
	private static String getStringValue(final org.w3c.dom.Element elem) {
1308
		return getStringValue(elem, "");
1309
	}
1310

    
1311
	protected static String getAttributeValue(final NamedNodeMap attributes, final String name) {
1312
		final Node attr = attributes.getNamedItem(name);
1313
		if (attr == null) return "";
1314
		final String value = attr.getNodeValue();
1315
		return value != null ? value : "";
1316
	}
1317

    
1318
	protected static org.w3c.dom.Element getDirectChild(final org.w3c.dom.Element parent, final String name) {
1319
		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
1320
			if ((child instanceof org.w3c.dom.Element) && name.equals(child.getLocalName())) return (org.w3c.dom.Element) child;
1321
		}
1322
		return null;
1323
	}
1324

    
1325
	protected static Qualifier.Builder getSimpleQualifier(final String classname, final String schemename) {
1326
		return getQualifier(classname, classname, schemename, schemename);
1327
	}
1328

    
1329
	protected static Qualifier.Builder getSimpleQualifier(final ProtocolMessageEnum classname, final String schemename) {
1330
		return getQualifier(classname.toString(), classname.toString(), schemename, schemename);
1331
	}
1332

    
1333
	protected static Qualifier.Builder getQualifier(final String classid, final String classname, final String schemeid, final String schemename) {
1334
		return Qualifier.newBuilder().setClassid(classid).setClassname(classname).setSchemeid(schemeid).setSchemename(schemename);
1335
	}
1336

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

    
1340
		if ((fields != null) && !fields.isEmpty() && (fields.get(0) != null)) {
1341
			qualifier.setClassid(fields.get(0));
1342
			qualifier.setClassname(getClassName(fields.get(0)));
1343
		}
1344
		return qualifier;
1345
	}
1346

    
1347
	protected static void addStructuredProps(final Builder builder,
1348
			final FieldDescriptor fd,
1349
			final ElementList values,
1350
			final String defaultClass,
1351
			final String defaultScheme) {
1352
		if (values != null) {
1353
			for (final Element s : values) {
1354
				final String classId = s.getAttributeValue("classid") != null ? s.getAttributeValue("classid") : defaultClass;
1355
				final String className = s.getAttributeValue("classname") != null ? s.getAttributeValue("classname") : defaultClass;
1356
				final String schemeId = s.getAttributeValue("schemeid") != null ? s.getAttributeValue("schemeid") : defaultScheme;
1357
				final String schemeName = s.getAttributeValue("schemename") != null ? s.getAttributeValue("schemename") : defaultScheme;
1358
				addField(builder, fd, getStructuredProperty(s.getText(), classId, className, schemeId, schemeName));
1359
			}
1360
		}
1361
	}
1362

    
1363
	protected static List<StructuredProperty> parsePids(final NodeList nodelist) {
1364

    
1365
		final List<StructuredProperty> pids = Lists.newArrayList();
1366

    
1367
		for (int i = 0; i < nodelist.getLength(); i++) {
1368
			final Node node = nodelist.item(i);
1369
			Node pidType = null;
1370
			if (node.getNodeType() == Node.ELEMENT_NODE) {
1371
				if (node.getLocalName().equalsIgnoreCase("identifier")) {
1372
					pidType = node.getAttributes().getNamedItem("identifierType");
1373
				}
1374
				//this is to handle dataset pids
1375
				if (node.getLocalName().equalsIgnoreCase("alternateIdentifier")) {
1376
					pidType = node.getAttributes().getNamedItem("alternateIdentifierType");
1377
				}
1378

    
1379
				for (int j = 0; j < node.getChildNodes().getLength(); j++) {
1380
					final Node child = node.getChildNodes().item(j);
1381

    
1382
					if ((child.getNodeType() == Node.TEXT_NODE) && (pidType != null) && (pidType.getNodeValue() != null) && !pidType.getNodeValue().isEmpty()
1383
							&& !pidType.getNodeValue().equalsIgnoreCase("url")) {
1384

    
1385
						final String type = pidType.getNodeValue().toLowerCase();
1386

    
1387
						final String value = child.getTextContent();
1388

    
1389
						pids.add(getStructuredProperty(value, type, getClassName(type), "dnet:pid_types", "dnet:pid_types"));
1390
						break;
1391
					}
1392
				}
1393
			}
1394
		}
1395

    
1396
		final Map<String, StructuredProperty> pidMap = pids.stream()
1397
				.collect(Collectors.toMap(
1398
						p -> getStructuredPropertyKey(p),
1399
						Function.identity(),
1400
						(oldValue, newValue) -> newValue));
1401

    
1402
		return Lists.newArrayList(pidMap.values());
1403
	}
1404

    
1405
	private static String getStructuredPropertyKey(final StructuredProperty p) {
1406
		return StringUtils.lowerCase(p.getQualifier().getClassid()) + StringUtils.lowerCase(p.getValue());
1407
	}
1408

    
1409
	@SuppressWarnings("unchecked")
1410
	protected static void addField(final Builder builder, final FieldDescriptor descriptor, Object value) {
1411

    
1412
		if (value == null) return;
1413

    
1414
		if (value instanceof List<?>) {
1415
			for (final Object o : (List<Object>) value) {
1416
				addField(builder, descriptor, o);
1417
			}
1418
		} else {
1419
			Object fieldValue = value;
1420
			switch (descriptor.getType()) {
1421
			case BOOL:
1422
				fieldValue = Boolean.valueOf(value.toString());
1423
				break;
1424
			case BYTES:
1425
				fieldValue = value.toString().getBytes(Charset.forName("UTF-8"));
1426
				break;
1427
			case DOUBLE:
1428
				fieldValue = Double.valueOf(value.toString());
1429
				break;
1430
			case FLOAT:
1431
				fieldValue = Float.valueOf(value.toString());
1432
				break;
1433
			case INT32:
1434
			case INT64:
1435
			case SINT32:
1436
			case SINT64:
1437
				fieldValue = Integer.valueOf(value.toString());
1438
				break;
1439
			case MESSAGE:
1440
				final Builder q = builder.newBuilderForField(descriptor);
1441

    
1442
				if (value instanceof Builder) {
1443
					value = ((Builder) value).build();
1444
					final byte[] b = ((Message) value).toByteArray();
1445
					try {
1446
						q.mergeFrom(b);
1447
					} catch (final InvalidProtocolBufferException e) {
1448
						throw new IllegalArgumentException("Unable to merge value: " + value + " with builder: " + q.getDescriptorForType().getName());
1449
					}
1450
				} else if (Qualifier.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1451
					if (value instanceof Qualifier) {
1452
						q.mergeFrom((Qualifier) value);
1453
					} else {
1454
						parseMessage(q, Qualifier.getDescriptor(), value.toString(), "@@@");
1455
					}
1456
				} else if (StructuredProperty.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1457
					if (value instanceof StructuredProperty) {
1458
						q.mergeFrom((StructuredProperty) value);
1459
					} else {
1460
						parseMessage(q, StructuredProperty.getDescriptor(), value.toString(), "###");
1461
					}
1462
				} else if (KeyValue.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1463
					if (value instanceof KeyValue) {
1464
						q.mergeFrom((KeyValue) value);
1465
					} else {
1466
						parseMessage(q, KeyValue.getDescriptor(), value.toString(), "&&&");
1467
					}
1468
				} else if (StringField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1469
					if (value instanceof StringField) {
1470
						q.mergeFrom((StringField) value);
1471
					} else {
1472
						q.setField(StringField.getDescriptor().findFieldByName("value"), value);
1473
					}
1474
				} else if (BoolField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1475
					if (value instanceof BoolField) {
1476
						q.mergeFrom((BoolField) value);
1477
					} else if (value instanceof String) {
1478
						q.setField(BoolField.getDescriptor().findFieldByName("value"), Boolean.valueOf((String) value));
1479
					} else {
1480
						q.setField(BoolField.getDescriptor().findFieldByName("value"), value);
1481
					}
1482
				} else if (IntField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1483
					if (value instanceof IntField) {
1484
						q.mergeFrom((IntField) value);
1485
					} else if (value instanceof String) {
1486
						q.setField(IntField.getDescriptor().findFieldByName("value"), NumberUtils.toInt((String) value));
1487
					} else {
1488
						q.setField(IntField.getDescriptor().findFieldByName("value"), value);
1489
					}
1490
				}
1491

    
1492
				fieldValue = q.buildPartial();
1493
				break;
1494
			default:
1495
				break;
1496
			}
1497

    
1498
			doAddField(builder, descriptor, fieldValue);
1499
		}
1500

    
1501
	}
1502

    
1503
	protected static void doAddField(final Builder builder, final FieldDescriptor fd, final Object value) {
1504
		if (value != null) {
1505
			if (fd.isRepeated()) {
1506
				builder.addRepeatedField(fd, value);
1507
			} else if (fd.isOptional() || fd.isRequired()) {
1508
				builder.setField(fd, value);
1509
			}
1510
		}
1511
	}
1512

    
1513
	protected static void parseMessage(final Builder builder, final Descriptor descriptor, final String value, final String split) {
1514
		final IterablePair<FieldDescriptor, String> iterablePair =
1515
				new IterablePair<FieldDescriptor, String>(descriptor.getFields(), Lists.newArrayList(Splitter
1516
						.on(split).trimResults().split(value)));
1517

    
1518
		for (final Pair<FieldDescriptor, String> p : iterablePair) {
1519
			addField(builder, p.getKey(), p.getValue());
1520
		}
1521
	}
1522

    
1523
	protected static String base64(final byte[] data) {
1524
		return new String(Base64.encodeBase64(data));
1525
	}
1526

    
1527
	public static String replace(final String s, final String regex, final String replacement) {
1528
		return s.replaceAll(regex, replacement);
1529
	}
1530

    
1531
	public static String trim(final String s) {
1532
		return s.trim();
1533
	}
1534

    
1535
	protected static String removePrefix(final Type type, final String s) {
1536
		return removePrefix(type.toString(), s);
1537
	}
1538

    
1539
	private static String removePrefix(final String prefix, final String s) {
1540
		return StringUtils.removeStart("" + s, prefix + "|");
1541
	}
1542

    
1543
	protected static Qualifier.Builder getDefaultQualifier(final String scheme) {
1544
		final Qualifier.Builder qualifier = Qualifier.newBuilder().setSchemeid(scheme).setSchemename(scheme);
1545
		return qualifier;
1546
	}
1547

    
1548
	protected static StructuredProperty getStructuredProperty(final String value,
1549
			final String classid,
1550
			final String classname,
1551
			final String schemeid,
1552
			final String schemename) {
1553
		if ((value == null) || value.isEmpty()) return null;
1554
		return StructuredProperty.newBuilder().setValue(value).setQualifier(getQualifier(classid, classname, schemeid, schemename)).build();
1555
	}
1556

    
1557
	protected static StringField.Builder sf(final String s) {
1558
		return StringField.newBuilder().setValue(s);
1559
	}
1560

    
1561
	public static String generateNsPrefix(final String prefix, final String externalId) {
1562
		return StringUtils.substring(prefix + StringUtils.leftPad(externalId, MAX_NSPREFIX_LEN - prefix.length(), "_"), 0, MAX_NSPREFIX_LEN);
1563
	}
1564

    
1565
	public static String md5(final String s) {
1566
		try {
1567
			final MessageDigest md = MessageDigest.getInstance("MD5");
1568
			md.update(s.getBytes("UTF-8"));
1569
			return new String(Hex.encodeHex(md.digest()));
1570
		} catch (final Exception e) {
1571
			System.err.println("Error creating id");
1572
			return null;
1573
		}
1574
	}
1575

    
1576
	public static String oafId(final String entityType, final String prefix, final String id) {
1577
		if (id.isEmpty() || prefix.isEmpty()) return "";
1578
		return oafSimpleId(entityType, prefix + "::" + md5(id));
1579
	}
1580

    
1581
	public static String oafSimpleId(final String entityType, final String id) {
1582
		return (Type.valueOf(entityType).getNumber() + "|" + id).replaceAll("\\s|\\n", "");
1583
	}
1584

    
1585
	public static String oafSplitId(final String entityType, final String fullId) {
1586
		return oafId(entityType, StringUtils.substringBefore(fullId, "::"), StringUtils.substringAfter(fullId, "::"));
1587
	}
1588

    
1589
	/**
1590
	 * Gets the classname of the given class code
1591
	 *
1592
	 * @param code class code.
1593
	 * @return the class name, if the code is a key of the map. The code itself otherwise.
1594
	 */
1595
	public static String getClassName(final String code) {
1596
		final String classname = code2name.get(code);
1597
		if (StringUtils.isBlank(classname)) return code;
1598
		return classname;
1599
	}
1600

    
1601
	/**
1602
	 * Utility method, allows to perform param based map lookups in xsl
1603
	 *
1604
	 * @param map
1605
	 * @param key
1606
	 * @return value associated to the key.
1607
	 */
1608
	public static Object lookupValue(final Map<String, Object> map, final String key) {
1609
		return map.get(key);
1610
	}
1611

    
1612
	/**
1613
	 * Utility method, allows to perform param based map lookups in xsl
1614
	 *
1615
	 * @param map
1616
	 * @param key
1617
	 * @return value associated to the key.
1618
	 */
1619
	public static int mustMerge(final Map<String, Object> map, final String key) {
1620
		final Object val = lookupValue(map, key);
1621
		return (val != null) && (val instanceof String) && val.equals("true") ? 1 : 0;
1622
	}
1623

    
1624
	public static String[] split(String name, String token){
1625
		return name.split(token);
1626
	}
1627

    
1628
}
(1-1/10)