Desenvolva seu proprio Skelleton com java

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");
	
}

}