maia/.svn/pristine/7c/7c2c0d632ffa2bddebce6329ee4...

549 lines
21 KiB
Plaintext
Executable File

package com.fp.hbm.bgenerator;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.exception.DataException;
import com.fp.common.exception.APPException;
import com.fp.hbm.helper.HqlStatementHQL;
import com.fp.hbm.helper.PersistenceHelperHQL;
import com.fp.hbm.persistence.TgeneEntity;
import com.fp.hbm.persistence.TgeneFields;
import com.fp.persistence.commondb.exception.CommondbException;
public abstract class AbstractMapper {
/**Nombre de la clase*/
protected String class_name;
protected String entity;
protected String table;
protected String packageBase;
protected HBMapper parent;
protected List<AbstractColumn> columns;
protected List<AbstractColumn> primary;
protected List<AbstractColumn> notNullable;
protected List<Reference> references;
protected String createReferences;
protected String packageName;
protected boolean optimistic = false;
protected String sExtends = null;
protected String sImplements = null;
protected boolean history = false;
protected boolean inmanual = false;
protected boolean cache = false;
protected boolean log = false;
protected TgeneEntity ent = null;
public HBMapper getParent() {
return parent;
}
public void setParent(HBMapper pParent) {
parent = pParent;
}
protected void safe(String pData, String pPath, String pFile) throws IOException {
File f = new File(pPath);
f.mkdirs();
FileOutputStream fout = new FileOutputStream(pPath + "/" + pFile);
fout.write(pData.getBytes());
fout.close();
f = new File(pPath + "/" + pFile);
}
public abstract void safeEntity() throws IOException, APPException;
public String getEntity() {
return entity;
}
public void setEntity(String pEntity) throws HibernateException, CommondbException, ParseException, InstantiationException, IllegalAccessException,
ClassNotFoundException {
entity = pEntity;
try {
this.prepareEntity(pEntity);
} catch (CommondbException e) {
throw new CommondbException("HM00", "NO SE ENCONTRO LA TABLA {0}", this.table);
}
try {
this.findColumns();
} catch (DataException e) {
System.out.println("Error en el mapero de la Tabla " + this.table);
throw e;
}
}
public String getPackageBase() {
return packageBase;
}
public void setPackageBase(String pPackageBase) {
packageBase = pPackageBase;
this.packageName = packageBase;
}
public String getTable() {
return table;
}
public void setTable(String pTable) {
table = pTable;
}
@SuppressWarnings("unchecked")
protected void findColumns() throws HibernateException, CommondbException, InstantiationException, IllegalAccessException, ClassNotFoundException,
ParseException {
columns = new ArrayList<AbstractColumn>();
primary = new ArrayList<AbstractColumn>();
notNullable = new ArrayList<AbstractColumn>();
String sql = "select distinct t.COLUMN_NAME as NAME," + " t.DATA_TYPE as TYPE,"
+ " nvl(t.DATA_PRECISION ,t.DATA_LENGTH) as LENGTH,"
+ " t.DATA_PRECISION as PRECISION,"
+ " t.DATA_SCALE as SCALE,"
+ " t.NULLABLE as NULLABLE,"
+ " c.comments as COMMENTS,"
+ " (select distinct c2.position"
+ " from all_constraints c1, all_cons_columns c2"
+ " where c1.table_name = t.TABLE_NAME and c1.constraint_type = 'P' and"
+ " c2.constraint_name = c1.constraint_name and"
+ " c1.table_name = c2.table_name and"
+ " c2.column_name = c.column_name)as PK,"
/*+ " (select '1'"
+ " from all_constraints c1, all_cons_columns c2"
+ " where c1.table_name = t.TABLE_NAME and c1.constraint_type = 'R' and"
+ " c2.constraint_name = c1.constraint_name and" + " c1.table_name = c2.table_name and"
+ " c2.column_name = c.column_name ) as FK"*/
+ " '1' as FK "
+ " from all_tab_columns t, all_col_comments c"
+ " where t.TABLE_NAME = :table and t.TABLE_NAME = c.table_name and"
+ " t.COLUMN_NAME = c.column_name";
// + " order by PK,t.COLUMN_ID";
SQLQuery oSQL = PersistenceHelperHQL.getSession().createSQLQuery(sql);
oSQL.addScalar("NAME");
oSQL.addScalar("TYPE");
oSQL.addScalar("LENGTH", Hibernate.INTEGER);
oSQL.addScalar("PRECISION", Hibernate.INTEGER);
oSQL.addScalar("SCALE", Hibernate.INTEGER);
oSQL.addScalar("NULLABLE");
oSQL.addScalar("COMMENTS");
oSQL.addScalar("PK", Hibernate.INTEGER);
oSQL.addScalar("FK", Hibernate.INTEGER);
oSQL.setString("table", this.table);
List columnData = oSQL.list();
for (Object object : columnData) {
AbstractColumn mc = record2AbstractColumn(object, this.parent.getType());
if (!mc.isNullable()) {
this.notNullable.add(mc);
}
if (mc.isPk()) {
this.primary.add(mc);
} else {
columns.add(mc);
}
}
if ((this.createReferences != null) && (this.createReferences.compareTo("0") != 0)) {
String hql = "from com.fp.hbm.persistence.TgeneFields t where t.pk.tname=:table and t.pk.entity=:entity and t.fromdb='0' and t.fktname is not null";
if ((this.createReferences.compareTo("S") == 0) || (this.createReferences.compareTo("M") == 0)) {
hql += " and t.type='" + this.createReferences + "'";
}
HqlStatementHQL pst = new HqlStatementHQL(hql);
pst.setString("table", this.getEnt().getPk().getTname());
pst.setString("entity", this.getEnt().getPk().getEntity());
List<TgeneFields> fields = new ArrayList<TgeneFields>();
try {
fields = pst.getList();
} catch (CommondbException e) {
fields = new ArrayList<TgeneFields>();
}
this.references = new ArrayList<Reference>();
for (TgeneFields f : fields) {
this.references.add(new Reference(f, this.packageBase));
}
}
}
private AbstractColumn record2AbstractColumn(Object pRst, MappingType pType) throws InstantiationException, IllegalAccessException,
ClassNotFoundException, CommondbException {
AbstractColumn m = pType.getColumn();
m.setMapper(this);
m.setTable(this.table);
m.setPacBase(this.packageBase);
Object[] rec = (Object[]) pRst;
m.setName((String) rec[0]);
m.setType((String) rec[1]);
m.setLength((Integer) rec[2]);
m.setPrecision((Integer) rec[3]);
m.setScale((Integer) rec[4]);
m.setNullable(((String) rec[5]).compareTo("Y") == 0);
m.setComments((String) rec[6]);
Integer aux = (Integer) rec[7];
boolean bAux = false;
if ((aux != null) && (aux != 0)) {
bAux = true;
m.setPkOrder(aux);
}
m.setPk(bAux);
aux = (Integer) rec[8];
bAux = false;
if ((aux != null) && (aux != 0)) {
bAux = true;
}
m.setFk(bAux);
return m;
}
public String getCreateReferences() {
return createReferences;
}
public void setCreateReferences(String pCreateReferences) {
createReferences = pCreateReferences;
}
public boolean isHistory() {
return history;
}
public void setHistory(boolean pHistory) {
history = pHistory;
}
public boolean isOptimistic() {
return optimistic;
}
public void setOptimistic(boolean pOptimistic) {
optimistic = pOptimistic;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String pPackageName) {
packageName = pPackageName;
}
public String getSExtends() {
return sExtends;
}
public void setSExtends(String pExtends) {
sExtends = pExtends;
}
public String getSImplements() {
return sImplements;
}
public void setSImplements(String pImplements) {
sImplements = pImplements;
}
@SuppressWarnings("unchecked")
protected void prepareEntity(String pEntity) throws CommondbException, HibernateException, ParseException {
String hql = "from TgeneEntity p where p.pk.tname=:tname";
HqlStatementHQL stm = new HqlStatementHQL(hql);
stm.setString("tname", this.table);
List l = stm.getList();
Iterator it = l.iterator();
String sEntity = null;
String sPac = null;
String sProject = null;
if (it.hasNext()) {
ent = (TgeneEntity) it.next();
this.optimistic = (ent.getOptimisticlocking().compareTo("1") == 0);
this.createReferences = ent.getCreatereferences();
try {
this.history = (ent.getHistory().compareTo("1") == 0);
} catch (NullPointerException e) {
this.history = false;
}
try {
this.inmanual = (ent.getInmanual().compareTo("1") == 0);
} catch (NullPointerException e) {
this.inmanual = false;
}
try {
this.cache = (ent.getCache().compareTo("1") == 0);
} catch (NullPointerException e) {
this.cache = false;
}
try {
this.log = (ent.getLog().compareTo("1") == 0);
} catch (NullPointerException e) {
this.log = false;
}
sEntity = ent.getPk().getEntity();
sPac = ent.getPac();
sProject = ent.getProject();
this.sExtends = ent.getJavaextends();
if ((sExtends != null) && (sExtends.trim().compareTo("") == 0)) {
this.sExtends = null;
}
this.sImplements = ent.getJavaimplements();
if ((sImplements != null) && (sImplements.trim().compareTo("") == 0)) {
this.sImplements = null;
}
}
if (sEntity != null) {
this.entity = sEntity;
} else {
this.entity = pEntity.substring(0, 1).toUpperCase() + pEntity.substring(1).toLowerCase();
}
if (sPac != null) {
this.packageName += "." + sProject;
this.packageName += "." + sPac;
}
}
protected void formatClassCompare(PrintWriter pw) {
pw.println("public boolean equals(Object rhs){");
pw.println(" if (rhs == null)return false;");
pw.println(" if (! (rhs instanceof " + this.entity + "))return false;");
pw.println(" " + this.entity + " that = (" + this.entity + ") rhs;");
pw.println(" if (this.getPk() == null || that.getPk() == null)");
pw.println(" return false;");
pw.println(" return (this.getPk().equals(that.getPk()));");
pw.println("}");
}
protected void formatClassCloneable(PrintWriter pw) {
pw.println("/**Clona la entidad " + this.entity);
pw.println("@see com.fp.dto.hb.HibernateBean#cloneMe()");
pw.println("*/");
pw.println("public Object cloneMe() throws CloneNotSupportedException{");
pw.println(" " + this.entity + " p=(" + this.entity + ")this.clone();");
if (this.isKeyClassNeeded()) {
pw.println(" p.setPk((" + this.entity + "Key)this.pk.cloneMe());");
}
pw.println(" return p;");
pw.println("}");
}
public boolean isKeyClassNeeded() {
return (this.primary.size() > 1);
}
public String getKeyClasss() throws APPException {
String data = "";
if (!this.isKeyClassNeeded()) {
data = this.primary.get(0).getJavaSimple();
} else {
data = this.entity + "Key";
}
return data;
}
protected void formatHistoryNeededMethods(PrintWriter pw) {
pw.println("public Object getId() {");
pw.println(" return this.pk;");
pw.println("}");
}
protected void formatCreateInstance(PrintWriter pw) {
pw.println("/**Implementacion de la creacion de un bean en blanco " + this.entity);
pw.println("*/");
pw.println("public Object createInstance(){");
pw.println(" " + this.entity + " instance=new " + this.entity + "(); ");
if (this.isKeyClassNeeded()) {
pw.println(" instance.setPk(new " + this.entity + "Key());");
}
pw.println(" return instance;");
pw.println("}");
}
protected void formatToString(PrintWriter pw, String pPrefix) {
pw.println("/**Implementacion toString");
pw.println("*/");
pw.println("public String toString() {");
pw.println(" Field[]fs=this.getClass().getDeclaredFields();");
pw.println(" String data=\"\";");
pw.println(" for(Field f:fs){");
pw.println(" try{ ");
pw.println(" String name=f.getName();");
pw.println(" if(f.getType().getName().compareTo(\"java.util.Set\")==0)continue;");
pw.println(" if(name.compareTo(\"hashValue\")==0||name.compareTo(\"serialVersionUID\")==0)continue;");
pw.println(" data+=" + ((pPrefix.compareTo("") == 0) ? "" : "\"pk.\"+") + "name+\"=\"+f.get(this)+\";\";");
pw.println(" }catch(Exception e){");
pw.println(" continue;");
pw.println(" }");
pw.println(" }");
pw.println(" if(data.compareTo(\"\")==0){");
pw.println(" data=super.toString();");
pw.println(" }");
pw.println(" return data;");
pw.println(" }");
}
protected void formatClassHash(PrintWriter pw) {
pw.println("/**Implementacion del metodo hashCode de la la entidad " + this.entity);
pw.println("@return el hashCode la instancia");
pw.println("*/");
pw.println("public int hashCode() {");
pw.println(" if (this.hashValue == 0){");
pw.println(" int result = 17;");
pw.println(" if (this.getPk() == null){");
pw.println(" result = super.hashCode();");
pw.println(" }else{");
pw.println(" result = this.getPk().hashCode();");
pw.println(" }");
pw.println(" this.hashValue = result;");
pw.println(" }");
pw.println(" return this.hashValue;");
pw.println("}");
}
protected void createClassConstructor(PrintWriter pw) throws APPException {
pw.println("/**Contructor por defecto*/");
pw.println("public " + class_name + "(){");
//pw.println(" pcs.addPropertyChangeListener(this);");
pw.println("}");
pw.println("/**Contructor de " + class_name);
String parameters = this.getKeyClasss() + " pPk";
pw.println("@param pPk Clave Primaria del entity");
for (AbstractColumn mc : this.notNullable) {
if (mc.isPk()) {
continue;
}
mc.formatJavaDocParam(pw);
String name = mc.getName();
name = name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
String par = mc.getParameterFormat();
if (par.compareTo("") == 0) {
continue;
}
parameters += "," + par;
}
pw.println("*/");
pw.println("public " + class_name + "(" + parameters + "){");
pw.println(" this();");
pw.println(" pk=pPk;");
for (AbstractColumn mc : this.notNullable) {
if (mc.isPk()) {
continue;
}
mc.formatAsign(pw);
}
pw.println("}");
}
protected void createKeyConstructor(PrintWriter pw) throws APPException {
pw.println("/**Contructor por defecto*/");
pw.println("public " + this.entity + "Key(){}");
pw.println("/**Contructor de " + this.entity + "Key");
String parameters = "";
boolean first = true;
for (AbstractColumn mc : this.primary) {
mc.formatJavaDocParam(pw);
String name = mc.getName();
name = name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
String par = mc.getParameterFormat();
if (par.compareTo("") == 0) {
continue;
}
parameters += ((first) ? "" : ",") + par;
first = false;
}
pw.println("*/");
pw.println("public " + this.entity + "Key(" + parameters + "){");
for (AbstractColumn mc : this.primary) {
mc.formatAsign(pw);
}
pw.println("}");
}
/**
* Metodo que entrega datos de una sucursal definidos en TgeneBranch.
* @param pBranch Codigo de sucursal.
* @param pCompany Compania a la que pertenece la cuenta.
* @return TgeneBranch
* @throws Exception
*/
protected void addFindMethod(PrintWriter pw) {
pw.println("/**");
pw.println("* Metodo que entrega datos de la tabla dada la clave primaria.");
pw.println("* @param pEntityManager referencia de la session a obtener datos del bean.");
pw.println("* @param pKey Caleve primaria del bean.");
pw.println("* @return " + this.entity);
pw.println("*/");
pw.println("public static " + this.entity + " find(EntityManager pEntityManager," + (isKeyClassNeeded() ? this.entity + "Key" : "Object") + " pKey) throws Exception{");
pw.println(" " + this.entity + " obj = pEntityManager.find(" + this.entity + ".class,pKey);");
pw.println(" return obj;");
pw.println("}");
}
protected void formatKeyClone(PrintWriter pw) {
pw.println("public Object cloneMe() throws CloneNotSupportedException {");
pw.println(" return this.clone();");
pw.println("}");
}
protected void formatKeyHistoryNeededMethods(PrintWriter pw) {
pw.println("public Object getId() {");
pw.println(" return null;");
pw.println("}");
}
protected void formatBasicsJava(PrintWriter pw) {
pw.println("/**");
pw.println("* HashCode asociado con la Instancia");
pw.println("*/");
pw.println("@Transient");
pw.println("private int hashValue = 0;");
pw.println("/**");
pw.println("* Version de la Clase");
pw.println("*/");
pw.println("private static final long serialVersionUID = 1L;");
}
protected void formatKeyEquals(PrintWriter pw) {
pw.println("/**Implementacion de la comparacion de " + this.entity + "Key");
pw.println("@param o Objeto de comparacion");
pw.println("*/");
pw.println("public boolean equals(Object o){");
pw.println(" if (o == null)return false;");
pw.println(" if (! (o instanceof " + this.entity + "Key))return false;");
pw.println(" " + this.entity + "Key that = (" + this.entity + "Key) o;");
for (AbstractColumn mc : this.primary) {
mc.formatCompare(pw);
}
pw.println(" return true;");
pw.println("}");
}
protected void formatKeyHash(PrintWriter pw) {
pw.println("/**Implementacion del metodo hashCode bajo el patron de Bloch");
pw.println("@return hashCode de la instancia " + this.entity + "Key");
pw.println("*/");
pw.println("public int hashCode(){");
pw.println(" if (this.hashValue == 0){");
pw.println(" int result = 17;");
for (AbstractColumn mc : this.primary) {
mc.formatHash(pw);
}
pw.println(" this.hashValue = result;");
pw.println(" }");
pw.println(" return this.hashValue;");
pw.println("}");
}
public TgeneEntity getEnt() {
return ent;
}
}