[Logo] Neo Framework Forum
  [Search] Busca   [Recent Topics] Tópicos Recentes   [Members]  Lista de Usuários   [Groups] De volta para a página principal 
[Register] Registrar / 
[Login] Entrar 
Upload e Combo  XML
Índice dos Fóruns -> Dúvidas
Autor Mensagem
michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Salve javaneses!

duas duvidas:

1- Como faço para filtrar a lista(combo) que vem preenchida de de um relacionamento ManyToOne? Explico: Imagine um cadastro de cidades com a opção Capital, e outro cadastro de pessoa no qual vincula-se uma cidade, mas as opções oferecidas do combo cidade so devem constar as capitais.

2- na aplicação de demostração do neo existe um exemplo de upload de arquivo, mas eu posso vincular somento um arquivo a uma pessoa,
como ficaria se eu quisesse vincular mais de um arquivo. ex. um email com vários anexos.

Grato desde já

pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

2 - Você pode montar uma lista de arquivos =p

Tenho exemplos se quiser

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

1- É uma questão de ajax + JavaScript, e é bastante específico..

Eu posso te ajudar a montar.. mas começa ele ai que aqui vamos tocando ele..

[]'s

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Blz Pedro,

em relação a lista, tambem dá pra fazer uma query específica e mandar a lista para o itens da property. o que acha?

agora quanto a lista de arquivos se vc puder me mandar eu agradeço
michael (em) maikosoft.com.br

pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

Pode ser também.

Vou pedir o hugo para portar no fórum o exemplo. Guenta ai.

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
hugo.ferreira
Equipe
[Avatar]

Membro desde: 20/11/2007 14:32:17
Mensagens: 4
Offline

Olá, michael-pr!

Bem, acho q tenho uma coisa parecida aki que pode te ajudar...
Para salvar uma lista de arquivos vinculadas a um bean temos que salvar arquivo por arquivo, na "unha".

Temos esses Beans:

Code:
 @Entity
 public class Email implements Serializable {
 
 	private static final long serialVersionUID = 1L;
 	protected Integer cdemail;
 	protected String mensagem;
 	protected Set<Anexo> listaAnexo = new ListSet<Anexo>(Anexo.class);
 
 //Gets and Sets
 }
 


Code:
 @Entity
 public class Anexo implements Serializable {
 
 	private static final long serialVersionUID = 1L;
 	protected Integer cdanexo;
 	protected Email email;
 	protected Arquivo arquivo;
 
 //Gets and Sets
 }
 


Criamos uma função no AnexoService que grava os arquivos da lista um a um:

Code:
 public void saveAnexo(Email email) {
 	Set<Anexo> listaAnexo = email.getListaAnexo();
 	if (listaAnexo != null && listaAnexo.size() > 0) {
 		for (Anexo anexo : listaAnexo) {
 			arquivoDAO.saveFile(anexo, "arquivo");
 		}
 	}
 }
 



E por fim, sobrescrevemos as funções updateSaveOrUpdate, saveOrUpdate e delete de "EmailDAO":

Code:
 	@Override
 	public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
 		Email email = (Email) save.getEntity();
 		anexoService.saveFotosAnexo(email);
 		save.saveOrUpdateManaged("listaAnexo");
 	}
 

Code:
 	@Override
 	public void saveOrUpdate(final Email email) {
 		transactionTemplate.execute(new TransactionCallback(){
 			public Object doInTransaction(TransactionStatus arg1) {
 				EmailDAO.super.saveOrUpdate(email);
 				return null;
 			}});
 	}
 

Code:
	
 	@Override
 	public void delete(Email bean) {
 		List<Anexo> findBy = anexoService.getByEmail(bean);
 		for (Anexo anexo : findBy) {
 			anexoService.delete(anexo);
 			arquivoDAO.delete(anexo.getArquivo());
 		}
 		super.delete(bean);
 	}
 


Espero que tenha ajudado.
Um abraço!
michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Valeu Hugo,

voce me deu uma luz então eu fiz assim:

na bean principal eu fiz o relacionamento um-para-muitos normal.

Code:
 @OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE}, mappedBy="pendencia")
 	public List<AnexoPendencia> getArquivos() {
 		return arquivos;
 	}
 	public void setArquivos(List<AnexoPendencia> arquivos) {
 		this.arquivos = arquivos;
 	}
 


no bean filhos ficou assim:

Code:
 
 public class AnexoPendencia implements Serializable {
 	
 	private static final long serialVersionUID = 1L;
 	protected Long id;
 	protected Arquivo arquivo;
 	protected Pendencia pendencia;
 	protected String nome;
 	protected String tipoconteudo;
 	protected Long tamanho;
 	protected byte[] conteudo;
 	protected Timestamp tsmodificacao;
 
 	public AnexoPendencia() {
 	}
 
 	public AnexoPendencia(Long id) {
 	this.id = id;
 	}
 
 	@Id
 	@GeneratedValue(strategy=GenerationType.AUTO, generator="gen_anexo_pendencia")
 	public Long getId() {
 	return id;
 	}
 
 	@ManyToOne(fetch=FetchType.LAZY)
 	@JoinColumn(name="id_pendencia")	
 	@Required
 	public Pendencia getPendencia() {
 		return pendencia;
 	}
 
 	@Transient
 	public Arquivo getArquivo() {
 		if (arquivo == null && id != null) {
 			arquivo = new Arquivo();
 			arquivo.setCdfile(id);
 			arquivo.setContent(conteudo);
 			arquivo.setContenttype(tipoconteudo);
 			arquivo.setName(nome);
 			arquivo.setSize(tamanho);
 			arquivo.setTsmodification(tsmodificacao);			
 		}
 		return arquivo;
 	}
 
 	public void setArquivo(Arquivo arquivo) {
 		this.arquivo = arquivo;
 	}
   // demais gettes and settes
 
 


no PendenciaDAO sobrescrevi os metodos:

Code:
 @Override
 	public void updateEntradaQuery(QueryBuilder<Pendencia> query) {
 		query.fetchCollection("pendenciasDelegadas");
 		query.fetchCollection("arquivos");
 	}
 	
 	@Override
 	public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
 	     save.saveOrUpdateManaged("pendenciasDelegadas");
 	     
 	     Pendencia bean = (Pendencia)save.getEntity();
 	     List<AnexoPendencia> arquivos = bean.getArquivos();
 	     for (AnexoPendencia anexo: arquivos) {
 	    	 anexo.setNome(anexo.getArquivo().getName());
 	    	 anexo.setTipoconteudo(anexo.getArquivo().getContenttype());
 	    	 anexo.setTamanho(anexo.getArquivo().getSize());
 	    	 anexo.setConteudo(anexo.getArquivo().getContent());
 	    	 anexo.setTsmodificacao(anexo.getArquivo().getTsmodification());
 	     }
 	     
 	     save.saveOrUpdateManaged("arquivos");	     
 	 }	
 


e na view pendenciaEntrada.jsp

Code:
 ...
 </t:detalhe>
         <t:detalhe name="arquivos">
         	   <t:property name="arquivo"/>
           </t:detalhe>  
           
 	</t:janelaEntrada>
 </t:entrada>
 


ok, ele inseri, altera e apaga gravando no banco blz.
so que agora preciso fazer download, e o arquivo do neo view.DownloadFileServlet so faz download de arquivo fisico.

vou ter que fazer um Servlet pra baixar do banco ou alguem tem algum pronto?


michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Opa,

revisando a implementação acima eu percebi que
se voce alterar os valores da tela principal (pendencia), os anexos eram alterados tambem devido ao save.saveOrUpdateManaged("arquivos");
no PendenciaDAO. Então eu alterei essa parte para:

Code:
 @Override
 	public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
 	     save.saveOrUpdateManaged("pendenciasDelegadas");
 	     
 	     Pendencia bean = (Pendencia)save.getEntity();
 	     List<AnexoPendencia> arquivos = bean.getArquivos();
 	     for (AnexoPendencia anexo: arquivos) {    	 
 	    	 if ((anexo.getArquivo() != null) && (anexo.getArquivo().getSize()>0)) {
 	    		 anexo.setNome(anexo.getArquivo().getName());
 	    		 anexo.setTipoconteudo(anexo.getArquivo().getContenttype());
 	    		 anexo.setTamanho(anexo.getArquivo().getSize());
 	    		 anexo.setConteudo(anexo.getArquivo().getContent());
 	    		 anexo.setTsmodificacao(anexo.getArquivo().getTsmodification());
 	    		 anexo.setPendencia(bean);
 	    		 anexoPendenciaDAO.saveOrUpdate(anexo);
 	    	 }
 	     }
 	 }	
 


agora ta inserindo e alterando certo.
mas nem tudo são flores....
o remover anexo tambem vou ter que fazer na unha,
e ai que surge o problema.
1- eu poderia criar um controler e colocar um botão remover so pra ir no banco de dados e remover um a um o anexo gravado.
2- eu poderia aproveitar o botão criado no <t:detalhe name="arquivos"> do jsp, mas a maneira de fazer isso é comparnado a lista que ta gravado no banco, com a lista que chega da bean (Pendencia)save.getEntity().getArquivos();

Pedro, Hugo o que acham?

michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Opa,

pra quem ta acompanhando segue o codigo pra fazer download do anexo que está no banco
Code:
 @Controller(path="/secured/anexoPendencia",authorizationModule=CrudAuthorizationModule.class)
 public class AnexoPendenciaController extends MultiActionController{
 
 	AnexoPendenciaService anexoPendenciaService;
 	
 	public void setAnexoPendenciaService(AnexoPendenciaService anexoPendenciaService) {
 		this.anexoPendenciaService = anexoPendenciaService;
 	}
 	
 	
 	@DefaultAction
 	public ModelAndView doDownload(WebRequestContext request,Usuario usuario){
 		Long id  = new Long(request.getParameter("id"));
 		AnexoPendencia bean = new AnexoPendencia(id);
 		bean = anexoPendenciaService.load(bean);	
 		Resource resource = new Resource(bean.getTipoconteudo(), bean.getNome(), bean.getConteudo());
 		resource.setSize(bean.getTamanho().intValue());		
 		return new ResourceModelAndView(resource);
 	}
 
 }

michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Opa

agora preciso fazer o link para o download no jsp
como façoa pra montar um link passando o id do registro que eu quero?

eu fiz no jsp:

Code:
  <t:detalhe name="arquivos" >
         	   <t:property name="id"/>	
         	   <t:property name="arquivo" showRemoverButton="false" transientFile="true" />
         	   <t:acao>
         	   <n:link url="/secured/anexoPendencia?id=${bean.arquivos.id}"   >download</n:link>        	   
         	   </t:acao>
           </t:detalhe> 
 
 


mas o link gerado não imprime o id

michael-pr
Equipe

Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline

Ok, pesquisando uma outra duvida, obtive a resposta

Code:
  <t:detalhe name="arquivos" >
         	   <t:property name="id"/>	
         	   <t:property name="arquivo" showRemoverButton="false" transientFile="true" />
         	   <t:acao>
         	   <n:link url="/secured/anexoPendencia?id=${pendencia.arquivos[index].id}"  type="BUTTON" >download</n:link>        	   
         	   </t:acao>
           </t:detalhe>
 

pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

Bom trabalho michael =p

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns -> Dúvidas
Ir para:   
Powered by JForum 2.1.7 © JForum Team