2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.app
.cyprus
;
12 import java
.io
.FileNotFoundException
;
14 import java
.net
.URISyntaxException
;
15 import java
.util
.ArrayList
;
16 import java
.util
.HashMap
;
17 import java
.util
.HashSet
;
19 import java
.util
.UUID
;
21 import org
.apache
.commons
.lang
.StringUtils
;
22 import org
.apache
.log4j
.Logger
;
23 import org
.springframework
.transaction
.TransactionStatus
;
25 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationController
;
26 import eu
.etaxonomy
.cdm
.app
.common
.CdmDestinations
;
27 import eu
.etaxonomy
.cdm
.common
.ExcelUtils
;
28 import eu
.etaxonomy
.cdm
.database
.DbSchemaValidation
;
29 import eu
.etaxonomy
.cdm
.database
.ICdmDataSource
;
30 import eu
.etaxonomy
.cdm
.io
.api
.application
.CdmIoApplicationController
;
31 import eu
.etaxonomy
.cdm
.io
.common
.IImportConfigurator
.CHECK
;
32 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
33 import eu
.etaxonomy
.cdm
.model
.common
.OriginalSourceType
;
34 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
35 import eu
.etaxonomy
.cdm
.model
.description
.MeasurementUnit
;
36 import eu
.etaxonomy
.cdm
.model
.description
.QuantitativeData
;
37 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasure
;
38 import eu
.etaxonomy
.cdm
.model
.description
.StatisticalMeasurementValue
;
39 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
40 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
41 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
42 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
43 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
44 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationship
;
45 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
46 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
52 public class CyprusAltitudeActivator
{
53 private static final Logger logger
= Logger
.getLogger(CyprusAltitudeActivator
.class);
55 //database validation status (create, update, validate ...)
56 static DbSchemaValidation hbm2dll
= DbSchemaValidation
.VALIDATE
;
57 // static final URI source = cyprus_distribution();
58 static final URI source
= cyprus_altitude();
61 static final ICdmDataSource cdmDestination
= CdmDestinations
.localH2();
62 // static final ICdmDataSource cdmDestination = CdmDestinations.cdm_test_local_mysql_test();
63 // static final ICdmDataSource cdmDestination = CdmDestinations.cdm_cyprus_dev();
64 // static final ICdmDataSource cdmDestination = CdmDestinations.cdm_cyprus_production();
68 public static final UUID featureTreeUuid
= UUID
.fromString("14d1e912-5ec2-4d10-878b-828788b70a87");
71 static final UUID classificationUuid
= UUID
.fromString("0c2b5d25-7b15-4401-8b51-dd4be0ee5cab");
73 private static final String sourceReferenceTitle
= "Cyprus Excel Altitude Import";
76 //TODO move to Feature vocabulary
77 private static final UUID uuidAltitudeFeature
= UUID
.fromString("1a28ed59-e15f-4001-b5c2-ea89f0012671");
80 static final CHECK check
= CHECK
.IMPORT_WITHOUT_CHECK
;
82 private void doImport(ICdmDataSource cdmDestination
){
85 ArrayList
<HashMap
<String
, String
>> excel
;
87 excel
= ExcelUtils
.parseXLS(source
, "coreTax");
88 } catch (FileNotFoundException e
) {
93 CdmApplicationController app
= CdmIoApplicationController
.NewInstance(cdmDestination
, hbm2dll
);
95 Set
<TaxonBase
> taxaToSave
= new HashSet
<TaxonBase
>();
97 TransactionStatus tx
= app
.startTransaction();
99 UUID uuidMikle77
= UUID
.fromString("9f5fa7ee-538b-4ae5-bd82-2a9503fea1d6");
100 UUID uuidMikle85
= UUID
.fromString("994403c4-c400-413d-9a1a-8531a40bfd8c");
102 Reference mikle77
= app
.getReferenceService().find(uuidMikle77
);
103 Reference mikle85
= app
.getReferenceService().find(uuidMikle85
);
106 Feature altitudeFeature
= (Feature
) app
.getTermService().find(uuidAltitudeFeature
);
107 if (altitudeFeature
== null){
108 // altitudeFeature = Feature.NewInstance("Altitude", "Altitude", "alt.");
109 // altitudeFeature.setUuid(uuidAltitudeFeature);
110 // featureVoc = app.getVocabularyService().find(UUID.fromString("b187d555-f06f-4d65-9e53-da7c93f8eaa8"));
111 // featureVoc.addTerm(altitudeFeature);
112 throw new RuntimeException("Could not find altitudinal range feature");
115 MeasurementUnit meter
= (MeasurementUnit
)app
.getTermService().find(UUID
.fromString("8bef5055-789c-41e5-bea2-8dc2ea8ecdf6"));
116 // NamedArea cyprus = (NamedArea)app.getTermService().find(UUID.fromString("da4cce9a-439b-4cc4-8073-85dc75bae169"));
119 for (HashMap
<String
, String
> row
: excel
){
121 UUID baseUuid
= makeUuid(row
, "uuid");
122 UUID acceptedUuid
= makeUuid(row
, "acceptedNameUuid");
123 UUID parentUuid
= makeUuid(row
, "parentUuid");
125 // String altitude = row.get("Altitude-kumuliert");
127 String altitudeMin
= row
.get("Min");
128 String altitudeMax
= row
.get("Max");
129 String acceptedName
= row
.get("AcceptedName");
133 String source
= row
.get("Source");
135 if (StringUtils
.isBlank(altitudeMin
)){
139 boolean hasAltitude
= false;
140 Reference sourceRef
= getSource(source
, mikle77
, mikle85
);
141 Taxon taxon
= getTaxon(app
, baseUuid
, acceptedUuid
, parentUuid
, acceptedName
, count
);
143 TaxonDescription desc
= getDescription(taxon
, sourceRef
);
145 hasAltitude
= makeAltitude(altitudeMin
, altitudeMax
, altitudeFeature
, sourceRef
, desc
, meter
, count
);
146 // hasAltitude = makeAltitudeOld(altitude, altitudeFeature, sourceRef, desc, meter, count);
148 if(desc
.getTaxon() == null){
149 taxon
.addDescription(desc
);
151 taxaToSave
.add(taxon
);
153 logger
.warn("HasALtitude is false in " + count
);
156 logger
.warn("Taxon not recognized in line " + count
);
160 app
.getTaxonService().saveOrUpdate(taxaToSave
);
162 // tx.setRollbackOnly();
163 app
.commitTransaction(tx
);
167 private Taxon
getTaxon(CdmApplicationController app
, UUID baseUuid
, UUID acceptedUuid
, UUID parentUuid
, String acceptedName
, int row
) {
168 TaxonBase
<?
> base
= app
.getTaxonService().find(baseUuid
);
169 // TaxonBase<?> parent = app.getTaxonService().find(parentUuid);
173 if (base
.isInstanceOf(Taxon
.class)){
174 Taxon t
= CdmBase
.deproxy(base
, Taxon
.class);
175 if (t
.getTaxonNodes().size() == 1 && t
.getTaxonNodes().iterator().next().getClassification().getUuid().equals(classificationUuid
)){
178 logger
.warn("Base taxon (uuid) not in classification. Row: " + row
+ ", Taxon: " + base
.getTitleCache());
182 TaxonBase
<?
> accepted
= app
.getTaxonService().find(acceptedUuid
);
183 Taxon t
= CdmBase
.deproxy(accepted
, Taxon
.class);;
184 if (t
.getTaxonNodes().size() == 1 && t
.getTaxonNodes().iterator().next().getClassification().getUuid().equals(classificationUuid
)){
185 if (hasSynonym(t
, base
)){
188 logger
.warn("Synonym relation has changed somehow. Row: " + row
+ ", Taxon: " + base
.getTitleCache());
192 logger
.warn("Accepted taxon not in classification. Row: " + row
+ ", Taxon: " + base
.getTitleCache());
197 if (! result
.getName().getTitleCache().equals(acceptedName
)){
198 logger
.warn("AcceptedName and taxon name is not equal in " + row
+ ".\n" +
199 " Accepted Name: " + acceptedName
+ ";\n" +
200 " Taxon Name: " + result
.getName().getTitleCache());
207 private boolean hasSynonym(Taxon t
, TaxonBase
<?
> base
) {
208 if (base
.isInstanceOf(Synonym
.class)){
209 for (SynonymRelationship rel
: t
.getSynonymRelations()){
210 if (rel
.getSynonym().equals(base
)){
218 // private static final Pattern altitudePattern = Pattern.compile("\\d{1,4}(-\\d{1,4})?");
221 private boolean makeAltitude(String altitudeMin
, String altitudeMax
, Feature altitudeFeature
,
222 Reference sourceRef
, TaxonDescription desc
, MeasurementUnit meter
, int row
) {
224 QuantitativeData data
= QuantitativeData
.NewInstance(altitudeFeature
);
228 TaxonNameBase
<?
,?
> nameUsedInSource
= null; //TODO
229 data
.addSource(OriginalSourceType
.PrimaryTaxonomicSource
, null, null, sourceRef
, null, nameUsedInSource
, null);
231 // //Excel //excel source not wanted by Ralf
232 // TaxonNameBase<?,?> nameUsedInSource = null; //TODO probably we don't want this
233 // data.addSource(OriginalSourceType.Import, String.valueOf(row), "row", getSourceReference(), null, nameUsedInSource, null);
237 Integer min
= Integer
.valueOf(altitudeMin
);
238 StatisticalMeasurementValue minValue
= StatisticalMeasurementValue
.NewInstance(StatisticalMeasure
.MIN(), min
);
239 data
.addStatisticalValue(minValue
);
241 Integer max
= Integer
.valueOf(altitudeMax
);
242 StatisticalMeasurementValue maxValue
= StatisticalMeasurementValue
.NewInstance(StatisticalMeasure
.MAX(), max
);
243 data
.addStatisticalValue(maxValue
);
245 desc
.addElement(data
);
249 // private boolean makeAltitudeOld(String altitudeOrig, Feature feature, Reference source, TaxonDescription desc, MeasurementUnit meter, int row) {
250 // String altitude = altitudeOrig.trim().replace(" ", "");
251 // Matcher matcher = altitudePattern.matcher(altitude);
253 // if (matcher.matches()){
254 // QuantitativeData data = QuantitativeData.NewInstance(feature);
257 // if (source != null){
258 // TaxonNameBase<?,?> nameUsedInSource = null; //TODO
259 // data.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, source, null, nameUsedInSource, null);
262 // TaxonNameBase<?,?> nameUsedInSource = null; //TODO probably we don't want this
263 // data.addSource(OriginalSourceType.Import, String.valueOf(row), "row", getSourceReference(), null, nameUsedInSource, null);
264 // data.setUnit(meter);
266 // String[] split = altitude.split("-");
268 // Integer min = Integer.valueOf(split[0]);
269 // StatisticalMeasurementValue minValue = StatisticalMeasurementValue.NewInstance(StatisticalMeasure.MIN(), min);
270 // data.addStatisticalValue(minValue);
272 // if (split.length > 1){
273 // Integer max = Integer.valueOf(split[1]);
274 // StatisticalMeasurementValue maxValue = StatisticalMeasurementValue.NewInstance(StatisticalMeasure.MAX(), max);
275 // data.addStatisticalValue(maxValue);
277 // desc.addElement(data);
280 // logger.warn("Altitude does not match in row " + row + ": " + altitudeOrig);
285 private TaxonDescription
getDescription(Taxon taxon
, Reference sourceRef
) {
287 //TODO Mikle existiert derzeit nicht also Source
289 TaxonDescription desc
= TaxonDescription
.NewInstance();
290 desc
.setTitleCache("Import from " + getSourceReference().getTitleCache(), true);
291 desc
.addSource(OriginalSourceType
.PrimaryTaxonomicSource
, null, null, sourceRef
,null);
292 desc
.addSource(OriginalSourceType
.Import
, null, null, getSourceReference(), null);
299 private Reference
getSource(String source
, Reference m77
, Reference m85
) {
300 if(StringUtils
.isNotBlank(source
)){
301 if (source
.equals("Meikle 1977")){
303 }else if (source
.equals("Meikle 1985")){
306 logger
.warn("Source not recognized: " + source
);
316 private UUID
makeUuid(HashMap
<String
, String
> row
, String colName
) {
317 if (StringUtils
.isBlank(row
.get(colName
))){
320 return UUID
.fromString(row
.get(colName
));
324 // private void getRowValues(HashMap<String, String> row) {
325 // // TODO Auto-generated method stub
326 // HashMap<String, Object> = new HashM
333 Reference sourceReference
;
334 private Reference
getSourceReference() {
335 if (sourceReference
== null){
336 sourceReference
= ReferenceFactory
.newGeneric();
337 sourceReference
.setTitleCache(sourceReferenceTitle
, true);
340 return sourceReference
;
346 public static URI
cyprus_altitude() {
349 sourceUrl
= new URI("file:/F:/data/cyprus/Cyprus-altitude-import-neu.xls");
350 // sourceUrl = new URI("file:/F:/data/cyprus/Zypern-Altitude.xls");
352 } catch (URISyntaxException e
) {
362 public static void main(String
[] args
) {
363 CyprusAltitudeActivator me
= new CyprusAltitudeActivator();
364 me
.doImport(cdmDestination
);
368 private void testMatcher() {
369 // makeAltitude("0-4400", null, null);