perform-service_broken/src/main/java/org/gcube/application/perform/service/engine/model/importer/CSVRecordConverter.java

105 lines
2.8 KiB
Java

package org.gcube.application.perform.service.engine.model.importer;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.gcube.application.perform.service.engine.model.DBField;
public class CSVRecordConverter {
private Map<String,DBField> labels;
public CSVRecordConverter(Map<String, DBField> labels) {
super();
this.labels = labels;
}
private Map<String,Map<String,String>> mappings=new HashMap<>();
private Map<DBField,Set<? extends Object>> condition=new HashMap<>();
// private Set<String> conditionValues=new HashSet<>();
private boolean isAlwaysMap=false;
private ResultSetMetaData rsMeta=null;
public Object[] convert(ResultSet rs)throws SQLException{
if(rsMeta==null)rsMeta=rs.getMetaData();
Object[] toReturn=new Object[rsMeta.getColumnCount()];
if(mappingCondition(rs)) return map(rs,toReturn);
else
for(int i=0;i<toReturn.length;i++)
toReturn[i]=rs.getObject(i+1);
return toReturn;
}
public void setMapping(String field, Map<String,String> mapping) {
String actualFieldName=labels.get(field).getFieldName();
actualFieldName=actualFieldName.substring(1, actualFieldName.length()-1);
mappings.put(actualFieldName, mapping);
}
// public void setCondition(String field, Set<String> values) {
// this.conditionField=labels.get(field).getFieldName();
// conditionField=conditionField.substring(1, conditionField.length()-1);
// this.conditionValues=values;
// }
public void addCondition(DBField conditionField,Set<? extends Object> values) {
String label=labels.get(conditionField.getFieldName()).getFieldName();
DBField labelledField=new DBField(conditionField.getType(),label.replace("\"",""));
this.condition.put(labelledField, values);
}
public void setAlwaysMap(boolean isAlwaysMap) {
this.isAlwaysMap = isAlwaysMap;
}
public void reset() {
rsMeta=null;
}
private boolean mappingCondition(ResultSet rs) throws SQLException{
// Optimized pass-all
if(isAlwaysMap) return true;
// DefaultBehaviour
if(condition.isEmpty()) return false;
else {
for(Entry<DBField,Set<? extends Object>> entry:condition.entrySet()) {
Object obj=rs.getObject(entry.getKey().getFieldName());
if(!entry.getValue().contains(obj)) return false;
}
return true;
}
}
private Object[] map(ResultSet rs,Object[] toReturn) throws SQLException{
for(int i=0;i<toReturn.length;i++) {
toReturn[i]=rs.getObject(i+1);
String field=rsMeta.getColumnName(i+1);
if(mappings.containsKey(field)) {
Map<String,String> fieldMapping=mappings.get(field);
String value=rs.getString(i+1);
if(value!=null&&fieldMapping.containsKey(value))
toReturn[i]=fieldMapping.get(value);
}
}
return toReturn;
}
}