Added 'limitSave' to set/get an upper limit amount of taxa to be saved at once (simil...
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / out / BerlinModelTaxonomicTreeExport.java
1 /**
2 * Copyright (C) 2007 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.berlinModel.out;
10
11 import java.sql.SQLException;
12 import java.sql.Types;
13 import java.util.List;
14
15 import org.apache.log4j.Logger;
16 import org.springframework.stereotype.Component;
17 import org.springframework.transaction.TransactionStatus;
18
19 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.CreatedAndNotesMapper;
20 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbConstantMapper;
21 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.DbObjectMapper;
22 import eu.etaxonomy.cdm.io.berlinModel.out.mapper.MethodMapper;
23 import eu.etaxonomy.cdm.io.common.DbExportStateBase;
24 import eu.etaxonomy.cdm.model.common.CdmBase;
25 import eu.etaxonomy.cdm.model.common.RelationshipBase;
26 import eu.etaxonomy.cdm.model.taxon.ITreeNode;
27 import eu.etaxonomy.cdm.model.taxon.Taxon;
28 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
29 import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
30
31
32 /**
33 * @author a.mueller
34 * @created 20.03.2008
35 * @version 1.0
36 */
37 @Component
38 public class BerlinModelTaxonomicTreeExport extends BerlinModelExportBase<RelationshipBase> {
39 private static final Logger logger = Logger.getLogger(BerlinModelTaxonomicTreeExport.class);
40
41 private static int modCount = 1000;
42 private static final String dbTableName = "RelPTaxon";
43 private static final String pluralString = "TaxonNodes";
44 private static final Class<? extends CdmBase> standardMethodParameter = TaxonNode.class;
45
46
47 public BerlinModelTaxonomicTreeExport(){
48 super();
49 }
50
51 /* (non-Javadoc)
52 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
53 */
54 @Override
55 protected boolean doCheck(BerlinModelExportState state){
56 boolean result = true;
57 logger.warn("Checking for " + pluralString + " not yet implemented");
58 //result &= checkArticlesWithoutJournal(bmiConfig);
59 //result &= checkPartOfJournal(bmiConfig);
60
61 return result;
62 }
63
64 private BerlinModelExportMapping getMapping(){
65 String tableName = dbTableName;
66 BerlinModelExportMapping mapping = new BerlinModelExportMapping(tableName);
67 // mapping.addMapper(IdMapper.NewInstance("RelPTaxonId")); //is Identity column
68
69 mapping.addMapper(MethodMapper.NewInstance("PTNameFk1", this.getClass(), "getPTNameFk1", standardMethodParameter, DbExportStateBase.class));
70 mapping.addMapper(MethodMapper.NewInstance("PTRefFk1", this.getClass(), "getPTRefFk1", standardMethodParameter, DbExportStateBase.class));
71
72 mapping.addMapper(MethodMapper.NewInstance("PTNameFk2", this.getClass(), "getPTNameFk2", standardMethodParameter, DbExportStateBase.class));
73 mapping.addMapper(MethodMapper.NewInstance("PTRefFk2", this.getClass(), "getPTRefFk2", standardMethodParameter, DbExportStateBase.class));
74
75 mapping.addMapper(DbConstantMapper.NewInstance("RelQualifierFk", Types.INTEGER, 1));
76
77 mapping.addMapper(DbObjectMapper.NewInstance("referenceForParentChildRelation", "RelRefFk"));
78 // mapping.addMapper(RefDetailMapper.NewInstance("citationMicroReference","citation", "FactRefDetailFk"));
79 mapping.addMapper(CreatedAndNotesMapper.NewInstance());
80
81 return mapping;
82 }
83
84 protected boolean doInvoke(BerlinModelExportState state){
85 if (state.getConfig().isUseTaxonomicTree() == false){
86 return true;
87 }
88
89 try{
90 logger.info("start make " + pluralString + " ...");
91 boolean success = true ;
92 doDelete(state);
93
94 TransactionStatus txStatus = startTransaction(true);
95
96 List<TaxonomicTree> list = getTaxonTreeService().list(null,10000000,0,null,null);
97
98 BerlinModelExportMapping mapping = getMapping();
99 mapping.initialize(state);
100
101 int count = 0;
102 for (TaxonomicTree tree : list){
103 for (TaxonNode node : tree.getAllNodes()){
104 if (node.getParent() == null){
105 continue;
106 }else{
107 doCount(count++, modCount, pluralString);
108 success &= mapping.invoke(node);
109 }
110 }
111 }
112 commitTransaction(txStatus);
113 logger.info("end make " + pluralString + " ..." + getSuccessString(success));
114 return success;
115 }catch(SQLException e){
116 e.printStackTrace();
117 logger.error(e.getMessage());
118 return false;
119 }
120 }
121
122
123 protected boolean doDelete(BerlinModelExportState state){
124 BerlinModelExportConfigurator bmeConfig = state.getConfig();
125
126 //already deleted in BerlinModelTaxonRelationExport
127 // String sql;
128 // Source destination = bmeConfig.getDestination();
129 // //RelPTaxon
130 // sql = "DELETE FROM RelPTaxon ";
131 // destination.setQuery(sql);
132 // destination.update(sql);
133
134 return true;
135 }
136
137
138 /* (non-Javadoc)
139 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
140 */
141 protected boolean isIgnore(BerlinModelExportState state){
142 return ! state.getConfig().isDoTaxonNames();
143 }
144
145 //called by MethodMapper
146
147 @SuppressWarnings("unused")
148 private static Integer getPTNameFk1(TaxonNode node, DbExportStateBase<?> state){
149 return getObjectFk(node, state, true, true);
150 }
151
152 @SuppressWarnings("unused")
153 private static Integer getPTRefFk1(TaxonNode node, DbExportStateBase<?> state){
154 return getObjectFk(node, state, false, true);
155 }
156
157 @SuppressWarnings("unused")
158 private static Integer getPTNameFk2(TaxonNode node, DbExportStateBase<?> state){
159 return getObjectFk(node, state, true, false);
160 }
161
162 @SuppressWarnings("unused")
163 private static Integer getPTRefFk2(TaxonNode node, DbExportStateBase<?> state){
164 return getObjectFk(node, state, false, false);
165 }
166
167 private static Integer getObjectFk(TaxonNode node, DbExportStateBase<?> state, boolean isName, boolean isFrom){
168 ITreeNode treeNode = (isFrom) ? node : node.getParent();
169 if (treeNode instanceof TaxonNode){
170 Taxon taxon = ((TaxonNode) treeNode).getTaxon();
171 CdmBase cdmBase = (isName) ? taxon.getName(): taxon.getSec();
172 return state.getDbId(cdmBase);
173 }
174 logger.warn("No taxon or parent taxon found for taxon node: " + node.toString());
175 return null;
176 }
177
178
179 /* (non-Javadoc)
180 * @see eu.etaxonomy.cdm.io.berlinModel.out.BerlinModelExportBase#getStandardMethodParameter()
181 */
182 @Override
183 public Class<? extends CdmBase> getStandardMethodParameter() {
184 return standardMethodParameter;
185 }
186 }