/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.GestDB.general;
import com.GestDB.Gestor;
import com.GestDB.swing.Alerta;
import com.utils.utilidades;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.helpers.Loader;
/**
*
* @author seni
*/
public class Trackbug extends OutputStream {
public static int ERR = 0;
public static int OUT = 1;
private int tipo = ERR;
private static org.apache.log4j.Logger registro;
private static org.apache.log4j.Logger registroServer;
static
{
try {
PropertyConfigurator.configure(Trackbug.class.getResource("/com/GestDB/conf/log4j.properties"));
registro = Logger.getLogger(Trackbug.class);
System.setErr(new PrintStream(new Trackbug(Trackbug.ERR)));
// System.setOut(new PrintStream(new Trackbug(Trackbug.OUT)));
registroServer = Logger.getLogger("LogServer");
System.out.println("Desviadas las salidas");
} catch (Exception e) {
BasicConfigurator.configure();
registro = Logger.getLogger(Trackbug.class);
}
}
/**
* Contruye el objeto indicandole el tipo de salida, puee ser ERR o OUT.
* @param tipo tipo de salida, Trackbug.ERR o Trackbug.OUT
*/
public Trackbug(int tipo) {
this.tipo = tipo;
}
/**
* Escribe la informaci�n en un log y valora si se tiene que enviar al desarrollador de gestdb
* @param e Excepci�n que se a lanzado al producirse el error. Puede ser null.
* @param Message Mensaje personalizado que se almacenar� para ese error. Si se pasa un valor null se escribir� el mensaje por defecto
*/
public static void info(String Message)
{
registro.info(Message);
}
/**
* Escribe la informaci�n en un log y valora si se tiene que enviar al desarrollador de gestdb
* @param e Excepci�n que se a lanzado al producirse el error. Puede ser null.
* @param Message Mensaje personalizado que se almacenar� para ese error. Si se pasa un valor null se escribir� el mensaje por defecto
*/
public static void fatal(Throwable e, String Message)
{
String infothreads = getInfoThreads();
registro.error(Message, e);
registro.error(infothreads);
showAlert(Message + "\n" + infothreads);
}
/**
* Escribe la informaci�n en un log y valora si se tiene que enviar al desarrollador de gestdb
* @param e Excepci�n que se a lanzado al producirse el error. Puede ser null.
* @param Message Mensaje personalizado que se almacenar� para ese error. Si se pasa un valor null se escribir� el mensaje por defecto
* @param level Nivel de log, Los niveles .
*/
public static void error(Throwable e, String Message)
{
if(e == null)
{
registro.error(Message);
registro.error(getInfoThreads());
}
else
{
registro.error(Message, e);
registro.error(getInfoThreads());
}
}
/**
* Retorna informaci�n del estado de los thread en el momento de lanzar el error o la informaci�n.
* @return Cadena con toda la informaci�n
*/
public static String getInfoThreads()
{
StringBuilder sb = new StringBuilder();
StackTraceElement ste[] = Thread.currentThread().getStackTrace();
sb.append("Informaci�n Threads\n");
sb.append("Thread actual:\n\t").append(Thread.currentThread().getName());
for(int i = 0; i < ste.length; i++)
{
sb.append("\n\t\t at ").append(ste[i].toString());
}
sb.append("\nTodos los Thread:");
Map<Thread, StackTraceElement[]> stes = Thread.getAllStackTraces();
Object claves[] = stes.keySet().toArray();
for(int i = 0; i < claves.length; i++)
{
StackTraceElement ste1[] = stes.get(claves[i]);
if(ste1.length > 0)
{
sb.append("\n\t").append(claves[i].getClass().getCanonicalName());
for(int j = 0; j < ste1.length; j++)
{
sb.append("\n\t\t at ").append(ste1[j].toString());
}
}
}
return sb.toString();
}
public static void showAlert(String textSend)
{
Alerta al = new Alerta((java.awt.Frame)null, Gestor.GetLiteral("gestor.error_1","Error"), true, Gestor.GetLiteral("trackbug.send_developer","Se ha producido un error en la aplicaci�n. �Desea enviar el error al desarrollador?"), Alerta.OKCANCEL);
al.setVisible(true);
if(al.getReturnStatus() == al.RET_OK)
{
// Mandamos el error al servidor
registroServer.fatal(textSend);
}
}
@Override
public void write(int b) throws IOException {
if(tipo == Trackbug.ERR)
registro.error(String.valueOf((byte)b));
else
registro.info(String.valueOf((byte)b));
}
@Override
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
if(b[off + (len - 1)] == '\n')
--len;
if(len > 0)
{
if(tipo == Trackbug.ERR)
registro.error(new String(b,off,len));
else
registro.info(new String(b,off,len));
}
}
}