OdfValidationException.java

/**
 * **********************************************************************
 *
 * <p>DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 *
 * <p>Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
 *
 * <p>Use is subject to license terms.
 *
 * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0. You can also obtain a copy of the License at
 * http://odftoolkit.org/docs/license.txt
 *
 * <p>Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 *
 * <p>See the License for the specific language governing permissions and limitations under the
 * License.
 *
 * <p>**********************************************************************
 */
package org.odftoolkit.odfdom.pkg;

import org.xml.sax.SAXParseException;

/**
 * This ODF specific validation excpetion faciliates the usage of a SAXParseException for none XML
 * validation, used by an <code>ErrorHandler</code>.
 */
public class OdfValidationException extends SAXParseException {

  private ValidationConstraint mConstraint;
  private static final String NO_SOURCE = "";
  private static final String SOURCE_PREFIX = " '";
  private static final String SOURCE_SUFFIX = "'";

  /**
   * An OdfValidationException should be used for any validation result related to an ODF package.
   * This constructor should only be used for SaxParseExceptions unrelated to XML. This constructor
   * sets the public and system ID for XML and line and column number of the super class will be set
   * to be invalid.
   *
   * @param constraint the predefined constaint message
   */
  public OdfValidationException(ValidationConstraint constraint) {
    // The constraint convention is the first parameter to be the sourcePath of the ODF
    // document/package causing the exception
    super(String.format(constraint.getMessage(), NO_SOURCE), null, null, -1, -1);
    mConstraint = constraint;
  }

  /**
   * An OdfValidationException should be used for any validation result related to an ODF package.
   * This constructor should only be used for SaxParseExceptions unrelated to XML. This constructor
   * sets the public and system ID for XML and line and column number of the super class will be set
   * to be invalid.
   *
   * @param constraint the predefined constaint message
   * @param sourcePath the source path of the exception. For instance, it might be an ODF package or
   *     ODF document.
   * @param messageParameters allow the customization of a constraint message with parameters.
   */
  public OdfValidationException(
      ValidationConstraint constraint, String sourcePath, Object... messageParameters) {
    // The constraint convention is the first parameter to be the sourcePath of the ODF
    // document/package causing the exception
    super(formatMessage(constraint, sourcePath, messageParameters), null, null, -1, -1);
    mConstraint = constraint;
  }

  /**
   * An OdfValidationException should be used for any validation result related to an ODF package.
   * This constructor should only be used for SaxParseExceptions unrelated to XML. This constructor
   * sets the public and system ID for XML and line and column number of the super class will be set
   * to be invalid.
   *
   * @param e root exception to be embeddded
   * @param constraint the predefined constaint message
   * @param sourcePath the source path of the exception. For instance, it might be an ODF package or
   *     ODF document.
   * @param messageParameters allow the customization of a constraint message with parameters.
   */
  public OdfValidationException(
      ValidationConstraint constraint,
      String sourcePath,
      Exception e,
      Object... messageParameters) {
    // The constraint convention is the first parameter to be the sourcePath of the ODF
    // document/package causing the exception
    super(formatMessage(constraint, sourcePath, messageParameters), null, null, -1, -1, e);
    mConstraint = constraint;
  }

  /** @return constraint belonging to this exception */
  public ValidationConstraint getConstraint() {
    return mConstraint;
  }

  private static String formatMessage(
      ValidationConstraint constraint, String sourcePath, Object... messageParameters) {
    String formattedString = NO_SOURCE;
    int varCount = 0;
    if (messageParameters != null) {
      varCount = messageParameters.length;
    }
    switch (varCount) {
      case 0:
        formattedString =
            String.format(
                constraint.getMessage(),
                sourcePath == null || sourcePath.equals(NO_SOURCE)
                    ? NO_SOURCE
                    : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX);
        break;
      case 1:
        formattedString =
            String.format(
                constraint.getMessage(),
                sourcePath == null || sourcePath.equals(NO_SOURCE)
                    ? NO_SOURCE
                    : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX,
                messageParameters[0]);
        break;
      case 2:
        formattedString =
            String.format(
                constraint.getMessage(),
                sourcePath == null || sourcePath.equals(NO_SOURCE)
                    ? NO_SOURCE
                    : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX,
                messageParameters[0],
                messageParameters[1]);
        break;
      case 3:
        formattedString =
            String.format(
                constraint.getMessage(),
                sourcePath == null || sourcePath.equals(NO_SOURCE)
                    ? NO_SOURCE
                    : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX,
                messageParameters[0],
                messageParameters[1],
                messageParameters[2]);
        break;
      case 4:
        formattedString =
            String.format(
                constraint.getMessage(),
                sourcePath == null || sourcePath.equals(NO_SOURCE)
                    ? NO_SOURCE
                    : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX,
                messageParameters[0],
                messageParameters[1],
                messageParameters[2],
                messageParameters[3]);
        break;
      case 5:
        formattedString =
            String.format(
                constraint.getMessage(),
                sourcePath == null || sourcePath.equals(NO_SOURCE)
                    ? NO_SOURCE
                    : SOURCE_PREFIX + sourcePath + SOURCE_SUFFIX,
                messageParameters[0],
                messageParameters[1],
                messageParameters[2],
                messageParameters[3],
                messageParameters[4]);
        break;
    }
    return formattedString;
  }
}