#include <gcj/cni.h>

#include <java/lang/System.h>
#include <java/lang/Integer.h>
#include <java/lang/RuntimeException.h>
#include <java/io/OutputStreamWriter.h>
#include <java/io/UnsupportedEncodingException.h>
#include <javax/xml/transform/TransformerException.h>
#include <javax/xml/transform/SourceLocator.h>
#include <org/xml/sax/SAXParseException.h>

#include "nu/validator/htmlparser/test/SystemErrErrorHandler.h"

using namespace java::io;
using namespace java::lang;
using namespace javax::xml::transform;
using namespace org::xml;
using namespace org::xml::sax;

using namespace nu::validator::htmlparser::test;

void SystemErrErrorHandler::_SystemErrErrorHandler() {
  try {
    String *UTF8 = JvNewStringUTF("UTF-8");
    out = new OutputStreamWriter((OutputStream*) System::err, UTF8);
  } catch (UnsupportedEncodingException* e) {
    throw new RuntimeException(e);
  }
}

void SystemErrErrorHandler::warning(SAXParseException *e) {
  try {
    out->write(JvNewStringUTF("Warning:\n"));
    out->write(e->getMessage());
    out->write(JvNewStringUTF("\nFile: "));
    String *systemId = e->getSystemId();
    out->write((systemId == NULL) ? JvNewStringUTF("Unknown") : systemId);
    out->write(JvNewStringUTF("\nLine: "));
    out->write(Integer::toString(e->getLineNumber()));
    out->write(JvNewStringUTF(" Col: "));
    out->write(Integer::toString(e->getColumnNumber()));
    out->write(JvNewStringUTF("\n\n"));
    out->flush();
  } catch (IOException* e1) {
    throw new SAXException(e1);
  }
}

void SystemErrErrorHandler::error(SAXParseException *e) {
  inError = true;
  try {
    out->write(JvNewStringUTF("Error:\n"));
    out->write(e->getMessage());
    out->write(JvNewStringUTF("\nFile: "));
    String *systemId = e->getSystemId();
    out->write((systemId == NULL) ? JvNewStringUTF("Unknown") : systemId);
    out->write(JvNewStringUTF("\nLine: "));
    out->write(Integer::toString(e->getLineNumber()));
    out->write(JvNewStringUTF(" Col: "));
    out->write(Integer::toString(e->getColumnNumber()));
    out->write(JvNewStringUTF("\n\n"));
    out->flush();
  } catch (IOException *e1) {
    throw new SAXException(e1);
  }
}

void SystemErrErrorHandler::fatalError(SAXParseException *e) {
  inError = true;
  try {
    out->write(JvNewStringUTF("Fatal Error:\n"));
    out->write(e->getMessage());
    out->write(JvNewStringUTF("\nFile: "));
    String *systemId = e->getSystemId();
    out->write((systemId == NULL) ? JvNewStringUTF("Unknown") : systemId);
    out->write(JvNewStringUTF("\nLine: "));
    out->write(Integer::toString(e->getLineNumber()));
    out->write(JvNewStringUTF(" Col: "));
    out->write(Integer::toString(e->getColumnNumber()));
    out->write(JvNewStringUTF("\n\n"));
    out->flush();
  } catch (IOException *e1) {
    throw new SAXException(e1);
  }
}

jboolean SystemErrErrorHandler::isInError() {
  return inError;
}

void SystemErrErrorHandler::reset() {
  inError = false;
}

void SystemErrErrorHandler::error(TransformerException *e) {
  inError = true;
  try {
    out->write(JvNewStringUTF("Error:\n"));
    out->write(e->getMessage());
    SourceLocator *sourceLocator = e->getLocator();
    if (sourceLocator != NULL) {
      out->write(JvNewStringUTF("\nFile: "));
      String *systemId = sourceLocator->getSystemId();
      out->write((systemId == NULL) ? JvNewStringUTF("Unknown") : systemId);
      out->write(JvNewStringUTF("\nLine: "));
      out->write(Integer::toString(sourceLocator->getLineNumber()));
      out->write(JvNewStringUTF(" Col: "));
      out->write(Integer::toString(sourceLocator->getColumnNumber()));
    }
    out->write(JvNewStringUTF("\n\n"));
    out->flush();
  } catch (IOException *e1) {
    throw new TransformerException(e1);
  }
}

void SystemErrErrorHandler::fatalError(TransformerException *e) {
  inError = true;
  try {
    out->write(JvNewStringUTF("Fatal Error:\n"));
    out->write(e->getMessage());
    SourceLocator *sourceLocator = e->getLocator();
    if (sourceLocator != NULL) {
      out->write(JvNewStringUTF("\nFile: "));
      String *systemId = sourceLocator->getSystemId();
      out->write((systemId == NULL) ? JvNewStringUTF("Unknown") : systemId);
      out->write(JvNewStringUTF("\nLine: "));
      out->write(Integer::toString(sourceLocator->getLineNumber()));
      out->write(JvNewStringUTF(" Col: "));
      out->write(Integer::toString(sourceLocator->getColumnNumber()));
    }
    out->write(JvNewStringUTF("\n\n"));
    out->flush();
  } catch (IOException *e1) {
    throw new TransformerException(e1);
  }
}

void SystemErrErrorHandler::warning(TransformerException *e) {
  try {
    out->write(JvNewStringUTF("Warning:\n"));
    out->write(e->getMessage());
    SourceLocator *sourceLocator = e->getLocator();
    if (sourceLocator != NULL) {
      out->write(JvNewStringUTF("\nFile: "));
      String *systemId = sourceLocator->getSystemId();
      out->write((systemId == NULL) ? JvNewStringUTF("Unknown") : systemId);
      out->write(JvNewStringUTF("\nLine: "));
      out->write(Integer::toString(sourceLocator->getLineNumber()));
      out->write(JvNewStringUTF(" Col: "));
      out->write(Integer::toString(sourceLocator->getColumnNumber()));
    }
    out->write(JvNewStringUTF("\n\n"));
    out->flush();
  } catch (IOException *e1) {
    throw new TransformerException(e1);
  }
}


