content: /*
   *  This file is part of AndroidIDE.
   *
   *  AndroidIDE 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 3 of the License, or
   *  (at your option) any later version.
   *
   *  AndroidIDE 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 AndroidIDE.  If not, see <https://www.gnu.org/licenses/>.
   */
  
  /*
   * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.  Oracle designates this
   * particular file as subject to the "Classpath" exception as provided
   * by Oracle in the LICENSE file that accompanied this code.
   *
   * This code 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
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   * or visit www.oracle.com if you need additional information or have any
   * questions.
   */
  
  package jaxp.sun.xml.internal.stream;
  
  
  
  import jaxp.xml.stream.Location;
  import jaxp.xml.stream.XMLInputFactory;
  import jaxp.xml.stream.XMLReporter;
  import jaxp.xml.stream.XMLStreamException;
  import jaxp.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter;
  import jaxp.sun.org.apache.xerces.internal.util.MessageFormatter;
  import jaxp.sun.org.apache.xerces.internal.xni.XMLLocator;
  import jaxp.sun.org.apache.xerces.internal.xni.XNIException;
  
  import jaxp.sun.org.apache.xerces.internal.impl.PropertyManager;
  import jaxp.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
  
  /**
   *
   * @author  neeraj
   */
  
  public class StaxErrorReporter extends XMLErrorReporter {
  
      protected XMLReporter fXMLReporter = null ;
  
      /** Creates a new instance of StaxErrorReporter */
      public StaxErrorReporter(PropertyManager propertyManager) {
          super();
          putMessageFormatter(XMLMessageFormatter.XML_DOMAIN, new XMLMessageFormatter());
          reset(propertyManager);
      }
  
      /** Creates a new instance of StaxErrorReporter
       * If this constructor is used to create the object, one must invoke reset() on this object.
       */
      public StaxErrorReporter() {
          super();
          putMessageFormatter(XMLMessageFormatter.XML_DOMAIN, new XMLMessageFormatter());
      }
  
      /**
       *One must call reset before using any of the function.
       */
      public void reset(PropertyManager propertyManager){
          fXMLReporter = (XMLReporter)propertyManager.getProperty(XMLInputFactory.REPORTER);
      }
      /**
       * Reports an error at a specific location.
       *
       * @param location  The error location.
       * @param domain    The error domain.
       * @param key       The key of the error message.
       * @param arguments The replacement arguments for the error message,
       *                  if needed.
       * @param severity  The severity of the error.
       *
       * @see #SEVERITY_WARNING
       * @see #SEVERITY_ERROR
       * @see #SEVERITY_FATAL_ERROR
       */
      public String reportError(XMLLocator location,
      String domain, String key, Object[] arguments,
      short severity) throws XNIException {
          // format error message and create parse exception
          MessageFormatter messageFormatter = getMessageFormatter(domain);
          String message;
          if (messageFormatter != null) {
              message = messageFormatter.formatMessage(fLocale, key, arguments);
          }
          else {
              StringBuffer str = new StringBuffer();
              str.append(domain);
              str.append('#');
              str.append(key);
              int argCount = arguments != null ? arguments.length : 0;
              if (argCount > 0) {
                  str.append('?');
                  for (int i = 0; i < argCount; i++) {
                      str.append(arguments[i]);
                      if (i < argCount -1) {
                          str.append('&');
                      }
                  }
              }
              message = str.toString();
          }
  
  
  
          //no reporter was specified
          /**
           * if (reporter == null) {
           * reporter = new DefaultStaxErrorReporter();
           * }
           */
  
          // call error handler
          switch (severity) {
              case SEVERITY_WARNING: {
                  try{
                      if(fXMLReporter!= null){
                          fXMLReporter.report(message, "WARNING", null, convertToStaxLocation(location) );
                      }
                  }catch(XMLStreamException ex){
                      //what we should be doing ?? if the user throws XMLStreamException
                      //REVISIT:
                      throw new XNIException(ex);
                  }
                  break;
              }
              case SEVERITY_ERROR: {
                  try{
                      if(fXMLReporter!= null){
                          fXMLReporter.report(message, "ERROR", null, convertToStaxLocation(location) );
                      }
                  }catch(XMLStreamException ex){
                      //what we should be doing ?? if the user throws XMLStreamException
                      //REVISIT:
                      throw new XNIException(ex);
                  }
                  break;
              }
              case SEVERITY_FATAL_ERROR: {
                  if (!fContinueAfterFatalError) {
                      throw new XNIException(message);
                  }
                  break;
              }
          }
          return message;
      }
  
  
      Location convertToStaxLocation(final XMLLocator location){
          return new Location(){
              public int getColumnNumber(){
                  return location.getColumnNumber();
              }
  
              public int getLineNumber(){
                  return location.getLineNumber();
              }
  
              public String getPublicId(){
                  return location.getPublicId();
              }
  
              public String getSystemId(){
                  return location.getLiteralSystemId();
              }
  
              public int getCharacterOffset(){
                  return location.getCharacterOffset();
              }
              public String getLocationURI(){
                  return "";
              }
  
          };
      }
  
  }
  