/*******************************************************************\

              Copyright (C) 2003 Joseph Coffland

    This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
        of the License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                           02111-1307, USA.

            For information regarding this software email
                   jcofflan@users.sourceforge.net

\*******************************************************************/

#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/SAXParseException.hpp>
#include <xercesc/validators/common/Grammar.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/framework/LocalFileInputSource.hpp>
#include <xercesc/util/XMLString.hpp>
XERCES_CPP_NAMESPACE_USE;

#include <BasicUtils/BasicException.h>
#include "BasicErrorHandler.h"

#include <iostream>
#include <fstream>
using namespace std;


int main(int argc, char *argv[]) {
  try {XMLPlatformUtils::Initialize();}

  catch (const XMLException &e) {
    cerr << "Error during initialization!" << endl;
    return 1;
  }

  try {
    if (argc < 3) {
      cerr << "Syntax: " << argv[0] << " <xml> <schema>" << endl;
      exit(1);
    }

    SAX2XMLReader *parser = XMLReaderFactory::createXMLReader();
    parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
    parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
    parser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);

    BasicErrorHandler errorHandler;
    parser->setErrorHandler(&errorHandler);
  
    LocalFileInputSource schemaInput(XMLString::transcode(argv[2]));
    if (!parser->loadGrammar(schemaInput, Grammar::SchemaGrammarType, true))
      cerr << "Error loading schema grammar!" << endl;

    LocalFileInputSource xmlInput(XMLString::transcode(argv[1]));

    XMLPScanToken token;
    parser->parseFirst(xmlInput, token);
    while (parser->parseNext(token)) continue;

  } catch (BasicException &e) {
    cout << e << endl;

  } catch (...) {
    cout << endl << "Unknown Exception" << endl;
    XMLPlatformUtils::Terminate();
    return 1;
  }

  XMLPlatformUtils::Terminate();
  return 0;
}
