content: /*
   * This library is part of OpenCms -
   * the Open Source Content Management System
   *
   * Copyright (c) Alkacon Software GmbH & Co. KG (https://www.alkacon.com)
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library 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
   * Lesser General Public License for more details.
   *
   * For further information about Alkacon Software GmbH & Co. KG, please see the
   * company website: https://www.alkacon.com
   *
   * For further information about OpenCms, please see the
   * project website: https://www.opencms.org
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  package org.opencms.xml.content;
  
  import org.opencms.main.CmsLog;
  import org.opencms.xml.types.I_CmsXmlContentValue;
  
  import java.util.HashMap;
  import java.util.Locale;
  import java.util.Map;
  
  import org.apache.commons.logging.Log;
  
  /**
   * Handler for issues found during XML content validation.<p>
   *
   * @since 6.0.0
   */
  public class CmsXmlContentErrorHandler {
  
      /** Static reference to the log. */
      private static final Log LOG = CmsLog.getLog(CmsXmlContentErrorHandler.class);
  
      /** The list of validation errors. */
      private Map<Locale, Map<String, String>> m_errors;
  
      /** Indicates that the validated content has errors. */
      private boolean m_hasErrors;
  
      /** Indicates that the validated content has warnings. */
      private boolean m_hasWarnings;
  
      /** The list of validation warnings. */
      private Map<Locale, Map<String, String>> m_warnings;
  
      /**
       * Create a new instance of the validation handler.<p>
       */
      public CmsXmlContentErrorHandler() {
  
          // initialize the internal error / warning list
          m_warnings = new HashMap<Locale, Map<String, String>>();
          m_errors = new HashMap<Locale, Map<String, String>>();
      }
  
      /**
       * Adds an error message to the internal list of errors,
       * also raised the "has errors" flag.<p>
       *
       * @param value the value that contains the error
       * @param message the error message to add
       */
      public void addError(I_CmsXmlContentValue value, String message) {
  
          m_hasErrors = true;
          Locale locale = value.getLocale();
          Map<String, String> localeErrors = getLocalIssueMap(m_errors, locale);
          localeErrors.put(value.getPath(), message);
  
          if (LOG.isDebugEnabled()) {
              LOG.debug(
                  Messages.get().getBundle().key(Messages.LOG_XMLCONTENT_VALIDATION_ERR_2, value.getPath(), message));
          }
      }
  
      /**
       * Adds an warning message to the internal list of errors,
       * also raised the "has warning" flag.<p>
       *
       * @param value the value that contians the warning
       * @param message the warning message to add
       */
      public void addWarning(I_CmsXmlContentValue value, String message) {
  
          m_hasWarnings = true;
          Locale locale = value.getLocale();
          Map<String, String> localeWarnings = getLocalIssueMap(m_warnings, locale);
          localeWarnings.put(value.getPath(), message);
  
          if (LOG.isDebugEnabled()) {
              LOG.debug(
                  Messages.get().getBundle().key(Messages.LOG_XMLCONTENT_VALIDATION_WARN_2, value.getPath(), message));
          }
      }
  
      /**
       * Returns the map of validation errors.<p>
       *
       * The map contains further maps. The key of the "first" map is the
       * {@link java.util.Locale} of the language where issues where found. The key of the "second" map
       * is a mapping from the element node name obtained with {@link I_CmsXmlContentValue#getPath()} to the error message
       * which is a String.<p>
       *
       * @return the map of validation errors
       */
      public Map<Locale, Map<String, String>> getErrors() {
  
          return m_errors;
      }
  
      /**
       * Returns the Map of errors for the selected locale.<p>
       *
       * @param locale the locale to get the errors for
       *
       * @return the Map of errors for the selected locale
       */
      public Map<String, String> getErrors(Locale locale) {
  
          return m_errors.get(locale);
      }
  
      /**
       * Returns the map of validation warnings.<p>
       *
       * The map contains further maps. The key of the "first" map is the
       * {@link java.util.Locale} of the language where issues where found. The key of the "second" map
       * is a mapping from the element node name obtained with {@link I_CmsXmlContentValue#getPath()} to the error message
       * which is a String.<p>
       *
       * @return the map of validation warnings
       */
      public Map<Locale, Map<String, String>> getWarnings() {
  
          return m_warnings;
      }
  
      /**
       * Returns the Map of warnings for the selected locale.<p>
       *
       * @param locale the locale to get the warnings for
       *
       * @return the Map of warnings for the selected locale
       */
      public Map<String, String> getWarnings(Locale locale) {
  
          return m_warnings.get(locale);
      }
  
      /**
       * Returns true if the validated content had errors.<p>
       *
       * @return true if the validated content had errors
       */
      public boolean hasErrors() {
  
          return m_hasErrors;
      }
  
      /**
       * Returns <code>true</code> if there is at last one error in the selected locale.<p>
       *
       * @param locale the locale to check
       *
       * @return <code>true</code> if there is at last one error in the selected locale
       */
      public boolean hasErrors(Locale locale) {
  
          return null != getErrors(locale);
      }
  
      /**
       * Returns true if the validated content has warnings.<p>
       *
       * @return true if the validated content had warnings
       */
      public boolean hasWarnings() {
  
          return m_hasWarnings;
      }
  
      /**
       * Returns <code>true</code> if there is at last one warning in the selected locale.<p>
       *
       * @param locale the locale to check
       *
       * @return <code>true</code> if there is at last one warning in the selected locale
       */
      public boolean hasWarnings(Locale locale) {
  
          return null != getWarnings(locale);
      }
  
      /**
       * Returns the localized issue map from the given base map.<p>
       *
       * If the base map does not contains an issue map for the given locale,
       * a new map is added for the locale.<p>
       *
       * @param base the base issue map
       * @param locale the locale to get the localized issue map for
       *
       * @return the localized issue map from the given base map
       */
      private Map<String, String> getLocalIssueMap(Map<Locale, Map<String, String>> base, Locale locale) {
  
          Map<String, String> result = base.get(locale);
          if (result == null) {
              result = new HashMap<String, String>();
              base.put(locale, result);
          }
          return result;
      }
  }