Project

General

Profile

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

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

    
25
import org.apache.log4j.Logger;
26

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

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

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

    
45

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

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

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

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

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

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

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

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

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

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

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

    
122

    
123
    public void printReport(PrintStream out) {
124

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

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

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

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

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

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

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

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

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

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

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

    
247

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

    
296
    }
297

    
298
}
(11-11/14)