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.lang.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 KeyValue getKV(final String id, final String name) {
1133
		return KeyValue.newBuilder().setKey(id).setValue(name).build();
1134
	}
1135

    
1136
	protected static OafRel.Builder getRel(final String sourceId,
1137
			final String targetId,
1138
			final RelType relType,
1139
			final SubRelType subRelType,
1140
			final String relClass,
1141
			final String collectedFromId,
1142
			final String collectedFromName,
1143
			final boolean isChild) {
1144
		final OafRel.Builder oafRel = OafRel.newBuilder().setSource(sourceId)
1145
				.setTarget(targetId)
1146
				.setRelType(relType)
1147
				.setSubRelType(subRelType)
1148
				.setRelClass(relClass)
1149
				.setChild(isChild);
1150
		if (StringUtils.isNotBlank(collectedFromId) && StringUtils.isNotBlank(collectedFromName)) {
1151
			oafRel.addCollectedfrom(getKV(collectedFromId, collectedFromName));
1152
		}
1153
		return oafRel;
1154
	}
1155

    
1156
	protected static OafEntity.Builder getEntity(final Type type,
1157
			final String id,
1158
			final KeyValue collectedFrom,
1159
			final Collection<String> originalIds,
1160
			final String dateOfCollection,
1161
			final String dateOfTransformation,
1162
			final List<StructuredProperty> pids) {
1163
		final OafEntity.Builder builder = OafEntity.newBuilder().setType(type).setId(id);
1164
		if (collectedFrom != null) builder.addCollectedfrom(collectedFrom);
1165
		builder.setDateoftransformation(StringUtils.isBlank(dateOfTransformation) ? "" : dateOfTransformation);
1166
		builder.setDateofcollection(StringUtils.isBlank(dateOfCollection) ? "" : dateOfCollection);
1167

    
1168
		if ((originalIds != null) && !originalIds.isEmpty()) {
1169
			builder.addAllOriginalId(originalIds.stream()
1170
					.filter(StringUtils::isNotBlank)
1171
					.collect(Collectors.toList()));
1172
		}
1173

    
1174
		if ((pids != null) && !pids.isEmpty()) {
1175
			builder.addAllPid(
1176
			        pids.stream().filter(Objects::nonNull)
1177
                            .collect(Collectors.toList()));
1178
		}
1179

    
1180
		return builder;
1181
	}
1182

    
1183
	public static DataInfo.Builder getDataInfo(
1184
			final NodeList about,
1185
			final String provenanceaction,
1186
			final String trust,
1187
			final boolean deletedbyinference,
1188
			final boolean inferred) {
1189
		return getDataInfo(false, about, provenanceaction, trust, deletedbyinference, inferred);
1190
	}
1191

    
1192
	public static DataInfo.Builder getDataInfo(
1193
			final boolean invisible,
1194
			final NodeList about,
1195
			final String provenanceaction,
1196
			final String trust,
1197
			final boolean deletedbyinference,
1198
			final boolean inferred) {
1199

    
1200
		final DataInfo.Builder dataInfoBuilder = DataInfo.newBuilder();
1201
		dataInfoBuilder.setInvisible(invisible);
1202
		dataInfoBuilder.setInferred(inferred);
1203
		dataInfoBuilder.setDeletedbyinference(deletedbyinference);
1204
		dataInfoBuilder.setTrust(trust);
1205
		dataInfoBuilder.setProvenanceaction(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1206

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

    
1210
			final org.w3c.dom.Element dataInfoElement = getDirectChild((org.w3c.dom.Element) about.item(0), "datainfo");
1211
			if (dataInfoElement != null) {
1212
				org.w3c.dom.Element elem = getDirectChild(dataInfoElement, "inferred");
1213
				dataInfoBuilder.setInferred(Boolean.valueOf(getStringValue(elem, String.valueOf(inferred))));
1214

    
1215
				elem = getDirectChild(dataInfoElement, "deletedbyinference");
1216
				dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(getStringValue(elem, String.valueOf(deletedbyinference))));
1217

    
1218
				elem = getDirectChild(dataInfoElement, "trust");
1219
				dataInfoBuilder.setTrust(getStringValue(elem, trust));
1220

    
1221
				elem = getDirectChild(dataInfoElement, "invisible");
1222
				dataInfoBuilder.setInvisible(getBooleanValue(elem, invisible));
1223

    
1224
				elem = getDirectChild(dataInfoElement, "inferenceprovenance");
1225
				dataInfoBuilder.setInferenceprovenance(getStringValue(elem));
1226

    
1227
				elem = getDirectChild(dataInfoElement, "provenanceaction");
1228
				final Qualifier.Builder pBuilder = Qualifier.newBuilder();
1229
				if (elem.hasAttributes()) {
1230
					final NamedNodeMap attributes = elem.getAttributes();
1231
					pBuilder.setClassid(getAttributeValue(attributes, "classid"));
1232
					pBuilder.setClassname(getAttributeValue(attributes, "classname"));
1233
					pBuilder.setSchemeid(getAttributeValue(attributes, "schemeid"));
1234
					pBuilder.setSchemename(getAttributeValue(attributes, "schemename"));
1235
				} else {
1236
					pBuilder.mergeFrom(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1237
				}
1238
				dataInfoBuilder.setProvenanceaction(pBuilder);
1239
			}
1240
		}
1241

    
1242
		return dataInfoBuilder;
1243
	}
1244

    
1245
	protected static OAIProvenance getOAIProvenance(final NodeList about) {
1246

    
1247
		OAIProvenance.Builder oaiProv = OAIProvenance.newBuilder();
1248

    
1249
		if (((about != null) && (about.getLength() > 0))) {
1250

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

    
1253
			if (provenance != null) {
1254
				final org.w3c.dom.Element origDesc = getDirectChild(provenance, "originDescription");
1255
				oaiProv.setOriginDescription(buildOriginDescription(origDesc, OriginDescription.newBuilder()));
1256
			}
1257
		}
1258

    
1259
		return oaiProv.build();
1260
	}
1261

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

    
1265
		org.w3c.dom.Element elem = getDirectChild(origDesc, "baseURL");
1266
		od.setBaseURL(getStringValue(elem));
1267

    
1268
		elem = getDirectChild(origDesc, "identifier");
1269
		od.setIdentifier(getStringValue(elem));
1270

    
1271
		elem = getDirectChild(origDesc, "datestamp");
1272
		od.setDatestamp(getStringValue(elem));
1273

    
1274
		elem = getDirectChild(origDesc, "metadataNamespace");
1275
		od.setMetadataNamespace(getStringValue(elem));
1276

    
1277
		elem = getDirectChild(origDesc, "originDescription");
1278

    
1279
		if (elem != null) {
1280

    
1281
			od.setOriginDescription(buildOriginDescription(elem, OriginDescription.newBuilder()));
1282
		}
1283

    
1284
		return od.build();
1285
	}
1286

    
1287
	private static boolean getBooleanValue(final org.w3c.dom.Element elem, final boolean defaultValue) {
1288
		return (elem != null && elem.getTextContent() != null) ? Boolean.valueOf(elem.getTextContent()) : defaultValue;
1289
	}
1290

    
1291
	private static String getStringValue(final org.w3c.dom.Element elem, final String defaultValue) {
1292
		return (elem != null && elem.getTextContent() != null) ? elem.getTextContent() : defaultValue;
1293
	}
1294

    
1295
	private static String getStringValue(final org.w3c.dom.Element elem) {
1296
		return getStringValue(elem, "");
1297
	}
1298

    
1299
	protected static String getAttributeValue(final NamedNodeMap attributes, final String name) {
1300
		final Node attr = attributes.getNamedItem(name);
1301
		if (attr == null) return "";
1302
		final String value = attr.getNodeValue();
1303
		return value != null ? value : "";
1304
	}
1305

    
1306
	protected static org.w3c.dom.Element getDirectChild(final org.w3c.dom.Element parent, final String name) {
1307
		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
1308
			if ((child instanceof org.w3c.dom.Element) && name.equals(child.getLocalName())) return (org.w3c.dom.Element) child;
1309
		}
1310
		return null;
1311
	}
1312

    
1313
	protected static Qualifier.Builder getSimpleQualifier(final String classname, final String schemename) {
1314
		return getQualifier(classname, classname, schemename, schemename);
1315
	}
1316

    
1317
	protected static Qualifier.Builder getSimpleQualifier(final ProtocolMessageEnum classname, final String schemename) {
1318
		return getQualifier(classname.toString(), classname.toString(), schemename, schemename);
1319
	}
1320

    
1321
	protected static Qualifier.Builder getQualifier(final String classid, final String classname, final String schemeid, final String schemename) {
1322
		return Qualifier.newBuilder().setClassid(classid).setClassname(classname).setSchemeid(schemeid).setSchemename(schemename);
1323
	}
1324

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

    
1328
		if ((fields != null) && !fields.isEmpty() && (fields.get(0) != null)) {
1329
			qualifier.setClassid(fields.get(0));
1330
			qualifier.setClassname(getClassName(fields.get(0)));
1331
		}
1332
		return qualifier;
1333
	}
1334

    
1335
	protected static void addStructuredProps(final Builder builder,
1336
			final FieldDescriptor fd,
1337
			final ElementList values,
1338
			final String defaultClass,
1339
			final String defaultScheme) {
1340
		if (values != null) {
1341
			for (final Element s : values) {
1342
				final String classId = s.getAttributeValue("classid") != null ? s.getAttributeValue("classid") : defaultClass;
1343
				final String className = s.getAttributeValue("classname") != null ? s.getAttributeValue("classname") : defaultClass;
1344
				final String schemeId = s.getAttributeValue("schemeid") != null ? s.getAttributeValue("schemeid") : defaultScheme;
1345
				final String schemeName = s.getAttributeValue("schemename") != null ? s.getAttributeValue("schemename") : defaultScheme;
1346
				addField(builder, fd, getStructuredProperty(s.getText(), classId, className, schemeId, schemeName));
1347
			}
1348
		}
1349
	}
1350

    
1351
	protected static List<StructuredProperty> parsePids(final NodeList nodelist) {
1352

    
1353
		final List<StructuredProperty> pids = Lists.newArrayList();
1354

    
1355
		for (int i = 0; i < nodelist.getLength(); i++) {
1356
			final Node node = nodelist.item(i);
1357
			Node pidType = null;
1358
			if (node.getNodeType() == Node.ELEMENT_NODE) {
1359
				if (node.getLocalName().equalsIgnoreCase("identifier")) {
1360
					pidType = node.getAttributes().getNamedItem("identifierType");
1361
				}
1362
				//this is to handle dataset pids
1363
				if (node.getLocalName().equalsIgnoreCase("alternateIdentifier")) {
1364
					pidType = node.getAttributes().getNamedItem("alternateIdentifierType");
1365
				}
1366

    
1367
				for (int j = 0; j < node.getChildNodes().getLength(); j++) {
1368
					final Node child = node.getChildNodes().item(j);
1369

    
1370
					if ((child.getNodeType() == Node.TEXT_NODE) && (pidType != null) && (pidType.getNodeValue() != null) && !pidType.getNodeValue().isEmpty()
1371
							&& !pidType.getNodeValue().equalsIgnoreCase("url")) {
1372

    
1373
						final String type = pidType.getNodeValue().toLowerCase();
1374

    
1375
						final String value = child.getTextContent();
1376

    
1377
						pids.add(getStructuredProperty(value, type, getClassName(type), "dnet:pid_types", "dnet:pid_types"));
1378
						break;
1379
					}
1380
				}
1381
			}
1382
		}
1383

    
1384
		final Map<String, StructuredProperty> pidMap = pids.stream()
1385
				.collect(Collectors.toMap(
1386
						p -> getStructuredPropertyKey(p),
1387
						Function.identity(),
1388
						(oldValue, newValue) -> newValue));
1389

    
1390
		return Lists.newArrayList(pidMap.values());
1391
	}
1392

    
1393
	private static String getStructuredPropertyKey(final StructuredProperty p) {
1394
		return StringUtils.lowerCase(p.getQualifier().getClassid()) + StringUtils.lowerCase(p.getValue());
1395
	}
1396

    
1397
	@SuppressWarnings("unchecked")
1398
	protected static void addField(final Builder builder, final FieldDescriptor descriptor, Object value) {
1399

    
1400
		if (value == null) return;
1401

    
1402
		if (value instanceof List<?>) {
1403
			for (final Object o : (List<Object>) value) {
1404
				addField(builder, descriptor, o);
1405
			}
1406
		} else {
1407
			Object fieldValue = value;
1408
			switch (descriptor.getType()) {
1409
			case BOOL:
1410
				fieldValue = Boolean.valueOf(value.toString());
1411
				break;
1412
			case BYTES:
1413
				fieldValue = value.toString().getBytes(Charset.forName("UTF-8"));
1414
				break;
1415
			case DOUBLE:
1416
				fieldValue = Double.valueOf(value.toString());
1417
				break;
1418
			case FLOAT:
1419
				fieldValue = Float.valueOf(value.toString());
1420
				break;
1421
			case INT32:
1422
			case INT64:
1423
			case SINT32:
1424
			case SINT64:
1425
				fieldValue = Integer.valueOf(value.toString());
1426
				break;
1427
			case MESSAGE:
1428
				final Builder q = builder.newBuilderForField(descriptor);
1429

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

    
1480
				fieldValue = q.buildPartial();
1481
				break;
1482
			default:
1483
				break;
1484
			}
1485

    
1486
			doAddField(builder, descriptor, fieldValue);
1487
		}
1488

    
1489
	}
1490

    
1491
	protected static void doAddField(final Builder builder, final FieldDescriptor fd, final Object value) {
1492
		if (value != null) {
1493
			if (fd.isRepeated()) {
1494
				builder.addRepeatedField(fd, value);
1495
			} else if (fd.isOptional() || fd.isRequired()) {
1496
				builder.setField(fd, value);
1497
			}
1498
		}
1499
	}
1500

    
1501
	protected static void parseMessage(final Builder builder, final Descriptor descriptor, final String value, final String split) {
1502
		final IterablePair<FieldDescriptor, String> iterablePair =
1503
				new IterablePair<FieldDescriptor, String>(descriptor.getFields(), Lists.newArrayList(Splitter
1504
						.on(split).trimResults().split(value)));
1505

    
1506
		for (final Pair<FieldDescriptor, String> p : iterablePair) {
1507
			addField(builder, p.getKey(), p.getValue());
1508
		}
1509
	}
1510

    
1511
	protected static String base64(final byte[] data) {
1512
		return new String(Base64.encodeBase64(data));
1513
	}
1514

    
1515
	public static String replace(final String s, final String regex, final String replacement) {
1516
		return s.replaceAll(regex, replacement);
1517
	}
1518

    
1519
	public static String trim(final String s) {
1520
		return s.trim();
1521
	}
1522

    
1523
	protected static String removePrefix(final Type type, final String s) {
1524
		return removePrefix(type.toString(), s);
1525
	}
1526

    
1527
	private static String removePrefix(final String prefix, final String s) {
1528
		return StringUtils.removeStart("" + s, prefix + "|");
1529
	}
1530

    
1531
	protected static Qualifier.Builder getDefaultQualifier(final String scheme) {
1532
		final Qualifier.Builder qualifier = Qualifier.newBuilder().setSchemeid(scheme).setSchemename(scheme);
1533
		return qualifier;
1534
	}
1535

    
1536
	protected static StructuredProperty getStructuredProperty(final String value,
1537
			final String classid,
1538
			final String classname,
1539
			final String schemeid,
1540
			final String schemename) {
1541
		if ((value == null) || value.isEmpty()) return null;
1542
		return StructuredProperty.newBuilder().setValue(value).setQualifier(getQualifier(classid, classname, schemeid, schemename)).build();
1543
	}
1544

    
1545
	protected static StringField.Builder sf(final String s) {
1546
		return StringField.newBuilder().setValue(s);
1547
	}
1548

    
1549
	public static String generateNsPrefix(final String prefix, final String externalId) {
1550
		return StringUtils.substring(prefix + StringUtils.leftPad(externalId, MAX_NSPREFIX_LEN - prefix.length(), "_"), 0, MAX_NSPREFIX_LEN);
1551
	}
1552

    
1553
	public static String md5(final String s) {
1554
		try {
1555
			final MessageDigest md = MessageDigest.getInstance("MD5");
1556
			md.update(s.getBytes("UTF-8"));
1557
			return new String(Hex.encodeHex(md.digest()));
1558
		} catch (final Exception e) {
1559
			System.err.println("Error creating id");
1560
			return null;
1561
		}
1562
	}
1563

    
1564
	public static String oafId(final String entityType, final String prefix, final String id) {
1565
		if (id.isEmpty() || prefix.isEmpty()) return "";
1566
		return oafSimpleId(entityType, prefix + "::" + md5(id));
1567
	}
1568

    
1569
	public static String oafSimpleId(final String entityType, final String id) {
1570
		return (Type.valueOf(entityType).getNumber() + "|" + id).replaceAll("\\s|\\n", "");
1571
	}
1572

    
1573
	public static String oafSplitId(final String entityType, final String fullId) {
1574
		return oafId(entityType, StringUtils.substringBefore(fullId, "::"), StringUtils.substringAfter(fullId, "::"));
1575
	}
1576

    
1577
	/**
1578
	 * Gets the classname of the given class code
1579
	 *
1580
	 * @param code class code.
1581
	 * @return the class name, if the code is a key of the map. The code itself otherwise.
1582
	 */
1583
	public static String getClassName(final String code) {
1584
		final String classname = code2name.get(code);
1585
		if (StringUtils.isBlank(classname)) return code;
1586
		return classname;
1587
	}
1588

    
1589
	/**
1590
	 * Utility method, allows to perform param based map lookups in xsl
1591
	 *
1592
	 * @param map
1593
	 * @param key
1594
	 * @return value associated to the key.
1595
	 */
1596
	public static Object lookupValue(final Map<String, Object> map, final String key) {
1597
		return map.get(key);
1598
	}
1599

    
1600
	/**
1601
	 * Utility method, allows to perform param based map lookups in xsl
1602
	 *
1603
	 * @param map
1604
	 * @param key
1605
	 * @return value associated to the key.
1606
	 */
1607
	public static int mustMerge(final Map<String, Object> map, final String key) {
1608
		final Object val = lookupValue(map, key);
1609
		return (val != null) && (val instanceof String) && val.equals("true") ? 1 : 0;
1610
	}
1611

    
1612
	public static String[] split(String name, String token){
1613
		return name.split(token);
1614
	}
1615

    
1616
}
(1-1/10)