Juguete generador de bean

JLanas
15 de Septiembre del 2003
Para los que les gusta "jugar", con las potencialidades de java, aquí les va un ejercicio para la generación de un frameworks que permite generar el modelo de beans de una aplicación X. Esta demás decir que algunas implementaciones de métodos los forcé en forma bizarra .. jejeje.

Espero sugerencias y/o consejos ... gracias.

Imaginemos que tenemos una aplicación que interactúa con una base de datos con 2 tablas.

Para este caso he creado un archivo denominado tablas.txt
>>>
# Mapping tablas - bean a crear

tabla1=employee
tabla2=product
>>>

De tal manera que, para la tabla empleado, por ejemplo, deseo generar el siguiente código java:

>>>
public class employee implements java.io.Serializable{
private String id;
private String name;
private String dept;
private String job;
private String hiredate;
private String salary;
private String comm;
public employee(){} public employee( String newId, String newName, String newDept, String newJob, String newHiredate, String newSalary, String newComm) {
id = newId;
name = newName;
dept = newDept;
job = newJob;
hiredate = newHiredate;
salary = newSalary;
comm = newComm;
}
public java.lang.String getId() {
return id;
}
public java.lang.String getName() {
return name;
}
public java.lang.String getDept() {
return dept;
}
public java.lang.String getJob() {
return job;
}
public java.lang.String getHiredate() {
return hiredate;
}
public java.lang.String getSalary() {
return salary;
}
public java.lang.String getComm() {
return comm;
}
public void setId(java.lang.String newId) {
id = newId;
}
public void setName(java.lang.String newName) {
name = newName;
}
public void setDept(java.lang.String newDept) {
dept = newDept;
}
public void setJob(java.lang.String newJob) {
job = newJob;
}
public void setHiredate(java.lang.String newHiredate) {
hiredate = newHiredate;
}
public void setSalary(java.lang.String newSalary) {
salary = newSalary;
}
public void setComm(java.lang.String newComm) {
comm = newComm;
}
public java.util.Vector getMappingColumnName() {
java.util.Vector vector = new java.util.Vector();
vector.addElement("ID");
vector.addElement("NAME");
vector.addElement("DEPT");
vector.addElement("JOB");
vector.addElement("HIREDATE");
vector.addElement("SALARY");
vector.addElement("COMM");
return vector;
}
public java.util.Vector getMappingDataType() {
java.util.Vector vector = new java.util.Vector();
vector.addElement("SMALLINT");
vector.addElement("VARCHAR");
vector.addElement("SMALLINT");
vector.addElement("CHARACTER");
vector.addElement("DATE");
vector.addElement("DECIMAL");
vector.addElement("DECIMAL");
return vector;
}
public java.util.Vector getMappingColumnDisplaySize() {
java.util.Vector vector = new java.util.Vector();
vector.addElement("6");
vector.addElement("9");
vector.addElement("6");
vector.addElement("5");
vector.addElement("10");
vector.addElement("9");
vector.addElement("9");
return vector;
}
}
>>>

He decidido que todos los atributos sean de tipo String, a posterior se podría implementar una clase que valide los tipos de datos.

El método getMappingColumnName almacena en un vector los nombres de los campos de la base de datos. El método getMappingDataType almacena el tipo del dato. El método getMappingColumnDisplaySize almacena el tamaño escalar del dato (Este método hay que refinarlo un poco).

>>
Clase AppCreateBean: Para crear el bean.java
>>
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class AppCreateBean extends CreateBean {
private static CreateBean createbean = new CreateBean();
static ResultSetMetaData metadata;
private static StringBuffer bean = new StringBuffer("");
private final static String EOL = "rn";
private static List tablas = new ArrayList();

private final static String path_escribe = "D:\pry\beans";

public AppCreateBean() {
super();
}
/**
* Funcion que crea un archivo
* */
public static boolean creafile(String archivo) {
try {
File file = new File(path_escribe, archivo);
// Create file if it does not exist
boolean success = file.createNewFile();
if (success) {
// File did not exist and was created
} else {
// File already exists
}
return (true);
} catch (IOException e) {
return (false);
}
}
public static void getTablas(List tablas) {
// Read properties file.
Properties properties = new Properties();
int i = 1;
try {
properties.load(new FileInputStream("D:\pry\beans\tablas.txt"));
while (properties.getProperty("tabla" + i) != null) {
tablas.add(properties.getProperty("tabla" + i));
i++;
}
} catch (IOException e) {
}
}
/**
* Inicia la aplicación.
* @param args una matriz de argumentos de línea de mandatos
*/
public static void main(java.lang.String[] args) {
Connection con = null;
String tablaName = "";
String archivo = "";

try {
con = Tools.DBConnect("DB", "usuario", "clave");
getTablas(tablas);
for (int j = 0; j < tablas.size(); j++) {
tablaName = tablas.get(j).toString();

metadata = createbean.getResultSetMetaData(con, tablaName);
bean.append(
"public class " + tablaName + " implements java.io.Serializable{" + EOL);
// crea variables privadas
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
" private String " + metadata.getColumnName(i).toLowerCase() + ";" + EOL);
}
// Crea constructor sin parametros de entrada
bean.append(" public " + tablaName + "(){}");
// Crea constructor con parametros de entrada
bean.append(" public " + tablaName + "(");
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
" String new"
+ metadata.getColumnName(i).substring(0, 1).toUpperCase()
+ metadata
.getColumnName(i)
.substring(1, metadata.getColumnName(i).length())
.toLowerCase());
if (i != metadata.getColumnCount()) {
bean.append(", ");
}
}
bean.append(") {" + EOL);
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
" "
+ metadata.getColumnName(i).toLowerCase()
+ " = new"
+ metadata.getColumnName(i).substring(0, 1).toUpperCase()
+ metadata
.getColumnName(i)
.substring(1, metadata.getColumnName(i).length())
.toLowerCase()
+ ";"
+ EOL);
}
bean.append(" }" + EOL);
// Creación de getter
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
"public java.lang.String get"
+ metadata.getColumnName(i).substring(0, 1).toUpperCase()
+ metadata
.getColumnName(i)
.substring(1, metadata.getColumnName(i).length())
.toLowerCase()
+ "() {"
+ EOL
+ " return "
+ metadata.getColumnName(i).toLowerCase()
+ ";"
+ EOL
+ "}"
+ EOL);
}
// Creación de setter
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
"public void set"
+ metadata.getColumnName(i).substring(0, 1).toUpperCase()
+ metadata
.getColumnName(i)
.substring(1, metadata.getColumnName(i).length())
.toLowerCase()
+ "(java.lang.String new"
+ metadata.getColumnName(i).substring(0, 1).toUpperCase()
+ metadata
.getColumnName(i)
.substring(1, metadata.getColumnName(i).length())
.toLowerCase()
+ ") {"
+ EOL
+ " "
+ metadata.getColumnName(i).toLowerCase()
+ " = new"
+ metadata.getColumnName(i).substring(0, 1).toUpperCase()
+ metadata
.getColumnName(i)
.substring(1, metadata.getColumnName(i).length())
.toLowerCase()
+ ";"
+ EOL
+ "}"
+ EOL);
}
// Creación de método getMappingColumnName
bean.append(
"public java.util.Vector getMappingColumnName() {"
+ EOL
+ " java.util.Vector vector = new java.util.Vector();"
+ EOL);
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
" vector.addElement(""
+ metadata.getColumnName(i).toUpperCase()
+ "");"
+ EOL
);
}
bean.append(
" return vector;"
+ EOL
+ "}"
+ EOL);
// Creación de método getMappingDataType
bean.append(
"public java.util.Vector getMappingDataType() {"
+ EOL
+ " java.util.Vector vector = new java.util.Vector();"
+ EOL);
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
" vector.addElement(""
+ metadata.getColumnTypeName(i).toUpperCase()
+ "");"
+ EOL
);
}
bean.append(
" return vector;"
+ EOL
+ "}"
+ EOL);
// Creación de método getMappingColumnDisplaySize
bean.append(
"public java.util.Vector getMappingColumnDisplaySize() {"
+ EOL
+ " java.util.Vector vector = new java.util.Vector();"
+ EOL);
for (int i = 1; i <= metadata.getColumnCount(); i++) {
bean.append(
" vector.addElement(""
+ metadata.getColumnDisplaySize(i)
+ "");"
+ EOL
);
}
bean.append(
" return vector;"
+ EOL
+ "}"
+ EOL);
// ...
bean.append("}" + EOL);

archivo = tablaName + ".java";
if (creafile(archivo))
writefile(path_escribe + "\" + archivo, bean.toString());
bean.delete(0, bean.length());
}
con.commit();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void writefile(String archivo, String texto) {
try {
BufferedWriter out = new BufferedWriter(new FileWriter(archivo));
out.write(texto);
out.close();
} catch (IOException e) {
}
}
}


>>
Clase CreateBean: Recupera el ResultSetMetaData.
>>
import java.io.*;
import java.lang.*;
import java.sql.*;

public class CreateBean {
protected ResultSet rs;
protected Statement stmt;
/**
* Comentario de constructor CreateBean.
*/
public CreateBean() {
super();
}
/**
* Inserte aquí la descripción del método.
* Fecha de creación: (05/30/2003 11:28:56)
* @return boolean
*/
public ResultSetMetaData getResultSetMetaData(Connection con, String tablaName) {
ResultSetMetaData metadata = null;
try {
stmt = con.createStatement();

rs = stmt.executeQuery ("SELECT * from "+tablaName+" fetch first 1 rows only");

metadata = rs.getMetaData();

} catch (Exception e) { e.printStackTrace(); }

return metadata;
}
}
>>

Así tenemos un pequeño generador de bean de datos basado en el mapping del modelo relacional definido en el archivo tablas.txt.

Me pregunto si al generar el bean employee.java, podría compilarlo en línea, aún mejor validar su sintaxis java y luego compilarlo en un .class.

Disculpas por lo burdo del ejemplo pero me pareció interesante el ejercicio.

Juan Carlos Lanas Ocampo.

un viejo amigo
15 de Septiembre del 2003
veo que aun te gusta meterte en las patas de las ovejas...(perdón caballos)