View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  package org.apache.log4j;
    18
    19  import org.apache.log4j.spi.ThrowableRenderer;
    20
    21  import java.io.StringWriter;
    22  import java.io.PrintWriter;
    23  import java.io.LineNumberReader;
    24  import java.io.StringReader;
    25  import java.io.IOException;
    26  import java.io.InterruptedIOException;
    27  import java.util.ArrayList;
    28
    29  /**
    30   * Default implementation of ThrowableRenderer using
    31   * Throwable.printStackTrace.
    32   *
    33   * @since 1.2.16
    34   */
    35  public final class DefaultThrowableRenderer implements ThrowableRenderer {
    36      /**
    37       * Construct new instance.
    38       */
    39      public DefaultThrowableRenderer() {
    40
    41      }
    42
    43
    44      /**
    45       * {@inheritDoc}
    46       */
    47      public String[] doRender(final Throwable throwable) {
    48          return render(throwable);
    49      }
    50
    51      /**
    52       * Render throwable using Throwable.printStackTrace.
    53       * @param throwable throwable, may not be null.
    54       * @return string representation.
    55       */
    56      public static String[] render(final Throwable throwable) {
    57          StringWriter sw = new StringWriter();
    58          PrintWriter pw = new PrintWriter(sw);
    59          try {
    60              throwable.printStackTrace(pw);
    61          } catch(RuntimeException ex) {
    62          }
    63          pw.flush();
    64          LineNumberReader reader = new LineNumberReader(
    65                  new StringReader(sw.toString()));
    66          ArrayList lines = new ArrayList();
    67          try {
    68            String line = reader.readLine();
    69            while(line != null) {
    70              lines.add(line);
    71              line = reader.readLine();
    72            }
    73          } catch(IOException ex) {
    74              if (ex instanceof InterruptedIOException) {
    75                  Thread.currentThread().interrupt();
    76              }
    77              lines.add(ex.toString());
    78          }
    79          String[] tempRep = new String[lines.size()];
    80          lines.toArray(tempRep);
    81          return tempRep;
    82      }
    83  }