Project

General

Profile

Download (10.8 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2015 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.cdm.io.specimen.abcd206.in;
11

    
12
import java.io.File;
13
import java.io.FileNotFoundException;
14
import java.io.PrintStream;
15
import java.io.PrintWriter;
16
import java.io.StringWriter;
17
import java.net.URI;
18
import java.util.ArrayList;
19
import java.util.HashMap;
20
import java.util.HashSet;
21
import java.util.List;
22
import java.util.Map;
23
import java.util.Map.Entry;
24
import java.util.Set;
25

    
26
import org.apache.log4j.Logger;
27

    
28
import eu.etaxonomy.cdm.io.specimen.SpecimenImportConfiguratorBase;
29
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
30
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
31
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
32
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
33
import eu.etaxonomy.cdm.model.taxon.Taxon;
34
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
35

    
36
/**
37
 * Gathers information about the ABCD import and presents them in a suitable way.
38
 * @author pplitzner
39
 * @date Jan 23, 2015
40
 *
41
 */
42
public class SpecimenImportReport {
43

    
44
    static private final Logger logger = Logger.getLogger(SpecimenImportReport.class);
45

    
46

    
47
    private final List<Taxon> createdTaxa = new ArrayList<Taxon>();
48
    private final Map<Taxon, List<UnitIdSpecimen>> taxonToAssociatedSpecimens =  new HashMap<Taxon, List<UnitIdSpecimen>>();
49
    private final Map<UnitIdSpecimen, List<UnitIdSpecimen>> derivateMap = new HashMap<UnitIdSpecimen, List<UnitIdSpecimen>>();
50
    private final List<UnitIdSpecimen> alreadyExistingSpecimens = new ArrayList<UnitIdSpecimen>();
51
    private final List<TaxonNameBase<?, ?>> createdNames = new ArrayList<TaxonNameBase<?,?>>();
52
    private final List<TaxonNode> createdTaxonNodes = new ArrayList<TaxonNode>();
53
    private final List<String> infoMessages = new ArrayList<String>();
54

    
55
    public void addTaxon(Taxon taxon){
56
        createdTaxa.add(taxon);
57
    }
58

    
59
    public void addName(TaxonNameBase<?, ?> taxonName){
60
        createdNames.add(taxonName);
61
    }
62

    
63
    public void addTaxonNode(TaxonNode taxonNode){
64
        createdTaxonNodes.add(taxonNode);
65
    }
66

    
67
    public void addDerivate(DerivedUnit parent, SpecimenImportConfiguratorBase config){
68
        addDerivate(parent, null, config);
69
    }
70

    
71
    public void addDerivate(DerivedUnit parent, DerivedUnit child, SpecimenImportConfiguratorBase config){
72
        UnitIdSpecimen parentUnitIdSpecimen = new UnitIdSpecimen(SpecimenImportUtility.getUnitID(parent, config), parent);
73
        List<UnitIdSpecimen> children = derivateMap.get(parentUnitIdSpecimen);
74
        if(children==null){
75
            children = new ArrayList<UnitIdSpecimen>();
76
        }
77
        if(child!=null){
78
            children.add(new UnitIdSpecimen(SpecimenImportUtility.getUnitID(child, config), child));
79
        }
80
        derivateMap.put(parentUnitIdSpecimen, children);
81
    }
82

    
83
    public void addIndividualAssociation(Taxon taxon, String derivedUnitId, DerivedUnit derivedUnitBase) {
84
        UnitIdSpecimen derivedUnitIdSpecimen = new UnitIdSpecimen(derivedUnitId, derivedUnitBase);
85
        List<UnitIdSpecimen> associatedSpecimens = taxonToAssociatedSpecimens.get(taxon);
86
        if(associatedSpecimens==null){
87
            associatedSpecimens = new ArrayList<UnitIdSpecimen>();
88
        }
89
        associatedSpecimens.add(derivedUnitIdSpecimen);
90
        taxonToAssociatedSpecimens.put(taxon, associatedSpecimens);
91
    }
92

    
93
    public void addAlreadyExistingSpecimen(String unitId, DerivedUnit derivedUnit){
94
        alreadyExistingSpecimens.add(new UnitIdSpecimen(unitId, derivedUnit));
95
    }
96

    
97
    public void addException(String message, Exception e) {
98
        StringWriter errors = new StringWriter();
99
        e.printStackTrace(new PrintWriter(errors));
100
        infoMessages.add(message+"\n"+e.getMessage()+"\n"+errors.toString());
101
    }
102

    
103
    public void addInfoMessage(String message) {
104
        infoMessages.add(message);
105
    }
106

    
107
    public void printReport(URI reportUri) {
108
        PrintStream out;
109
        if(reportUri != null){
110
            try {
111
                out = new PrintStream(new File(reportUri));
112
            } catch (FileNotFoundException e) {
113
                logger.warn("Report file could not be found.");
114
                out = System.out;
115
            }
116
        }
117
        else{
118
            out = System.out;
119
        }
120
        printReport(out);
121
    }
122

    
123

    
124
    public void printReport(PrintStream out) {
125

    
126
        out.println("++++++++Import Report+++++++++");
127
      //all specimens
128
        Set<UnitIdSpecimen> allSpecimens = new HashSet<UnitIdSpecimen>();
129
        for (Entry<UnitIdSpecimen, List<UnitIdSpecimen>> entry : derivateMap.entrySet()) {
130
            UnitIdSpecimen parentSpecimen = entry.getKey();
131
            allSpecimens.add(parentSpecimen);
132
            for (UnitIdSpecimen childSpecimen : entry.getValue()) {
133
                allSpecimens.add(childSpecimen);
134
            }
135
        }
136
        out.println("Specimens created: "+allSpecimens.size());
137
        Map<SpecimenOrObservationType, Integer> specimenTypeToCount = new HashMap<SpecimenOrObservationType, Integer>();
138
        for (UnitIdSpecimen unitIdSpecimen : allSpecimens) {
139
            incrementSpecimenTypeCount(specimenTypeToCount, unitIdSpecimen);
140
        }
141
        for(Entry<SpecimenOrObservationType, Integer> entry:specimenTypeToCount.entrySet()){
142
            SpecimenOrObservationType type = entry.getKey();
143
            out.println(type+": "+entry.getValue());
144
        }
145
        //not imported
146
        out.println("Skipped/not imported: "+alreadyExistingSpecimens.size());
147
        out.println("\n");
148

    
149
        out.println("Imported unit ids");
150
        for (UnitIdSpecimen unitIdSpecimen : allSpecimens) {
151
			out.print(unitIdSpecimen.unitId+", ");
152
		}
153
        out.println("\n");
154

    
155
        out.println("Ignored unit ids");
156
        for (UnitIdSpecimen unitIdSpecimen : alreadyExistingSpecimens) {
157
        	out.print(unitIdSpecimen.unitId+", ");
158
        }
159
        out.println("\n");
160

    
161
        //taxon name
162
        out.println("---Created Taxon Names ("+createdNames.size()+")---");
163
        for (TaxonNameBase<?, ?> taxonName : createdNames) {
164
            out.println(taxonName.getTitleCache());
165
        }
166
        out.println("\n");
167

    
168
        //taxa
169
        out.println("---Created Taxa ("+createdTaxa.size()+")---");
170
        for (Taxon taxon : createdTaxa) {
171
            out.println(taxon.getTitleCache());
172
        }
173
        out.println("\n");
174

    
175
        //taxon nodes
176
        out.println("---Created Taxon Nodes ("+createdTaxonNodes.size()+")---");
177
        for (TaxonNode taxonNode : createdTaxonNodes) {
178
            String nodeString = taxonNode.toString();
179
            if(taxonNode.getTaxon()!=null){
180
                nodeString += " ("+taxonNode.getTaxon().getTitleCache()+")";
181
            }
182
            if(taxonNode.getParent()!=null){
183
                nodeString += " with parent "+taxonNode.getParent();
184
                if(taxonNode.getParent().getTaxon()!=null){
185
                    nodeString += " ("+taxonNode.getParent().getTaxon().getTitleCache()+")";
186
                }
187
            }
188
            out.println(nodeString);
189
        }
190
        out.println("\n");
191

    
192
        //not imported
193
        out.println("---Already existing specimen/not imported ("+alreadyExistingSpecimens.size()+")---");
194
        for(UnitIdSpecimen specimen:alreadyExistingSpecimens){
195
            out.println(formatSpecimen(specimen));
196
        }
197
        out.println("\n");
198

    
199
        //taxa with associated specimens
200
        out.println("---Taxa with associated specimens ("+taxonToAssociatedSpecimens.size()+")---");
201
        for(Entry<Taxon, List<UnitIdSpecimen>> entry:taxonToAssociatedSpecimens.entrySet()){
202
            Taxon taxon = entry.getKey();
203
            List<UnitIdSpecimen> specimens = entry.getValue();
204
            out.println(taxon.getTitleCache() + " ("+specimens.size()+")");
205
            for (UnitIdSpecimen derivedUnit : specimens) {
206
                out.println("\t- "+formatSpecimen(derivedUnit));
207
                //check for derivatives
208
                List<UnitIdSpecimen> list = derivateMap.get(derivedUnit);
209
                for (UnitIdSpecimen derivate : list) {
210
                    out.println("\t\t- "+formatSpecimen(derivate));
211
                }
212
            }
213
        }
214
        out.println("\n");
215
        out.println("\n");
216
        //info messages
217
        out.println("---Info messages---");
218
        for(String message:infoMessages){
219
            out.println(message);
220
            out.println("---");
221
        }
222
        if(out!=System.out){
223
            out.close();
224
        }
225
    }
226

    
227
    private void incrementSpecimenTypeCount(Map<SpecimenOrObservationType, Integer> specimenTypeToCount,
228
            UnitIdSpecimen specimen) {
229
        SpecimenOrObservationType specimenType = specimen.getSpecimen().getRecordBasis();
230
        Integer count = specimenTypeToCount.get(specimenType);
231
        if(count==null){
232
            count = 1;
233
        }
234
        else{
235
            count++;
236
        }
237
        specimenTypeToCount.put(specimenType, count);
238
    }
239

    
240
    private String formatSpecimen(UnitIdSpecimen specimen){
241
        return "("+specimen.getUnitId()+") ["+specimen.getSpecimen().getRecordBasis()+"] "+specimen.getSpecimen().getTitleCache();
242
    }
243

    
244
    private class UnitIdSpecimen{
245
        private final String unitId;
246
        private final SpecimenOrObservationBase<?> specimen;
247

    
248

    
249
        public UnitIdSpecimen(String unitId, SpecimenOrObservationBase<?> specimen) {
250
            super();
251
            this.unitId = unitId;
252
            this.specimen = specimen;
253
        }
254
        public String getUnitId() {
255
            return unitId;
256
        }
257
        public SpecimenOrObservationBase<?> getSpecimen() {
258
            return specimen;
259
        }
260
        @Override
261
        public int hashCode() {
262
            final int prime = 31;
263
            int result = 1;
264
            result = prime * result + ((specimen == null) ? 0 : specimen.hashCode());
265
            result = prime * result + ((unitId == null) ? 0 : unitId.hashCode());
266
            return result;
267
        }
268
        @Override
269
        public boolean equals(Object obj) {
270
            if (this == obj) {
271
                return true;
272
            }
273
            if (obj == null) {
274
                return false;
275
            }
276
            if (getClass() != obj.getClass()) {
277
                return false;
278
            }
279
            UnitIdSpecimen other = (UnitIdSpecimen) obj;
280
            if (specimen == null) {
281
                if (other.specimen != null) {
282
                    return false;
283
                }
284
            } else if (!specimen.equals(other.specimen)) {
285
                return false;
286
            }
287
            if (unitId == null) {
288
                if (other.unitId != null) {
289
                    return false;
290
                }
291
            } else if (!unitId.equals(other.unitId)) {
292
                return false;
293
            }
294
            return true;
295
        }
296

    
297
    }
298

    
299
}
(11-11/14)