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.function.Function;
9
import java.util.stream.Collectors;
10

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

    
59
public abstract class AbstractDNetXsltFunctions {
60

    
61
	public static final String URL_REGEX = "^(http|https|ftp)\\://.*";
62
	private static final int MAX_NSPREFIX_LEN = 12;
63
	public static Predicate<String> urlFilter = new Predicate<String>() {
64

    
65
		@Override
66
		public boolean apply(final String s) {
67
			return s.trim().matches(URL_REGEX);
68
		}
69
	};
70
	protected static Map<String, String> code2name = Maps.newHashMap();
71

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

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

    
1029
		switch(rType) {
1030

    
1031
		case datasourceOrganization:
1032
			return rel.setDatasourceOrganization(DatasourceOrganization.newBuilder().setProvision((Provision.Builder) subRel));
1033
		case projectOrganization:
1034
			return rel.setProjectOrganization(ProjectOrganization.newBuilder().setParticipation((Participation.Builder) subRel));
1035
		case resultOrganization:
1036
			return rel.setResultOrganization(ResultOrganization.newBuilder().setAffiliation((Affiliation.Builder) subRel));
1037
		case resultProject:
1038
			return rel.setResultProject(ResultProject.newBuilder().setOutcome((Outcome.Builder) subRel));
1039
		case resultResult:
1040
			final ResultResult.Builder rr = ResultResult.newBuilder();
1041
			switch (subRelType) {
1042

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

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

    
1074
		switch (subRelType) {
1075

    
1076
		case provision:
1077
			return Provision.newBuilder().setRelMetadata(metadata);
1078
		case outcome:
1079
			return Outcome.newBuilder().setRelMetadata(metadata);
1080
		case similarity:
1081
			return Similarity.newBuilder().setRelMetadata(metadata);
1082
		case publicationDataset:
1083
			return PublicationDataset.newBuilder().setRelMetadata(metadata);
1084
		case affiliation:
1085
			return Affiliation.newBuilder().setRelMetadata(metadata);
1086
		case dedup:
1087
			return Dedup.newBuilder().setRelMetadata(metadata);
1088
		case dedupSimilarity:
1089
			return DedupSimilarity.newBuilder().setRelMetadata(metadata);
1090
		case supplement:
1091
			return Supplement.newBuilder().setRelMetadata(metadata);
1092
		case part:
1093
			return Part.newBuilder().setRelMetadata(metadata);
1094
		}
1095
		throw new IllegalArgumentException("invalid relation type " + subRelType.toString());
1096
	}
1097

    
1098
	protected static String getVocabularyName(final RelType relType) {
1099
		switch (relType) {
1100

    
1101
		case datasourceOrganization:
1102
			return "dnet:datasource_organization_relations";
1103
		case projectOrganization:
1104
			return "dnet:project_organization_relations";
1105
		case resultOrganization:
1106
			return "dnet:result_organization_relations";
1107
		case resultProject:
1108
			return "dnet:result_project_relations";
1109
		case resultResult:
1110
			return "dnet:result_result_relations";
1111
		case organizationOrganization:
1112
			return "dnet:organization_organization_relations";
1113
		}
1114
		throw new IllegalArgumentException("invalid relation type " + relType.toString());
1115
	}
1116

    
1117

    
1118
	// Builder for Entities
1119
	protected static Oaf getOaf(final OafEntity.Builder entity, final DataInfo.Builder info) {
1120
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.entity).setEntity(entity).build();
1121
	}
1122

    
1123
	// Builder for Rels
1124
	protected static Oaf getOaf(final OafRel.Builder rel, final DataInfo.Builder info) {
1125
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.relation).setRel(rel).build();
1126
	}
1127

    
1128
	private static Oaf.Builder _getOaf(final Oaf.Builder oaf, final DataInfo.Builder info) {
1129
		if (info != null) {
1130
			return oaf.setDataInfo(ensureDataInfo(info));
1131
		} else return oaf;
1132
	}
1133

    
1134
	protected static DataInfo.Builder ensureDataInfo(final DataInfo.Builder info) {
1135
		if (info.isInitialized()) return info;
1136
		return getDataInfo(null, "UNKNOWN", "0.9", false, false);
1137
	}
1138

    
1139
	protected static KeyValue getKV(final String id, final String name) {
1140
		return KeyValue.newBuilder().setKey(id).setValue(name).build();
1141
	}
1142

    
1143
	protected static OafRel.Builder getRel(final String sourceId,
1144
			final String targetId,
1145
			final RelType relType,
1146
			final SubRelType subRelType,
1147
			final String relClass,
1148
			final String collectedFromId,
1149
			final String collectedFromName,
1150
			final boolean isChild) {
1151
		final OafRel.Builder oafRel = OafRel.newBuilder().setSource(sourceId)
1152
				.setTarget(targetId)
1153
				.setRelType(relType)
1154
				.setSubRelType(subRelType)
1155
				.setRelClass(relClass)
1156
				.setChild(isChild);
1157
		if (StringUtils.isNotBlank(collectedFromId) && StringUtils.isNotBlank(collectedFromName)) {
1158
			oafRel.addCollectedfrom(getKV(collectedFromId, collectedFromName));
1159
		}
1160
		return oafRel;
1161
	}
1162

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

    
1175
		if ((originalIds != null) && !originalIds.isEmpty()) {
1176
			builder.addAllOriginalId(originalIds.stream()
1177
					.filter(StringUtils::isNotBlank)
1178
					.collect(Collectors.toList()));
1179
		}
1180

    
1181
		if ((pids != null) && !pids.isEmpty()) {
1182
			builder.addAllPid(Iterables.filter(pids, Predicates.notNull()));
1183
		}
1184

    
1185
		return builder;
1186
	}
1187

    
1188
	public static DataInfo.Builder getDataInfo(final NodeList about,
1189
			final String provenanceaction,
1190
			final String trust,
1191
			final boolean deletedbyinference,
1192
			final boolean inferred) {
1193

    
1194
		final DataInfo.Builder dataInfoBuilder = DataInfo.newBuilder();
1195
		dataInfoBuilder.setInferred(Boolean.valueOf(inferred));
1196
		dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(deletedbyinference));
1197
		dataInfoBuilder.setTrust(trust);
1198
		dataInfoBuilder.setProvenanceaction(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1199

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

    
1203
			final org.w3c.dom.Element dataInfoElement = getDirectChild((org.w3c.dom.Element) about.item(0), "datainfo");
1204
			if (dataInfoElement != null) {
1205
				org.w3c.dom.Element elem = getDirectChild(dataInfoElement, "inferred");
1206
				dataInfoBuilder.setInferred(Boolean.valueOf(getStringValue(elem, String.valueOf(inferred))));
1207

    
1208
				elem = getDirectChild(dataInfoElement, "deletedbyinference");
1209
				dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(getStringValue(elem, String.valueOf(deletedbyinference))));
1210

    
1211
				elem = getDirectChild(dataInfoElement, "trust");
1212
				dataInfoBuilder.setTrust(getStringValue(elem, trust));
1213

    
1214
				elem = getDirectChild(dataInfoElement, "inferenceprovenance");
1215
				dataInfoBuilder.setInferenceprovenance(getStringValue(elem));
1216

    
1217
				elem = getDirectChild(dataInfoElement, "provenanceaction");
1218
				final Qualifier.Builder pBuilder = Qualifier.newBuilder();
1219
				if (elem.hasAttributes()) {
1220
					final NamedNodeMap attributes = elem.getAttributes();
1221
					pBuilder.setClassid(getAttributeValue(attributes, "classid"));
1222
					pBuilder.setClassname(getAttributeValue(attributes, "classname"));
1223
					pBuilder.setSchemeid(getAttributeValue(attributes, "schemeid"));
1224
					pBuilder.setSchemename(getAttributeValue(attributes, "schemename"));
1225
				} else {
1226
					pBuilder.mergeFrom(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1227
				}
1228
				dataInfoBuilder.setProvenanceaction(pBuilder);
1229
			}
1230
		}
1231

    
1232
		return dataInfoBuilder;
1233
	}
1234

    
1235
	protected static OAIProvenance getOAIProvenance(final NodeList about) {
1236

    
1237
		OAIProvenance.Builder oaiProv = OAIProvenance.newBuilder();
1238

    
1239
		if (((about != null) && (about.getLength() > 0))) {
1240

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

    
1243
			if (provenance != null) {
1244
				final org.w3c.dom.Element origDesc = getDirectChild(provenance, "originDescription");
1245
				oaiProv.setOriginDescription(buildOriginDescription(origDesc, OriginDescription.newBuilder()));
1246
			}
1247
		}
1248

    
1249
		return oaiProv.build();
1250
	}
1251

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

    
1255
		org.w3c.dom.Element elem = getDirectChild(origDesc, "baseURL");
1256
		od.setBaseURL(getStringValue(elem));
1257

    
1258
		elem = getDirectChild(origDesc, "identifier");
1259
		od.setIdentifier(getStringValue(elem));
1260

    
1261
		elem = getDirectChild(origDesc, "datestamp");
1262
		od.setDatestamp(getStringValue(elem));
1263

    
1264
		elem = getDirectChild(origDesc, "metadataNamespace");
1265
		od.setMetadataNamespace(getStringValue(elem));
1266

    
1267
		elem = getDirectChild(origDesc, "originDescription");
1268

    
1269
		if (elem != null) {
1270

    
1271
			od.setOriginDescription(buildOriginDescription(elem, OriginDescription.newBuilder()));
1272
		}
1273

    
1274
		return od.build();
1275
	}
1276

    
1277
	private static String getStringValue(final org.w3c.dom.Element elem, final String defaultValue) {
1278
		return (elem != null && elem.getTextContent() != null) ? elem.getTextContent() : defaultValue;
1279
	}
1280

    
1281
	private static String getStringValue(final org.w3c.dom.Element elem) {
1282
		return getStringValue(elem, "");
1283
	}
1284

    
1285
	protected static String getAttributeValue(final NamedNodeMap attributes, final String name) {
1286
		final Node attr = attributes.getNamedItem(name);
1287
		if (attr == null) return "";
1288
		final String value = attr.getNodeValue();
1289
		return value != null ? value : "";
1290
	}
1291

    
1292
	protected static org.w3c.dom.Element getDirectChild(final org.w3c.dom.Element parent, final String name) {
1293
		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
1294
			if ((child instanceof org.w3c.dom.Element) && name.equals(child.getLocalName())) return (org.w3c.dom.Element) child;
1295
		}
1296
		return null;
1297
	}
1298

    
1299
	protected static Qualifier.Builder getSimpleQualifier(final String classname, final String schemename) {
1300
		return getQualifier(classname, classname, schemename, schemename);
1301
	}
1302

    
1303
	protected static Qualifier.Builder getSimpleQualifier(final ProtocolMessageEnum classname, final String schemename) {
1304
		return getQualifier(classname.toString(), classname.toString(), schemename, schemename);
1305
	}
1306

    
1307
	protected static Qualifier.Builder getQualifier(final String classid, final String classname, final String schemeid, final String schemename) {
1308
		return Qualifier.newBuilder().setClassid(classid).setClassname(classname).setSchemeid(schemeid).setSchemename(schemename);
1309
	}
1310

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

    
1314
		if ((fields != null) && !fields.isEmpty() && (fields.get(0) != null)) {
1315
			qualifier.setClassid(fields.get(0));
1316
			qualifier.setClassname(getClassName(fields.get(0)));
1317
		}
1318
		return qualifier;
1319
	}
1320

    
1321
	protected static void addStructuredProps(final Message.Builder builder,
1322
			final FieldDescriptor fd,
1323
			final ElementList values,
1324
			final String defaultClass,
1325
			final String defaultScheme) {
1326
		if (values != null) {
1327
			for (final Element s : values) {
1328
				final String classId = s.getAttributeValue("classid") != null ? s.getAttributeValue("classid") : defaultClass;
1329
				final String className = s.getAttributeValue("classname") != null ? s.getAttributeValue("classname") : defaultClass;
1330
				final String schemeId = s.getAttributeValue("schemeid") != null ? s.getAttributeValue("schemeid") : defaultScheme;
1331
				final String schemeName = s.getAttributeValue("schemename") != null ? s.getAttributeValue("schemename") : defaultScheme;
1332
				addField(builder, fd, getStructuredProperty(s.getText(), classId, className, schemeId, schemeName));
1333
			}
1334
		}
1335
	}
1336

    
1337
	protected static List<StructuredProperty> parsePids(final NodeList nodelist) {
1338

    
1339
		final List<StructuredProperty> pids = Lists.newArrayList();
1340

    
1341
		for (int i = 0; i < nodelist.getLength(); i++) {
1342
			final Node node = nodelist.item(i);
1343
			Node pidType = null;
1344
			if (node.getNodeType() == Node.ELEMENT_NODE) {
1345
				if (node.getLocalName().equalsIgnoreCase("identifier")) {
1346
					pidType = node.getAttributes().getNamedItem("identifierType");
1347
				}
1348
				//this is to handle dataset pids
1349
				if (node.getLocalName().equalsIgnoreCase("alternateIdentifier")) {
1350
					pidType = node.getAttributes().getNamedItem("alternateIdentifierType");
1351
				}
1352

    
1353
				for (int j = 0; j < node.getChildNodes().getLength(); j++) {
1354
					final Node child = node.getChildNodes().item(j);
1355

    
1356
					if ((child.getNodeType() == Node.TEXT_NODE) && (pidType != null) && (pidType.getNodeValue() != null) && !pidType.getNodeValue().isEmpty()
1357
							&& !pidType.getNodeValue().equalsIgnoreCase("url")) {
1358

    
1359
						final String type = pidType.getNodeValue().toLowerCase();
1360

    
1361
						final String value = child.getTextContent();
1362

    
1363
						pids.add(getStructuredProperty(value, type, getClassName(type), "dnet:pid_types", "dnet:pid_types"));
1364
						break;
1365
					}
1366
				}
1367
			}
1368
		}
1369

    
1370
		final Map<String, StructuredProperty> pidMap = pids.stream()
1371
				.collect(Collectors.toMap(
1372
						p -> getStructuredPropertyKey(p),
1373
						Function.identity(),
1374
						(oldValue, newValue) -> newValue));
1375

    
1376
		return Lists.newArrayList(pidMap.values());
1377
	}
1378

    
1379
	private static String getStructuredPropertyKey(final StructuredProperty p) {
1380
		return StringUtils.lowerCase(p.getQualifier().getClassid()) + StringUtils.lowerCase(p.getValue());
1381
	}
1382

    
1383
	@SuppressWarnings("unchecked")
1384
	protected static void addField(final Builder builder, final FieldDescriptor descriptor, Object value) {
1385

    
1386
		if (value == null) return;
1387

    
1388
		if (value instanceof List<?>) {
1389
			for (final Object o : (List<Object>) value) {
1390
				addField(builder, descriptor, o);
1391
			}
1392
		} else {
1393
			Object fieldValue = value;
1394
			switch (descriptor.getType()) {
1395
			case BOOL:
1396
				fieldValue = Boolean.valueOf(value.toString());
1397
				break;
1398
			case BYTES:
1399
				fieldValue = value.toString().getBytes(Charset.forName("UTF-8"));
1400
				break;
1401
			case DOUBLE:
1402
				fieldValue = Double.valueOf(value.toString());
1403
				break;
1404
			case FLOAT:
1405
				fieldValue = Float.valueOf(value.toString());
1406
				break;
1407
			case INT32:
1408
			case INT64:
1409
			case SINT32:
1410
			case SINT64:
1411
				fieldValue = Integer.valueOf(value.toString());
1412
				break;
1413
			case MESSAGE:
1414
				final Builder q = builder.newBuilderForField(descriptor);
1415

    
1416
				if (value instanceof Builder) {
1417
					value = ((Builder) value).build();
1418
					final byte[] b = ((Message) value).toByteArray();
1419
					try {
1420
						q.mergeFrom(b);
1421
					} catch (final InvalidProtocolBufferException e) {
1422
						throw new IllegalArgumentException("Unable to merge value: " + value + " with builder: " + q.getDescriptorForType().getName());
1423
					}
1424
				} else if (Qualifier.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1425
					if (value instanceof Qualifier) {
1426
						q.mergeFrom((Qualifier) value);
1427
					} else {
1428
						parseMessage(q, Qualifier.getDescriptor(), value.toString(), "@@@");
1429
					}
1430
				} else if (StructuredProperty.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1431
					if (value instanceof StructuredProperty) {
1432
						q.mergeFrom((StructuredProperty) value);
1433
					} else {
1434
						parseMessage(q, StructuredProperty.getDescriptor(), value.toString(), "###");
1435
					}
1436
				} else if (KeyValue.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1437
					if (value instanceof KeyValue) {
1438
						q.mergeFrom((KeyValue) value);
1439
					} else {
1440
						parseMessage(q, KeyValue.getDescriptor(), value.toString(), "&&&");
1441
					}
1442
				} else if (StringField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1443
					if (value instanceof StringField) {
1444
						q.mergeFrom((StringField) value);
1445
					} else {
1446
						q.setField(StringField.getDescriptor().findFieldByName("value"), value);
1447
					}
1448
				} else if (BoolField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1449
					if (value instanceof BoolField) {
1450
						q.mergeFrom((BoolField) value);
1451
					} else if (value instanceof String) {
1452
						q.setField(BoolField.getDescriptor().findFieldByName("value"), Boolean.valueOf((String) value));
1453
					} else {
1454
						q.setField(BoolField.getDescriptor().findFieldByName("value"), value);
1455
					}
1456
				} else if (IntField.getDescriptor().getName().equals(q.getDescriptorForType().getName())) {
1457
					if (value instanceof IntField) {
1458
						q.mergeFrom((IntField) value);
1459
					} else if (value instanceof String) {
1460
						q.setField(IntField.getDescriptor().findFieldByName("value"), NumberUtils.toInt((String) value));
1461
					} else {
1462
						q.setField(IntField.getDescriptor().findFieldByName("value"), value);
1463
					}
1464
				}
1465

    
1466
				fieldValue = q.buildPartial();
1467
				break;
1468
			default:
1469
				break;
1470
			}
1471

    
1472
			doAddField(builder, descriptor, fieldValue);
1473
		}
1474

    
1475
	}
1476

    
1477
	protected static void doAddField(final Builder builder, final FieldDescriptor fd, final Object value) {
1478
		if (value != null) {
1479
			if (fd.isRepeated()) {
1480
				builder.addRepeatedField(fd, value);
1481
			} else if (fd.isOptional() || fd.isRequired()) {
1482
				builder.setField(fd, value);
1483
			}
1484
		}
1485
	}
1486

    
1487
	protected static void parseMessage(final Builder builder, final Descriptor descriptor, final String value, final String split) {
1488
		final IterablePair<FieldDescriptor, String> iterablePair =
1489
				new IterablePair<FieldDescriptor, String>(descriptor.getFields(), Lists.newArrayList(Splitter
1490
						.on(split).trimResults().split(value)));
1491

    
1492
		for (final Pair<FieldDescriptor, String> p : iterablePair) {
1493
			addField(builder, p.getKey(), p.getValue());
1494
		}
1495
	}
1496

    
1497
	protected static String base64(final byte[] data) {
1498
		return new String(Base64.encodeBase64(data));
1499
	}
1500

    
1501
	public static String replace(final String s, final String regex, final String replacement) {
1502
		return s.replaceAll(regex, replacement);
1503
	}
1504

    
1505
	public static String trim(final String s) {
1506
		return s.trim();
1507
	}
1508

    
1509
	protected static String removePrefix(final Type type, final String s) {
1510
		return removePrefix(type.toString(), s);
1511
	}
1512

    
1513
	private static String removePrefix(final String prefix, final String s) {
1514
		return StringUtils.removeStart("" + s, prefix + "|");
1515
	}
1516

    
1517
	protected static Qualifier.Builder getDefaultQualifier(final String scheme) {
1518
		final Qualifier.Builder qualifier = Qualifier.newBuilder().setSchemeid(scheme).setSchemename(scheme);
1519
		return qualifier;
1520
	}
1521

    
1522
	protected static StructuredProperty getStructuredProperty(final String value,
1523
			final String classid,
1524
			final String classname,
1525
			final String schemeid,
1526
			final String schemename) {
1527
		if ((value == null) || value.isEmpty()) return null;
1528
		return StructuredProperty.newBuilder().setValue(value).setQualifier(getQualifier(classid, classname, schemeid, schemename)).build();
1529
	}
1530

    
1531
	protected static StringField.Builder sf(final String s) {
1532
		return StringField.newBuilder().setValue(s);
1533
	}
1534

    
1535
	public static String generateNsPrefix(final String prefix, final String externalId) {
1536
		return StringUtils.substring(prefix + StringUtils.leftPad(externalId, MAX_NSPREFIX_LEN - prefix.length(), "_"), 0, MAX_NSPREFIX_LEN);
1537
	}
1538

    
1539
	public static String md5(final String s) {
1540
		try {
1541
			final MessageDigest md = MessageDigest.getInstance("MD5");
1542
			md.update(s.getBytes("UTF-8"));
1543
			return new String(Hex.encodeHex(md.digest()));
1544
		} catch (final Exception e) {
1545
			System.err.println("Error creating id");
1546
			return null;
1547
		}
1548
	}
1549

    
1550
	public static String oafId(final String entityType, final String prefix, final String id) {
1551
		if (id.isEmpty() || prefix.isEmpty()) return "";
1552
		return oafSimpleId(entityType, prefix + "::" + md5(id));
1553
	}
1554

    
1555
	public static String oafSimpleId(final String entityType, final String id) {
1556
		return (Type.valueOf(entityType).getNumber() + "|" + id).replaceAll("\\s|\\n", "");
1557
	}
1558

    
1559
	public static String oafSplitId(final String entityType, final String fullId) {
1560
		return oafId(entityType, StringUtils.substringBefore(fullId, "::"), StringUtils.substringAfter(fullId, "::"));
1561
	}
1562

    
1563
	/**
1564
	 * Gets the classname of the given class code
1565
	 *
1566
	 * @param code class code.
1567
	 * @return the class name, if the code is a key of the map. The code itself otherwise.
1568
	 */
1569
	public static String getClassName(final String code) {
1570
		final String classname = code2name.get(code);
1571
		if (StringUtils.isBlank(classname)) return code;
1572
		return classname;
1573
	}
1574

    
1575
	/**
1576
	 * Utility method, allows to perform param based map lookups in xsl
1577
	 *
1578
	 * @param map
1579
	 * @param key
1580
	 * @return value associated to the key.
1581
	 */
1582
	public static Object lookupValue(final Map<String, Object> map, final String key) {
1583
		return map.get(key);
1584
	}
1585

    
1586
	/**
1587
	 * Utility method, allows to perform param based map lookups in xsl
1588
	 *
1589
	 * @param map
1590
	 * @param key
1591
	 * @return value associated to the key.
1592
	 */
1593
	public static int mustMerge(final Map<String, Object> map, final String key) {
1594
		final Object val = lookupValue(map, key);
1595
		return (val != null) && (val instanceof String) && val.equals("true") ? 1 : 0;
1596
	}
1597

    
1598
	public static String[] split(String name, String token){
1599
		return name.split(token);
1600
	}
1601

    
1602
}
(1-1/10)