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

                 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 "ParseHelpers.h"

#include "BasicErrorHandler.h"
#include "XercesStr.h"

#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/validators/common/Grammar.hpp>
#include <xercesc/sax/SAXException.hpp>

#include <BasicUtils/BasicException.h>

#include <iostream>
using namespace std;

XERCES_CPP_NAMESPACE_USE;

DOMDocument *parseWithSchema(InputSource &input, InputSource &schema) {
  try {

    XercesDOMParser parser;
    BasicErrorHandler errorHandler;

    parser.setErrorHandler(&errorHandler);
    parser.setValidationScheme(XercesDOMParser::Val_Always);
    parser.setDoNamespaces(true);
    parser.setDoSchema(true);
    parser.setValidationSchemaFullChecking(true);
    parser.cacheGrammarFromParse(true);
    parser.useCachedGrammarInParse(true);
    
    if (!parser.loadGrammar(schema, Grammar::SchemaGrammarType, true))
      throw BasicException("Error loading schema grammar");
    
    parser.parse(input);
    return parser.adoptDocument();

  } catch (const DOMException &e) {
    throw BasicException(XercesStr(e.msg).localForm());

  } catch (const XMLException &e) {
    XercesStr message(e.getMessage());
    throw BasicException(message.localForm());
 
  } catch (const SAXException &e) {
    XercesStr message(e.getMessage());
    throw BasicException(message.localForm());
  }
}
