Boa noite galera,
Para facilitar a explicação do meu problema irei primeiramente falar o código que tinha e que já funciona.
Tenho um objeto do tipo Evento e nele tenho um List de Imagem. Um dos atributos de Imagem é um byte[], que é a imagem propriamente dita.
@PostConstruct
public void init() {
eventoAtual = dao.buscarUnicoComImagens((long) 22); // Busca todas as imagens do
//// evento utilizando dentro de buscarUnicoComImagens crit.setFetchMode("imagemList", FetchMode.JOIN);
}
private EventoVO eventoAtual;
public void print(OutputStream out, Object data) throws IOException {
Long index = (Long) data;
ImagemVO imagem = null;
for (ImagemVO imagemIndex : eventoAtual.getImagemList()) {
if (imagemIndex.getId().equals(index)) {
imagem = imagemIndex;
break;
}
}
byte[] dataByte = imagem.getImage();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(dataByte);
BufferedImage result = ImageIO.read(byteArrayInputStream);
ImageIO.write(result, "jpg", out); // TODO
}
E meu xhtml:
<a4j:outputPanel id="gallery">
<a4j:repeat id="imageList"
value="#{homeMB.eventoAtual.imagemList}" var="image"
iterationStatusVar="it" rows="5">
<a4j:mediaOutput element="img" mimeType="image/jpg"
styleClass="thumbnail tableThumbnail"
createContent="#{homeMB.print}" value="#{image.id}"
cacheable="false" session="false">
</a4j:mediaOutput>
</a4j:repeat>
</a4j:outputPanel>
Como vocês podem ver, fiz um FetchMode.JOIN no método init().
Este código anterior está funcioando, mas tenho que usar @SessionScoped e não queria, mas isso e discussão para outro capítulo.
Meu problema é: ao invés de ter um Evento, eu tenho uma lista de Eventos. Se eu fizer um a4j:repeat para a lista de eventos e depois utilizar o código descrito anteriormente, no meu método print(…) eu não vou saber de qual evento devo pegar minhas imagens, e mesmo se soubesse, eu não fiz uma nova busca no atual evento para buscar todas suas imagens.
<a4j:repeat id="eventoList" value="#{homeMB.eventoList}"
var="evento" iterationStatusVar="eventoIt" rows="3">
<a4j:outputPanel id="gallery">
<a4j:repeat id="imageList"
value="#{homeMB.eventoAtual.imagemList}" var="image"
iterationStatusVar="it" rows="5">
<a4j:mediaOutput element="img" mimeType="image/jpg"
styleClass="thumbnail tableThumbnail"
createContent="#{homeMB.print}" value="#{image.id}"
cacheable="false" session="false">
</a4j:mediaOutput>
</a4j:repeat>
</a4j:outputPanel>
</a4j:repeat>
Eu precisaria de algo como:
<a4j:repeat id="eventoList" value="#{homeMB.eventoList}"
......
chamar um método no managed bean para setar o evento atual
exibir a imagem na tela com o código descrito anteriormente.
......
</a4j:repeat>
Alguém poderia me ajudar nisso?
obs.: estou aberto à críticas construtivas desse meu pequeno código.
Obrigado pela atenção
Hader