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.List;
6
import java.util.Map;
7

    
8
import com.google.common.base.Predicate;
9
import com.google.common.base.Predicates;
10
import com.google.common.base.Splitter;
11
import com.google.common.collect.Iterables;
12
import com.google.common.collect.Lists;
13
import com.google.common.collect.Maps;
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.PersonPersonProtos.PersonPerson;
32
import eu.dnetlib.data.proto.PersonPersonProtos.PersonPerson.CoAuthorship;
33
import eu.dnetlib.data.proto.PersonResultProtos.PersonResult;
34
import eu.dnetlib.data.proto.PersonResultProtos.PersonResult.Authorship;
35
import eu.dnetlib.data.proto.ProjectOrganizationProtos.ProjectOrganization;
36
import eu.dnetlib.data.proto.ProjectOrganizationProtos.ProjectOrganization.Participation;
37
import eu.dnetlib.data.proto.ProjectPersonProtos.ProjectPerson;
38
import eu.dnetlib.data.proto.ProjectPersonProtos.ProjectPerson.ContactPerson;
39
import eu.dnetlib.data.proto.RelMetadataProtos.RelMetadata;
40
import eu.dnetlib.data.proto.RelTypeProtos.RelType;
41
import eu.dnetlib.data.proto.RelTypeProtos.SubRelType;
42
import eu.dnetlib.data.proto.ResultOrganizationProtos.ResultOrganization;
43
import eu.dnetlib.data.proto.ResultOrganizationProtos.ResultOrganization.Affiliation;
44
import eu.dnetlib.data.proto.ResultProjectProtos.ResultProject;
45
import eu.dnetlib.data.proto.ResultProjectProtos.ResultProject.Outcome;
46
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult;
47
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.Part;
48
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.PublicationDataset;
49
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.Similarity;
50
import eu.dnetlib.data.proto.ResultResultProtos.ResultResult.Supplement;
51
import eu.dnetlib.data.proto.TypeProtos.Type;
52
import eu.dnetlib.miscutils.collections.Pair;
53
import eu.dnetlib.miscutils.iterators.IterablePair;
54
import org.apache.commons.codec.binary.Base64;
55
import org.apache.commons.codec.binary.Hex;
56
import org.apache.commons.lang.StringUtils;
57
import org.apache.commons.lang.math.NumberUtils;
58
import org.w3c.dom.*;
59

    
60
public abstract class AbstractDNetXsltFunctions {
61

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

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

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

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

    
1027
		switch(rType) {
1028

    
1029
		case datasourceOrganization:
1030
			return rel.setDatasourceOrganization(DatasourceOrganization.newBuilder().setProvision((Provision.Builder) subRel));
1031
		case personResult:
1032
			final PersonResult.Builder pr = PersonResult.newBuilder();
1033
			switch (subRelType) {
1034
			case authorship:
1035
				return rel.setPersonResult(pr.setAuthorship((Authorship.Builder) subRel));
1036
			default:
1037
				throw new IllegalArgumentException("invalid subRelType for result_person relations: " + subRelType.toString());
1038
			}
1039
		case projectOrganization:
1040
			return rel.setProjectOrganization(ProjectOrganization.newBuilder().setParticipation((Participation.Builder) subRel));
1041
		case projectPerson:
1042
			return rel.setProjectPerson(ProjectPerson.newBuilder().setContactPerson(((ContactPerson.Builder) subRel)));
1043
		case resultOrganization:
1044
			return rel.setResultOrganization(ResultOrganization.newBuilder().setAffiliation((Affiliation.Builder) subRel));
1045
		case resultProject:
1046
			return rel.setResultProject(ResultProject.newBuilder().setOutcome((Outcome.Builder) subRel));
1047
		case resultResult:
1048
			final ResultResult.Builder rr = ResultResult.newBuilder();
1049
			switch (subRelType) {
1050

    
1051
			case similarity:
1052
				return rel.setResultResult(rr.setSimilarity((Similarity.Builder) subRel));
1053
			case publicationDataset:
1054
				return rel.setResultResult(rr.setPublicationDataset((PublicationDataset.Builder) subRel));
1055
			case dedup:
1056
				return rel.setResultResult(rr.setDedup((Dedup.Builder) subRel));
1057
			case dedupSimilarity:
1058
				return rel.setResultResult(rr.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1059
			case supplement:
1060
				return rel.setResultResult(rr.setSupplement((Supplement.Builder) subRel));
1061
			case part:
1062
				return rel.setResultResult(rr.setPart((Part.Builder) subRel));
1063
			default:
1064
				throw new IllegalArgumentException("invalid subRelType for result_result relations: " + subRelType.toString());
1065
			}
1066
		case personPerson:
1067
			final PersonPerson.Builder pp = PersonPerson.newBuilder();
1068
			switch (subRelType) {
1069
			case dedup:
1070
				return rel.setPersonPerson(pp.setDedup((Dedup.Builder) subRel));
1071
			case dedupSimilarity:
1072
				return rel.setPersonPerson(pp.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1073
			default:
1074
				throw new IllegalArgumentException("invalid subRelType for person_person relations: " + subRelType.toString());
1075
			}
1076
		case organizationOrganization:
1077
			final OrganizationOrganization.Builder oo = OrganizationOrganization.newBuilder();
1078
			switch (subRelType) {
1079
			case dedup:
1080
				return rel.setOrganizationOrganization(oo.setDedup((Dedup.Builder) subRel));
1081
			case dedupSimilarity:
1082
				return rel.setOrganizationOrganization(oo.setDedupSimilarity((DedupSimilarity.Builder) subRel));
1083
			default:
1084
				throw new IllegalArgumentException("invalid subRelType for organization_organization relations: " + subRelType.toString());
1085
			}
1086
		}
1087
		throw new IllegalArgumentException("invalid relation type " + rType.toString());
1088
	}
1089

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

    
1092
		switch (subRelType) {
1093

    
1094
		case provision:
1095
			return Provision.newBuilder().setRelMetadata(metadata);
1096
		case coauthorship:
1097
			return CoAuthorship.newBuilder().setRelMetadata(metadata);
1098
		case authorship:
1099
			return Authorship.newBuilder().setRelMetadata(metadata).setRanking("" + params.get("rank"));
1100
		case participation:
1101
			return Participation.newBuilder().setRelMetadata(metadata);
1102
		case contactPerson:
1103
			return ContactPerson.newBuilder().setRelMetadata(metadata);
1104
		case outcome:
1105
			return Outcome.newBuilder().setRelMetadata(metadata);
1106
		case similarity:
1107
			return Similarity.newBuilder().setRelMetadata(metadata);
1108
		case publicationDataset:
1109
			return PublicationDataset.newBuilder().setRelMetadata(metadata);
1110
		case affiliation:
1111
			return Affiliation.newBuilder().setRelMetadata(metadata);
1112
		case dedup:
1113
			return Dedup.newBuilder().setRelMetadata(metadata);
1114
		case dedupSimilarity:
1115
			return DedupSimilarity.newBuilder().setRelMetadata(metadata);
1116
		case supplement:
1117
			return Supplement.newBuilder().setRelMetadata(metadata);
1118
		case part:
1119
			return Part.newBuilder().setRelMetadata(metadata);
1120
		}
1121
		throw new IllegalArgumentException("invalid relation type " + subRelType.toString());
1122
	}
1123

    
1124
	protected static String getVocabularyName(final RelType relType) {
1125
		switch (relType) {
1126

    
1127
		case datasourceOrganization:
1128
			return "dnet:datasource_organization_relations";
1129
		case personResult:
1130
			return "dnet:person_result_relations";
1131
		case projectOrganization:
1132
			return "dnet:project_organization_relations";
1133
		case projectPerson:
1134
			return "dnet:project_person_relations";
1135
		case resultOrganization:
1136
			return "dnet:result_organization_relations";
1137
		case resultProject:
1138
			return "dnet:result_project_relations";
1139
		case resultResult:
1140
			return "dnet:result_result_relations";
1141
		case personPerson:
1142
			return "dnet:person_person_relations";
1143
		case organizationOrganization:
1144
			return "dnet:organization_organization_relations";
1145
		}
1146
		throw new IllegalArgumentException("invalid relation type " + relType.toString());
1147
	}
1148

    
1149

    
1150
	// Builder for Entities
1151
	protected static Oaf getOaf(final OafEntity.Builder entity, final DataInfo.Builder info) {
1152
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.entity).setEntity(entity).build();
1153
	}
1154

    
1155
	// Builder for Rels
1156
	protected static Oaf getOaf(final OafRel.Builder rel, final DataInfo.Builder info) {
1157
		return _getOaf(Oaf.newBuilder(), info).setKind(Kind.relation).setRel(rel).build();
1158
	}
1159

    
1160
	private static Oaf.Builder _getOaf(final Oaf.Builder oaf, final DataInfo.Builder info) {
1161
		if (info != null) {
1162
			return oaf.setDataInfo(ensureDataInfo(info));
1163
		} else return oaf;
1164
	}
1165

    
1166
	protected static DataInfo.Builder ensureDataInfo(final DataInfo.Builder info) {
1167
		if (info.isInitialized()) return info;
1168
		return getDataInfo(null, "UNKNOWN", "0.9", false, false);
1169
	}
1170

    
1171
	protected static KeyValue getKV(final String id, final String name) {
1172
		return KeyValue.newBuilder().setKey(id).setValue(name).build();
1173
	}
1174

    
1175
	protected static OafRel.Builder getRel(final String sourceId,
1176
			final String targetId,
1177
			final RelType relType,
1178
			final SubRelType subRelType,
1179
			final String relClass,
1180
			final String collectedFromId,
1181
			final String collectedFromName,
1182
			final boolean isChild) {
1183
		final OafRel.Builder oafRel = OafRel.newBuilder().setSource(sourceId)
1184
				.setTarget(targetId)
1185
				.setRelType(relType)
1186
				.setSubRelType(subRelType)
1187
				.setRelClass(relClass)
1188
				.setChild(isChild);
1189
		if (StringUtils.isNotBlank(collectedFromId) && StringUtils.isNotBlank(collectedFromName)) {
1190
			oafRel.addCollectedfrom(getKV(collectedFromId, collectedFromName));
1191
		}
1192
		return oafRel;
1193
	}
1194

    
1195
	protected static OafEntity.Builder getEntity(final Type type,
1196
			final String id,
1197
			final KeyValue collectedFrom,
1198
			final List<String> originalIds,
1199
			final String dateOfCollection,
1200
			final String dateOfTransformation,
1201
			final List<StructuredProperty> pids) {
1202
		final OafEntity.Builder builder = OafEntity.newBuilder().setType(type).setId(id);
1203
		if (collectedFrom != null) builder.addCollectedfrom(collectedFrom);
1204
		builder.setDateoftransformation(StringUtils.isBlank(dateOfTransformation) ? "" : dateOfTransformation);
1205
		builder.setDateofcollection(StringUtils.isBlank(dateOfCollection) ? "" : dateOfCollection);
1206

    
1207
		if ((originalIds != null) && !originalIds.isEmpty()) {
1208
			builder.addAllOriginalId(Iterables.filter(originalIds, getPredicateNotBlankString()));
1209
		}
1210

    
1211
		if ((pids != null) && !pids.isEmpty()) {
1212
			builder.addAllPid(Iterables.filter(pids, Predicates.notNull()));
1213
		}
1214

    
1215
		return builder;
1216
	}
1217

    
1218
	private static Predicate<String> getPredicateNotBlankString() {
1219
		return new Predicate<String>() {
1220
			@Override
1221
			public boolean apply(final String s) {
1222
				return StringUtils.isNotBlank(s);
1223
			}
1224
		};
1225
	}
1226

    
1227
	public static DataInfo.Builder getDataInfo(final NodeList about,
1228
			final String provenanceaction,
1229
			final String trust,
1230
			final boolean deletedbyinference,
1231
			final boolean inferred) {
1232

    
1233
		final DataInfo.Builder dataInfoBuilder = DataInfo.newBuilder();
1234
		dataInfoBuilder.setInferred(Boolean.valueOf(inferred));
1235
		dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(deletedbyinference));
1236
		dataInfoBuilder.setTrust(trust);
1237
		dataInfoBuilder.setProvenanceaction(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1238

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

    
1242
			final org.w3c.dom.Element dataInfoElement = getDirectChild((org.w3c.dom.Element) about.item(0), "datainfo");
1243
			if (dataInfoElement != null) {
1244
				org.w3c.dom.Element elem = getDirectChild(dataInfoElement, "inferred");
1245
				dataInfoBuilder.setInferred(Boolean.valueOf(getStringValue(elem, String.valueOf(inferred))));
1246

    
1247
				elem = getDirectChild(dataInfoElement, "deletedbyinference");
1248
				dataInfoBuilder.setDeletedbyinference(Boolean.valueOf(getStringValue(elem, String.valueOf(deletedbyinference))));
1249

    
1250
				elem = getDirectChild(dataInfoElement, "trust");
1251
				dataInfoBuilder.setTrust(getStringValue(elem, trust));
1252

    
1253
				elem = getDirectChild(dataInfoElement, "inferenceprovenance");
1254
				dataInfoBuilder.setInferenceprovenance(getStringValue(elem));
1255

    
1256
				elem = getDirectChild(dataInfoElement, "provenanceaction");
1257
				final Qualifier.Builder pBuilder = Qualifier.newBuilder();
1258
				if (elem.hasAttributes()) {
1259
					final NamedNodeMap attributes = elem.getAttributes();
1260
					pBuilder.setClassid(getAttributeValue(attributes, "classid"));
1261
					pBuilder.setClassname(getAttributeValue(attributes, "classname"));
1262
					pBuilder.setSchemeid(getAttributeValue(attributes, "schemeid"));
1263
					pBuilder.setSchemename(getAttributeValue(attributes, "schemename"));
1264
				} else {
1265
					pBuilder.mergeFrom(getSimpleQualifier(provenanceaction, "dnet:provenanceActions").build());
1266
				}
1267
				dataInfoBuilder.setProvenanceaction(pBuilder);
1268
			}
1269
		}
1270

    
1271
		return dataInfoBuilder;
1272
	}
1273

    
1274
	protected static OAIProvenance getOAIProvenance(final NodeList about) {
1275

    
1276
		OAIProvenance.Builder oaiProv = OAIProvenance.newBuilder();
1277

    
1278
		if (((about != null) && (about.getLength() > 0))) {
1279

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

    
1282
			if (provenance != null) {
1283
				final org.w3c.dom.Element origDesc = getDirectChild(provenance, "originDescription");
1284
				oaiProv.setOriginDescription(buildOriginDescription(origDesc, OriginDescription.newBuilder()));
1285
			}
1286
		}
1287

    
1288
		return oaiProv.build();
1289
	}
1290

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

    
1294
		org.w3c.dom.Element elem = getDirectChild(origDesc, "baseURL");
1295
		od.setBaseURL(getStringValue(elem));
1296

    
1297
		elem = getDirectChild(origDesc, "identifier");
1298
		od.setIdentifier(getStringValue(elem));
1299

    
1300
		elem = getDirectChild(origDesc, "datestamp");
1301
		od.setDatestamp(getStringValue(elem));
1302

    
1303
		elem = getDirectChild(origDesc, "metadataNamespace");
1304
		od.setMetadataNamespace(getStringValue(elem));
1305

    
1306
		elem = getDirectChild(origDesc, "originDescription");
1307

    
1308
		if (elem != null) {
1309

    
1310
			od.setOriginDescription(buildOriginDescription(elem, OriginDescription.newBuilder()));
1311
		}
1312

    
1313
		return od.build();
1314
	}
1315

    
1316
	private static String getStringValue(final org.w3c.dom.Element elem, final String defaultValue) {
1317
		return (elem != null && elem.getTextContent() != null) ? elem.getTextContent() : defaultValue;
1318
	}
1319

    
1320
	private static String getStringValue(final org.w3c.dom.Element elem) {
1321
		return getStringValue(elem, "");
1322
	}
1323

    
1324
	protected static String getAttributeValue(final NamedNodeMap attributes, final String name) {
1325
		final Node attr = attributes.getNamedItem(name);
1326
		if (attr == null) return "";
1327
		final String value = attr.getNodeValue();
1328
		return value != null ? value : "";
1329
	}
1330

    
1331
	protected static org.w3c.dom.Element getDirectChild(final org.w3c.dom.Element parent, final String name) {
1332
		for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
1333
			if ((child instanceof org.w3c.dom.Element) && name.equals(child.getLocalName())) return (org.w3c.dom.Element) child;
1334
		}
1335
		return null;
1336
	}
1337

    
1338
	protected static Qualifier.Builder getSimpleQualifier(final String classname, final String schemename) {
1339
		return getQualifier(classname, classname, schemename, schemename);
1340
	}
1341

    
1342
	protected static Qualifier.Builder getSimpleQualifier(final ProtocolMessageEnum classname, final String schemename) {
1343
		return getQualifier(classname.toString(), classname.toString(), schemename, schemename);
1344
	}
1345

    
1346
	protected static Qualifier.Builder getQualifier(final String classid, final String classname, final String schemeid, final String schemename) {
1347
		return Qualifier.newBuilder().setClassid(classid).setClassname(classname).setSchemeid(schemeid).setSchemename(schemename);
1348
	}
1349

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

    
1353
		if ((fields != null) && !fields.isEmpty() && (fields.get(0) != null)) {
1354
			qualifier.setClassid(fields.get(0));
1355
			qualifier.setClassname(getClassName(fields.get(0)));
1356
		}
1357
		return qualifier;
1358
	}
1359

    
1360
	protected static void addStructuredProps(final Message.Builder builder,
1361
			final FieldDescriptor fd,
1362
			final ElementList values,
1363
			final String defaultClass,
1364
			final String defaultScheme) {
1365
		if (values != null) {
1366
			for (final Element s : values) {
1367
				final String classId = s.getAttributeValue("classid") != null ? s.getAttributeValue("classid") : defaultClass;
1368
				final String className = s.getAttributeValue("classname") != null ? s.getAttributeValue("classname") : defaultClass;
1369
				final String schemeId = s.getAttributeValue("schemeid") != null ? s.getAttributeValue("schemeid") : defaultScheme;
1370
				final String schemeName = s.getAttributeValue("schemename") != null ? s.getAttributeValue("schemename") : defaultScheme;
1371
				addField(builder, fd, getStructuredProperty(s.getText(), classId, className, schemeId, schemeName));
1372
			}
1373
		}
1374
	}
1375

    
1376
	protected static List<StructuredProperty> parsePids(final NodeList nodelist) {
1377

    
1378
		final List<StructuredProperty> pids = Lists.newArrayList();
1379

    
1380
		for (int i = 0; i < nodelist.getLength(); i++) {
1381
			final Node node = nodelist.item(i);
1382
			Node pidType = null;
1383
			if (node.getNodeType() == Node.ELEMENT_NODE) {
1384
				if (node.getLocalName().equalsIgnoreCase("identifier")) {
1385
					pidType = node.getAttributes().getNamedItem("identifierType");
1386
				}
1387
				//this is to handle dataset pids
1388
				if (node.getLocalName().equalsIgnoreCase("alternateIdentifier")) {
1389
					pidType = node.getAttributes().getNamedItem("alternateIdentifierType");
1390
				}
1391

    
1392
				for (int j = 0; j < node.getChildNodes().getLength(); j++) {
1393
					final Node child = node.getChildNodes().item(j);
1394

    
1395
					if ((child.getNodeType() == Node.TEXT_NODE) && (pidType != null) && (pidType.getNodeValue() != null) && !pidType.getNodeValue().isEmpty()
1396
							&& !pidType.getNodeValue().equalsIgnoreCase("url")) {
1397

    
1398
						final String type = pidType.getNodeValue().toLowerCase();
1399

    
1400
						final String value = child.getTextContent();
1401

    
1402
						pids.add(getStructuredProperty(value, type, getClassName(type), "dnet:pid_types", "dnet:pid_types"));
1403
						break;
1404
					}
1405
				}
1406
			}
1407
		}
1408
		return pids;
1409
	}
1410

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

    
1414
		if (value == null) return;
1415

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

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

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

    
1500
			doAddField(builder, descriptor, fieldValue);
1501
		}
1502

    
1503
	}
1504

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

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

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

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

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

    
1533
	public static String trim(final String s) {
1534
		return s.trim();
1535
	}
1536

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1626
}
(1-1/9)