Code:
package test.tools.vogenerator;
import java.io.File;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeMap;
import org.apache.log4j.Logger;
import org.springframework.jdbc.core.RowMapper;
public class GenericVo implements RowMapper {
private Object voUnderTest;
Logger logger = Logger.getLogger(GenericVo.class);
private Map colMap = new TreeMap();
private Set nonNullableTypes;
private String tablename;
/**
* This was the original intent of the tool, insuring that the VO under test
* had getters and setters that reflected the types in the database.
*/
public Object getById(String pkName, Object pkValue, Class voClass) throws Exception{
logger.debug("in getById");
voUnderTest = voClass.newInstance();
List list = null;
String classname = voClass.getName();
String tablename = classname.substring(classname.lastIndexOf(".")+1);
String sql = "SELECT * FROM " + tablename + " where " + pkName + " = '" + pkValue + "'";
logger.debug("sql: " + sql);
//list = getJdbcTemplate().query(sql, this);
return list.get(0);
}
public void setTableName(String tablename){
this.tablename = tablename.toUpperCase();
}
public void reset(){
colMap.clear();
}
public Object mapRow(ResultSet rs, int rownum) throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
int colcnt = metaData.getColumnCount();
for (int i = 1; i <= colcnt; i++){
String colname = metaData.getColumnName(i).toUpperCase();
String colclassname = metaData.getColumnClassName(i);
int isnullable = metaData.isNullable(i);
colMap.put(colname, colclassname);
logger.debug(colname + " " + colclassname + " isNullable: " + isnullable);
}
return null;
}
public void outputColNames(File path, String pkg, boolean includeTryCatch){
PrintWriter writer=null;
try{
String classname = makeName(tablename);
File fullpath = new File(path,pkg.replace('.','/'));
logger.info("fullpath: " + fullpath );
fullpath.mkdirs();
File file = new File(fullpath,classname + ".java");
writer = new PrintWriter(file);
writer.println("package " + pkg + ";");
writer.println();
writer.println("import java.sql.Date;");
writer.println("import java.sql.ResultSet;");
writer.println("import java.sql.Timestamp;");
writer.println("import java.sql.SQLException;");
writer.println("import java.math.BigDecimal;");
writer.println("import java.io.Serializable;");
writer.println("import org.springframework.jdbc.core.support.JdbcDaoSupport;");
writer.println("import org.springframework.jdbc.core.RowMapper;");
writer.println();
writer.println("public class " + classname + " extends JdbcDaoSupport implements Serializable, RowMapper {");
writer.println();
writer.flush();
//print the Static Names
writer.println("\tpublic static final String TABLENAME " + " = \"" + tablename + "\"; " );
for (Iterator keys = colMap.keySet().iterator(); keys.hasNext();){
String colname = (String)keys.next();
writer.println("\tpublic static final String " + colname + " = \"" + colname + "\"; " );
}
writer.println();
writer.flush();
//print the private vars
for (Iterator keys = colMap.keySet().iterator(); keys.hasNext();){
String colname = (String)keys.next();
String varname = makeVarName(colname);
String coltype = (String)colMap.get(colname);
coltype = coltype.substring(coltype.lastIndexOf(".")+1);
//private BigDecimal something;
writer.println("\tprivate " + coltype + " " + varname + ";" );
}
//print the private vars predicates
writer.println();
writer.flush();
for (Iterator keys = colMap.keySet().iterator(); keys.hasNext();){
String colname = makeVarName((String)keys.next());
//private BigDecimal something;
writer.println("\tprivate boolean " + colname + "Set = false;" );
}
//print the getters and setters
writer.println();
writer.flush();
for (Iterator keys = colMap.keySet().iterator(); keys.hasNext();){
String colname = (String)keys.next();
String methodName = makeName(colname);
String varName = makeVarName(colname);
String coltype = (String)colMap.get(colname);
coltype = coltype.substring(coltype.lastIndexOf(".")+1);
//private BigDecimal something;
writer.println("\tpublic " + coltype + " get" + methodName + "(){ return this." + varName + ";}" );
writer.println("\tpublic void set" + methodName + "( " + coltype + " " + varName + "){ this."
+ varName + "=" + varName + "; " + varName + "Set = true; }" );
writer.println("\tpublic boolean is" + methodName + "Set(){ return this." + varName + "Set;}" );
writer.println();
}
writer.flush();
writer.println("\tpublic Object mapRow(ResultSet rs, int rownum) throws SQLException {");
writer.println("\t\t"+classname + " vo = new " + classname + "();" );
for (Iterator keys = colMap.keySet().iterator(); keys.hasNext();){
String colname = (String)keys.next();
String methodName = makeName(colname);
String varName = makeVarName(colname);
String coltype = (String)colMap.get(colname);
String constantName = classname + "." + colname;
coltype = coltype.substring(coltype.lastIndexOf(".")+1);
writer.println("\t\ttry{");
if (nonNullableTypes.contains(coltype)){
writer.println("\t\t\tString tmp = rs.getString(" + constantName + ");" );
writer.println("\t\t\tif (tmp != null){ " );
writer.println("\t\t\t\tvo.set" + methodName + "( new " + coltype + "( tmp ));" );
writer.println("\t\t\t}" );
}else{
writer.println("\t\t\tvo.set" + methodName + "( rs.get" + coltype + "(" + constantName + "));" );
}
writer.println("\t\t\t" + varName + "Set = true;");
writer.println("\t\t}catch(SQLException e){}");
}
writer.println("\t\treturn vo;");
writer.println("\t}");
writer.println("}");
writer.println();
writer.flush();
} catch(Exception e){
e.printStackTrace();
} finally{
try{
writer.flush();
writer.close();
}
catch(Exception e1){}
}
}
private String makeVarName(String rawName){
StringTokenizer st = new StringTokenizer(rawName.toLowerCase(), "_");
String name = st.nextToken();
while (st.hasMoreTokens()){
String segment = st.nextToken();
String first = String.valueOf(segment.charAt(0)).toUpperCase();
String rest = segment.substring(1);
name = name.concat(first + rest);
}
return name;
}
private String makeName(String rawName){
StringTokenizer st = new StringTokenizer(rawName.toLowerCase(), "_");
String name ="";
while (st.hasMoreTokens()){
String segment = st.nextToken();
String first = String.valueOf(segment.charAt(0)).toUpperCase();
String rest = segment.substring(1);
name = name.concat(first + rest);
}
return name;
}
public Set getNonNullableTypes() {
return nonNullableTypes;
}
public void setNonNullableTypes(Set nullTypeMap) {
this.nonNullableTypes = nullTypeMap;
}
}