-// $Id$\r
-/**\r
-* Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
-* http://www.e-taxonomy.eu\r
-* \r
-* The contents of this file are subject to the Mozilla Public License Version 1.1\r
-* See LICENSE.TXT at the top of this package for the full license terms.\r
-*/\r
-package eu.etaxonomy.cdm.app.wp6.diptera;\r
-\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.InputStream;\r
-import java.io.InputStreamReader;\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.apache.commons.lang.StringUtils;\r
-import org.apache.log4j.Logger;\r
-import org.springframework.transaction.TransactionStatus;\r
-\r
-import au.com.bytecode.opencsv.CSVReader;\r
-import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
-import eu.etaxonomy.cdm.app.common.CdmDestinations;\r
-import eu.etaxonomy.cdm.common.CdmUtils;\r
-import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
-import eu.etaxonomy.cdm.database.ICdmDataSource;\r
-import eu.etaxonomy.cdm.model.agent.Institution;\r
-import eu.etaxonomy.cdm.model.occurrence.Collection;\r
-import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
-\r
-/**\r
- * @author a.mueller\r
- * @date 07.04.2010\r
- *\r
- */\r
-public class DipteraCollectionImport {\r
- private static final Logger logger = Logger.getLogger(DipteraCollectionImport.class);\r
-\r
- public static final File acronymsFile = new File("src/main/resources/collections/Acronyms.tab");\r
- //datasource for use from local main()\r
- static final ICdmDataSource cdmDestination = CdmDestinations.cdm_local_dipera();\r
- \r
-\r
- public boolean invoke(ICdmDataSource dataSource) {\r
- CdmApplicationController cdmApp = CdmApplicationController.NewInstance(dataSource, DbSchemaValidation.VALIDATE);\r
- \r
- //create collections\r
- TransactionStatus tx = cdmApp.startTransaction();\r
- Map<String, Collection> colletionMap = createCollections(cdmApp);\r
- \r
- //add collections to specimen\r
- addCollectionsToSpecimen(cdmApp, colletionMap);\r
- cdmApp.commitTransaction(tx);\r
- \r
- return true;\r
- \r
- }\r
-\r
-\r
- /**\r
- * @param cdmApp\r
- * @param colletionMap \r
- */\r
- private void addCollectionsToSpecimen(CdmApplicationController cdmApp, Map<String, Collection> colletionMap) {\r
- List<SpecimenOrObservationBase> specimens = (cdmApp.getOccurrenceService().list(DerivedUnit.class, null, null, null, null));\r
- for (SpecimenOrObservationBase<?> specOrObservBase : specimens){\r
- if (specOrObservBase.getRecordBasis().isPreservedSpecimen()){\r
- handleSingleSpecimen((DerivedUnit)specOrObservBase, colletionMap);\r
- }else{\r
- logger.warn("There are specimenOrObservationBase objects which are not of class Specimen. This is probably an error.");\r
- }\r
- }\r
- cdmApp.getOccurrenceService().save(specimens);\r
- }\r
-\r
-\r
- /**\r
- * @param specimen \r
- * @param colletionMap\r
- */\r
- private void handleSingleSpecimen(DerivedUnit specimen, Map<String, Collection> collectionMap) {\r
- String titleCache = specimen.getTitleCache();\r
- String collectionCode = getCollectionCode(titleCache);\r
- if (StringUtils.isBlank(collectionCode)){\r
- logger.warn("Collection code is empty for: " + titleCache);\r
- }else{\r
- Collection collection = collectionMap.get(collectionCode);\r
- if (collection != null){\r
- specimen.setCollection(collection);\r
- }else{\r
- logger.warn("Collection not found for code: " + collectionCode + "; titleCache: " + titleCache);\r
- }\r
- }\r
- }\r
-\r
-\r
- /**\r
- * @param titleCache\r
- * @return\r
- */\r
- private String getCollectionCode(String titleCache) {\r
- String result = titleCache.trim();\r
- result = replaceBracket(result);\r
- result = replaceLastFullStop(result);\r
- result = replaceLastQuestionMark(result);\r
- result = parseLastUpperCase(result);\r
- return result;\r
- }\r
-\r
-\r
- /**\r
- * @param result\r
- * @return\r
- */\r
- private String parseLastUpperCase(String string) {\r
- String result = "";\r
- String tmpString = string;\r
- int pos = tmpString.lastIndexOf(" ");\r
- if (pos>-1){\r
- tmpString = tmpString.substring(pos+1);\r
- }\r
- while (tmpString.length() > 0){\r
- int len = tmpString.length();\r
- char lastChar = tmpString.charAt(len-1);\r
- if (Character.isUpperCase( lastChar)){\r
- result = lastChar + result;\r
- }else{\r
- if (result.length() > 0){\r
- logger.warn("Collection code is not space separated: " + string);\r
- }\r
- break;\r
- }\r
- //remove last character\r
- tmpString = tmpString.substring(0, tmpString.length()-1);\r
- }\r
- return result;\r
- }\r
-\r
-\r
-\r
- /**\r
- * @param result\r
- * @return\r
- */\r
- private String replaceLastQuestionMark(String string) {\r
- if (string.endsWith("?")){\r
- string = string.substring(0,string.length()-1).trim();\r
- }\r
- return string;\r
- }\r
- \r
- /**\r
- * @param result\r
- * @return\r
- */\r
- private String replaceLastFullStop(String string) {\r
- if (string.endsWith(".")){\r
- string = string.substring(0,string.length()-1).trim();\r
- }\r
- return string;\r
- }\r
-\r
-\r
- /**\r
- * @param result\r
- * @return\r
- */\r
- private String replaceBracket(String string) {\r
- if (string.endsWith("]")){\r
- int pos = string.indexOf("[");\r
- if (pos >0){\r
- string = string.substring(0, pos).trim();\r
- }else{\r
- logger.warn("Closing bracket has no opening bracket in: " + string);\r
- }\r
- }\r
- return string;\r
- }\r
-\r
-\r
- /**\r
- * @param cdmApp\r
- */\r
- private Map<String, Collection> createCollections(CdmApplicationController cdmApp) {\r
- Map<String, Collection> collectionMap = new HashMap<String, Collection>(); \r
- List<String[]> lines = getLines();\r
- for (String[] line:lines){\r
- Collection collection = makeLine(line);\r
- collectionMap.put(collection.getCode(), collection);\r
- }\r
- cdmApp.getCollectionService().save(collectionMap.values());\r
-// for (Collection collection: collectionMap.values()){\r
-// System.out.println(collection.getTitleCache());\r
-// }\r
- return collectionMap;\r
- }\r
- \r
-\r
- private Collection makeLine(String[] line) {\r
- String code = line[0];\r
- String instituteName = line[1];\r
- String lowerInstitutionName = line[2];\r
- String higherInstitutionName = line[3];\r
- String location = line[4];\r
- String country = line[5];\r
- //create objects\r
- Collection collection = Collection.NewInstance();\r
- collection.setCode(code);\r
- Institution institution = Institution.NewInstance();\r
- institution.setCode(code);\r
- \r
- institution.setName(instituteName);\r
- \r
- if (StringUtils.isNotBlank(lowerInstitutionName)){\r
- Institution lowerInstitution = Institution.NewInstance();\r
- lowerInstitution.setName(lowerInstitutionName);\r
- lowerInstitution.setIsPartOf(institution);\r
- }\r
- \r
- if (StringUtils.isNotBlank(higherInstitutionName)){\r
- Institution higherInstitution = Institution.NewInstance();\r
- higherInstitution.setName(higherInstitutionName);\r
- institution.setIsPartOf(higherInstitution);\r
- }\r
- \r
- collection.setInstitute(institution);\r
- String locationAndCountry = CdmUtils.concat("/", location, country);\r
- collection.setTownOrLocation(locationAndCountry);\r
- \r
- String titleCache = CdmUtils.concat(", ", new String[]{instituteName, lowerInstitutionName, higherInstitutionName, location, country});\r
- collection.setTitleCache(titleCache, true);\r
- \r
- return collection;\r
- }\r
-\r
- \r
- \r
- \r
- private List<String[]> getLines() {\r
- List<String[]> result = new ArrayList<String[]>();\r
- \r
- try {\r
- InputStream inStream = new FileInputStream(acronymsFile);\r
- InputStreamReader inputStreamReader = new InputStreamReader(inStream, "UTF8");\r
- CSVReader reader = new CSVReader(inputStreamReader, '\t');\r
- String [] nextLine = reader.readNext();\r
- \r
- \r
- while ((nextLine = reader.readNext()) != null) {\r
- if (nextLine.length == 0){\r
- continue;\r
- }\r
- result.add(nextLine);\r
- }\r
- return result;\r
- } catch (Exception e) {\r
- logger.error(e + " " + e.getCause() + " " + e.getMessage());\r
- for(StackTraceElement ste : e.getStackTrace()) {\r
- logger.error(ste);\r
- }\r
- throw new RuntimeException(e);\r
- }\r
- }\r
-\r
-\r
-\r
-\r
-\r
- /**\r
- * @param args\r
- */\r
- public static void main(String[] args) {\r
- try {\r
- DipteraCollectionImport collectionImport = new DipteraCollectionImport();\r
- collectionImport.invoke(cdmDestination);\r
-// String titleCache = "Peru. Mouth of Rio Pachitea. ST 2R SMT. [fig. of male abdomen]";\r
-// String collectionCode = collectionImport.getCollectionCode(titleCache);\r
-// System.out.println(collectionCode);\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- System.exit(-1);\r
- }\r
- }\r
-\r
-}\r
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.cdm.app.wp6.diptera;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.transaction.TransactionStatus;
+
+import au.com.bytecode.opencsv.CSVReader;
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;
+import eu.etaxonomy.cdm.app.common.CdmDestinations;
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.database.DbSchemaValidation;
+import eu.etaxonomy.cdm.database.ICdmDataSource;
+import eu.etaxonomy.cdm.io.common.ImportResult;
+import eu.etaxonomy.cdm.model.agent.Institution;
+import eu.etaxonomy.cdm.model.occurrence.Collection;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
+
+/**
+ * @author a.mueller
+ * @since 07.04.2010
+ *
+ */
+public class DipteraCollectionImport {
+ private static final Logger logger = Logger.getLogger(DipteraCollectionImport.class);
+
+ public static final File acronymsFile = new File("src/main/resources/collections/Acronyms.tab");
+ //datasource for use from local main()
+ static final ICdmDataSource cdmDestination = CdmDestinations.localH2();
+
+
+ public ImportResult invoke(ICdmDataSource dataSource) {
+ ImportResult result = new ImportResult();
+ CdmApplicationController cdmApp = CdmApplicationController.NewInstance(dataSource, DbSchemaValidation.VALIDATE);
+
+ //create collections
+ TransactionStatus tx = cdmApp.startTransaction();
+ Map<String, Collection> colletionMap = createCollections(cdmApp);
+
+ //add collections to specimen
+ addCollectionsToSpecimen(cdmApp, colletionMap);
+ cdmApp.commitTransaction(tx);
+
+ return result;
+
+ }
+
+
+ /**
+ * @param cdmApp
+ * @param colletionMap
+ */
+ private void addCollectionsToSpecimen(CdmApplicationController cdmApp, Map<String, Collection> colletionMap) {
+ List<DerivedUnit> specimens = cdmApp.getOccurrenceService().list(DerivedUnit.class, null, null, null, null);
+ for (SpecimenOrObservationBase<?> specOrObservBase : specimens){
+ if (specOrObservBase.getRecordBasis().isPreservedSpecimen()){
+ handleSingleSpecimen((DerivedUnit)specOrObservBase, colletionMap);
+ }else{
+ logger.warn("There are specimenOrObservationBase objects which are not of class Specimen. This is probably an error.");
+ }
+ }
+ List<SpecimenOrObservationBase> specimenList = new ArrayList<SpecimenOrObservationBase>(specimens);
+ cdmApp.getOccurrenceService().save(specimenList);
+ }
+
+
+ /**
+ * @param specimen
+ * @param colletionMap
+ */
+ private void handleSingleSpecimen(DerivedUnit specimen, Map<String, Collection> collectionMap) {
+ String titleCache = specimen.getTitleCache();
+ String collectionCode = getCollectionCode(titleCache);
+ if (StringUtils.isBlank(collectionCode)){
+ logger.warn("Collection code is empty for: " + titleCache);
+ }else{
+ Collection collection = collectionMap.get(collectionCode);
+ if (collection != null){
+ specimen.setCollection(collection);
+ }else{
+ logger.warn("Collection not found for code: " + collectionCode + "; titleCache: " + titleCache);
+ }
+ }
+ }
+
+
+ /**
+ * @param titleCache
+ * @return
+ */
+ private String getCollectionCode(String titleCache) {
+ String result = titleCache.trim();
+ result = replaceBracket(result);
+ result = replaceLastFullStop(result);
+ result = replaceLastQuestionMark(result);
+ result = parseLastUpperCase(result);
+ return result;
+ }
+
+
+ /**
+ * @param result
+ * @return
+ */
+ private String parseLastUpperCase(String string) {
+ String result = "";
+ String tmpString = string;
+ int pos = tmpString.lastIndexOf(" ");
+ if (pos>-1){
+ tmpString = tmpString.substring(pos+1);
+ }
+ while (tmpString.length() > 0){
+ int len = tmpString.length();
+ char lastChar = tmpString.charAt(len-1);
+ if (Character.isUpperCase( lastChar)){
+ result = lastChar + result;
+ }else{
+ if (result.length() > 0){
+ logger.warn("Collection code is not space separated: " + string);
+ }
+ break;
+ }
+ //remove last character
+ tmpString = tmpString.substring(0, tmpString.length()-1);
+ }
+ return result;
+ }
+
+
+
+ /**
+ * @param result
+ * @return
+ */
+ private String replaceLastQuestionMark(String string) {
+ if (string.endsWith("?")){
+ string = string.substring(0,string.length()-1).trim();
+ }
+ return string;
+ }
+
+ /**
+ * @param result
+ * @return
+ */
+ private String replaceLastFullStop(String string) {
+ if (string.endsWith(".")){
+ string = string.substring(0,string.length()-1).trim();
+ }
+ return string;
+ }
+
+
+ /**
+ * @param result
+ * @return
+ */
+ private String replaceBracket(String string) {
+ if (string.endsWith("]")){
+ int pos = string.indexOf("[");
+ if (pos >0){
+ string = string.substring(0, pos).trim();
+ }else{
+ logger.warn("Closing bracket has no opening bracket in: " + string);
+ }
+ }
+ return string;
+ }
+
+
+ /**
+ * @param cdmApp
+ */
+ private Map<String, Collection> createCollections(CdmApplicationController cdmApp) {
+ Map<String, Collection> collectionMap = new HashMap<String, Collection>();
+ List<String[]> lines = getLines();
+ for (String[] line:lines){
+ Collection collection = makeLine(line);
+ collectionMap.put(collection.getCode(), collection);
+ }
+ cdmApp.getCollectionService().save(collectionMap.values());
+// for (Collection collection: collectionMap.values()){
+// System.out.println(collection.getTitleCache());
+// }
+ return collectionMap;
+ }
+
+
+ private Collection makeLine(String[] line) {
+ String code = line[0];
+ String instituteName = line[1];
+ String lowerInstitutionName = line[2];
+ String higherInstitutionName = line[3];
+ String location = line[4];
+ String country = line[5];
+ //create objects
+ Collection collection = Collection.NewInstance();
+ collection.setCode(code);
+ Institution institution = Institution.NewInstance();
+ institution.setCode(code);
+
+ institution.setName(instituteName);
+
+ if (StringUtils.isNotBlank(lowerInstitutionName)){
+ Institution lowerInstitution = Institution.NewInstance();
+ lowerInstitution.setName(lowerInstitutionName);
+ lowerInstitution.setIsPartOf(institution);
+ }
+
+ if (StringUtils.isNotBlank(higherInstitutionName)){
+ Institution higherInstitution = Institution.NewInstance();
+ higherInstitution.setName(higherInstitutionName);
+ institution.setIsPartOf(higherInstitution);
+ }
+
+ collection.setInstitute(institution);
+ String locationAndCountry = CdmUtils.concat("/", location, country);
+ collection.setTownOrLocation(locationAndCountry);
+
+ String titleCache = CdmUtils.concat(", ", new String[]{instituteName, lowerInstitutionName, higherInstitutionName, location, country});
+ collection.setTitleCache(titleCache, true);
+
+ return collection;
+ }
+
+
+
+
+ private List<String[]> getLines() {
+ List<String[]> result = new ArrayList<String[]>();
+
+ try {
+ InputStream inStream = new FileInputStream(acronymsFile);
+ InputStreamReader inputStreamReader = new InputStreamReader(inStream, "UTF8");
+ CSVReader reader = new CSVReader(inputStreamReader, '\t');
+ String [] nextLine = reader.readNext();
+
+
+ while ((nextLine = reader.readNext()) != null) {
+ if (nextLine.length == 0){
+ continue;
+ }
+ result.add(nextLine);
+ }
+ return result;
+ } catch (Exception e) {
+ logger.error(e + " " + e.getCause() + " " + e.getMessage());
+ for(StackTraceElement ste : e.getStackTrace()) {
+ logger.error(ste);
+ }
+ throw new RuntimeException(e);
+ }
+ }
+
+
+
+
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ try {
+ DipteraCollectionImport collectionImport = new DipteraCollectionImport();
+ collectionImport.invoke(cdmDestination);
+// String titleCache = "Peru. Mouth of Rio Pachitea. ST 2R SMT. [fig. of male abdomen]";
+// String collectionCode = collectionImport.getCollectionCode(titleCache);
+// System.out.println(collectionCode);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.exit(-1);
+ }
+ }
+
+}