Project

General

Profile

Download (74.5 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.io.specimen.abcd206.in;
2

    
3
import eu.etaxonomy.cdm.common.URI;
4
import java.util.ArrayList;
5
import java.util.HashMap;
6
import java.util.Map;
7

    
8
import org.apache.commons.lang3.StringUtils;
9
import org.apache.log4j.Logger;
10
import org.w3c.dom.Element;
11
import org.w3c.dom.Node;
12
import org.w3c.dom.NodeList;
13

    
14
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
15

    
16
public class Abcd206XMLFieldGetter {
17

    
18
    private static final Logger logger = Logger.getLogger(Abcd206Import.class);
19
    private final Abcd206DataHolder dataHolder;
20
    private final String prefix;
21
    private String path = "";
22
    boolean DEBUG =false;
23

    
24
    public Abcd206XMLFieldGetter(Abcd206DataHolder dataholder, String prefix){
25
        this.dataHolder = dataholder;
26
        this.prefix = prefix;
27
    }
28

    
29

    
30
    /**
31
     * getType :
32
     * @param result
33
     */
34
    protected void getType(Node result) {
35
        if (DEBUG) {
36
            logger.info("GetType");
37
        }
38
        NodeList results, types, ntds, ntd;
39
        String type;
40
        results = result.getChildNodes();
41
        boolean typeFound = false;
42
        try {
43
            for (int k = 0; k < results.getLength(); k++) {
44
                typeFound=false;
45
                if (results.item(k).getNodeName()
46
                        .equals(prefix + "SpecimenUnit")) {
47
                    types = results.item(k).getChildNodes();
48
                    for (int l = 0; l < types.getLength(); l++) {
49
                        /*
50
                         *NomenclaturalTypeDesignations>
51
                         *<abcd21:NomenclaturalTypeDesignation>
52
                         *<abcd21:TypeStatus>epitype</abcd21:TypeStatus>
53
                         *</abcd21:NomenclaturalTypeDesignation>
54
                         *</abcd21:NomenclaturalTypeDesignations>
55
                         */
56
                        if (types.item(l).getNodeName().equals(prefix+ "NomenclaturalTypeDesignations")) {
57
                            ntds = types.item(l).getChildNodes();
58
                            for (int m = 0; m < ntds.getLength(); m++) {
59
                                if (ntds.item(m).getNodeName().equals(prefix+ "NomenclaturalTypeDesignation")) {
60
                                    ntd = ntds.item(m).getChildNodes();
61
                                    for (int n = 0; n < ntd.getLength(); n++) {
62
                                        if (ntd.item(n).getNodeName().equals(prefix + "TypeStatus"))
63
                                        {
64
                                            type = ntd.item(n).getTextContent();
65
                                            if(DEBUG) {
66
                                                logger.info("ADD "+type);
67
                                            }
68
                                            dataHolder.getStatusList().add(getSpecimenTypeDesignationStatusByKey(type));
69
                                            typeFound=true;
70
                                          //  path = ntd.item(n).getNodeName();
71
                                         //   getHierarchie(ntd.item(l));
72
                                          //  dataHolder.knownABCDelements.add(path);
73
                                           // path = "";
74
                                        }
75
                                    }
76
                                }
77
                            }
78
                        }
79
                    }
80
                }
81
                if (!typeFound) {
82
                    if (dataHolder.getStatusList() != null){
83
                        dataHolder.getStatusList().add(null);
84
                    }else{
85
                        dataHolder.setStatusList(new ArrayList<SpecimenTypeDesignationStatus>());
86
                    }
87
                }
88
            }
89
        } catch (NullPointerException e) {
90

    
91
            dataHolder.setStatusList(new ArrayList<SpecimenTypeDesignationStatus>());
92
        }
93
    }
94

    
95
    /**
96
     * getType :
97
     * @param result
98
     */
99
    protected void getPreparation(Node result) {
100
        if (DEBUG) {
101
            logger.info("GetPreparation");
102
        }
103
        NodeList results, preps, ntds, ntd;
104
        String prep;
105
        String item;
106
        results = result.getChildNodes();
107

    
108
        try {
109
            for (int k = 0; k < results.getLength(); k++) {
110

    
111
                if (results.item(k).getNodeName()
112
                        .equals(prefix + "SpecimenUnit")) {
113
                    preps = results.item(k).getChildNodes();
114
                    for (int l = 0; l < preps.getLength(); l++) {
115
                        if (preps.item(l).getNodeName().equals(prefix+ "Preparations")) {
116
                            ntds = preps.item(l).getChildNodes();
117
                            for (int m = 0; m < ntds.getLength(); m++) {
118
                                if (ntds.item(m).getNodeName().equals(prefix+ "preparation")) {
119
                                    ntd = ntds.item(m).getChildNodes();
120
                                    prep = "";
121

    
122
                                    for (int n = 0; n < ntd.getLength(); n++) {
123

    
124
                                        //Fix me: now only the type or the agent is imported because it is overwritten
125
                                        if (ntd.item(n).getNodeName().equals(prefix + "preparationType"))
126
                                        {
127
                                            item = ntd.item(n).getTextContent().trim();
128
                                            prep += " Preparation Type: "+item +System.lineSeparator();
129

    
130
                                            if(DEBUG) {
131
                                                logger.info("ADD "+prep);
132
                                            }
133
                                            dataHolder.setUnitNotes(prep);
134
                                            path = ntd.item(l).getNodeName();
135
                                            getHierarchie(ntd.item(l));
136
                                            dataHolder.knownABCDelements.add(path);
137
                                            path = "";
138
                                        }
139
                                        if (ntd.item(n).getNodeName().equals(prefix + "preparationAgent"))
140
                                        {
141
                                            item = ntd.item(n).getTextContent().trim();
142
                                            prep += " Preparation Agent: "+item;
143
                                            if(DEBUG) {
144
                                                logger.info("ADD "+prep);
145
                                            }
146
                                            dataHolder.setUnitNotes(prep);
147
                                            path = ntd.item(l).getNodeName();
148
                                            getHierarchie(ntd.item(l));
149
                                            dataHolder.knownABCDelements.add(path);
150
                                            path = "";
151
                                        }
152
                                    }
153
                                }
154
                            }
155
                        }
156
                    }
157
                }
158

    
159
            }
160
        } catch (NullPointerException e) {
161

    
162
        }
163
    }
164

    
165
    /**
166
     * getScientificNames : get the list of scientific names (preferred and non preferred)
167
     * @param group
168
     */
169
    protected void getScientificNames(NodeList group) {
170
        NodeList identifications, results;
171
        String tmpName = null;
172
        String preferredFlag = null;
173
        String identifierStr = null;
174
        String dateStr = null;
175
        String modifierStr = null;
176
        //TODO: add the identifier!!
177
//        abcd:Identification>
178
//        <abcd:Result>
179
//        <abcd:TaxonIdentified>
180
//        <abcd:ScientificName>
181
//        <abcd:FullScientificNameString>Melosira varians C. Agardh</abcd:FullScientificNameString>
182
//        <abcd:NameAtomised><abcd:Botanical><abcd:GenusOrMonomial>Melosira</abcd:GenusOrMonomial><abcd:FirstEpithet>varians</abcd:FirstEpithet><abcd:Rank>sp.</abcd:Rank><abcd:AuthorTeam>C.Agardh</abcd:AuthorTeam></abcd:Botanical></abcd:NameAtomised>
183
//        </abcd:ScientificName>
184
//        </abcd:TaxonIdentified>
185
//        </abcd:Result>
186
//        <abcd:PreferredFlag>true</abcd:PreferredFlag>
187
//        <abcd:Identifiers>
188
//        <abcd:Identifier>
189
//        <abcd:PersonName><abcd:FullName>W.-H. Kusber</abcd:FullName></abcd:PersonName>
190
//        </abcd:Identifier>
191
//        </abcd:Identifiers>
192
//        <abcd:Date>
193
//        <abcd:DateText>2014-07-11T00:00:00</abcd:DateText></abcd:Date>
194
//        </abcd:Identification>
195

    
196
        // TODO:here we need to get the informations about the higher taxa to get the info about the nomenclatural code!!
197
        for (int j = 0; j < group.getLength(); j++) {
198
            if (group.item(j).getNodeName().equals(prefix + "Identification")) {
199
                identifications = group.item(j).getChildNodes();
200
                for (int m = 0; m < identifications.getLength(); m++) {
201
                    if (identifications.item(m).getNodeName()
202
                            .equals(prefix + "Result")) {
203
                        results = identifications.item(m).getChildNodes();
204
                        for (int k = 0; k < results.getLength(); k++) {
205
                            if (results.item(k).getNodeName().equals(prefix + "TaxonIdentified")) {
206
                                tmpName = this.getScientificName(results.item(k));
207
                                if (tmpName.contains("cf.")){
208
                                    modifierStr = "cf.";
209
                                    tmpName = tmpName.replace("cf.", "");
210
                                }
211
                                if (tmpName.contains("aff.")){
212
                                    modifierStr = "aff.";
213
                                    tmpName = tmpName.replace("aff.", "");
214
                                }
215
                                 logger.info("TMP NAME " + tmpName);
216
                            }
217
                        }
218
                      } else if (identifications.item(m).getNodeName().equals(prefix + "PreferredFlag")) {
219
                          preferredFlag = identifications.item(m).getTextContent();
220
//                        if (dataHolder.getNomenclatureCode() != null&& dataHolder.getNomenclatureCode() != "") {
221
//                            // logger.info("TMP NAME P" + tmpName);
222
//
223
//                            dataHolder.getIdentificationList().add(new Identification(tmpName, preferredFlag, dataHolder.getNomenclatureCode(), null));
224
//                        } else {
225
//                            dataHolder.getIdentificationList().add(new Identification(tmpName, preferredFlag));
226
//                        }
227
                        path = identifications.item(m).getNodeName();
228
                        // getHierarchie(identifications.item(m));
229
                        dataHolder.knownABCDelements.add(path);
230
                        path = "";
231
                    } else if (identifications.item(m).getNodeName().equals(prefix + "References")) {
232
                        this.getReferences(identifications.item(m));
233
                    } else if (identifications.item(m).getNodeName().equals(prefix + "Identifiers")){
234
                        identifierStr = this.getIdentifiers(identifications.item(m));
235
                    }else if (identifications.item(m).getNodeName().equals(prefix +"Date")){
236
                        dateStr = this.getDateIdentified(identifications.item(m));
237
                    }
238
//                    if (identifications.item(m).getNodeName()
239
//                            .equals(prefix + "PreferredFlag")) {
240
//                        hasPref = true;
241
//                    }
242
                }
243
                if (StringUtils.isNoneBlank(dataHolder.getNomenclatureCode())) {
244
                    // logger.info("TMP NAME P" + tmpName);
245
                    dataHolder.getIdentificationList().add(new Identification(tmpName, preferredFlag, dataHolder.getNomenclatureCode(), identifierStr, dateStr, modifierStr));
246
                } else {
247
                    dataHolder.getIdentificationList().add(new Identification(tmpName, preferredFlag,identifierStr, dateStr, modifierStr));
248
                }
249
            }
250
        }
251

    
252
//        for (int j = 0; j < group.getLength(); j++) {
253
//            if (group.item(j).getNodeName().equals(prefix + "Identification")) {
254
//                dataHolder.setNomenclatureCode("");
255
//                identifications = group.item(j).getChildNodes();
256
//                for (int m = 0; m < identifications.getLength(); m++) {
257
//                    if (identifications.item(m).getNodeName().equals(prefix + "Result")) {
258
//                        results = identifications.item(m).getChildNodes();
259
//                        for (int k = 0; k < results.getLength(); k++) {
260
//                            if (results.item(k).getNodeName().equals(prefix + "TaxonIdentified")) {
261
//                                tmpName = this.getScientificName(results.item(k));
262
//                            }
263
//                        }
264
//                    }
265
//                    if (identifications.item(m).getNodeName()
266
//                            .equals(prefix + "PreferredFlag")) {
267
//                        hasPref = true;
268
//                    }
269
//                }
270
//                if (!hasPref && tmpName != null) {
271
//                    if (dataHolder.getNomenclatureCode() != null
272
//                            && dataHolder.getNomenclatureCode() != "") {
273
//                        dataHolder.getIdentificationList().add(new Identification(tmpName, "0", dataHolder.getNomenclatureCode(), null, dateStr));
274
//                    } else {
275
//                        dataHolder.getIdentificationList().add(new Identification(tmpName, "0", null, dateStr));
276
//                    }
277
//                }
278
//            }
279
//        }
280
    }
281

    
282
    /**
283
     * @param item
284
     * @return
285
     */
286
    private String getDateIdentified(Node item) {
287
        NodeList results, dateNode, dateTextNode;
288
        results = item.getChildNodes();
289
        boolean identifierFound = false;
290

    
291
        for (int k = 0; k < results.getLength(); k++) {
292
            if (results.item(k).getNodeName().equals(prefix + "DateText")) {
293
                return results.item(k).getTextContent();
294
            }
295

    
296

    
297
        }
298
        return null;
299

    
300
    }
301

    
302

    
303
    /**
304
     * @param item
305
     */
306
    private String getIdentifiers(Node item) {
307
        NodeList results, identifier, personName;
308
        results = item.getChildNodes();
309
        boolean identifierFound = false;
310

    
311
        for (int k = 0; k < results.getLength(); k++) {
312
            if (results.item(k).getNodeName().equals(prefix + "Identifier")) {
313
                /*
314
                 * <abcd21:Identifiers>
315
                 * <abcd21:Identifier>
316
                 * <abcd21:PersonName>
317
                 * <abcd21:FullName>R. Jahn</abcd21:FullName>
318
                 * </abcd21:PersonName>
319
                 * </abcd21:Identifier>
320
                 * </abcd21:Identifiers>
321
                 */
322
                identifier = results.item(k).getChildNodes();
323
                for (int l = 0; l < identifier.getLength(); l++) {
324
                    if (identifier.item(l).getNodeName().equals(prefix + "PersonName")) {
325
                       identifierFound = true;
326
                       Node identifierPersonName = identifier.item(l);
327
                       personName = identifierPersonName.getChildNodes();
328
                       for (int m = 0; m < personName.getLength(); m++) {
329
                           if (personName.item(m).getNodeName().equals(prefix + "FullName")) {
330
                               return personName.item(m).getTextContent();
331
                           }
332
                       }
333

    
334
                    }
335

    
336
                }
337

    
338
            }
339
        }
340
        return null;
341

    
342
    }
343

    
344

    
345
    /**
346
     * getScientificName : get the list of scientific names
347
     * @param result
348
     * @return
349
     */
350
    private String getScientificName(Node result) {
351
        // logger.info("IN getScientificName " + dataHolder.nomenclatureCode);
352
        NodeList taxonsIdentified, scnames, atomised;
353
        String tmpName = "";
354
        taxonsIdentified = result.getChildNodes();
355
        for (int l = 0; l < taxonsIdentified.getLength(); l++) {
356

    
357
            if (taxonsIdentified.item(l).getNodeName().equals(prefix + "ScientificName")) {
358
                scnames = taxonsIdentified.item(l).getChildNodes();
359
                for (int n = 0; n < scnames.getLength(); n++) {
360

    
361
                    if (scnames.item(n).getNodeName().equals(prefix + "FullScientificNameString")) {
362
                        path = scnames.item(n).getNodeName();
363
                        tmpName = scnames.item(n).getTextContent();
364
                        getHierarchie(scnames.item(n));
365
                        dataHolder.knownABCDelements.add(path);
366
                        path = "";
367
                    }
368
                    else if (scnames.item(n).getNodeName().equals(prefix + "NameAtomised")) {
369
                        Node nameAtomised = scnames.item(n);
370
                        try {
371
                            if (nameAtomised.hasChildNodes()) {
372
                                NodeList children = nameAtomised.getChildNodes();
373
                                String tmp = children.item(1).getNodeName();
374

    
375
                                if (tmp.indexOf(prefix) != -1 && prefix.length() > 0) {
376
                                    dataHolder.setNomenclatureCode(tmp.split(prefix)[1]);
377
                                }
378
                                else {
379
                                    dataHolder.setNomenclatureCode(scnames.item(n).getChildNodes().item(1).getNodeName());
380
                                }
381

    
382
                                Node child = children.item(0);
383

    
384
                                dataHolder.getAtomisedIdentificationList().add(this.getAtomisedNames(dataHolder.getNomenclatureCode(),children));
385
                            }
386
                        } catch (Exception e) {
387
                            if(DEBUG) {
388
                                logger.warn("PB nomenclaturecode");
389
                            }
390
                            dataHolder.setNomenclatureCode("");
391
                        }
392

    
393

    
394
                    }
395
                }
396
            }
397
        }
398
        return tmpName;
399
    }
400

    
401
    /**
402
     * getRerences : get the reference and citations
403
     * @param result
404
     * @return
405
     */
406
    protected boolean getReferences(Node result) {
407
        // logger.info("GET REFERENCE");
408
        NodeList results, reference;
409
        results = result.getChildNodes();
410
        boolean referencefound = false;
411
        String[] refDetails =new String[3];
412

    
413
        for (int k = 0; k < results.getLength(); k++) {
414
           if (results.item(k).getNodeName().equals(prefix + "SourceReference")) {
415
                reference = results.item(k).getChildNodes();
416
                for (int l = 0; l < reference.getLength(); l++) {
417
                    if (reference.item(l).getNodeName().equals(prefix + "TitleCitation")) {
418
                        path = reference.item(l).getNodeName();
419
                        refDetails[0]=reference.item(l).getTextContent();
420
                        getHierarchie(reference.item(l));
421
                        dataHolder.knownABCDelements.add(path);
422
                        path = "";
423
                        referencefound = true;
424
                    }
425
                    if (reference.item(l).getNodeName().equals(prefix + "CitationDetail")) {
426
                        path = reference.item(l).getNodeName();
427
                        refDetails[1]=reference.item(l).getTextContent();
428
                        getHierarchie(reference.item(l));
429
                        dataHolder.knownABCDelements.add(path);
430
                        path = "";
431
                        referencefound = true;
432
                    }
433
                    if (reference.item(l).getNodeName().equals(prefix + "URI")) {
434
                        path = reference.item(l).getNodeName();
435
                        refDetails[2]=reference.item(l).getTextContent();
436
                        getHierarchie(reference.item(l));
437
                        dataHolder.knownABCDelements.add(path);
438
                        path = "";
439
                        referencefound = true;
440
                    }
441
                }
442
                if (refDetails!=null){
443
                    for (int i=0;i<3;i++) {
444
                        if (refDetails[i]==null) {
445
                            refDetails[i]="";
446
                        }
447
                    }
448
                    dataHolder.getReferenceList().add(refDetails);
449
                    refDetails =new String[3];
450
                }
451
            }
452
        }
453
        return referencefound;
454
    }
455

    
456
    /**
457
     * Traverses the tree for compareABCDtoCDM
458
     *
459
     * @param node
460
     * @param dataHolder
461
     */
462
    protected void traverse(Node node) {
463
        // Extract node info:
464
        String test = node.getTextContent();
465

    
466
        // Print and continue traversing.
467
        if (test != null && test != "#text" && node.getNodeName() != "#text"&& test.split("\n").length == 1 && test.length() > 0) {
468
            path = node.getNodeName();
469
            getHierarchie(node);
470
            dataHolder.allABCDelements.put(path, test);
471
            path = "";
472
        }
473
        // Now traverse the rest of the tree in depth-first order.
474
        if (node.hasChildNodes()) {
475
            // Get the children in a list.
476
            NodeList nl = node.getChildNodes();
477
            // How many of them?
478
            int size = nl.getLength();
479
            for (int i = 0; i < size; i++) {
480
                // Recursively traverse each of the children.
481
                traverse(nl.item(i));
482
            }
483
        }
484
    }
485

    
486

    
487

    
488
    /*
489
     * (non-Javadoc)
490
     *
491
     * @see eu.etaxonomy.cdm.io.common.mapping.IInputTransformer#
492
     * getSpecimenTypeDesignationStatusByKey(java.lang.String)
493
     */
494
    private SpecimenTypeDesignationStatus getSpecimenTypeDesignationStatusByKey(
495
            String key) {
496
        if (key == null) {
497
            return null;
498
        } else if (key.matches("(?i)(T|Type)")) {
499
            return SpecimenTypeDesignationStatus.TYPE();
500
        } else if (key.matches("(?i)(HT|Holotype)")) {
501
            return SpecimenTypeDesignationStatus.HOLOTYPE();
502
        } else if (key.matches("(?i)(LT|Lectotype)")) {
503
            return SpecimenTypeDesignationStatus.LECTOTYPE();
504
        } else if (key.matches("(?i)(NT|Neotype)")) {
505
            return SpecimenTypeDesignationStatus.NEOTYPE();
506
        } else if (key.matches("(?i)(ST|Syntype)")) {
507
            return SpecimenTypeDesignationStatus.SYNTYPE();
508
        } else if (key.matches("(?i)(ET|Epitype)")) {
509
            return SpecimenTypeDesignationStatus.EPITYPE();
510
        } else if (key.matches("(?i)(IT|Isotype)")) {
511
            return SpecimenTypeDesignationStatus.ISOTYPE();
512
        } else if (key.matches("(?i)(ILT|Isolectotype)")) {
513
            return SpecimenTypeDesignationStatus.ISOLECTOTYPE();
514
        } else if (key.matches("(?i)(INT|Isoneotype)")) {
515
            return SpecimenTypeDesignationStatus.ISONEOTYPE();
516
        } else if (key.matches("(?i)(IET|Isoepitype)")) {
517
            return SpecimenTypeDesignationStatus.ISOEPITYPE();
518
        } else if (key.matches("(?i)(PT|Paratype)")) {
519
            return SpecimenTypeDesignationStatus.PARATYPE();
520
        } else if (key.matches("(?i)(PLT|Paralectotype)")) {
521
            return SpecimenTypeDesignationStatus.PARALECTOTYPE();
522
        } else if (key.matches("(?i)(PNT|Paraneotype)")) {
523
            return SpecimenTypeDesignationStatus.PARANEOTYPE();
524
        } else if (key.matches("(?i)(unsp.|Unspecified)")) {
525
            return SpecimenTypeDesignationStatus.UNSPECIFIC();
526
        } else if (key.matches("(?i)(2LT|Second Step Lectotype)")) {
527
            return SpecimenTypeDesignationStatus.SECOND_STEP_LECTOTYPE();
528
        } else if (key.matches("(?i)(2NT|Second Step Neotype)")) {
529
            return SpecimenTypeDesignationStatus.SECOND_STEP_NEOTYPE();
530
        } else if (key.matches("(?i)(OM|Original Material)")) {
531
            return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();
532
        } else if (key.matches("(?i)(IcT|Iconotype)")) {
533
            return SpecimenTypeDesignationStatus.ICONOTYPE();
534
        } else if (key.matches("(?i)(PT|Phototype)")) {
535
            return SpecimenTypeDesignationStatus.PHOTOTYPE();
536
        } else if (key.matches("(?i)(IST|Isosyntype)")) {
537
            return SpecimenTypeDesignationStatus.ISOSYNTYPE();
538
        } else {
539
            return null;
540
        }
541
    }
542

    
543
    /**
544
     * getHierarchie : get the whole path
545
     * @param node
546
     */
547
    private void getHierarchie(Node node) {
548
        // logger.info("getHierarchie");
549
        while (node != null && node.getNodeName() != prefix + "DataSets" && node.getParentNode() != null) {
550
            // logger.info("nodeparent "+node.getParentNode().getNodeName());
551
            path = node.getParentNode().getNodeName() + "/" + path;
552
            node = node.getParentNode();
553
        }
554
        // logger.info("path gethierarchie: "+path);
555
    }
556

    
557

    
558
    /**
559
     * getIDs : get the source institution id, source id...
560
     * @param root
561
     */
562
    protected void getIDs(Element root) {
563
        NodeList group;
564
        try {
565
            group = root.getElementsByTagName(prefix + "SourceInstitutionID");
566
            path = group.item(0).getNodeName();
567
            getHierarchie(group.item(0));
568
            dataHolder.knownABCDelements.add(path);
569
            path = "";
570
            dataHolder.institutionCode = group.item(0).getTextContent();
571
        } catch (NullPointerException e) {
572
            dataHolder.institutionCode = "";
573
        }
574
        try {
575
            group = root.getElementsByTagName(prefix + "SourceID");
576
            path = group.item(0).getNodeName();
577
            getHierarchie(group.item(0));
578
            dataHolder.knownABCDelements.add(path);
579
            path = "";
580
            dataHolder.collectionCode = group.item(0).getTextContent();
581
        } catch (NullPointerException e) {
582
            dataHolder.collectionCode = "";
583
        }
584
        try {
585
            group = root.getElementsByTagName(prefix + "UnitID");
586
            path = group.item(0).getNodeName();
587
            getHierarchie(group.item(0));
588
            dataHolder.knownABCDelements.add(path);
589
            path = "";
590
            dataHolder.setUnitID(group.item(0).getTextContent());
591
        } catch (NullPointerException e) {
592
            dataHolder.setUnitID("");
593
        }
594
        try {
595
            group = root.getElementsByTagName(prefix + "UnitGUID");
596
            path = group.item(0).getNodeName();
597
            getHierarchie(group.item(0));
598
            dataHolder.knownABCDelements.add(path);
599
            path = "";
600
            try{
601
                dataHolder.setPreferredStableUri(URI.create(group.item(0).getTextContent()));
602
            }catch(IllegalArgumentException e){
603
                dataHolder.setPreferredStableUri(null);
604
            }
605
        } catch (NullPointerException e) {
606
            dataHolder.setPreferredStableUri(null);
607
        }
608
    }
609

    
610
    /**
611
     * getRecordBasis : extract the recordBasis out of the ABCD document
612
     * @param root
613
     */
614
    protected void getRecordBasis(Element root) {
615
        NodeList group;
616
        try {
617
            group = root.getElementsByTagName(prefix + "RecordBasis");
618
            path = group.item(0).getNodeName();
619
            getHierarchie(group.item(0));
620
            dataHolder.knownABCDelements.add(path);
621
            path = "";
622
            dataHolder.setRecordBasis(group.item(0).getTextContent()) ;
623
        } catch (NullPointerException e) {
624
            dataHolder.setRecordBasis("") ;
625
        }
626
    }
627

    
628
    protected void getKindOfUnit(Element root) {
629
        NodeList group;
630
        try {
631
            group = root.getElementsByTagName(prefix + "KindOfUnit");
632
            path = group.item(0).getNodeName();
633
            getHierarchie(group.item(0));
634
            dataHolder.knownABCDelements.add(path);
635
            path = "";
636
            dataHolder.setKindOfUnit(group.item(0).getTextContent());
637
        } catch (NullPointerException e) {
638
            dataHolder.setKindOfUnit("");
639
        }
640
    }
641

    
642
    /**
643
     * getNumbers : getAccessionNumber, collector number ...
644
     * @param root
645
     */
646
    protected void getNumbers(Element root) {
647
        NodeList group;
648
        try {
649
            group = root.getElementsByTagName(prefix + "AccessionNumber");
650
            path = group.item(0).getNodeName();
651
            getHierarchie(group.item(0));
652
            dataHolder.knownABCDelements.add(path);
653
            path = "";
654
            dataHolder.accessionNumber = group.item(0).getTextContent();
655
        } catch (NullPointerException e) {
656
            dataHolder.accessionNumber = "";
657
        }
658
        try {
659
            group = root.getElementsByTagName(prefix + "CollectorsFieldNumber");
660
            path = group.item(0).getNodeName();
661
            getHierarchie(group.item(0));
662
            dataHolder.knownABCDelements.add(path);
663
            path = "";
664
            String collectorsFieldNumber = group.item(0).getTextContent();
665
            dataHolder.setFieldNumber(collectorsFieldNumber);
666
        } catch (NullPointerException e) {
667
            dataHolder.setFieldNumber("");
668
        }
669

    
670
        //try {
671
        //group = root.getElementsByTagName(prefix + "AccessionNumber");
672
        //path = group.item(0).getNodeName();
673
        //getHierarchie(group.item(0));
674
        //dataHolder.knownABCDelements.add(path);
675
        //path = "";
676
        //dataHolder.accessionNumber = group.item(0).getTextContent();
677
        //} catch (NullPointerException e) {
678
        //dataHolder.accessionNumber = "";
679
        //}
680
    }
681

    
682
    /**
683
     * getGeolocation : get locality
684
     * @param root
685
     * @param state
686
     */
687
    protected void getGeolocation(Element root, Abcd206ImportState state) {
688
        NodeList group, childs;
689
        try {
690
            group = root.getElementsByTagName(prefix + "LocalityText");
691
            path = group.item(0).getNodeName();
692
            getHierarchie(group.item(0));
693
            dataHolder.knownABCDelements.add(path);
694
            path = "";
695
            dataHolder.locality = group.item(0).getTextContent();
696
            if (group.item(0).hasAttributes()) {
697
                if (group.item(0).getAttributes().getNamedItem("lang") != null) {
698
                    dataHolder.languageIso = group.item(0).getAttributes().getNamedItem("lang").getTextContent();
699
                }
700
            }
701
        } catch (NullPointerException e) {
702
            dataHolder.locality = "";
703
        }
704
        try {
705
            group = root.getElementsByTagName(prefix + "LongitudeDecimal");
706
            path = group.item(0).getNodeName();
707
            getHierarchie(group.item(0));
708
            dataHolder.knownABCDelements.add(path);
709
            path = "";
710
            Node node = group.item(0);
711
            dataHolder.longitude = Double.valueOf(group.item(0).getTextContent());
712
        } catch (NullPointerException e) {
713
            dataHolder.longitude = null;
714
        }
715
        try {
716
            group = root.getElementsByTagName(prefix + "LatitudeDecimal");
717
            path = group.item(0).getNodeName();
718
            getHierarchie(group.item(0));
719
            dataHolder.knownABCDelements.add(path);
720
            path = "";
721
            dataHolder.latitude = Double.valueOf(group.item(0).getTextContent());
722
        } catch (NullPointerException e) {
723
            dataHolder.latitude = null;
724
        }
725
        try {
726
            group = root.getElementsByTagName(prefix + "CoordinateErrorDistanceInMeters");
727
            path = group.item(0).getNodeName();
728
            getHierarchie(group.item(0));
729
            dataHolder.knownABCDelements.add(path);
730
            path = "";
731
            dataHolder.setGatheringCoordinateErrorMethod(group.item(0).getTextContent());
732
        } catch (NullPointerException e) {
733
            dataHolder.setGatheringCoordinateErrorMethod(null);
734
        }
735
        try {
736
            group = root.getElementsByTagName(prefix + "Country");
737
            childs = group.item(0).getChildNodes();
738
            for (int i = 0; i < childs.getLength(); i++) {
739
                if (childs.item(i).getNodeName().contains("Name")) {
740
                    path = childs.item(i).getNodeName();
741
                    getHierarchie(childs.item(i));
742
                    dataHolder.knownABCDelements.add(path);
743
                    path = "";
744
                    dataHolder.country = childs.item(i).getTextContent();
745
                }
746
            }
747
        } catch (NullPointerException e) {
748
            dataHolder.country = "";
749
        }
750
        try {
751
            group = root.getElementsByTagName(prefix + "Country");
752
            childs = group.item(0).getChildNodes();
753
            for (int i = 0; i < childs.getLength(); i++) {
754
                if (childs.item(i).getNodeName().contains("ISO3166Code")) {
755
                    path = childs.item(i).getNodeName();
756
                    getHierarchie(childs.item(i));
757
                    dataHolder.knownABCDelements.add(path);
758
                    path = "";
759
                    dataHolder.isocountry = childs.item(i).getTextContent();
760
                }
761
            }
762
        } catch (NullPointerException e) {
763
            dataHolder.isocountry = "";
764
        }
765
        try {
766
            group = root.getElementsByTagName(prefix + "Altitude");
767
            for (int i = 0; i < group.getLength(); i++) {
768
                childs = group.item(i).getChildNodes();
769
                for (int j = 0; j < childs.getLength(); j++) {
770
                    if (childs.item(j).getNodeName().equals(prefix + "MeasurementOrFactText")) {
771
                        path = childs.item(j).getNodeName();
772
                        getHierarchie(childs.item(j));
773
                        dataHolder.knownABCDelements.add(path);
774
                        path = "";
775
                        dataHolder.altitude = Integer.valueOf(childs.item(j).getTextContent());
776
                    }
777
                }
778
            }
779
        } catch (NullPointerException e) {
780
            dataHolder.altitude = -9999;
781
        }
782

    
783
        getGatheringDepth(root);
784

    
785
        try {
786
            group = root.getElementsByTagName(prefix + "NamedArea");
787
            dataHolder.setNamedAreaList(new HashMap<String, String>());
788
            for (int i = 0; i < group.getLength(); i++) {
789
                childs = group.item(i).getChildNodes();
790
                String currentArea = null;
791
                for (int j = 0; j < childs.getLength(); j++) {
792
                    if (childs.item(j).getNodeName() .equals(prefix + "AreaName")) {
793
                        path = childs.item(j).getNodeName();
794
                        getHierarchie(childs.item(j));
795
                        dataHolder.knownABCDelements.add(path);
796
                        path = "";
797
                        currentArea = childs.item(j).getTextContent();
798
                        dataHolder.getNamedAreaList().put(currentArea, null);
799
                    }
800
                }
801
                if(currentArea!=null){
802
                    for (int j = 0; j < childs.getLength(); j++) {
803
                        if (childs.item(j).getNodeName() .equals(prefix + "AreaClass")) {
804
                            path = childs.item(j).getNodeName();
805
                            getHierarchie(childs.item(j));
806
                            dataHolder.knownABCDelements.add(path);
807
                            path = "";
808
                            dataHolder.getNamedAreaList().put(currentArea, childs.item(j).getTextContent());
809
                        }
810
                    }
811
                }
812
            }
813
        } catch (NullPointerException e) {
814
            dataHolder.setNamedAreaList(new HashMap<String, String>());
815
        }
816

    
817
        if(state.getConfig().isRemoveCountryFromLocalityText()){
818
            if(dataHolder.locality.startsWith(dataHolder.country)){
819
                dataHolder.locality = dataHolder.locality.replaceFirst(dataHolder.country+"[\\W]", "");
820
            }
821
            for (String namedArea : ((HashMap<String, String>) dataHolder.getNamedAreaList()).keySet()) {
822
                if(dataHolder.locality.startsWith(namedArea)){
823
                    dataHolder.locality = dataHolder.locality.replaceFirst(namedArea+"[\\W]", "");
824
                }
825
            }
826
        }
827
    }
828

    
829

    
830
    /**
831
     * @param root
832
     */
833
    private void getGatheringDepth(Element root) {
834
        NodeList group;
835
        try {
836
            group = root.getElementsByTagName(prefix + "Gathering");
837
            for (int i = 0; i < group.getLength(); i++) {
838
                NodeList children = group.item(i).getChildNodes();
839
                for (int j = 0; j < children.getLength(); j++) {
840
                    if (children.item(j).getNodeName().equals(prefix + "Depth")) {
841
                        NodeList altitudes = children.item(j).getChildNodes();
842
                        for (int k = 0; k < altitudes.getLength(); k++) {
843
                            if (altitudes.item(k).getNodeName().equals(prefix + "MeasurementOrFactText")) {
844
                                path = altitudes.item(k).getNodeName();
845
                                getHierarchie(altitudes.item(k));
846
                                dataHolder.knownABCDelements.add(path);
847
                                path = "";
848
                                try{
849
                                    dataHolder.setGatheringDepthText(altitudes.item(k).getTextContent());
850
                                }catch(NumberFormatException e){
851
                                    logger.debug("Gathering depth value is not parsable to double: " + altitudes.item(k).getTextContent());
852
                                }
853
                            }
854
                        }
855
                    }
856
                }
857
                }
858
            } catch (NullPointerException e) {
859
                dataHolder.setDepth( -9999.0);
860
            }
861
        if(dataHolder.getDepth()==null){
862
            group = root.getElementsByTagName(prefix + "Gathering");
863
            for (int i = 0; i < group.getLength(); i++) {
864
                NodeList children = group.item(i).getChildNodes();
865
                for (int j = 0; j < children.getLength(); j++) {
866
                    if (children.item(j).getNodeName().equals(prefix + "Depth")) {
867
                        NodeList altitudes = children.item(j).getChildNodes();
868
                        for (int k = 0; k < altitudes.getLength(); k++) {
869
                            if (altitudes.item(k).getNodeName().equals(prefix + "MeasurementOrFactAtomised")) {
870
                                NodeList facts = altitudes.item(k).getChildNodes();
871
                                for (int l = 0; l < facts.getLength(); l++) {
872
                                    if (facts.item(l).getNodeName().equalsIgnoreCase(prefix + "LowerValue")) {
873
                                        path = facts.item(l).getNodeName();
874
                                        getHierarchie(facts.item(l));
875
                                        dataHolder.knownABCDelements.add(path);
876
                                        path = "";
877
                                        try{
878
                                            dataHolder.setGatheringDepthMin(Double.parseDouble(facts.item(l).getTextContent()));
879
                                        } catch(NumberFormatException e){
880
                                            logger.debug("Gathering depth min is not numeric. " + facts.item(l).getTextContent());
881
                                        }
882
                                    }
883
                                    else if (facts.item(l).getNodeName().equalsIgnoreCase(prefix + "UpperValue")) {
884
                                        path = facts.item(l).getNodeName();
885
                                        getHierarchie(facts.item(l));
886
                                        dataHolder.knownABCDelements.add(path);
887
                                        path = "";
888
                                        try{
889
                                            dataHolder.setGatheringDepthMax(Double.parseDouble(facts.item(l).getTextContent()));
890
                                        }catch(NumberFormatException e){
891
                                            logger.debug("Gathering depth max is not numeric. " + facts.item(l).getTextContent());
892
                                        }
893
                                    }
894
                                    else if (facts.item(l).getNodeName().equals(prefix + "UnitOfMeasurement")) {
895
                                        path = facts.item(l).getNodeName();
896
                                        getHierarchie(facts.item(l));
897
                                        dataHolder.knownABCDelements.add(path);
898
                                        path = "";
899
                                        dataHolder.setGatheringDepthUnit(facts.item(l).getTextContent());
900
                                    }
901
                                }
902
                            }
903
                        }
904
                    }
905
                }
906
            }
907
        }
908
    }
909

    
910
    /**
911
     * getMultimedia: get the FileURI objects
912
     * @param root
913
     */
914
    protected void getMultimedia(Element root) {
915
        NodeList group, multimedias, multimedia, creators, creator, copyRightNodes, iprNodes, textNodes, licenceNodes, licences, copyrights;
916
        try {
917
            group = root.getElementsByTagName(prefix + "MultiMediaObjects");
918
            for (int i = 0; i < group.getLength(); i++) {
919
                multimedias = group.item(i).getChildNodes();
920

    
921
                for (int j = 0; j < multimedias.getLength(); j++) {
922
                    if (multimedias.item(j).getNodeName().equals(prefix + "MultiMediaObject")) {
923
                        multimedia = multimedias.item(j).getChildNodes();
924
                        Map<String,String> mediaObjectMap = new HashMap<String, String>();
925

    
926
                        String fileUri = extractMediaInformation(multimedia, mediaObjectMap);
927
                        if (fileUri != ""){
928
                            dataHolder.putMultiMediaObject(fileUri,mediaObjectMap);
929
                        }
930
                    }
931
                }
932
            }
933
        } catch (NullPointerException e) {
934
            logger.info(e);
935

    
936
            e.printStackTrace();
937
        }
938
    }
939

    
940

    
941
    /**
942
     * @param multimedia
943
     * @param mediaObjectMap
944
     * @param fileUri
945
     * @return
946
     */
947
    private String extractMediaInformation(NodeList multimedia, Map<String, String> mediaObjectMap) {
948
        NodeList creators;
949
        NodeList copyRightNodes;
950
        NodeList iprNodes;
951
        NodeList licenceNodes;
952
        NodeList license;
953
        NodeList copyrights;
954

    
955
        String fileUri = "";
956
        for (int k = 0; k < multimedia.getLength(); k++) {
957
            if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "fileURI")) {
958
                fileUri = multimedia.item(k).getTextContent();
959
                mediaObjectMap.put("fileUri", fileUri);
960
                path = multimedia.item(k).getNodeName();
961
                getHierarchie(multimedia.item(k));
962
                dataHolder.knownABCDelements.add(path);
963
                path = "";
964
            } else if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "context")) {
965
                mediaObjectMap.put("Context", multimedia.item(k).getTextContent());
966
            } else if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "createDate")) {
967
                mediaObjectMap.put("CreateDate", multimedia.item(k).getTextContent());
968
            }else if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "Creators")){
969
                String creatorString = "";
970
                creators = multimedia.item(k).getChildNodes();
971
                for (int l = 0; l < creators.getLength(); l++) {
972

    
973
                    if (creators.item(l).getNodeName().equalsIgnoreCase(prefix + "Creator")){
974
                        if (creatorString != ""){
975
                            creatorString += ", ";
976
                        }
977
                       creatorString += creators.item(l).getTextContent();
978
                    }
979
                }
980
                mediaObjectMap.put("Creators",creatorString);
981
            } else if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "Creator")){
982
                mediaObjectMap.put("Creators",multimedia.item(k).getTextContent());
983
            } else if (multimedia.item(k).getNodeName().equals("CreatedDate")){
984
                mediaObjectMap.put("CreatedDate",multimedia.item(k).getTextContent());
985
            } else if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "comment")){
986
                mediaObjectMap.put("Comment",multimedia.item(k).getTextContent());
987
            } else if (multimedia.item(k).getNodeName().equalsIgnoreCase(prefix + "IPR")){
988
                String copyRightString = "";
989
                iprNodes = multimedia.item(k).getChildNodes();
990
                for (int l = 0; l < iprNodes.getLength(); l++) {
991
                    if (iprNodes.item(l).getNodeName().equalsIgnoreCase(prefix + "Copyrights")){
992
                        copyRightNodes = iprNodes.item(l).getChildNodes();
993
                        for (int m = 0; m < copyRightNodes.getLength(); m++) {
994
                            if (copyRightNodes.item(m).getNodeName().equalsIgnoreCase(prefix + "Copyright")){
995
                                copyrights = copyRightNodes.item(m).getChildNodes();
996
                                for (int n = 0; n < copyrights.getLength(); n++){
997
                                    if (copyrights.item(n).getNodeName().equalsIgnoreCase(prefix + "text")){
998
                                        mediaObjectMap.put("Copyright", copyrights.item(n).getTextContent());
999
                                    }
1000
                                }
1001
                            }
1002
                        }
1003
                    } else if (iprNodes.item(l).getNodeName().equalsIgnoreCase(prefix + "Licenses")){
1004
                        licenceNodes = iprNodes.item(l).getChildNodes();
1005
                        for (int m = 0; m < licenceNodes.getLength(); m++) {
1006
                            if (licenceNodes.item(m).getNodeName().equalsIgnoreCase(prefix + "License")){
1007
                                license = licenceNodes.item(m).getChildNodes();
1008
                                for (int n = 0; n < license.getLength(); n++){
1009
                                    if (license.item(n).getNodeName().equalsIgnoreCase(prefix + "Text")){
1010
                                        mediaObjectMap.put("License", license.item(n).getTextContent());
1011
                                    }else{
1012
                                        Node node = license.item(n);
1013
                                        NodeList children = node.getChildNodes();
1014
                                        for (int o = 0; o < children.getLength(); o++){
1015
                                            if (children.item(o).getNodeName().equalsIgnoreCase(prefix + "Text")){
1016
                                                mediaObjectMap.put("License", children.item(n).getTextContent());
1017
                                            }
1018

    
1019
                                        }
1020
                                    }
1021
                                }
1022
                            }
1023
                        }
1024
                    }else{
1025
                        //System.err.println(iprNodes.item(l).getNodeName());
1026
                    }
1027

    
1028
                }
1029

    
1030
            } else{
1031
               // System.err.println(multimedia.item(k).getNodeName());
1032
            }
1033

    
1034
        }
1035
        return fileUri;
1036
    }
1037

    
1038
    protected void getAssociatedUnitIds(Element root) {
1039
        NodeList associations, childrenAssociations, childrenUnitAssociations;
1040
        try {
1041
            associations = root.getElementsByTagName(prefix + "Associations");
1042
            for (int i = 0; i < associations.getLength(); i++) {
1043
                childrenAssociations = associations.item(i).getChildNodes();
1044
                for (int j = 0; j < childrenAssociations.getLength(); j++) {
1045
                    if (childrenAssociations.item(j).getNodeName().equals(prefix + "UnitAssociation")) {
1046
                        childrenUnitAssociations = childrenAssociations.item(j).getChildNodes();
1047
                        String[] associatedUnitId = new String[2];
1048
                        for (int k = 0; k < childrenUnitAssociations.getLength(); k++) {
1049
                            if (childrenUnitAssociations.item(k).getNodeName().equals(prefix + "UnitID")) {
1050
                                associatedUnitId[0]= childrenUnitAssociations.item(k).getTextContent();
1051

    
1052
                                path = childrenUnitAssociations.item(k).getNodeName();
1053
                                getHierarchie(childrenUnitAssociations.item(k));
1054
                                dataHolder.knownABCDelements.add(path);
1055
                                path = "";
1056
                            }
1057
                            if (childrenUnitAssociations.item(k).getNodeName().equals(prefix +"DatasetAccessPoint")){
1058
                                associatedUnitId[1]= childrenUnitAssociations.item(k).getTextContent();
1059
                            }
1060
                        }
1061
                        dataHolder.addAssociatedUnitId(associatedUnitId);
1062
                    }
1063
                }
1064
            }
1065
        } catch (NullPointerException e) {
1066
            logger.info(e);
1067
        }
1068
    }
1069

    
1070
    protected void getUnitNotes(Element root) {
1071
        NodeList childNodes = root.getChildNodes();
1072
        for (int i = 0; i < childNodes.getLength(); i++) {
1073
            if(childNodes.item(i).getNodeName().equals(prefix + "Notes")){
1074
                dataHolder.setUnitNotes(childNodes.item(i).getTextContent());
1075
                path = childNodes.item(i).getNodeName();
1076
                getHierarchie(childNodes.item(i));
1077
                dataHolder.knownABCDelements.add(path);
1078
                path = "";
1079
            }
1080
        }
1081
    }
1082

    
1083
    //Gathering/SiteCoordinateSets/SiteCoordinates/CoordinatesLatLong/SpatialDatum ../CoordinateErrorMethod
1084
    protected void getGatheringSpatialDatum(Element root) {
1085
        NodeList group = root.getElementsByTagName(prefix + "Gathering");
1086
        for (int i = 0; i < group.getLength(); i++) {
1087
            NodeList spatialDatum = ((Element) group.item(i)).getElementsByTagName(prefix + "SpatialDatum");
1088
            dataHolder.setGatheringSpatialDatum(AbcdParseUtility.parseFirstTextContent(spatialDatum));
1089
        }
1090
        for (int i = 0; i < group.getLength(); i++) {
1091
            NodeList coordinateMethod = ((Element) group.item(i)).getElementsByTagName(prefix + "CoordinateErrorMethod");
1092
            dataHolder.setGatheringCoordinateErrorMethod(AbcdParseUtility.parseFirstTextContent(coordinateMethod));
1093
        }
1094
    }
1095

    
1096
    protected void getGatheringElevation(Element root) {
1097
        try {
1098
            //check for freetext elevation
1099
            NodeList group = root.getElementsByTagName(prefix + "Gathering");
1100
            for (int i = 0; i < group.getLength(); i++) {
1101
                NodeList children = group.item(i).getChildNodes();
1102
                for (int j = 0; j < children.getLength(); j++) {
1103
                    if (children.item(j).getNodeName().equals(prefix + "Altitude")) {
1104
                        NodeList altitudes = children.item(j).getChildNodes();
1105
                        for (int k = 0; k < altitudes.getLength(); k++) {
1106
                            if (altitudes.item(k).getNodeName().equals(prefix + "MeasurementOrFactText")) {
1107
                                path = altitudes.item(k).getNodeName();
1108
                                getHierarchie(altitudes.item(k));
1109
                                dataHolder.knownABCDelements.add(path);
1110
                                path = "";
1111
                                dataHolder.setGatheringElevationText(altitudes.item(k).getTextContent());
1112
                            }
1113
                        }
1114
                    }
1115

    
1116
                }
1117
            }
1118

    
1119
        } catch (NullPointerException e) {
1120
            dataHolder.setGatheringElevationText(null);
1121
        }
1122

    
1123
        try{
1124
            //check for atomised elevation
1125
            if(dataHolder.getGatheringElevationText()==null){
1126
                NodeList group = root.getElementsByTagName(prefix + "Gathering");
1127
                for (int i = 0; i < group.getLength(); i++) {
1128
                    NodeList children = group.item(i).getChildNodes();
1129
                    for (int j = 0; j < children.getLength(); j++) {
1130
                        if (children.item(j).getNodeName().equals(prefix + "Altitude")) {
1131
                            NodeList altitudes = children.item(j).getChildNodes();
1132
                            for (int k = 0; k < altitudes.getLength(); k++) {
1133
                                if (altitudes.item(k).getNodeName().equals(prefix + "MeasurementOrFactAtomised")) {
1134
                                    NodeList facts = altitudes.item(k).getChildNodes();
1135
                                    for (int l = 0; l < facts.getLength(); l++) {
1136
                                        if (facts.item(l).getNodeName().equals(prefix + "LowerValue")) {
1137
                                            path = facts.item(l).getNodeName();
1138
                                            getHierarchie(facts.item(l));
1139
                                            dataHolder.knownABCDelements.add(path);
1140
                                            path = "";
1141
                                            dataHolder.setGatheringElevationMin(facts.item(l).getTextContent());
1142
                                        }
1143
                                        else if (facts.item(l).getNodeName().equals(prefix + "UpperValue")) {
1144
                                            path = facts.item(l).getNodeName();
1145
                                            getHierarchie(facts.item(l));
1146
                                            dataHolder.knownABCDelements.add(path);
1147
                                            path = "";
1148
                                            dataHolder.setGatheringElevationMax(facts.item(l).getTextContent());
1149
                                        }
1150
                                        else if (facts.item(l).getNodeName().equals(prefix + "UnitOfMeasurement")) {
1151
                                            path = facts.item(l).getNodeName();
1152
                                            getHierarchie(facts.item(l));
1153
                                            dataHolder.knownABCDelements.add(path);
1154
                                            path = "";
1155
                                            dataHolder.setGatheringElevationUnit(facts.item(l).getTextContent());
1156
                                        }
1157
                                    }
1158
                                }
1159
                            }
1160
                        }
1161
                    }
1162
                }
1163
            }
1164
        } catch (NullPointerException e) {
1165
            dataHolder.setGatheringElevationText(null);
1166
        }
1167
    }
1168

    
1169
    protected void getGatheringNotes(Element root) {
1170
        try {
1171
            NodeList group = root.getElementsByTagName(prefix + "Gathering");
1172
            for (int i = 0; i < group.getLength(); i++) {
1173
                NodeList children = group.item(i).getChildNodes();
1174
                for (int j = 0; j < children.getLength(); j++) {
1175
                    if (children.item(j).getNodeName().equals(prefix + "Notes")) {
1176
                        path = children.item(j).getNodeName();
1177
                        getHierarchie(children.item(j));
1178
                        dataHolder.knownABCDelements.add(path);
1179
                        path = "";
1180
                        dataHolder.setGatheringNotes(children.item(j).getTextContent());
1181
                    }
1182
                }
1183
            }
1184

    
1185

    
1186
        } catch (NullPointerException e) {
1187
            dataHolder.setGatheringElevationText(null);
1188
        }
1189

    
1190
    }
1191

    
1192
    protected void getGatheringDate(Element root) {
1193
        try {
1194
            NodeList group = root.getElementsByTagName(prefix + "Gathering");
1195
            for (int i = 0; i < group.getLength(); i++) {
1196
                NodeList children = group.item(i).getChildNodes();
1197
                for (int j = 0; j < children.getLength(); j++) {
1198
                    if (children.item(j).getNodeName().equals(prefix + "DateTime")) {
1199
                        NodeList dateTimes = children.item(j).getChildNodes();
1200
                        for (int k = 0; k < dateTimes.getLength(); k++) {
1201
                            if (dateTimes.item(k).getNodeName().equals(prefix + "ISODateTimeBegin")) {
1202
                                path = dateTimes.item(k).getNodeName();
1203
                                getHierarchie(dateTimes.item(k));
1204
                                dataHolder.knownABCDelements.add(path);
1205
                                path = "";
1206
                                dataHolder.setGatheringDateText(dateTimes.item(k).getTextContent());
1207
                            }
1208
                        }
1209

    
1210
                        for (int k = 0; k < dateTimes.getLength(); k++) {
1211
                            if (dateTimes.item(k).getNodeName().equals(prefix + "DateText")) {
1212
                                path = dateTimes.item(k).getNodeName();
1213
                                getHierarchie(dateTimes.item(k));
1214
                                dataHolder.knownABCDelements.add(path);
1215
                                path = "";
1216
                                dataHolder.setGatheringDateText(dateTimes.item(k).getTextContent());
1217
                            }
1218
                        }
1219
                    }
1220

    
1221
                }
1222
            }
1223

    
1224
        } catch (NullPointerException e) {
1225
            dataHolder.setGatheringDateText(null);
1226
        }
1227
    }
1228

    
1229
    protected void getGatheringMethod(Element root) {
1230
        try {
1231
            NodeList group = root.getElementsByTagName(prefix + "Gathering");
1232
            for (int i = 0; i < group.getLength(); i++) {
1233
                NodeList children = group.item(i).getChildNodes();
1234
                for (int j = 0; j < children.getLength(); j++) {
1235
                    if (children.item(j).getNodeName().equalsIgnoreCase(prefix + "Method")) {
1236
                        NodeList methods = children.item(j).getChildNodes();
1237
                        for (int k = 0; k < methods.getLength(); k++) {
1238
                            dataHolder.setGatheringMethod(methods.item(k).getTextContent());
1239
                        }
1240
                    }
1241

    
1242
                }
1243
            }
1244

    
1245
        } catch (NullPointerException e) {
1246
            dataHolder.setGatheringDateText(null);
1247
        }
1248
    }
1249

    
1250

    
1251
    /**
1252
     * getGatheringPeople : get GatheringAgent with fullname
1253
     * @param root
1254
     */
1255
    protected void getGatheringPeople(Element root) {
1256
        try {
1257
            dataHolder.gatheringAgentsText = "";
1258
            dataHolder.gatheringAgentsList = new ArrayList<String>();
1259

    
1260
            NodeList group = root.getElementsByTagName(prefix + "GatheringAgent");
1261
            for (int i = 0; i < group.getLength(); i++) {
1262
                NodeList children = group.item(i).getChildNodes();
1263
                for (int j = 0; j < children.getLength(); j++) {
1264
                    if (children.item(j).getNodeName().equals(prefix + "Person")) {
1265
                        NodeList persons = children.item(j).getChildNodes();
1266
                        for (int k = 0; k < persons.getLength(); k++) {
1267
                            if (persons.item(k).getNodeName().equals(prefix + "FullName")) {
1268
                                path = persons.item(k).getNodeName();
1269
                                getHierarchie(persons.item(k));
1270
                                dataHolder.knownABCDelements.add(path);
1271
                                path = "";
1272
                                if (!persons.item(k).getTextContent().trim().equalsIgnoreCase("none")) {
1273

    
1274
                                    dataHolder.gatheringAgentsList.add(persons.item(k).getTextContent());
1275
                                }
1276
                            }
1277
                        }
1278
                    }
1279

    
1280
                    if (children.item(j).getNodeName().equals(prefix + "AgentText")){
1281
                        if (!children.item(j).getTextContent().trim().equalsIgnoreCase("none")) {
1282
                            dataHolder.gatheringAgentsText=children.item(j).getTextContent();
1283
                        }
1284

    
1285

    
1286
                    }
1287

    
1288
                }
1289
            }
1290

    
1291
            group = root.getElementsByTagName(prefix + "Gathering");
1292
            for (int i = 0; i < group.getLength(); i++) {
1293
                NodeList children = group.item(i).getChildNodes();
1294
                for (int j = 0; j < children.getLength(); j++) {
1295
                    if (children.item(j).getNodeName().equals(prefix + "Agents")) {
1296
                        NodeList persons = children.item(j).getChildNodes();
1297
                        for (int k = 0; k < persons.getLength(); k++) {
1298
                            if (persons.item(k).getNodeName().equals(prefix + "GatheringAgentsText") ) {
1299
                                path = persons.item(k).getNodeName();
1300
                                getHierarchie(persons.item(k));
1301
                                dataHolder.knownABCDelements.add(path);
1302
                                path = "";
1303
                                if (!persons.item(k).getTextContent().trim().equalsIgnoreCase("none")) {
1304
                                    dataHolder.gatheringAgentsText=persons.item(k).getTextContent();
1305
                                }
1306
                            }
1307

    
1308

    
1309

    
1310
                        }
1311
                    }
1312

    
1313
                }
1314
            }
1315

    
1316
        } catch (NullPointerException e) {
1317
            if (StringUtils.isBlank(dataHolder.gatheringAgentsText) &&  dataHolder.gatheringAgentsList == null){
1318
                dataHolder.gatheringAgentsText = "";
1319
                dataHolder.gatheringAgentsList = new ArrayList<String>();
1320
            }
1321
       }
1322

    
1323
    }
1324

    
1325
    /*PARSING METHODS*/
1326

    
1327
    private HashMap<String, String> getAtomisedNames(String code,NodeList atomised) {
1328
        if (DEBUG) {
1329
            logger.info("code getatomised " + code);
1330
        }
1331
        if (code.indexOf("Botanical") != -1) {
1332
            return this.getAtomisedBotanical(atomised);
1333
        }
1334
        if (code.indexOf("Bacterial") != -1) {
1335
            return this.getAtomisedBacterial(atomised);
1336
        }
1337
        if (code.indexOf("Viral") != -1) {
1338
            return this.getAtomisedViral(atomised);
1339
        }
1340
        if (code.indexOf("Zoological") != -1) {
1341
            return this.getAtomisedZoological(atomised);
1342
        }
1343
        return new HashMap<String, String>();
1344
    }
1345

    
1346
    private HashMap<String, String> getAtomisedZoological(NodeList atomised) {
1347
        if(DEBUG) {
1348
            logger.info("getAtomisedZoo");
1349
        }
1350
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
1351

    
1352
        for (int i = 0; i < atomised.getLength(); i++) {
1353
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
1354
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
1355
                path = atomised.item(i).getNodeName();
1356
                getHierarchie(atomised.item(i));
1357
                dataHolder.knownABCDelements.add(path);
1358
                path = "";
1359
            }
1360
            else if (atomised.item(i).getNodeName().equals(prefix + "Subgenus")) {
1361
                atomisedMap.put("Subgenus", atomised.item(i).getTextContent());
1362
                path = atomised.item(i).getNodeName();
1363
                getHierarchie(atomised.item(i));
1364
                dataHolder.knownABCDelements.add(path);
1365
                path = "";
1366
            }
1367
            else if (atomised.item(i).getNodeName().equals(prefix + "SpeciesEpithet")) {
1368
                atomisedMap.put("SpeciesEpithet", atomised.item(i).getTextContent());
1369
                path = atomised.item(i).getNodeName();
1370
                getHierarchie(atomised.item(i));
1371
                dataHolder.knownABCDelements.add(path);
1372
                path = "";
1373
            }
1374
            else if (atomised.item(i).getNodeName().equals(prefix + "SubspeciesEpithet")) {
1375
                atomisedMap.put("SubspeciesEpithet", atomised.item(i).getTextContent());
1376
                path = atomised.item(i).getNodeName();
1377
                getHierarchie(atomised.item(i));
1378
                dataHolder.knownABCDelements.add(path);
1379
                path = "";
1380
            }
1381
            else if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeamOriginalAndYear")) {
1382
                atomisedMap.put("AuthorTeamOriginalAndYear", atomised.item(i).getTextContent());
1383
                path = atomised.item(i).getNodeName();
1384
                getHierarchie(atomised.item(i));
1385
                dataHolder.knownABCDelements.add(path);
1386
                path = "";
1387
            }
1388
            else if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeamParenthesisAndYear")) {
1389
                atomisedMap.put("AuthorTeamParenthesisAndYear", atomised.item(i).getTextContent());
1390
                path = atomised.item(i).getNodeName();
1391
                getHierarchie(atomised.item(i));
1392
                dataHolder.knownABCDelements.add(path);
1393
                path = "";
1394
            }
1395
            else if (atomised.item(i).getNodeName().equals(prefix + "CombinationAuthorTeamAndYear")) {
1396
                atomisedMap.put("CombinationAuthorTeamAndYear", atomised.item(i).getTextContent());
1397
                path = atomised.item(i).getNodeName();
1398
                getHierarchie(atomised.item(i));
1399
                dataHolder.knownABCDelements.add(path);
1400
                path = "";
1401
            }
1402
            else if (atomised.item(i).getNodeName().equals(prefix + "Breed")) {
1403
                atomisedMap.put("Breed", atomised.item(i).getTextContent());
1404
                path = atomised.item(i).getNodeName();
1405
                getHierarchie(atomised.item(i));
1406
                dataHolder.knownABCDelements.add(path);
1407
                path = "";
1408
            }
1409
            else if (atomised.item(i).getNodeName().equals(prefix + "NamedIndividual")) {
1410
                atomisedMap.put("NamedIndividual", atomised.item(i).getTextContent());
1411
                path = atomised.item(i).getNodeName();
1412
                getHierarchie(atomised.item(i));
1413
                dataHolder.knownABCDelements.add(path);
1414
                path = "";
1415
            }
1416
        }
1417
        return atomisedMap;
1418
    }
1419

    
1420
    private HashMap<String, String> getAtomisedViral(NodeList atomised) {
1421
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
1422
        for (int i = 0; i < atomised.getLength(); i++) {
1423
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
1424
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
1425
                path = atomised.item(i).getNodeName();
1426
                getHierarchie(atomised.item(i));
1427
                dataHolder.knownABCDelements.add(path);
1428
                path = "";
1429
            }
1430
            if (atomised.item(i).getNodeName().equals(prefix + "ViralSpeciesDesignation")) {
1431
                atomisedMap.put("ViralSpeciesDesignation", atomised.item(i).getTextContent());
1432
                path = atomised.item(i).getNodeName();
1433
                getHierarchie(atomised.item(i));
1434
                dataHolder.knownABCDelements.add(path);
1435
                path = "";
1436
            }
1437
            if (atomised.item(i).getNodeName().equals(prefix + "Acronym")) {
1438
                atomisedMap.put("Acronym", atomised.item(i).getTextContent());
1439
                path = atomised.item(i).getNodeName();
1440
                getHierarchie(atomised.item(i));
1441
                dataHolder.knownABCDelements.add(path);
1442
                path = "";
1443
            }
1444
        }
1445
        return atomisedMap;
1446
    }
1447

    
1448
    private HashMap<String, String> getAtomisedBotanical(NodeList atomised) {
1449
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
1450
        for (int i = 0; i < atomised.getLength(); i++) {
1451
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
1452
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
1453
                path = atomised.item(i).getNodeName();
1454
                getHierarchie(atomised.item(i));
1455
                dataHolder.knownABCDelements.add(path);
1456
                path = "";
1457
            }
1458
            if (atomised.item(i).getNodeName().equals(prefix + "FirstEpithet")) {
1459
                atomisedMap.put("FirstEpithet", atomised.item(i).getTextContent());
1460
                path = atomised.item(i).getNodeName();
1461
                getHierarchie(atomised.item(i));
1462
                dataHolder.knownABCDelements.add(path);
1463
                path = "";
1464
            }
1465
            if (atomised.item(i).getNodeName()
1466
                    .equals(prefix + "InfraspecificEpithet")) {
1467
                atomisedMap.put("InfraSpeEpithet", atomised.item(i).getTextContent());
1468
                path = atomised.item(i).getNodeName();
1469
                getHierarchie(atomised.item(i));
1470
                dataHolder.knownABCDelements.add(path);
1471
                path = "";
1472
            }
1473
            if (atomised.item(i).getNodeName().equals(prefix + "Rank")) {
1474
                atomisedMap.put("Rank", atomised.item(i).getTextContent());
1475
                path = atomised.item(i).getNodeName();
1476
                getHierarchie(atomised.item(i));
1477
                dataHolder.knownABCDelements.add(path);
1478
                path = "";
1479
            }
1480
            if (atomised.item(i).getNodeName().equals(prefix + "HybridFlag")) {
1481
                atomisedMap.put("HybridFlag", atomised.item(i).getTextContent());
1482
                path = atomised.item(i).getNodeName();
1483
                getHierarchie(atomised.item(i));
1484
                dataHolder.knownABCDelements.add(path);
1485
                path = "";
1486
            }
1487
            if (atomised.item(i).getNodeName()
1488
                    .equals(prefix + "AuthorTeamParenthesis")) {
1489
                atomisedMap.put("AuthorTeamParenthesis", atomised.item(i).getTextContent());
1490
                path = atomised.item(i).getNodeName();
1491
                getHierarchie(atomised.item(i));
1492
                dataHolder.knownABCDelements.add(path);
1493
                path = "";
1494
            }
1495
            if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeam")) {
1496
                atomisedMap.put("AuthorTeam", atomised.item(i).getTextContent());
1497
                path = atomised.item(i).getNodeName();
1498
                getHierarchie(atomised.item(i));
1499
                dataHolder.knownABCDelements.add(path);
1500
                path = "";
1501
            }
1502
            if (atomised.item(i).getNodeName().equals(prefix + "CultivarGroupName")) {
1503
                atomisedMap.put("CultivarGroupName", atomised.item(i).getTextContent());
1504
                path = atomised.item(i).getNodeName();
1505
                getHierarchie(atomised.item(i));
1506
                dataHolder.knownABCDelements.add(path);
1507
                path = "";
1508
            }
1509
            if (atomised.item(i).getNodeName().equals(prefix + "CultivarName")) {
1510
                atomisedMap.put("CultivarName", atomised.item(i).getTextContent());
1511
                path = atomised.item(i).getNodeName();
1512
                getHierarchie(atomised.item(i));
1513
                dataHolder.knownABCDelements.add(path);
1514
                path = "";
1515
            }
1516
            if (atomised.item(i).getNodeName().equals(prefix + "TradeDesignationNames")) {
1517
                atomisedMap.put("Trade", atomised.item(i).getTextContent());
1518
                path = atomised.item(i).getNodeName();
1519
                getHierarchie(atomised.item(i));
1520
                dataHolder.knownABCDelements.add(path);
1521
                path = "";
1522
            }
1523
        }
1524
        return atomisedMap;
1525
    }
1526

    
1527
    private HashMap<String, String> getAtomisedBacterial(NodeList atomised) {
1528
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
1529
        for (int i = 0; i < atomised.getLength(); i++) {
1530
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
1531
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
1532
                path = atomised.item(i).getNodeName();
1533
                getHierarchie(atomised.item(i));
1534
                dataHolder.knownABCDelements.add(path);
1535
                path = "";
1536
            }
1537
            if (atomised.item(i).getNodeName().equals(prefix + "Subgenus")) {
1538
                atomisedMap.put("SubGenus", atomised.item(i).getTextContent());
1539
                path = atomised.item(i).getNodeName();
1540
                getHierarchie(atomised.item(i));
1541
                dataHolder.knownABCDelements.add(path);
1542
                path = "";
1543
            }
1544
            if (atomised.item(i).getNodeName().equals(prefix + "SubgenusAuthorAndYear")) {
1545
                atomisedMap.put("SubgenusAuthorAndYear", atomised.item(i).getTextContent());
1546
                path = atomised.item(i).getNodeName();
1547
                getHierarchie(atomised.item(i));
1548
                dataHolder.knownABCDelements.add(path);
1549
                path = "";
1550
            }
1551
            if (atomised.item(i).getNodeName().equals(prefix + "SpeciesEpithet")) {
1552
                atomisedMap.put("SpeciesEpithet", atomised.item(i).getTextContent());
1553
                path = atomised.item(i).getNodeName();
1554
                getHierarchie(atomised.item(i));
1555
                dataHolder.knownABCDelements.add(path);
1556
                path = "";
1557
            }
1558
            if (atomised.item(i).getNodeName().equals(prefix + "SubspeciesEpithet")) {
1559
                atomisedMap.put("SubspeciesEpithet", atomised.item(i).getTextContent());
1560
                path = atomised.item(i).getNodeName();
1561
                getHierarchie(atomised.item(i));
1562
                dataHolder.knownABCDelements.add(path);
1563
                path = "";
1564
            }
1565
            if (atomised.item(i).getNodeName().equals(prefix + "ParentheticalAuthorTeamAndYear")) {
1566
                atomisedMap.put("ParentheticalAuthorTeamAndYear", atomised.item(i).getTextContent());
1567
                path = atomised.item(i).getNodeName();
1568
                getHierarchie(atomised.item(i));
1569
                dataHolder.knownABCDelements.add(path);
1570
                path = "";
1571
            }
1572
            if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeamAndYear")) {
1573
                atomisedMap.put("AuthorTeamAndYear", atomised.item(i).getTextContent());
1574
                path = atomised.item(i).getNodeName();
1575
                getHierarchie(atomised.item(i));
1576
                dataHolder.knownABCDelements.add(path);
1577
                path = "";
1578
            }
1579
            if (atomised.item(i).getNodeName().equals(prefix + "NameApprobation")) {
1580
                atomisedMap.put("NameApprobation", atomised.item(i).getTextContent());
1581
                path = atomised.item(i).getNodeName();
1582
                getHierarchie(atomised.item(i));
1583
                dataHolder.knownABCDelements.add(path);
1584
                path = "";
1585
            }
1586
        }
1587
        return atomisedMap;
1588
    }
1589

    
1590

    
1591
    /**
1592
     * @param root
1593
     */
1594
    public void getGatheringImages(Element root) {
1595
        NodeList group, multimedias, multimedia, creators, creator;
1596
        try {
1597
            group = root.getElementsByTagName(prefix + "SiteImages");
1598
            for (int i = 0; i < group.getLength(); i++) {
1599
                multimedias = group.item(i).getChildNodes();
1600
                for (int j = 0; j < multimedias.getLength(); j++) {
1601
                    if (multimedias.item(j).getNodeName().equals(prefix + "SiteImage")) {
1602
                        multimedia = multimedias.item(j).getChildNodes();
1603
                        Map<String,String> mediaObjectMap = new HashMap<String, String>();
1604
                        String fileUri = extractMediaInformation(multimedia, mediaObjectMap);
1605

    
1606
                        if (fileUri != ""){
1607
                            dataHolder.putGatheringMultiMediaObject(fileUri,mediaObjectMap);
1608
                        }
1609
                    }
1610
                }
1611
            }
1612
        } catch (NullPointerException e) {
1613
            logger.info(e);
1614
        }
1615

    
1616
    }
1617

    
1618
}
(6-6/15)