View Javadoc

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   
10  package eu.etaxonomy.cdm.io.berlinModel.in;
11  
12  import java.sql.ResultSet;
13  import java.sql.SQLException;
14  import java.util.Collection;
15  import java.util.HashMap;
16  import java.util.Map;
17  import java.util.Set;
18  
19  import org.apache.log4j.Logger;
20  import org.springframework.stereotype.Component;
21  
22  import eu.etaxonomy.cdm.common.CdmUtils;
23  import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelRefDetailImportValidator;
24  import eu.etaxonomy.cdm.io.common.IImportConfigurator;
25  import eu.etaxonomy.cdm.io.common.IOValidator;
26  import eu.etaxonomy.cdm.io.common.ImportHelper;
27  import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28  import eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES;
29  import eu.etaxonomy.cdm.model.common.CdmBase;
30  import eu.etaxonomy.cdm.model.reference.ReferenceBase;
31  import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
32  
33  /**
34   * This class imports all preliminary refdetails as generic references. Non preliminary 
35   * refdetails are imported as microcitation together with the record using the refdetail
36   * and therefore left out here.
37   *  
38   * @author a.mueller
39   * @created 20.03.2008
40   * @version 1.0
41   */
42  @Component
43  public class BerlinModelRefDetailImport extends BerlinModelImportBase {
44  	private static final Logger logger = Logger.getLogger(BerlinModelRefDetailImport.class);
45  
46  	public static final String NOM_REFDETAIL_NAMESPACE = "NomRefDetail";
47  	public static final String BIBLIO_REFDETAIL_NAMESPACE = "BiblioRefDetail";
48  	ReferenceFactory refFactory;
49  	
50  	
51  	
52  	private int modCount = 1000;
53  	private static final String pluralString = "ref-details";
54  	private static final String dbTableName = "RefDetail";
55  
56  	
57  	public BerlinModelRefDetailImport(){
58  		super();
59  	}
60  	
61  	
62  	//type to count the references nomReferences that have been created and saved
63  	private class RefCounter{
64  		RefCounter() {nomRefCount = 0; biblioRefCount = 0;};
65  		int nomRefCount;
66  		int biblioRefCount;
67  		public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(biblioRefCount);};
68  	}
69  
70  	
71  	
72  	/* (non-Javadoc)
73  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
74  	 */
75  	@Override
76  	protected String getIdQuery() {
77  		String strQuery = " SELECT RefDetail.RefDetailId " +
78          	" FROM RefDetail " +
79          	" WHERE (RefDetail.PreliminaryFlag = 1)";
80  		return strQuery;
81  	}
82  
83  
84  	/* (non-Javadoc)
85  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
86  	 */
87  	@Override
88  	protected String getRecordQuery(BerlinModelImportConfigurator config) {
89  		String strQuery = 
90  			" SELECT RefDetail.*, Reference.RefYear " +
91              " FROM RefDetail " +
92              	" INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
93              " WHERE (RefDetail.refDetailId IN (" + ID_LIST_TOKEN + ")) AND " + 
94              	" (RefDetail.PreliminaryFlag = 1)";
95  		return strQuery;  
96  	}
97  
98  
99  	/* (non-Javadoc)
100 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
101 	 */
102 	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
103 		boolean success = true;
104 		logger.info("start make " + getPluralString() + " ...");
105 		
106 		BerlinModelImportConfigurator config = state.getConfig(); 
107 		Map<Integer, ReferenceBase> biblioRefDetailsToSave = new HashMap<Integer, ReferenceBase>();
108 		Map<Integer, ReferenceBase> nomRefDetailsToSave =  new HashMap<Integer, ReferenceBase>();
109 		
110 		ResultSet rs = partitioner.getResultSet();
111 		
112 		try {
113 			int i = 0;
114 			RefCounter refCounter  = new RefCounter();
115 			while (rs.next()){
116 				
117 				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RefDetails handled: " + (i-1) );}
118 				int refDetailId = rs.getInt("refDetailId"); 
119 				String refYear = rs.getString("RefYear"); 
120 				
121 				//nomRef
122 				String fullNomRefCache = rs.getString("fullNomRefCache"); 
123 				if ( CdmUtils.isNotEmpty(fullNomRefCache) ){
124 					ReferenceBase genericReference = refFactory.newGeneric();
125 					genericReference.setTitleCache(fullNomRefCache, true);
126 					nomRefDetailsToSave.put(refDetailId, genericReference);
127 					//year
128 					genericReference.setDatePublished(ImportHelper.getDatePublished(refYear)); 
129 					//refId, created, notes
130 					doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, NOM_REFDETAIL_NAMESPACE );						
131 					refCounter.nomRefCount++;
132 				}	
133 				
134 				//biblioRef
135 				String fullRefCache = rs.getString("fullRefCache"); 
136 				if ( CdmUtils.isNotEmpty(fullRefCache) && ! fullRefCache.equals(fullNomRefCache)){
137 					ReferenceBase genericReference = refFactory.newGeneric();
138 					genericReference.setTitleCache(fullRefCache, true);
139 					biblioRefDetailsToSave.put(refDetailId, genericReference);
140 					//year
141 					genericReference.setDatePublished(ImportHelper.getDatePublished(refYear)); 
142 					//refId, created, notes
143 					doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, BIBLIO_REFDETAIL_NAMESPACE );						
144 					refCounter.biblioRefCount++;
145 				}
146 			}
147 			//save and store in map
148 			logger.info("Save nomenclatural preliminary references (" + refCounter.nomRefCount + ")");
149 			partitioner.startDoSave();
150 			Collection<ReferenceBase> col = nomRefDetailsToSave.values();
151 			getReferenceService().save(col);
152 			logger.info("Save bibliographical preliminary references (" + refCounter.biblioRefCount +")");
153 			getReferenceService().save(biblioRefDetailsToSave.values());
154 			
155 			//TODO
156 			//SecondarySources
157 			//IdInSource
158 
159 		} catch (SQLException e) {
160 			logger.error("SQLException:" +  e);
161 			return false;
162 		}
163 		return success;
164 	}
165 
166 
167 
168 	/* (non-Javadoc)
169 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
170 	 */
171 	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
172 		String nameSpace;
173 		Class cdmClass;
174 		Set<String> idSet;
175 		
176 		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
177 		
178 		//no related objects needed 
179 
180 		return result;
181 	}
182 	
183 	/* (non-Javadoc)
184 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
185 	 */
186 	@Override
187 	protected boolean doCheck(BerlinModelImportState state){
188 		IOValidator<BerlinModelImportState> validator = new BerlinModelRefDetailImportValidator();
189 		return validator.validate(state);
190 	}
191 	
192 	
193 	/* (non-Javadoc)
194 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
195 	 */
196 	@Override
197 	protected String getTableName() {
198 		return dbTableName;
199 	}
200 
201 	/* (non-Javadoc)
202 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
203 	 */
204 	@Override
205 	public String getPluralString() {
206 		return pluralString;
207 	}
208 	
209 	/* (non-Javadoc)
210 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
211 	 */
212 	protected boolean isIgnore(BerlinModelImportState state){
213 		DO_REFERENCES doReference = state.getConfig().getDoReferences();
214 		return (doReference == IImportConfigurator.DO_REFERENCES.NONE || doReference == IImportConfigurator.DO_REFERENCES.CONCEPT_REFERENCES);
215 	}
216 
217 }