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   package eu.etaxonomy.cdm.io.berlinModel.in;
10  
11  import java.sql.ResultSet;
12  import java.sql.SQLException;
13  import java.util.HashMap;
14  import java.util.HashSet;
15  import java.util.Map;
16  import java.util.Set;
17  
18  import org.apache.log4j.Logger;
19  import org.springframework.stereotype.Component;
20  
21  import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelWebMarkerImportValidator;
22  import eu.etaxonomy.cdm.io.common.ICdmIO;
23  import eu.etaxonomy.cdm.io.common.IOValidator;
24  import eu.etaxonomy.cdm.io.common.MapWrapper;
25  import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
26  import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
27  import eu.etaxonomy.cdm.model.common.CdmBase;
28  import eu.etaxonomy.cdm.model.common.DefinedTermBase;
29  import eu.etaxonomy.cdm.model.common.Marker;
30  import eu.etaxonomy.cdm.model.common.MarkerType;
31  import eu.etaxonomy.cdm.model.taxon.Taxon;
32  import eu.etaxonomy.cdm.model.taxon.TaxonBase;
33  
34  
35  /**
36   * @author a.mueller
37   * @created 20.03.2008
38   * @version 1.0
39   */
40  @Component
41  public class BerlinModelWebMarkerImport extends BerlinModelImportBase {
42  	private static final Logger logger = Logger.getLogger(BerlinModelWebMarkerImport.class);
43  
44  	private static int modCount = 2000;
45  	private static final String dbTableName = "webMarker";
46  	private static final String pluralString = "markers";
47  	
48  	public BerlinModelWebMarkerImport(){
49  		super();
50  	}
51  	
52  	
53  	/* (non-Javadoc)
54  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
55  	 */
56  	@Override
57  	protected String getIdQuery() {
58  		return " SELECT markerId FROM " + getTableName();
59  	}
60  
61  	/* (non-Javadoc)
62  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
63  	 */
64  	@Override
65  	protected String getRecordQuery(BerlinModelImportConfigurator config) {
66  		String strQuery = 
67  			" SELECT *  " +
68              " FROM webMarker INNER JOIN webTableName ON webMarker.TableNameFk = webTableName.TableNameId " +
69              " WHERE (markerId IN ("+ ID_LIST_TOKEN + ") )";
70  		return strQuery;
71  
72  	}
73  
74  	/* (non-Javadoc)
75  	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
76  	 */
77  	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
78  		boolean success = true ;
79  	
80  		MapWrapper<Taxon> taxonMap = (MapWrapper<Taxon>)state.getStore(ICdmIO.TAXON_STORE);
81  		Set<TaxonBase> taxaToBeSaved = new HashSet<TaxonBase>(); 
82  		
83  		Map<String, DefinedTermBase> definedTermMap = state.getDbCdmDefinedTermMap();
84  		ResultSet rs = partitioner.getResultSet();
85  		
86  		int i = 0;
87  		//for each reference
88  		try{
89  			while (rs.next()){
90  				try{
91  					if ((i++ % modCount ) == 0 && i!= 1 ){ logger.info(""+pluralString+" handled: " + (i-1));}
92  					//
93  					int markerId = rs.getInt("MarkerId");
94  					int markerCategoryFk = rs.getInt("MarkerCategoryFk");
95  					int rIdentifierFk = rs.getInt("RIdentifierFk");
96  					String tableName = rs.getString("TableName");
97  					Boolean activeFlag = rs.getBoolean("ActiveFlag");
98  					
99  					AnnotatableEntity annotatableEntity;
100 					if ("PTaxon".equals(tableName)){
101 						TaxonBase<?> taxon = taxonMap.get(String.valueOf(rIdentifierFk));
102 						if (taxon != null){
103 							annotatableEntity = taxon;
104 							taxaToBeSaved.add(taxon);
105 							addMarker(annotatableEntity, activeFlag, markerCategoryFk, definedTermMap);
106 						}else{
107 							logger.warn("TaxonBase (RIdentifier " + rIdentifierFk + ") could not be found for marker " + markerId);
108 						}
109 					}else{
110 						logger.warn("Marker for table " + tableName + " not yet implemented.");
111 						success = false;
112 					}
113 					
114 					
115 				}catch(Exception ex){
116 					logger.error(ex.getMessage());
117 					ex.printStackTrace();
118 					success = false;
119 				}
120 			} //while rs.hasNext()
121 		} catch (SQLException e) {
122 			logger.error("SQLException:" +  e);
123 			return false;
124 		}
125 
126 		logger.info("save " + i + " "+pluralString + " ...");
127 		getTaxonService().save(taxaToBeSaved);
128 		return success;
129 	}
130 		
131 
132 	/* (non-Javadoc)
133 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
134 	 */
135 	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
136 		String nameSpace;
137 		Class cdmClass;
138 		Set<String> idSet;
139 		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
140 		
141 		try{
142 			Set<String> taxonIdSet = new HashSet<String>();
143 			while (rs.next()){
144 				int tableNameId = rs.getInt("TableNameFk");
145 				if (tableNameId != 500){
146 					//TODO
147 					logger.warn("A marker is not related to table PTaxon. This case is not handled yet!");
148 				}else{
149 					handleForeignKey(rs, taxonIdSet, "RIdentifierFk");
150 	}
151 			}
152 	
153 			//taxon map
154 			nameSpace = BerlinModelTaxonImport.NAMESPACE;
155 			cdmClass = TaxonBase.class;
156 			idSet = taxonIdSet;
157 			Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
158 			result.put(nameSpace, taxonMap);
159 			
160 		} catch (SQLException e) {
161 			throw new RuntimeException(e);
162 		}
163 		return result;
164 	}
165 
166 	
167 	private boolean addMarker(AnnotatableEntity annotatableEntity, boolean activeFlag, int markerCategoryFk, Map<String, DefinedTermBase> map ){
168 		MarkerType markerType = (MarkerType)map.get("webMarkerCategory_" + markerCategoryFk);
169 		if (markerType == null){
170 			logger.warn("MarkerType not found: " + markerCategoryFk);
171 		}
172 		Marker marker = Marker.NewInstance(markerType, activeFlag);
173 		annotatableEntity.addMarker(marker);
174 		return true;
175 
176 	}
177 	
178 	
179 	/* (non-Javadoc)
180 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
181 	 */
182 	@Override
183 	protected boolean doCheck(BerlinModelImportState state){
184 		IOValidator<BerlinModelImportState> validator = new BerlinModelWebMarkerImportValidator();
185 		return validator.validate(state);
186 	}
187 	
188 	
189 	/* (non-Javadoc)
190 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
191 	 */
192 	@Override
193 	protected String getTableName() {
194 		return dbTableName;
195 	}
196 	
197 	/* (non-Javadoc)
198 	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
199 	 */
200 	@Override
201 	public String getPluralString() {
202 		return pluralString;
203 	}
204 	
205 	/* (non-Javadoc)
206 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
207 	 */
208 	protected boolean isIgnore(BerlinModelImportState state){
209 		return ! state.getConfig().isDoMarker();
210 	}
211 
212 
213 }