Project

General

Profile

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

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

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

    
56
public abstract class AbstractDNetXsltFunctions {
57

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

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

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

    
1021
		switch(rType) {
1022

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

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

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

    
1066
		switch (subRelType) {
1067

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

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

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

    
1109

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

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

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

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

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

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

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

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

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

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

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

    
1191
		return builder;
1192
	}
1193

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

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

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

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

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

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

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

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

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

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

    
1253
		return dataInfoBuilder;
1254
	}
1255

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

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

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

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

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

    
1270
		return oaiProv.build();
1271
	}
1272

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

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

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

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

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

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

    
1290
		if (elem != null) {
1291

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

    
1295
		return od.build();
1296
	}
1297

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1387
						if (invalidPidTypes.contains(type)) {
1388
							break;
1389
						}
1390

    
1391
						final String value = child.getTextContent();
1392

    
1393
						pids.add(getStructuredProperty(value, type, getClassName(type), "dnet:pid_types", "dnet:pid_types"));
1394
						break;
1395
					}
1396
				}
1397
			}
1398
		}
1399

    
1400
		final Map<String, StructuredProperty> pidMap = pids.stream()
1401
				.collect(Collectors.toMap(
1402
						p -> getStructuredPropertyKey(p),
1403
						Function.identity(),
1404
						(oldValue, newValue) -> newValue));
1405

    
1406
		return Lists.newArrayList(pidMap.values());
1407
	}
1408

    
1409
	private static String getStructuredPropertyKey(final StructuredProperty p) {
1410
		return StringUtils.lowerCase(p.getQualifier().getClassid()) + StringUtils.lowerCase(p.getValue());
1411
	}
1412

    
1413
	@SuppressWarnings("unchecked")
1414
	protected static void addField(final Builder builder, final FieldDescriptor descriptor, Object value) {
1415

    
1416
		if (value == null) return;
1417

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

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

    
1496
				fieldValue = q.buildPartial();
1497
				break;
1498
			default:
1499
				break;
1500
			}
1501

    
1502
			doAddField(builder, descriptor, fieldValue);
1503
		}
1504

    
1505
	}
1506

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

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

    
1522
		for (final Pair<FieldDescriptor, String> p : iterablePair) {
1523
			addField(builder, p.getKey(), p.getValue());
1524
		}
1525
	}
1526

    
1527
	protected static String base64(final byte[] data) {
1528
		return new String(Base64.encodeBase64(data));
1529
	}
1530

    
1531
	public static String replace(final String s, final String regex, final String replacement) {
1532
		return s.replaceAll(regex, replacement);
1533
	}
1534

    
1535
	public static String trim(final String s) {
1536
		return s.trim();
1537
	}
1538

    
1539
	protected static String removePrefix(final Type type, final String s) {
1540
		return removePrefix(type.toString(), s);
1541
	}
1542

    
1543
	private static String removePrefix(final String prefix, final String s) {
1544
		return StringUtils.removeStart("" + s, prefix + "|");
1545
	}
1546

    
1547
	protected static Qualifier.Builder getDefaultQualifier(final String scheme) {
1548
		final Qualifier.Builder qualifier = Qualifier.newBuilder().setSchemeid(scheme).setSchemename(scheme);
1549
		return qualifier;
1550
	}
1551

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

    
1561
	protected static StringField.Builder sf(final String s) {
1562
		return StringField.newBuilder().setValue(s);
1563
	}
1564

    
1565
	public static String generateNsPrefix(final String prefix, final String externalId) {
1566
		return StringUtils.substring(prefix + StringUtils.leftPad(externalId, MAX_NSPREFIX_LEN - prefix.length(), "_"), 0, MAX_NSPREFIX_LEN);
1567
	}
1568

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

    
1580
	public static String oafId(final String entityType, final String prefix, final String id) {
1581
		if (id.isEmpty() || prefix.isEmpty()) return "";
1582
		return oafSimpleId(entityType, prefix + "::" + md5(id));
1583
	}
1584

    
1585
	public static String oafSimpleId(final String entityType, final String id) {
1586
		return (Type.valueOf(entityType).getNumber() + "|" + id).replaceAll("\\s|\\n", "");
1587
	}
1588

    
1589
	public static String oafSplitId(final String entityType, final String fullId) {
1590
		return oafId(entityType, StringUtils.substringBefore(fullId, "::"), StringUtils.substringAfter(fullId, "::"));
1591
	}
1592

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

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

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

    
1628
	public static String[] split(String name, String token){
1629
		return name.split(token);
1630
	}
1631

    
1632
}
(1-1/10)