Pessoal, nem sei mais usar o GUJ mas vamos lá! Estou desenvolvendo um Builder bem interessante que vai minimizar e automatizar (tipo skelleton) algumas classes chave da minha aplicação! A diferença entre usar um skelleton de fabrica e cria o seu pode estar no quanto consegue personaliza-lo e utilizar “coisas” que no decorrer da da aplicação vai criando … segue abaixo um modelo inicial da construção de Uma DAO via Skelleton !!! É claro aqui que termos que salvar em disco ainda mas “tirando o que é padrao” o restante é o que segue: (espero fomentar interessados no conceito) e discutirmos a respeito
package br.com.brabus.epico.infra.skeleton;
import java.lang.reflect.Method;
import java.util.List;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import br.com.brabus.epico.infra.session.SessionS;
import br.com.brabus.epico.model.Arquivo;
import br.com.brabus.epico.model.DepartamentoEpico;
import br.com.brabus.nbs.model.procedimento.Procedimento;
import br.com.caelum.vraptor.interceptor.download.Download;
public class ScheduleDAO{
private String linha = "\n";
private String espaco = "\t";
public void build(String _class) {
String strDao = "";
try {
Object obj = Class.forName( _class ).newInstance();
String uploadMethod = null;
for(Method m : obj.getClass().getMethods() ){
if( m.getReturnType().getSimpleName().equals( "Arquivo" ) ) {
uploadMethod = m.getName().replace("get", "set");
}
}
String nomeClasse = obj.getClass().getSimpleName();
strDao += "package " + _class + ";" + linha + linha
+ "import java.util.List;" + linha
+ "import javax.servlet.http.HttpServletRequest;"+ linha
+ "import org.hibernate.Criteria;" + linha
+ "import org.hibernate.Transaction;" + linha
+ "import org.hibernate.classic.Session;" + linha
+ "import org.hibernate.criterion.Order;" + linha
+ "import org.hibernate.criterion.Restrictions;" + linha
+ "import br.com.brabus.epico.infra.ECriteria;" + linha
+ "import br.com.brabus.epico.infra.EEMail;" + linha
+ "import br.com.brabus.epico.infra.EUtil;" + linha
+ "import br.com.caelum.vraptor.ioc.Component;" + linha
+ "import br.com.brabus.epico.infra.UsuarioScoped;" + linha
+ "import br.com.brabus.epico.infra.session.SessionS;" + linha
+ "import br.com.brabus.epico.model.acesso.UsuarioEpico;" + linha
+ "import br.com.caelum.vraptor.Result;" + linha;
if( uploadMethod != null ) {
strDao += "import br.com.brabus.epico.dao.ArquivoDisco; " + linha
+ "import br.com.caelum.vraptor.interceptor.download.Download; " + linha
+ "import br.com.caelum.vraptor.interceptor.multipart.UploadedFile; " + linha
+ "import br.com.brabus.epico.model.Arquivo;" + linha;
}
strDao += linha + "@Component" + linha
+ "public class "+nomeClasse+"DAO{ " + linha + linha
+ espaco + "private SessionS session;" + linha
+ espaco + "private UsuarioScoped usuarioScoped;" + linha
+ espaco + ( uploadMethod != null ? "private ArquivoDisco arquivoDisco;" : "" ) + linha
+ espaco + "private String sqlCodClienteCampanha;" + linha
+ espaco + "private int ate = 100;" + linha + linha
+ espaco + "public int getAte() { return this.ate; } " + linha + linha
+ espaco + "public "+nomeClasse+"DAO(SessionS session, UsuarioScoped usuarioScoped "+( uploadMethod != null ? "ArquivoDisco arquivoDisco" : "" )+") { " + linha
+ espaco + espaco + "this.session = session; " + linha
+ espaco + espaco + "this.usuarioScoped = usuarioScoped; " + linha
+ espaco + espaco + ( uploadMethod != null ? "this.arquivoDisco = arquivoDisco" : "" ) + linha
+ espaco + "}" + linha + linha
+ espaco + "public UsuarioEpico buscarUsuarioEpicoPorId(Long id) { " + linha
+ espaco + espaco + "return (UsuarioEpico) this.session.epicoSession().get(UsuarioEpico.class, id); " + linha
+ espaco + "}" + linha + linha
+ espaco + "public "+nomeClasse+" buscarPorId( Long id ){ " + linha
+ espaco + espaco + "return ( " + nomeClasse + " ) this.session.epicoSession().get(" + nomeClasse + ".class, id)" + linha
+ espaco + "} " + linha + linha
+ espaco + "public boolean manter("+nomeClasse+" obj "+( uploadMethod != null ? ", UploadedFile arq" : "" )+ "){ " + linha + linha
+ espaco + espaco + "if( usuarioScoped.getUsuarioEpico() == null ) return false;" + linha + linha
+ espaco + espaco + "Transaction tx = session.epicoSession().beginTransaction(); " + linha + linha
+ espaco + espaco + "try{ " + linha + linha
+ espaco + espaco + nomeClasse + " _obj = new " + nomeClasse + "();" + linha
+ espaco + espaco + "if( obj.getId() != null ){ _obj = this.buscarPorId(obj.getId()); }" + linha ;
for(Method m : obj.getClass().getMethods() ){
String methodName = m.getName();
if( methodName.substring(0,3).equals( "set" ) &&
methodName.equals( "setId" ) == false &&
m.getReturnType().getSimpleName().equals( "Arquivo" ) == false
) {
String fieldNameFirstCharUpper = methodName.replace("set", "");
strDao += espaco + espaco + " _obj.set" + fieldNameFirstCharUpper +"( obj.get"+fieldNameFirstCharUpper+"() ); " + linha;
}
}
strDao += linha + espaco + espaco + "if(obj.getId() != null){ " + linha
+ espaco + espaco + espaco + "session.epicoSession().merge( _obj ); " + linha
+ espaco + espaco + "}else{ " + linha
+ espaco + espaco + espaco + "session.epicoSession().persist( _obj ); " + linha
+ espaco + espaco + "}" + linha
+ linha + espaco + espaco + "tx.commit();" + linha
+ espaco + espaco + "return true;" + linha + linha
+ espaco + espaco + "}catch(Exception e){ " + linha + linha
+ espaco + espaco + espaco + "tx.rollback();" + linha
+ espaco + espaco + espaco + "EUtil.exToMsg( usuarioScoped, this.getClass(), e, \"[EPICO] ["+nomeClasse+"] ERRO AO TENTAR MANTER\" );" + linha
+ espaco + espaco + espaco + "return false;" + linha + linha
+ espaco + espaco + "}" + linha + linha;
if( uploadMethod != null ) {
strDao += espaco + espaco + "tx = session.epicoSession().beginTransaction(); " + linha + linha
+ espaco + espaco + "try{ " + linha + linha
+ espaco + espaco + espaco + "_obj."+uploadMethod+"( "
+ " this.arquivoDisco.manter( arq, "+nomeClasse+".class, _obj.getId(), this.session.epicoSession(), false ) "
+ "); " + linha + linha
+ espaco + espaco + espaco + "this.session.epicoSession().merge( _obj );" + linha + linha
+ espaco + espaco + espaco + "tx.commit();" + linha + espaco + espaco + espaco + "return true;" + linha + linha
+ espaco + espaco + "}catch(Exception e){ " + linha + linha
+ espaco + espaco + espaco + "tx.rollback();" + linha
+ espaco + espaco + espaco + "EUtil.exToMsg( usuarioScoped, this.getClass(), e, \"[EPICO] ["+nomeClasse+"] ERRO AO TENTAR MANTER O ARQUIVO\" );" + linha
+ espaco + espaco + espaco + "return false;" + linha + linha
+ espaco + espaco + "}" + linha + linha;
}
strDao += espaco + "}" + linha + linha
+ espaco + "@SuppressWarnings(\"unchecked\", \"rawtypes\")" + linha
+ espaco + "public List<"+nomeClasse+"> listar(int de){" + linha + linha
+ espaco + espaco + "Criteria criteria = this.session.epicoSession().createCriteria("+nomeClasse+".class); " + linha + linha
+ espaco + espaco + "if (this.usuarioScoped.getM() != null) { " + linha + linha
+ espaco + espaco + "Map map = this.usuarioScoped.getM();" + linha + linha;
for( Method m : obj.getClass().getMethods() ){
String methodName = m.getName();
if( methodName.substring(0,3).equals("get") &&
methodName.equals( "getId" ) == false &&
methodName.equals( "getClass" ) == false &&
m.getReturnType().getSimpleName().equals("Arquivo") == false
) {
String field = methodName.replace("get", "");
field = Character.toLowerCase(field.charAt(0)) + field.substring(1);
String tipo = m.getReturnType().getSimpleName();
strDao += espaco + espaco + espaco + "if( EUtil.existe((Map) map, \""+field+"\") ){" + linha
+ espaco + espaco + espaco + espaco + "criteria.add( Restrictions.eq(\""+field+"\", ("+tipo+") map.get( \""+field+"\") ) );" + linha
+ espaco + espaco + espaco + "}" + linha + linha ;
}
}
strDao += espaco + espaco + "}" + linha + linha
+ espaco + espaco + "criteria.addOrder(Order.desc(\"id\")).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).setFirstResult(de)" + linha
+ espaco + espaco + "criteria.setMaxResults(this.ate);" + linha
+ espaco + espaco + "return criteria.list();" + linha
+ espaco + "}" + linha + linha;
if( uploadMethod != null ) {
strDao += espaco + "public boolean removerArquivo( Long id, Long idArquivo ) {" + linha + linha
+ espaco + espaco + "try{" + linha + linha
+ espaco + espaco + espaco + nomeClasse + " _obj = buscarPorId(id)" + linha
+ espaco + espaco + espaco + "_obj."+uploadMethod+"(null);" + linha
+ espaco + espaco + espaco + "this.session.epicoSession().merge(_obj)" + linha
+ espaco + espaco + espaco + "this.arquivoDisco.remover(idArquivo, this.session.epicoSession(), false);" + linha + linha
+ espaco + espaco + espaco + "tx.commit();" + linha + espaco + espaco + espaco + "return true;" + linha + linha
+ espaco + espaco + "}catch( Exception e ){ " + linha + linha
+ espaco + espaco + espaco + "tx.rollback();" + linha
+ espaco + espaco + espaco + "EUtil.exToMsg( usuarioScoped, this.getClass(), e, \"[EPICO] ["+nomeClasse+"] ERRO AO TENTAR REMOVER O ARQUIVO\" );" + linha
+ espaco + espaco + espaco + "return false;" + linha + linha
+ espaco + espaco + "}" + linha + linha
+ espaco + "}" + linha + linha
+ espaco + "public Download baixarArquivo(Long id){" + linha + linha
+ espaco + espaco + "Arquivo arquivo = this.arquivoDisco.buscarArquivo(id, this.session.epicoSession());" + linha
+ espaco + espaco + "return this.arquivoDisco.abrirArquivoPorNome(arquivo.getNome(), arquivo.getType());" + linha + linha
+ espaco + "}" + linha + linha;
}
/*public List<DepartamentoEpico> listarDepartamentoEpicoS() {
return SessionS.current().epicoSession().createCriteria(DepartamentoEpico.class)
.add(Restrictions.not((Criterion) Restrictions.like((String) "nome", "%NAYA%")))
.addOrder(Order.asc((String) "nome")).list();
}*/
strDao += "}"; // FECHA A CLASSE
System.out.println( strDao );
}catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void run() {
build("br.com.brabus.epico.model.manutencao.OsManutencaoRequisicao");
// build("br.com.brabus.epico.model.combustivel.LoteCombustivel");
}
}