    1   /*
    2    * Copyright 2002,2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16
    17  package org.apache.commons.jelly.tags.junit;
    18
    19  import java.io.PrintStream;
    20  import java.io.PrintWriter;
    21
    22  import junit.framework.AssertionFailedError;
    23
    24  import org.apache.commons.jelly.LocationAware;
    25
    26  /***
    27   * <p><code>JellyAssertionFailedError</code> is
    28   * a JUnit AssertionFailedError which is LocationAware so that it can include
    29   * details of where in the JellyUnit test case that the failure occurred.</p>
    30   *
    31   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    32   * @version $Revision: 155420 $
    33   */
    34
    35  public class JellyAssertionFailedError extends AssertionFailedError implements LocationAware {
    36
    37      /*** the underlying cause of the exception */
    38      private Throwable cause;
    39
    40      /*** the Jelly file which caused the problem */
    41      private String fileName;
    42
    43      /*** the tag name which caused the problem */
    44      private String elementName;
    45
    46      /*** the line number in the script of the error */
    47      private int lineNumber = -1;
    48
    49      /*** the column number in the script of the error */
    50      private int columnNumber = -1;
    51
    52      public JellyAssertionFailedError() {
    53      }
    54
    55      public JellyAssertionFailedError(String message) {
    56          super(message);
    57      }
    58
    59      public JellyAssertionFailedError(String message, Throwable cause) {
    60          super(message);
    61          this.cause = cause;
    62      }
    63
    64      public JellyAssertionFailedError(Throwable cause) {
    65          super(cause.getLocalizedMessage());
    66          this.cause = cause;
    67      }
    68
    69      public Throwable getCause() {
    70          return cause;
    71      }
    72
    73
    74      /***
    75       * @return the line number of the tag
    76       */
    77      public int getLineNumber() {
    78          return lineNumber;
    79      }
    80
    81      /***
    82       * Sets the line number of the tag
    83       */
    84      public void setLineNumber(int lineNumber) {
    85          this.lineNumber = lineNumber;
    86      }
    87
    88      /***
    89       * @return the column number of the tag
    90       */
    91      public int getColumnNumber() {
    92          return columnNumber;
    93      }
    94
    95      /***
    96       * Sets the column number of the tag
    97       */
    98      public void setColumnNumber(int columnNumber) {
    99          this.columnNumber = columnNumber;
    100     }
    101
    102     /***
    103      * @return the Jelly file which caused the problem
    104      */
    105     public String getFileName() {
    106         return fileName;
    107     }
    108
    109     /***
    110      * Sets the Jelly file which caused the problem
    111      */
    112     public void setFileName(String fileName) {
    113         this.fileName = fileName;
    114     }
    115
    116
    117     /***
    118      * @return the element name which caused the problem
    119      */
    120     public String getElementName() {
    121         return elementName;
    122     }
    123
    124     /***
    125      * Sets the element name which caused the problem
    126      */
    127     public void setElementName(String elementName) {
    128         this.elementName = elementName;
    129     }
    130
    131
    132     public String getMessage() {
    133         return super.getMessage() + " File: " + fileName + " At tag <" + elementName + ">: line: "
    134             + lineNumber + " column: " + columnNumber;
    135     }
    136
    137     public String getReason() {
    138         return super.getMessage();
    139     }
    140
    141     // #### overload the printStackTrace methods...
    142     public void printStackTrace(PrintWriter s) {
    143         synchronized (s) {
    144             super.printStackTrace(s);
    145             if  (cause != null) {
    146                 s.println("Root cause");
    147                 cause.printStackTrace(s);
    148             }
    149         }
    150     }
    151
    152     public void printStackTrace(PrintStream s) {
    153         synchronized (s) {
    154             super.printStackTrace(s);
    155             if  (cause != null) {
    156                 s.println("Root cause");
    157                 cause.printStackTrace(s);
    158             }
    159         }
    160     }
    161
    162     public void printStackTrace() {
    163         super.printStackTrace();
    164         if (cause != null) {
    165             System.out.println("Root cause");
    166             cause.printStackTrace();
    167         }
    168     }
    169 }