Logging en Java con log4j

28/06/2009 at 4:56 pm | In Informatica, Java | Leave a Comment
Tags: , , ,

¿Qué es logging en una aplicación Java?

Insertar líneas de logeo dentro de tu código es un método arcaico para depurarlo. Esta podría ser además la única manera de hacerlo porque los debuggers no siempre están disponibles o son aplicables en el contexto. Este es frecuentemente el caso para las aplicaciones distribuídas.

Por otra parte, algunas personas afirman que las líneas de logeo contaminan el código fuente y disminuyen la legilibilidad. (Nosotros creemos que lo contrario es cierto). En el lenguaje Java en el cual no hay un preprocesador disponible, las líneas de logeo incrementan el tamaño del código y reducen la velocidad, incluso cuando el logeo esta desactivado. Dado que una aplicación de tamaño considerable puede contener miles de líneas de logeo, la velocidad es de particular importancia.

Con log4j es posible activar el logeo en tiempo de ejecución sin modificar la aplicación en binario (Esto es, compilada). El paquete log4j esta diseñado para que éstas líneas puede permanecer en el código sin incurrir en un alto costo de desempeño. El comportamiento del logeo puede ser controlado editando un archivo de configuración, sin tocar nuestra aplicación compilada.

Extraído de http://logging.apache.org/log4j/1.2/index.html

Bueno, es la primer vez que utilizo este método para depurar y rastrear errores, y pues he podido notar que es una manera bastante inteligente de reemplazar nuestros clásicos

* System.out.println(…

para revisar el estado de una variable, para indicar si se ingreso a un bloque o para saber simplemente que nuestra consola funciona :). Bueno en pocas palabras el logging nos permite arrojar este tipo de mensajes en varias maneras, identicamente a nuestro método de toda la vida (System.out.println()) o a un archivo de texto u otros medios (HTML, etc).

Pondré un ejemplo, digamos que tienes una clase que estás depurando, con 2000 líneas de código, y pues a lo largo de esta tienes 40 System.out.println()

¿Sabes lo que te va a costar eliminar todas estas líneas cuando acabes el proyecto? Tú dirás, existen la búsqueda/reemplazo con expresiones regulares. Claro, pero que tal si derepente necesitas depurar tu código nuevamente, entonces tendrías que escribir nuevamente muchas líneas de código. Suficiente, no estamos dispuestos a realizar este trabajo.

Para este tipo de cosas está log4j

Con log4j puedes activar y desactivar la salida de éstas líneas desde un sencillo (no tan sencillo) archivo de configuración, quiero decir, desde este archivo de configuración decides si deseas que en tu consola salgas los mensajes, si quieres que salgan en un archivo de texto a modo de logs del sistema, en un documento de word, hasta por sms como dicen algunos por ahi.

Bueno, podría acabar de escribir este artículo con algunos ejemplos, pero que mejor que enviarlos a un artículo del ChuWiki.

http://www.chuidiang.com/chuwiki/index.php?title=Ejemplo_con_log4j

POI, Interacción entre Java y documentos de Excel

27/06/2009 at 4:20 pm | In Informatica, Java | 6 Comments
Tags: , , ,

¿Qué les parece poder interactuar entre Java y Excel, de manera más específica, tener la capacidad de leer documentos de Excel usando Java, y la capacidad de poder crear y escribir documentos de excel también, bueno, ésto es posible usando la librería POI. Entre otras cosas que podemos hacer usando la librería POI, tenemos la capacidad de interactuar con documentos de Word, Power Point, Open Office, etc.

Propósito de POI

El proyecto POI consiste de varios API para manipular varios formatos de archivo basado en OLE 2, Office OpenXML usando código 100% Java. En pocas palabras, puedes leer y escribir archivos de MS Excel usando Java. Adicionalmente, puedes leer y escribir archivos de MS Word, y MS Power Point usando Java. POI es tu solución Java Excel (Excel 97-2007). Sin embargo, tenemos un completo API para portar documento OLE2 y le damos la bienvenida a otros formatos.

El formato OLE 2 incluye la mayoría de los documentos de Microsoft Office como XLS, DOC, así como los archivos basados en el API de serialización MFC.

El formato Office OpenXML incluye los nuevos formatos basados en XML (2007+), incluyendo los archivos XLSX, DOCX y PPTX de Microsoft Office.

Como política general tratamos de colaborar tanto como sea posible con otros proyectos para proveer esta funcionalidad. Algunos ejemplos incluyen: Cocoon, OpenOffice.org y Lucene. Cuando resulta práctico, le donamos componentes a aquellos proyectos para POI-activarlos. :)

Adaptación al español de un fragmento de: http://poi.apache.org/

Bueno, veamos un ejemplo para comenzar a familiarizarnos con esta librería, asumo que tiene un conocimiento basico/medio del lenguaje Java, y facilidad para interactuar con un IDE, en éste caso usaremos Netbeans, porque Eclipse corre muy lento en mi PC (Un modesto Xeon de 4 procesadores, sí, ya lo sé, no es una computadora de escritorio, pero Netbeans no la discrimina :) ).

El código completo para éste proyecto se encuentra aquí, puedes descargarlo y abrirlo con el Netbeans.

http://www.2shared.com/file/6472969/ebd7783d/poi.html

Lo más probable es que al abrirlo obtengamos dependencias rotas, lo más probable es que no tengas las librerías POI, y por lo tanto, que esperas para descargarlas?

http://poi.apache.org/

El vínculo de descarga se encuentra en la columna de la izquierda dentro de Project > Download

Una de las clases que veremos dentro de éste proyecto sera:

ServletExcel2.java


import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ServletExcel2 extends HttpServlet {

 protected void processRequest(HttpServletRequest request,
 HttpServletResponse response)
 throws ServletException, IOException {

 String nota11 = request.getParameter("nota11");    // Juan
 String nota12 = request.getParameter("nota12");
 String nota13 = request.getParameter("nota13");

 String nota21 = request.getParameter("nota21");    // Ana
 String nota22 = request.getParameter("nota22");
 String nota23 = request.getParameter("nota23");

 String nota31 = request.getParameter("nota31");    // Luis
 String nota32 = request.getParameter("nota32");
 String nota33 = request.getParameter("nota33");

 response.setContentType("application/vnd.ms-excel");

 HttpServletRequestWrapper srw =
 new HttpServletRequestWrapper(request);
 String excel2 = srw.getRealPath("");
 excel2 += "/excel/alumnos.xls";

 POIFSFileSystem fs =
 new POIFSFileSystem(new FileInputStream(excel2));
 HSSFWorkbook wb = new HSSFWorkbook(fs);
 HSSFSheet sheet = wb.getSheetAt(0);

 HSSFRow row1 = sheet.getRow(1);    // Juan
 HSSFCell b2 = row1.getCell(1);
 HSSFCell c2 = row1.getCell(2);
 HSSFCell d2 = row1.getCell(3);
 b2.setCellValue(Integer.valueOf(nota11).intValue());
 c2.setCellValue(Integer.valueOf(nota12).intValue());
 d2.setCellValue(Integer.valueOf(nota13).intValue());

 HSSFRow row2 = sheet.getRow(2);    // Ana
 HSSFCell b3 = row2.getCell(1);
 HSSFCell c3 = row2.getCell(2);
 HSSFCell d3 = row2.getCell(3);
 b3.setCellValue(Integer.valueOf(nota21).intValue());
 c3.setCellValue(Integer.valueOf(nota22).intValue());
 d3.setCellValue(Integer.valueOf(nota23).intValue());

 HSSFRow row3 = sheet.getRow(3);    // Luis
 HSSFCell b4 = row3.getCell(1);
 HSSFCell c4 = row3.getCell(2);
 HSSFCell d4 = row3.getCell(3);
 b4.setCellValue(Integer.valueOf(nota31).intValue());
 c4.setCellValue(Integer.valueOf(nota32).intValue());
 d4.setCellValue(Integer.valueOf(nota33).intValue());

 sheet.setForceFormulaRecalculation(true); // actualiza sheet

 OutputStream out = response.getOutputStream();
 wb.write(out);
 out.close();
 }

 /**
 * Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 processRequest(request, response);
 }

 /**
 * Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 processRequest(request, response);
 }

 /**
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */
 @Override
 public String getServletInfo() {
 return "Short description";
 }// </editor-fold>
}

Realmente creen que escribí todo ese código? De ninguna forma, para eso está Netbeans.

Bueno, explicaré rápidamente el ciclo de vida de nuestro Servlet:

1. El contenedor de Servlets (muy probablemente Tomcat) llama al mét0do

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

2. Este método a su vez llama al método

 protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

generado por Netbeans.

3. Establecemos el tipo MIME de respuesta, en éste caso Microsoft Excel.

 response.setContentType("application/vnd.ms-excel");

4. Cargamos un archivo de excel(Este se encuentra en el proyecto que descargaste… lo descargaste no?)

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excel2));

5. Cargamos un libro de trabajo usando el constructor siguiente


public HSSFWorkbook(POIFSFileSystem fs) throws IOException

HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);

6. Bueno, lo que sigue es bastante intuitivo, obtenemos una fila, y establecemos el valor para cada una de las celdas.


HSSFRow row1 = sheet.getRow(1);    // Juan

 HSSFCell b2 = row1.getCell(1);
 HSSFCell c2 = row1.getCell(2);
 HSSFCell d2 = row1.getCell(3);
 b2.setCellValue(Integer.valueOf(nota11).intValue());
 c2.setCellValue(Integer.valueOf(nota12).intValue());
 d2.setCellValue(Integer.valueOf(nota13).intValue());

7. Hacemos ésto, para evitar que el resultado de las fórmulas no se actualize, si no están seguros de lo que ésto hace, solo háganlo, nos podría evitar problemas difíciles de debugear.


sheet.setForceFormulaRecalculation(true); // actualiza sheet

8. Escribimos en el buffer de salida y cerramos la conexión.


OutputStream out = response.getOutputStream();

 wb.write(out);
 out.close();

Blog de WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.