Mostrando postagens com marcador Java. Mostrar todas as postagens
Mostrando postagens com marcador Java. Mostrar todas as postagens

terça-feira, 15 de março de 2011

Erro maldito BIP4502E no Websphere Broker WE

Se você tiver um deploy de um projeto Java com falha e esse tal de BIP4502E aparecer, cata o diretório shared-classes e soca ali todos os jar que a tua aplicação usa.
O meu shared-classes está em C:\ProgramData\Application Data\IBM\MQSI\shared-classes.
Seus problemas serão terminados. Ou somente começando. Depende da aplicação.

quinta-feira, 13 de maio de 2010

Manipulando imagens em Java

Para manipular imagens em Java, existem uma API: a Java Advanced Imaging (JAI). Ela é bem joinha e bem fácil de mexer.

Eu precisei, pra um relatório, dados vários resultados numéricos criar vários gráficos. Todos eles foram criados com o JFreeChart exceto um. O que eu usei JAI é uma figura que precisava ser semelhante ao Input Number Slider (componente do RichFaces), já que o Sun UI Visual não sei o quê do Netbeans não tem um componente parecido.
Pra gerar a figura que representa o slider, eu calculei o tamanho da margem esquerda que o meu slider (o losango cinza) deveria estar e unia esta imagem à imagem base pra gerar coisas no estilo:

Segue a classe teste que eu gerei:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ImageCombiner {
public static void main(String[] args) {
try {
BufferedImage img1 = ImageIO.read(
new File("perfilRiscoImagemBase.jpg"));
BufferedImage img2 = ImageIO.read(new File("pontoImagemBase.jpg"));
BufferedImage ponto = ImageIO.read(new File("ponto.jpg"));
// calculo de onde colocar o ponto
Double valor, posicao;

for (valor = new Double(1); valor <= 4; valor += 1) {
// gerando a figura do ponto
BufferedImage figuraPonto = new BufferedImage(img2.getWidth(),
img2.getHeight(), BufferedImage.TYPE_INT_RGB);

Graphics g1 = figuraPonto.getGraphics();
g1.drawImage(img2, 0, 0, null);
posicao = (((valor - 1) * 532) / 3) + 8;

if (valor < 3) {
posicao += valor;
} else if (valor >= 3 && valor < 4) {
posicao += new Double(2);
}
System.out.println("posicao; " + posicao);

// posicionando o ponto
g1.drawImage(ponto, posicao.intValue(), 0, null);
// gerando a figura final
BufferedImage combined = new BufferedImage(img1.getWidth(),
img1.getHeight(), BufferedImage.TYPE_INT_RGB);

Graphics g = combined.getGraphics();
g.drawImage(img1, 0, 0, null);
g.drawImage(figuraPonto, 0, 0, null);
g.dispose();
String fileName = "resultado" + valor.doubleValue() + ".png";
File file = new File(fileName);
ImageIO.write(combined, "png", file);
}
} catch (Exception w) {
w.printStackTrace();
}
}
}

quarta-feira, 5 de maio de 2010

Unindo dois (ou mais) .jasper para obtenção de apenas um relatório

Enfrentei o problema de ter um relatório muito grande para ser gerado usando JasperReport. Nem com subrelatórios o maldito era gerado. Cheguei à conclusão que o iReport não funciona legal com relatórios cuja base é extensa (e depois encontrei alguns posts pela internet falando que a quebra de página do iReport/Jasper não funciona corretamente).

A solução que encontrei foi fazer dois arquivos .jasper diferentes que, juntos, compunham meu relatório. O problema na sequência foi unir esses dois .jasper para a obtenção de um único relatório. Segue minha solução fortemente baseada nesse post do GUJ:
public void imprimirRelatorio() {

ExternalContext econtext = getExternalContext();
InputStream stream;

List j = new ArrayList();

try {
Map params = new HashMap(); // preenche os parâmetros do relatório 1
stream =
econtext.getResourceAsStream("/WEB-INF/reports/rel1.jasper");
j.add(JasperFillManager.fillReport(stream, params));

params = new HashMap(); // preenche os parâmetros do relatório 2
stream =
econtext.getResourceAsStream("/WEB-INF/reports/rel2.jasper");
j.add(JasperFillManager.fillReport(stream, params));

JRPdfExporter exporter = new JRPdfExporter();
HttpServletResponse response =
(HttpServletResponse) econtext.getResponse();
FacesContext fcontext = FacesContext.getCurrentInstance();
ByteArrayOutputStream retorno = new ByteArrayOutputStream();

exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, j);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, retorno);
exporter.setParameter
(JRPdfExporterParameter.IS_CREATING_BATCH_MODE_BOOKMARKS,
Boolean.TRUE);
exporter.exportReport();

byte[] retornoArray = retorno.toByteArray();

response.setContentType("application/pdf");
response.setContentLength(retornoArray.length);

OutputStream output = response.getOutputStream();
output.write(retornoArray);
output.flush();
output.close();

} catch (RuntimeException e) {
// logar e tratar exception
} catch (Exception e) {
e.printStackTrace();
} finally {

        try {
stream.close();
} catch (IOException e) {
// logar e tratar exception
}
}

fcontext.responseComplete();}

O código acima ainda está bem cru. Fica como excercício pra você melhorá-lo. :)