(no commit message)
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / init / TermLoader.java
1 package eu.etaxonomy.cdm.model.common.init;
2
3 import java.io.FileNotFoundException;
4 import java.io.InputStream;
5 import java.io.InputStreamReader;
6 import java.util.ArrayList;
7 import java.util.Map;
8 import java.util.UUID;
9
10 import org.apache.log4j.Logger;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Component;
13 import org.springframework.transaction.annotation.Transactional;
14
15 import au.com.bytecode.opencsv.CSVReader;
16 import au.com.bytecode.opencsv.CSVWriter;
17 import eu.etaxonomy.cdm.common.CdmUtils;
18
19 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
20 import eu.etaxonomy.cdm.model.common.IDefTerm;
21 import eu.etaxonomy.cdm.model.common.Language;
22 import eu.etaxonomy.cdm.model.common.NoDefinedTermClassException;
23 import eu.etaxonomy.cdm.model.common.TermVocabulary;
24 import eu.etaxonomy.cdm.model.location.Continent;
25 import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;
26 import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
27 import eu.etaxonomy.cdm.model.name.NameRelationshipType;
28 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
29 import eu.etaxonomy.cdm.model.name.Rank;
30 import eu.etaxonomy.cdm.model.name.TypeDesignationStatus;
31 import eu.etaxonomy.cdm.model.taxon.ConceptRelationshipType;
32 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
33
34 @Component
35 @Transactional(readOnly = false)
36 public class TermLoader {
37 private static final Logger logger = Logger.getLogger(TermLoader.class);
38
39 @Autowired
40 private IVocabularySaver vocabularySaver;
41
42 private static Map<UUID, DefinedTermBase> definedTermsMap;
43
44 public static void setDefinedTermsMap(Map<UUID, DefinedTermBase> dtm){
45 definedTermsMap = dtm;
46 }
47
48 // load a list of defined terms from a simple text file
49 // if isEnumeration is true an Enumeration for the ordered term list will be returned
50 @Transactional(readOnly = false)
51 public TermVocabulary<DefinedTermBase> loadTerms(Class<IDefTerm> termClass, String filename, boolean isEnumeration) throws NoDefinedTermClassException, FileNotFoundException {
52 TermVocabulary<DefinedTermBase> voc = new TermVocabulary<DefinedTermBase>(termClass.getCanonicalName(), termClass.getSimpleName(), termClass.getCanonicalName());
53 try {
54 String strResourceFileName = "terms" + CdmUtils.getFolderSeperator() + filename;
55 logger.debug("strResourceFileName is " + strResourceFileName);
56 InputStream inputStream = CdmUtils.getReadableResourceStream("terms" + CdmUtils.getFolderSeperator() + filename);
57 if (inputStream == null) {logger.debug("inputStream is null");}
58 CSVReader reader = new CSVReader(new InputStreamReader(inputStream));
59
60 String [] nextLine;
61 while ((nextLine = reader.readNext()) != null) {
62 // nextLine[] is an array of values from the line
63 IDefTerm term = termClass.newInstance();
64 ArrayList<String> aList = new ArrayList<String>(10);
65 for (String col : nextLine){
66 aList.add(col);
67 }
68 while (aList.size()<10){
69 aList.add("");
70 }
71 term.readCsvLine(aList);
72 term.setVocabulary(voc);
73 // save enumeration and all terms to DB
74 if (vocabularySaver != null){
75 vocabularySaver.saveOrUpdate(voc);
76 }else{
77 //e.g. in tests when no database connection exists
78 logger.debug("No dao exists. Vocabulary for class '" + termClass + "' could not be saved to database");
79 }
80 if (definedTermsMap != null){
81 DefinedTermBase defTermBase = (DefinedTermBase)term;
82 definedTermsMap.put(defTermBase.getUuid(), defTermBase);
83 }
84
85 }
86 } catch (Exception e) {
87 // TODO Auto-generated catch block
88 e.printStackTrace();
89 }
90 return voc;
91 }
92
93 public TermVocabulary loadDefaultTerms(Class termClass) throws NoDefinedTermClassException, FileNotFoundException {
94 return this.loadTerms(termClass, termClass.getSimpleName()+".csv", true);
95 }
96
97 public void loadAllDefaultTerms() throws FileNotFoundException, NoDefinedTermClassException{
98 // first insert default language english, its used everywhere even for Language!
99 //Language langEN = new Language("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
100 //dao.save(langEN);
101
102 logger.debug("load terms");
103 loadDefaultTerms(Language.class);
104 loadDefaultTerms(WaterbodyOrCountry.class);
105 loadDefaultTerms(Continent.class);
106 loadDefaultTerms(Rank.class);
107 loadDefaultTerms(TypeDesignationStatus.class);
108 loadDefaultTerms(NomenclaturalStatusType.class);
109 loadDefaultTerms(SynonymRelationshipType.class);
110 loadDefaultTerms(HybridRelationshipType.class);
111 loadDefaultTerms(NameRelationshipType.class);
112 loadDefaultTerms(ConceptRelationshipType.class);
113 logger.debug("terms loaded");
114 }
115
116
117 /******************* not in version 4.5 (cdmlib-model)*/
118
119 //
120 // public static void main(String[] args) {
121 // CdmApplicationController appCtr = new CdmApplicationController();
122 // TermLoader tl = (TermLoader) appCtr.applicationContext.getBean("termLoader");
123 // try {
124 // tl.loadAllDefaultTerms();
125 // } catch (Exception e) {
126 // // TODO Auto-generated catch block
127 // e.printStackTrace();
128 // }
129 // }
130 //
131 // public void loadAllDefaultTerms() throws FileNotFoundException, NoDefinedTermClassException{
132 // IVocabularySaver vocabularySaver = dao;
133 // loadAllDefaultTerms(vocabularySaver);
134 // }
135 }