Project

General

Profile

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

    
3
import java.util.ArrayList;
4
import java.util.HashMap;
5

    
6
import org.apache.log4j.Logger;
7
import org.w3c.dom.Element;
8
import org.w3c.dom.Node;
9
import org.w3c.dom.NodeList;
10

    
11
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
12

    
13
public class Abcd206XMLFieldGetter {
14

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

    
21
    public Abcd206XMLFieldGetter(Abcd206DataHolder dataholder, String prefix){
22
        this.dataHolder = dataholder;
23
        this.prefix = prefix;
24
    }
25

    
26

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

    
80
    /**
81
     * getScientificNames : get the list of scientific names (preferred and non preferred)
82
     * @param group
83
     */
84
    protected void getScientificNames(NodeList group) {
85
        NodeList identifications, results;
86
        String tmpName = null;
87

    
88
        for (int j = 0; j < group.getLength(); j++) {
89
            if (group.item(j).getNodeName().equals(prefix + "Identification")) {
90
                identifications = group.item(j).getChildNodes();
91
                for (int m = 0; m < identifications.getLength(); m++) {
92
                    if (identifications.item(m).getNodeName()
93
                            .equals(prefix + "Result")) {
94
                        results = identifications.item(m).getChildNodes();
95
                        for (int k = 0; k < results.getLength(); k++) {
96
                            if (results.item(k).getNodeName().equals(prefix + "TaxonIdentified")) {
97
                                tmpName = this.getScientificName(results.item(k));
98
                                // logger.info("TMP NAME " + tmpName);dataHolder.identificationList.add(tmpName);nameFound = true;
99
                            }
100
                        }
101
                    } else if (identifications.item(m).getNodeName().equals(prefix + "PreferredFlag")) {
102
                        if (dataHolder.nomenclatureCode != null&& dataHolder.nomenclatureCode != "") {
103
                            // logger.info("TMP NAME P" + tmpName);
104

    
105
                            dataHolder.identificationList.add(new Identification(tmpName, identifications.item(m).getTextContent(), dataHolder.nomenclatureCode));
106
                        } else {
107
                            dataHolder.identificationList.add(new Identification(tmpName, identifications.item(m).getTextContent()));
108
                        }
109
                        path = identifications.item(m).getNodeName();
110
                        // getHierarchie(identifications.item(m));
111
                        dataHolder.knownABCDelements.add(path);
112
                        path = "";
113
                    } else if (identifications.item(m).getNodeName().equals(prefix + "References")) {
114
                        this.getReferences(identifications.item(m));
115
                    }
116
                }
117
            }
118
        }
119
        boolean hasPref = false;
120
        for (int j = 0; j < group.getLength(); j++) {
121
            if (group.item(j).getNodeName().equals(prefix + "Identification")) {
122
                dataHolder.nomenclatureCode = "";
123
                identifications = group.item(j).getChildNodes();
124
                for (int m = 0; m < identifications.getLength(); m++) {
125
                    if (identifications.item(m).getNodeName().equals(prefix + "Result")) {
126
                        results = identifications.item(m).getChildNodes();
127
                        for (int k = 0; k < results.getLength(); k++) {
128
                            if (results.item(k).getNodeName().equals(prefix + "TaxonIdentified")) {
129
                                tmpName = this.getScientificName(results.item(k));
130
                            }
131
                        }
132
                    }
133
                    if (identifications.item(m).getNodeName()
134
                            .equals(prefix + "PreferredFlag")) {
135
                        hasPref = true;
136
                    }
137
                }
138
                if (!hasPref && tmpName != null) {
139
                    if (dataHolder.nomenclatureCode != null
140
                            && dataHolder.nomenclatureCode != "") {
141
                        dataHolder.identificationList.add(new Identification(tmpName, "0", dataHolder.nomenclatureCode));
142
                    } else {
143
                        dataHolder.identificationList.add(new Identification(tmpName, "0"));
144
                    }
145
                }
146
            }
147
        }
148
    }
149

    
150
    /**
151
     * getScientificName : get the list of scientific names
152
     * @param result
153
     * @return
154
     */
155
    private String getScientificName(Node result) {
156
        // logger.info("IN getScientificName " + dataHolder.nomenclatureCode);
157
        NodeList taxonsIdentified, scnames, atomised;
158
        String tmpName = "";
159
        taxonsIdentified = result.getChildNodes();
160
        for (int l = 0; l < taxonsIdentified.getLength(); l++) {
161

    
162
            if (taxonsIdentified.item(l).getNodeName().equals(prefix + "ScientificName")) {
163
                scnames = taxonsIdentified.item(l).getChildNodes();
164
                for (int n = 0; n < scnames.getLength(); n++) {
165

    
166
                    if (scnames.item(n).getNodeName().equals(prefix + "FullScientificNameString")) {
167
                        path = scnames.item(n).getNodeName();
168
                        tmpName = scnames.item(n).getTextContent();
169
                        getHierarchie(scnames.item(n));
170
                        dataHolder.knownABCDelements.add(path);
171
                        path = "";
172
                    }
173
                    else if (scnames.item(n).getNodeName().equals(prefix + "NameAtomised")) {
174
                        try {
175
                            if (scnames.item(n).hasChildNodes()) {
176
                                String tmp = scnames.item(n).getChildNodes().item(1).getNodeName();
177
                                if (tmp.indexOf(prefix) != -1&& prefix.length() > 0) {
178
                                    dataHolder.nomenclatureCode = tmp.split(prefix)[1];
179
                                }
180
                                else {
181
                                    dataHolder.nomenclatureCode = scnames.item(n).getChildNodes().item(1).getNodeName();
182
                                }
183
                            }
184
                        } catch (Exception e) {
185
                            if(DEBUG) {
186
                                logger.warn("PB nomenclaturecode");
187
                            }
188
                            dataHolder.nomenclatureCode = "";
189
                        }
190
                        atomised = scnames.item(n).getChildNodes().item(1).getChildNodes();
191
                        dataHolder.atomisedIdentificationList.add(this.getAtomisedNames(dataHolder.nomenclatureCode,atomised));
192
                    }
193
                }
194
            }
195
        }
196
        return tmpName;
197
    }
198

    
199
    /**
200
     * getRerences : get the reference and citations
201
     * @param result
202
     * @return
203
     */
204
    protected boolean getReferences(Node result) {
205
        // logger.info("GET REFERENCE");
206
        NodeList results, reference;
207
        results = result.getChildNodes();
208
        boolean referencefound = false;
209
        String[] refDetails =new String[3];;
210
        for (int k = 0; k < results.getLength(); k++) {
211
            if (results.item(k).getNodeName().equals(prefix + "SourceReference")) {
212
                reference = results.item(k).getChildNodes();
213
                for (int l = 0; l < reference.getLength(); l++) {
214
                    if (reference.item(l).getNodeName().equals(prefix + "TitleCitation")) {
215
                        path = reference.item(l).getNodeName();
216
                        refDetails[0]=reference.item(l).getTextContent();
217
                        getHierarchie(reference.item(l));
218
                        dataHolder.knownABCDelements.add(path);
219
                        path = "";
220
                        referencefound = true;
221
                    }
222
                    if (reference.item(l).getNodeName().equals(prefix + "CitationDetail")) {
223
                        path = reference.item(l).getNodeName();
224
                        refDetails[1]=reference.item(l).getTextContent();
225
                        getHierarchie(reference.item(l));
226
                        dataHolder.knownABCDelements.add(path);
227
                        path = "";
228
                        referencefound = true;
229
                    }
230
                    if (reference.item(l).getNodeName().equals(prefix + "URI")) {
231
                        path = reference.item(l).getNodeName();
232
                        refDetails[2]=reference.item(l).getTextContent();
233
                        getHierarchie(reference.item(l));
234
                        dataHolder.knownABCDelements.add(path);
235
                        path = "";
236
                        referencefound = true;
237
                    }
238
                }
239
                if (refDetails!=null){
240
                    for (int i=0;i<3;i++) {
241
                        if (refDetails[i]==null) {
242
                            refDetails[i]="";
243
                        }
244
                    }
245
                    dataHolder.referenceList.add(refDetails);
246
                    refDetails =new String[3];
247
                }
248
            }
249
        }
250
        return referencefound;
251
    }
252

    
253
    /**
254
     * Traverses the tree for compareABCDtoCDM
255
     *
256
     * @param node
257
     * @param dataHolder
258
     */
259
    protected void traverse(Node node) {
260
        // Extract node info:
261
        String test = node.getTextContent();
262

    
263
        // Print and continue traversing.
264
        if (test != null && test != "#text" && node.getNodeName() != "#text"&& test.split("\n").length == 1 && test.length() > 0) {
265
            path = node.getNodeName();
266
            getHierarchie(node);
267
            dataHolder.allABCDelements.put(path, test);
268
            path = "";
269
        }
270
        // Now traverse the rest of the tree in depth-first order.
271
        if (node.hasChildNodes()) {
272
            // Get the children in a list.
273
            NodeList nl = node.getChildNodes();
274
            // How many of them?
275
            int size = nl.getLength();
276
            for (int i = 0; i < size; i++) {
277
                // Recursively traverse each of the children.
278
                traverse(nl.item(i));
279
            }
280
        }
281
    }
282

    
283

    
284

    
285
    /*
286
     * (non-Javadoc)
287
     *
288
     * @see eu.etaxonomy.cdm.io.common.mapping.IInputTransformer#
289
     * getSpecimenTypeDesignationStatusByKey(java.lang.String)
290
     */
291
    private SpecimenTypeDesignationStatus getSpecimenTypeDesignationStatusByKey(
292
            String key) {
293
        if (key == null) {
294
            return null;
295
        } else if (key.matches("(?i)(T|Type)")) {
296
            return SpecimenTypeDesignationStatus.TYPE();
297
        } else if (key.matches("(?i)(HT|Holotype)")) {
298
            return SpecimenTypeDesignationStatus.HOLOTYPE();
299
        } else if (key.matches("(?i)(LT|Lectotype)")) {
300
            return SpecimenTypeDesignationStatus.LECTOTYPE();
301
        } else if (key.matches("(?i)(NT|Neotype)")) {
302
            return SpecimenTypeDesignationStatus.NEOTYPE();
303
        } else if (key.matches("(?i)(ST|Syntype)")) {
304
            return SpecimenTypeDesignationStatus.SYNTYPE();
305
        } else if (key.matches("(?i)(ET|Epitype)")) {
306
            return SpecimenTypeDesignationStatus.EPITYPE();
307
        } else if (key.matches("(?i)(IT|Isotype)")) {
308
            return SpecimenTypeDesignationStatus.ISOTYPE();
309
        } else if (key.matches("(?i)(ILT|Isolectotype)")) {
310
            return SpecimenTypeDesignationStatus.ISOLECTOTYPE();
311
        } else if (key.matches("(?i)(INT|Isoneotype)")) {
312
            return SpecimenTypeDesignationStatus.ISONEOTYPE();
313
        } else if (key.matches("(?i)(IET|Isoepitype)")) {
314
            return SpecimenTypeDesignationStatus.ISOEPITYPE();
315
        } else if (key.matches("(?i)(PT|Paratype)")) {
316
            return SpecimenTypeDesignationStatus.PARATYPE();
317
        } else if (key.matches("(?i)(PLT|Paralectotype)")) {
318
            return SpecimenTypeDesignationStatus.PARALECTOTYPE();
319
        } else if (key.matches("(?i)(PNT|Paraneotype)")) {
320
            return SpecimenTypeDesignationStatus.PARANEOTYPE();
321
        } else if (key.matches("(?i)(unsp.|Unspecified)")) {
322
            return SpecimenTypeDesignationStatus.UNSPECIFIC();
323
        } else if (key.matches("(?i)(2LT|Second Step Lectotype)")) {
324
            return SpecimenTypeDesignationStatus.SECOND_STEP_LECTOTYPE();
325
        } else if (key.matches("(?i)(2NT|Second Step Neotype)")) {
326
            return SpecimenTypeDesignationStatus.SECOND_STEP_NEOTYPE();
327
        } else if (key.matches("(?i)(OM|Original Material)")) {
328
            return SpecimenTypeDesignationStatus.ORIGINAL_MATERIAL();
329
        } else if (key.matches("(?i)(IcT|Iconotype)")) {
330
            return SpecimenTypeDesignationStatus.ICONOTYPE();
331
        } else if (key.matches("(?i)(PT|Phototype)")) {
332
            return SpecimenTypeDesignationStatus.PHOTOTYPE();
333
        } else if (key.matches("(?i)(IST|Isosyntype)")) {
334
            return SpecimenTypeDesignationStatus.ISOSYNTYPE();
335
        } else {
336
            return null;
337
        }
338
    }
339

    
340
    /**
341
     * getHierarchie : get the whole path
342
     * @param node
343
     */
344
    private void getHierarchie(Node node) {
345
        // logger.info("getHierarchie");
346
        while (node != null && node.getNodeName() != prefix + "DataSets" && node.getParentNode() != null) {
347
            // logger.info("nodeparent "+node.getParentNode().getNodeName());
348
            path = node.getParentNode().getNodeName() + "/" + path;
349
            node = node.getParentNode();
350
        }
351
        // logger.info("path gethierarchie: "+path);
352
    }
353

    
354

    
355
    /**
356
     * getIDs : get the source institution id, source id...
357
     * @param root
358
     */
359
    protected void getIDs(Element root) {
360
        NodeList group;
361
        try {
362
            group = root.getElementsByTagName(prefix + "SourceInstitutionID");
363
            path = group.item(0).getNodeName();
364
            getHierarchie(group.item(0));
365
            dataHolder.knownABCDelements.add(path);
366
            path = "";
367
            dataHolder.institutionCode = group.item(0).getTextContent();
368
        } catch (NullPointerException e) {
369
            dataHolder.institutionCode = "";
370
        }
371
        try {
372
            group = root.getElementsByTagName(prefix + "SourceID");
373
            path = group.item(0).getNodeName();
374
            getHierarchie(group.item(0));
375
            dataHolder.knownABCDelements.add(path);
376
            path = "";
377
            dataHolder.collectionCode = group.item(0).getTextContent();
378
        } catch (NullPointerException e) {
379
            dataHolder.collectionCode = "";
380
        }
381
        try {
382
            group = root.getElementsByTagName(prefix + "UnitID");
383
            path = group.item(0).getNodeName();
384
            getHierarchie(group.item(0));
385
            dataHolder.knownABCDelements.add(path);
386
            path = "";
387
            dataHolder.unitID = group.item(0).getTextContent();
388
        } catch (NullPointerException e) {
389
            dataHolder.unitID = "";
390
        }
391
    }
392

    
393
    /**
394
     * getRecordBasis : extract the recordBasis out of the ABCD document
395
     * @param root
396
     */
397
    protected void getRecordBasis(Element root) {
398
        NodeList group;
399
        try {
400
            group = root.getElementsByTagName(prefix + "RecordBasis");
401
            path = group.item(0).getNodeName();
402
            getHierarchie(group.item(0));
403
            dataHolder.knownABCDelements.add(path);
404
            path = "";
405
            dataHolder.recordBasis = group.item(0).getTextContent();
406
        } catch (NullPointerException e) {
407
            dataHolder.recordBasis = "";
408
        }
409
    }
410

    
411
    protected void getKindOfUnit(Element root) {
412
        NodeList group;
413
        try {
414
            group = root.getElementsByTagName(prefix + "KindOfUnit");
415
            path = group.item(0).getNodeName();
416
            getHierarchie(group.item(0));
417
            dataHolder.knownABCDelements.add(path);
418
            path = "";
419
            dataHolder.kindOfUnit = group.item(0).getTextContent();
420
        } catch (NullPointerException e) {
421
            dataHolder.kindOfUnit = "";
422
        }
423
    }
424

    
425
    /**
426
     * getNumbers : getAccessionNumber, collector number ...
427
     * @param root
428
     */
429
    protected void getNumbers(Element root) {
430
        NodeList group;
431
        try {
432
            group = root.getElementsByTagName(prefix + "AccessionNumber");
433
            path = group.item(0).getNodeName();
434
            getHierarchie(group.item(0));
435
            dataHolder.knownABCDelements.add(path);
436
            path = "";
437
            dataHolder.accessionNumber = group.item(0).getTextContent();
438
        } catch (NullPointerException e) {
439
            dataHolder.accessionNumber = "";
440
        }
441
        try {
442
            group = root.getElementsByTagName(prefix + "CollectorsFieldNumber");
443
            path = group.item(0).getNodeName();
444
            getHierarchie(group.item(0));
445
            dataHolder.knownABCDelements.add(path);
446
            path = "";
447
            dataHolder.fieldNumber = group.item(0).getTextContent();
448
        } catch (NullPointerException e) {
449
            dataHolder.fieldNumber = "";
450
        }
451

    
452
        //try {
453
        //group = root.getElementsByTagName(prefix + "AccessionNumber");
454
        //path = group.item(0).getNodeName();
455
        //getHierarchie(group.item(0));
456
        //dataHolder.knownABCDelements.add(path);
457
        //path = "";
458
        //dataHolder.accessionNumber = group.item(0).getTextContent();
459
        //} catch (NullPointerException e) {
460
        //dataHolder.accessionNumber = "";
461
        //}
462
    }
463

    
464
    /**
465
     * getGeolocation : get locality
466
     * @param root
467
     * @param state
468
     */
469
    protected void getGeolocation(Element root, Abcd206ImportState state) {
470
        NodeList group, childs;
471
        try {
472
            group = root.getElementsByTagName(prefix + "LocalityText");
473
            path = group.item(0).getNodeName();
474
            getHierarchie(group.item(0));
475
            dataHolder.knownABCDelements.add(path);
476
            path = "";
477
            dataHolder.locality = group.item(0).getTextContent();
478
            if (group.item(0).hasAttributes()) {
479
                if (group.item(0).getAttributes().getNamedItem("lang") != null) {
480
                    dataHolder.languageIso = group.item(0).getAttributes().getNamedItem("lang").getTextContent();
481
                }
482
            }
483
        } catch (NullPointerException e) {
484
            dataHolder.locality = "";
485
        }
486
        try {
487
            group = root.getElementsByTagName(prefix + "LongitudeDecimal");
488
            path = group.item(0).getNodeName();
489
            getHierarchie(group.item(0));
490
            dataHolder.knownABCDelements.add(path);
491
            path = "";
492
            dataHolder.longitude = Double.valueOf(group.item(0).getTextContent());
493
        } catch (NullPointerException e) {
494
            dataHolder.longitude = null;
495
        }
496
        try {
497
            group = root.getElementsByTagName(prefix + "LatitudeDecimal");
498
            path = group.item(0).getNodeName();
499
            getHierarchie(group.item(0));
500
            dataHolder.knownABCDelements.add(path);
501
            path = "";
502
            dataHolder.latitude = Double.valueOf(group.item(0).getTextContent());
503
        } catch (NullPointerException e) {
504
            dataHolder.latitude = null;
505
        }
506
        try {
507
            group = root.getElementsByTagName(prefix + "Country");
508
            childs = group.item(0).getChildNodes();
509
            for (int i = 0; i < childs.getLength(); i++) {
510
                if (childs.item(i).getNodeName().contains("Name")) {
511
                    path = childs.item(i).getNodeName();
512
                    getHierarchie(childs.item(i));
513
                    dataHolder.knownABCDelements.add(path);
514
                    path = "";
515
                    dataHolder.country = childs.item(i).getTextContent();
516
                }
517
            }
518
        } catch (NullPointerException e) {
519
            dataHolder.country = "";
520
        }
521
        try {
522
            group = root.getElementsByTagName(prefix + "Country");
523
            childs = group.item(0).getChildNodes();
524
            for (int i = 0; i < childs.getLength(); i++) {
525
                if (childs.item(i).getNodeName().contains("ISO3166Code")) {
526
                    path = childs.item(i).getNodeName();
527
                    getHierarchie(childs.item(i));
528
                    dataHolder.knownABCDelements.add(path);
529
                    path = "";
530
                    dataHolder.isocountry = childs.item(i).getTextContent();
531
                }
532
            }
533
        } catch (NullPointerException e) {
534
            dataHolder.isocountry = "";
535
        }
536
        try {
537
            group = root.getElementsByTagName(prefix + "Altitude");
538
            for (int i = 0; i < group.getLength(); i++) {
539
                childs = group.item(i).getChildNodes();
540
                for (int j = 0; j < childs.getLength(); j++) {
541
                    if (childs.item(j).getNodeName().equals(prefix + "MeasurementOrFactText")) {
542
                        path = childs.item(j).getNodeName();
543
                        getHierarchie(childs.item(j));
544
                        dataHolder.knownABCDelements.add(path);
545
                        path = "";
546
                        dataHolder.altitude = Integer.valueOf(childs.item(j).getTextContent());
547
                    }
548
                }
549
            }
550
        } catch (NullPointerException e) {
551
            dataHolder.altitude = -9999;
552
        }
553

    
554
        try {
555
            group = root.getElementsByTagName(prefix + "Depth");
556
            path = group.item(0).getNodeName();
557
            getHierarchie(group.item(0));
558
            dataHolder.knownABCDelements.add(path);
559
            path = "";
560
            dataHolder.depth = Integer.valueOf(group.item(0).getTextContent());
561
        } catch (NullPointerException e) {
562
            dataHolder.depth = -9999;
563
        }
564

    
565
        try {
566
            group = root.getElementsByTagName(prefix + "NamedArea");
567
            dataHolder.namedAreaList = new HashMap<String, String>();
568
            for (int i = 0; i < group.getLength(); i++) {
569
                childs = group.item(i).getChildNodes();
570
                String currentArea = null;
571
                for (int j = 0; j < childs.getLength(); j++) {
572
                    if (childs.item(j).getNodeName() .equals(prefix + "AreaName")) {
573
                        path = childs.item(j).getNodeName();
574
                        getHierarchie(childs.item(j));
575
                        dataHolder.knownABCDelements.add(path);
576
                        path = "";
577
                        currentArea = childs.item(j).getTextContent();
578
                        dataHolder.namedAreaList.put(currentArea, null);
579
                    }
580
                }
581
                if(currentArea!=null){
582
                    for (int j = 0; j < childs.getLength(); j++) {
583
                        if (childs.item(j).getNodeName() .equals(prefix + "AreaClass")) {
584
                            path = childs.item(j).getNodeName();
585
                            getHierarchie(childs.item(j));
586
                            dataHolder.knownABCDelements.add(path);
587
                            path = "";
588
                            dataHolder.namedAreaList.put(currentArea, childs.item(j).getTextContent());
589
                        }
590
                    }
591
                }
592
            }
593
        } catch (NullPointerException e) {
594
            dataHolder.namedAreaList = new HashMap<String, String>();
595
        }
596

    
597
        if(state.getConfig().isRemoveCountryFromLocalityText()){
598
            if(dataHolder.locality.startsWith(dataHolder.country)){
599
                dataHolder.locality = dataHolder.locality.replaceFirst(dataHolder.country+"[\\W]", "");
600
            }
601
            for (String namedArea : ((HashMap<String, String>) dataHolder.namedAreaList).keySet()) {
602
                if(dataHolder.locality.startsWith(namedArea)){
603
                    dataHolder.locality = dataHolder.locality.replaceFirst(namedArea+"[\\W]", "");
604
                }
605
            }
606
        }
607
    }
608

    
609
    /**
610
     * getMultimedia: get the FileURI objects
611
     * @param root
612
     */
613
    protected void getMultimedia(Element root) {
614
        NodeList group, multimedias, multimedia;
615
        try {
616
            group = root.getElementsByTagName(prefix + "MultiMediaObjects");
617
            for (int i = 0; i < group.getLength(); i++) {
618
                multimedias = group.item(i).getChildNodes();
619
                for (int j = 0; j < multimedias.getLength(); j++) {
620
                    if (multimedias.item(j).getNodeName().equals(prefix + "MultiMediaObject")) {
621
                        multimedia = multimedias.item(j).getChildNodes();
622
                        for (int k = 0; k < multimedia.getLength(); k++) {
623
                            if (multimedia.item(k).getNodeName().equals(prefix + "FileURI")) {
624
                                dataHolder.multimediaObjects.add(multimedia.item(k).getTextContent());
625
                                path = multimedia.item(k).getNodeName();
626
                                getHierarchie(multimedia.item(k));
627
                                dataHolder.knownABCDelements.add(path);
628
                                path = "";
629
                            }
630
                        }
631
                    }
632
                }
633
            }
634
        } catch (NullPointerException e) {
635
            logger.info(e);
636
        }
637
    }
638

    
639
    protected void getAssociatedUnitIds(Element root) {
640
        NodeList associations, childrenAssociations, childrenUnitAssociations;
641
        try {
642
            associations = root.getElementsByTagName(prefix + "Associations");
643
            for (int i = 0; i < associations.getLength(); i++) {
644
                childrenAssociations = associations.item(i).getChildNodes();
645
                for (int j = 0; j < childrenAssociations.getLength(); j++) {
646
                    if (childrenAssociations.item(j).getNodeName().equals(prefix + "UnitAssociation")) {
647
                        childrenUnitAssociations = childrenAssociations.item(j).getChildNodes();
648
                        for (int k = 0; k < childrenUnitAssociations.getLength(); k++) {
649
                            if (childrenUnitAssociations.item(k).getNodeName().equals(prefix + "UnitID")) {
650
                                dataHolder.associatedUnitIds.add(childrenUnitAssociations.item(k).getTextContent());
651
                                path = childrenUnitAssociations.item(k).getNodeName();
652
                                getHierarchie(childrenUnitAssociations.item(k));
653
                                dataHolder.knownABCDelements.add(path);
654
                                path = "";
655
                            }
656
                        }
657
                    }
658
                }
659
            }
660
        } catch (NullPointerException e) {
661
            logger.info(e);
662
        }
663
    }
664

    
665
    protected void getGatheringElevation(Element root) {
666
        try {
667
            //check for freetext elevation
668
            NodeList group = root.getElementsByTagName(prefix + "Gathering");
669
            for (int i = 0; i < group.getLength(); i++) {
670
                NodeList children = group.item(i).getChildNodes();
671
                for (int j = 0; j < children.getLength(); j++) {
672
                    if (children.item(j).getNodeName().equals(prefix + "Altitude")) {
673
                        NodeList altitudes = children.item(j).getChildNodes();
674
                        for (int k = 0; k < altitudes.getLength(); k++) {
675
                            if (altitudes.item(k).getNodeName().equals(prefix + "MeasurementOrFactText")) {
676
                                path = altitudes.item(k).getNodeName();
677
                                getHierarchie(altitudes.item(k));
678
                                dataHolder.knownABCDelements.add(path);
679
                                path = "";
680
                                dataHolder.gatheringElevationText = altitudes.item(k).getTextContent();
681
                            }
682
                        }
683
                    }
684

    
685
                }
686
            }
687

    
688
        } catch (NullPointerException e) {
689
            dataHolder.gatheringElevationText = null;
690
        }
691

    
692
        try{
693
            //check for atomised elevation
694
            if(dataHolder.gatheringElevationText==null){
695
                NodeList group = root.getElementsByTagName(prefix + "Gathering");
696
                for (int i = 0; i < group.getLength(); i++) {
697
                    NodeList children = group.item(i).getChildNodes();
698
                    for (int j = 0; j < children.getLength(); j++) {
699
                        if (children.item(j).getNodeName().equals(prefix + "Altitude")) {
700
                            NodeList altitudes = children.item(j).getChildNodes();
701
                            for (int k = 0; k < altitudes.getLength(); k++) {
702
                                if (altitudes.item(k).getNodeName().equals(prefix + "MeasurementOrFactAtomised")) {
703
                                    NodeList facts = altitudes.item(k).getChildNodes();
704
                                    for (int l = 0; l < facts.getLength(); l++) {
705
                                        if (facts.item(l).getNodeName().equals(prefix + "LowerValue")) {
706
                                            path = facts.item(l).getNodeName();
707
                                            getHierarchie(facts.item(l));
708
                                            dataHolder.knownABCDelements.add(path);
709
                                            path = "";
710
                                            dataHolder.gatheringElevationMin = facts.item(l).getTextContent();
711
                                        }
712
                                        else if (facts.item(l).getNodeName().equals(prefix + "UpperValue")) {
713
                                            path = facts.item(l).getNodeName();
714
                                            getHierarchie(facts.item(l));
715
                                            dataHolder.knownABCDelements.add(path);
716
                                            path = "";
717
                                            dataHolder.gatheringElevationMax = facts.item(l).getTextContent();
718
                                        }
719
                                        else if (facts.item(l).getNodeName().equals(prefix + "UnitOfMeasurement")) {
720
                                            path = facts.item(l).getNodeName();
721
                                            getHierarchie(facts.item(l));
722
                                            dataHolder.knownABCDelements.add(path);
723
                                            path = "";
724
                                            dataHolder.gatheringElevationUnit = facts.item(l).getTextContent();
725
                                        }
726
                                    }
727
                                }
728
                            }
729
                        }
730
                    }
731
                }
732
            }
733
        } catch (NullPointerException e) {
734
            dataHolder.gatheringElevationText = null;
735
        }
736
    }
737

    
738
    protected void getGatheringDate(Element root) {
739
        try {
740
            NodeList group = root.getElementsByTagName(prefix + "Gathering");
741
            for (int i = 0; i < group.getLength(); i++) {
742
                NodeList children = group.item(i).getChildNodes();
743
                for (int j = 0; j < children.getLength(); j++) {
744
                    if (children.item(j).getNodeName().equals(prefix + "DateTime")) {
745
                        NodeList dateTimes = children.item(j).getChildNodes();
746
                        for (int k = 0; k < dateTimes.getLength(); k++) {
747
                            if (dateTimes.item(k).getNodeName().equals(prefix + "DateText")) {
748
                                path = dateTimes.item(k).getNodeName();
749
                                getHierarchie(dateTimes.item(k));
750
                                dataHolder.knownABCDelements.add(path);
751
                                path = "";
752
                                dataHolder.gatheringDateText = dateTimes.item(k).getTextContent();
753
                            }
754
                        }
755
                    }
756

    
757
                }
758
            }
759

    
760
        } catch (NullPointerException e) {
761
            dataHolder.gatheringDateText = null;
762
        }
763
    }
764

    
765
    /**
766
     * getGatheringPeople : get GatheringAgent with fullname
767
     * @param root
768
     */
769
    protected void getGatheringPeople(Element root) {
770
        try {
771
            dataHolder.gatheringAgentList = new ArrayList<String>();
772

    
773
            NodeList group = root.getElementsByTagName(prefix + "GatheringAgent");
774
            for (int i = 0; i < group.getLength(); i++) {
775
                NodeList children = group.item(i).getChildNodes();
776
                for (int j = 0; j < children.getLength(); j++) {
777
                    if (children.item(j).getNodeName().equals(prefix + "Person")) {
778
                        NodeList persons = children.item(j).getChildNodes();
779
                        for (int k = 0; k < persons.getLength(); k++) {
780
                            if (persons.item(k).getNodeName().equals(prefix + "FullName")) {
781
                                path = persons.item(k).getNodeName();
782
                                getHierarchie(persons.item(k));
783
                                dataHolder.knownABCDelements.add(path);
784
                                path = "";
785
                                if (!persons.item(k).getTextContent().trim().equalsIgnoreCase("none")) {
786
                                    dataHolder.gatheringAgentList.add(persons.item(k).getTextContent());
787
                                }
788
                            }
789
                        }
790
                    }
791

    
792
                }
793
            }
794

    
795
            group = root.getElementsByTagName(prefix + "Gathering");
796
            for (int i = 0; i < group.getLength(); i++) {
797
                NodeList children = group.item(i).getChildNodes();
798
                for (int j = 0; j < children.getLength(); j++) {
799
                    if (children.item(j).getNodeName().equals(prefix + "Agents")) {
800
                        NodeList persons = children.item(j).getChildNodes();
801
                        for (int k = 0; k < persons.getLength(); k++) {
802
                            if (persons.item(k).getNodeName().equals(prefix + "GatheringAgentsText")) {
803
                                path = persons.item(k).getNodeName();
804
                                getHierarchie(persons.item(k));
805
                                dataHolder.knownABCDelements.add(path);
806
                                path = "";
807
                                if (!persons.item(k).getTextContent().trim().equalsIgnoreCase("none")) {
808
                                    dataHolder.gatheringAgentList.add(persons.item(k).getTextContent());
809
                                }
810
                            }
811
                        }
812
                    }
813

    
814
                }
815
            }
816

    
817
        } catch (NullPointerException e) {
818
            dataHolder.gatheringAgentList = new ArrayList<String>();
819
        }
820
        if (dataHolder.gatheringAgentList.size() > 1){
821
            dataHolder.gatheringTeamList.addAll(dataHolder.gatheringAgentList);
822
            dataHolder.gatheringAgentList = new ArrayList<String>();
823
        }
824
    }
825

    
826
    /*PARSING METHODS*/
827

    
828
    private HashMap<String, String> getAtomisedNames(String code,NodeList atomised) {
829
        if (DEBUG) {
830
            logger.info("code getatomised " + code);
831
        }
832
        if (code.indexOf("Botanical") != -1) {
833
            return this.getAtomisedBotanical(atomised);
834
        }
835
        if (code.indexOf("Bacterial") != -1) {
836
            return this.getAtomisedBacterial(atomised);
837
        }
838
        if (code.indexOf("Viral") != -1) {
839
            return this.getAtomisedViral(atomised);
840
        }
841
        if (code.indexOf("Zoological") != -1) {
842
            return this.getAtomisedZoological(atomised);
843
        }
844
        return new HashMap<String, String>();
845
    }
846

    
847
    private HashMap<String, String> getAtomisedZoological(NodeList atomised) {
848
        if(DEBUG) {
849
            logger.info("getAtomisedZoo");
850
        }
851
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
852

    
853
        for (int i = 0; i < atomised.getLength(); i++) {
854
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
855
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
856
                path = atomised.item(i).getNodeName();
857
                getHierarchie(atomised.item(i));
858
                dataHolder.knownABCDelements.add(path);
859
                path = "";
860
            }
861
            else if (atomised.item(i).getNodeName().equals(prefix + "Subgenus")) {
862
                atomisedMap.put("Subgenus", atomised.item(i).getTextContent());
863
                path = atomised.item(i).getNodeName();
864
                getHierarchie(atomised.item(i));
865
                dataHolder.knownABCDelements.add(path);
866
                path = "";
867
            }
868
            else if (atomised.item(i).getNodeName().equals(prefix + "SpeciesEpithet")) {
869
                atomisedMap.put("SpeciesEpithet", atomised.item(i).getTextContent());
870
                path = atomised.item(i).getNodeName();
871
                getHierarchie(atomised.item(i));
872
                dataHolder.knownABCDelements.add(path);
873
                path = "";
874
            }
875
            else if (atomised.item(i).getNodeName().equals(prefix + "SubspeciesEpithet")) {
876
                atomisedMap.put("SubspeciesEpithet", atomised.item(i).getTextContent());
877
                path = atomised.item(i).getNodeName();
878
                getHierarchie(atomised.item(i));
879
                dataHolder.knownABCDelements.add(path);
880
                path = "";
881
            }
882
            else if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeamOriginalAndYear")) {
883
                atomisedMap.put("AuthorTeamOriginalAndYear", atomised.item(i).getTextContent());
884
                path = atomised.item(i).getNodeName();
885
                getHierarchie(atomised.item(i));
886
                dataHolder.knownABCDelements.add(path);
887
                path = "";
888
            }
889
            else if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeamParenthesisAndYear")) {
890
                atomisedMap.put("AuthorTeamParenthesisAndYear", atomised.item(i).getTextContent());
891
                path = atomised.item(i).getNodeName();
892
                getHierarchie(atomised.item(i));
893
                dataHolder.knownABCDelements.add(path);
894
                path = "";
895
            }
896
            else if (atomised.item(i).getNodeName().equals(prefix + "CombinationAuthorTeamAndYear")) {
897
                atomisedMap.put("CombinationAuthorTeamAndYear", atomised.item(i).getTextContent());
898
                path = atomised.item(i).getNodeName();
899
                getHierarchie(atomised.item(i));
900
                dataHolder.knownABCDelements.add(path);
901
                path = "";
902
            }
903
            else if (atomised.item(i).getNodeName().equals(prefix + "Breed")) {
904
                atomisedMap.put("Breed", atomised.item(i).getTextContent());
905
                path = atomised.item(i).getNodeName();
906
                getHierarchie(atomised.item(i));
907
                dataHolder.knownABCDelements.add(path);
908
                path = "";
909
            }
910
            else if (atomised.item(i).getNodeName().equals(prefix + "NamedIndividual")) {
911
                atomisedMap.put("NamedIndividual", atomised.item(i).getTextContent());
912
                path = atomised.item(i).getNodeName();
913
                getHierarchie(atomised.item(i));
914
                dataHolder.knownABCDelements.add(path);
915
                path = "";
916
            }
917
        }
918
        return atomisedMap;
919
    }
920

    
921
    private HashMap<String, String> getAtomisedViral(NodeList atomised) {
922
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
923
        for (int i = 0; i < atomised.getLength(); i++) {
924
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
925
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
926
                path = atomised.item(i).getNodeName();
927
                getHierarchie(atomised.item(i));
928
                dataHolder.knownABCDelements.add(path);
929
                path = "";
930
            }
931
            if (atomised.item(i).getNodeName().equals(prefix + "ViralSpeciesDesignation")) {
932
                atomisedMap.put("ViralSpeciesDesignation", atomised.item(i).getTextContent());
933
                path = atomised.item(i).getNodeName();
934
                getHierarchie(atomised.item(i));
935
                dataHolder.knownABCDelements.add(path);
936
                path = "";
937
            }
938
            if (atomised.item(i).getNodeName().equals(prefix + "Acronym")) {
939
                atomisedMap.put("Acronym", atomised.item(i).getTextContent());
940
                path = atomised.item(i).getNodeName();
941
                getHierarchie(atomised.item(i));
942
                dataHolder.knownABCDelements.add(path);
943
                path = "";
944
            }
945
        }
946
        return atomisedMap;
947
    }
948

    
949
    private HashMap<String, String> getAtomisedBotanical(NodeList atomised) {
950
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
951
        for (int i = 0; i < atomised.getLength(); i++) {
952
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
953
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
954
                path = atomised.item(i).getNodeName();
955
                getHierarchie(atomised.item(i));
956
                dataHolder.knownABCDelements.add(path);
957
                path = "";
958
            }
959
            if (atomised.item(i).getNodeName().equals(prefix + "FirstEpithet")) {
960
                atomisedMap.put("FirstEpithet", atomised.item(i).getTextContent());
961
                path = atomised.item(i).getNodeName();
962
                getHierarchie(atomised.item(i));
963
                dataHolder.knownABCDelements.add(path);
964
                path = "";
965
            }
966
            if (atomised.item(i).getNodeName()
967
                    .equals(prefix + "InfraspecificEpithet")) {
968
                atomisedMap.put("InfraSpeEpithet", atomised.item(i).getTextContent());
969
                path = atomised.item(i).getNodeName();
970
                getHierarchie(atomised.item(i));
971
                dataHolder.knownABCDelements.add(path);
972
                path = "";
973
            }
974
            if (atomised.item(i).getNodeName().equals(prefix + "Rank")) {
975
                atomisedMap.put("Rank", atomised.item(i).getTextContent());
976
                path = atomised.item(i).getNodeName();
977
                getHierarchie(atomised.item(i));
978
                dataHolder.knownABCDelements.add(path);
979
                path = "";
980
            }
981
            if (atomised.item(i).getNodeName().equals(prefix + "HybridFlag")) {
982
                atomisedMap.put("HybridFlag", atomised.item(i).getTextContent());
983
                path = atomised.item(i).getNodeName();
984
                getHierarchie(atomised.item(i));
985
                dataHolder.knownABCDelements.add(path);
986
                path = "";
987
            }
988
            if (atomised.item(i).getNodeName()
989
                    .equals(prefix + "AuthorTeamParenthesis")) {
990
                atomisedMap.put("AuthorTeamParenthesis", atomised.item(i).getTextContent());
991
                path = atomised.item(i).getNodeName();
992
                getHierarchie(atomised.item(i));
993
                dataHolder.knownABCDelements.add(path);
994
                path = "";
995
            }
996
            if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeam")) {
997
                atomisedMap.put("AuthorTeam", atomised.item(i).getTextContent());
998
                path = atomised.item(i).getNodeName();
999
                getHierarchie(atomised.item(i));
1000
                dataHolder.knownABCDelements.add(path);
1001
                path = "";
1002
            }
1003
            if (atomised.item(i).getNodeName().equals(prefix + "CultivarGroupName")) {
1004
                atomisedMap.put("CultivarGroupName", atomised.item(i).getTextContent());
1005
                path = atomised.item(i).getNodeName();
1006
                getHierarchie(atomised.item(i));
1007
                dataHolder.knownABCDelements.add(path);
1008
                path = "";
1009
            }
1010
            if (atomised.item(i).getNodeName().equals(prefix + "CultivarName")) {
1011
                atomisedMap.put("CultivarName", atomised.item(i).getTextContent());
1012
                path = atomised.item(i).getNodeName();
1013
                getHierarchie(atomised.item(i));
1014
                dataHolder.knownABCDelements.add(path);
1015
                path = "";
1016
            }
1017
            if (atomised.item(i).getNodeName().equals(prefix + "TradeDesignationNames")) {
1018
                atomisedMap.put("Trade", atomised.item(i).getTextContent());
1019
                path = atomised.item(i).getNodeName();
1020
                getHierarchie(atomised.item(i));
1021
                dataHolder.knownABCDelements.add(path);
1022
                path = "";
1023
            }
1024
        }
1025
        return atomisedMap;
1026
    }
1027

    
1028
    private HashMap<String, String> getAtomisedBacterial(NodeList atomised) {
1029
        HashMap<String, String> atomisedMap = new HashMap<String, String>();
1030
        for (int i = 0; i < atomised.getLength(); i++) {
1031
            if (atomised.item(i).getNodeName().equals(prefix + "GenusOrMonomial")) {
1032
                atomisedMap.put("Genus", atomised.item(i).getTextContent());
1033
                path = atomised.item(i).getNodeName();
1034
                getHierarchie(atomised.item(i));
1035
                dataHolder.knownABCDelements.add(path);
1036
                path = "";
1037
            }
1038
            if (atomised.item(i).getNodeName().equals(prefix + "Subgenus")) {
1039
                atomisedMap.put("SubGenus", atomised.item(i).getTextContent());
1040
                path = atomised.item(i).getNodeName();
1041
                getHierarchie(atomised.item(i));
1042
                dataHolder.knownABCDelements.add(path);
1043
                path = "";
1044
            }
1045
            if (atomised.item(i).getNodeName().equals(prefix + "SubgenusAuthorAndYear")) {
1046
                atomisedMap.put("SubgenusAuthorAndYear", atomised.item(i).getTextContent());
1047
                path = atomised.item(i).getNodeName();
1048
                getHierarchie(atomised.item(i));
1049
                dataHolder.knownABCDelements.add(path);
1050
                path = "";
1051
            }
1052
            if (atomised.item(i).getNodeName().equals(prefix + "SpeciesEpithet")) {
1053
                atomisedMap.put("SpeciesEpithet", atomised.item(i).getTextContent());
1054
                path = atomised.item(i).getNodeName();
1055
                getHierarchie(atomised.item(i));
1056
                dataHolder.knownABCDelements.add(path);
1057
                path = "";
1058
            }
1059
            if (atomised.item(i).getNodeName().equals(prefix + "SubspeciesEpithet")) {
1060
                atomisedMap.put("SubspeciesEpithet", atomised.item(i).getTextContent());
1061
                path = atomised.item(i).getNodeName();
1062
                getHierarchie(atomised.item(i));
1063
                dataHolder.knownABCDelements.add(path);
1064
                path = "";
1065
            }
1066
            if (atomised.item(i).getNodeName().equals(prefix + "ParentheticalAuthorTeamAndYear")) {
1067
                atomisedMap.put("ParentheticalAuthorTeamAndYear", atomised.item(i).getTextContent());
1068
                path = atomised.item(i).getNodeName();
1069
                getHierarchie(atomised.item(i));
1070
                dataHolder.knownABCDelements.add(path);
1071
                path = "";
1072
            }
1073
            if (atomised.item(i).getNodeName().equals(prefix + "AuthorTeamAndYear")) {
1074
                atomisedMap.put("AuthorTeamAndYear", atomised.item(i).getTextContent());
1075
                path = atomised.item(i).getNodeName();
1076
                getHierarchie(atomised.item(i));
1077
                dataHolder.knownABCDelements.add(path);
1078
                path = "";
1079
            }
1080
            if (atomised.item(i).getNodeName().equals(prefix + "NameApprobation")) {
1081
                atomisedMap.put("NameApprobation", atomised.item(i).getTextContent());
1082
                path = atomised.item(i).getNodeName();
1083
                getHierarchie(atomised.item(i));
1084
                dataHolder.knownABCDelements.add(path);
1085
                path = "";
1086
            }
1087
        }
1088
        return atomisedMap;
1089
    }
1090

    
1091
}
(6-6/11)