Project

General

Profile

Download (10.7 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.util.ArrayList;
17
import java.util.HashMap;
18
import java.util.HashSet;
19
import java.util.List;
20
import java.util.Map;
21
import java.util.Map.Entry;
22
import java.util.Set;
23

    
24
import org.apache.log4j.Logger;
25

    
26
import eu.etaxonomy.cdm.common.URI;
27
import eu.etaxonomy.cdm.io.specimen.SpecimenImportConfiguratorBase;
28
import eu.etaxonomy.cdm.model.name.TaxonName;
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
 * @since 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<>();
47
    private final Map<Taxon, List<UnitIdSpecimen>> taxonToAssociatedSpecimens =  new HashMap<>();
48
    private final Map<UnitIdSpecimen, List<UnitIdSpecimen>> derivateMap = new HashMap<>();
49
    private final List<UnitIdSpecimen> alreadyExistingSpecimens = new ArrayList<>();
50
    private final List<TaxonName> createdNames = new ArrayList<>();
51
    private final List<TaxonNode> createdTaxonNodes = new ArrayList<>();
52
    private final List<String> infoMessages = new ArrayList<>();
53

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

    
58
    public void addName(TaxonName 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
            if (!alreadyExistingSpecimens.contains(child)){
78
                children.add(new UnitIdSpecimen(SpecimenImportUtility.getUnitID(child, config), child));
79
            }
80
        }
81
        derivateMap.put(parentUnitIdSpecimen, children);
82
    }
83

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

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

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

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

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

    
124

    
125
    public void printReport(PrintStream out) {
126

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

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

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

    
162
        //taxon name
163
        out.println("---Created Taxon Names ("+createdNames.size()+")---");
164
        for (TaxonName taxonName : createdNames) {
165
            out.println(taxonName.getTitleCache());
166
        }
167
        out.println("\n");
168

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

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

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

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

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

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

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

    
249

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

    
298
    }
299

    
300
}
(12-12/15)