Package org.ngrinder.common.util

Source Code of org.ngrinder.common.util.ExceptionUtils

package org.ngrinder.common.util;

import org.ngrinder.common.exception.NGrinderRuntimeException;

import java.util.List;

/**
* Exception processing utility.
*
* @author junoyoon
* @since 3.2.3
*/
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
public abstract class ExceptionUtils {
  /**
   * Check if the exception is {@link NGrinderRuntimeException}. If so, throw it. If
   * not, wrap the given exception and throw it.
   *
   * @param t   Throwable
   * @return exception
   */
  public static NGrinderRuntimeException processException(Throwable t) {
    if (t instanceof NGrinderRuntimeException) {
      throw (NGrinderRuntimeException) sanitize(t);
    } else {
      throw new NGrinderRuntimeException(sanitize(t), true);
    }
  }

  /**
   * Check if the exception {@link NGrinderRuntimeException}. If so, throw. If
   * not, wrap the given exception.
   *
   * @param message  message
   * @return exception
   */
  public static NGrinderRuntimeException processException(String message) {
    throw processException(new NGrinderRuntimeException(message));
  }

  /**
   * Check if the exception is {@link NGrinderRuntimeException}. If so, throw.
   * If not, wrap the given exception.
   *
   * @param message  message
   * @param t     Throwable
   * @return exception
   */
  public static NGrinderRuntimeException processException(String message, Throwable t) {
    if (t instanceof NGrinderRuntimeException) {
      throw (NGrinderRuntimeException) sanitize(t);
    } else {
      throw new NGrinderRuntimeException(message, sanitize(t), true);
    }
  }

  /**
   * Filter the stacktrace elements with only interesting one.
   *
   * @param throwable  throwable
   * @return {@link Throwable} instance with interested stacktrace elements.
   */
  public static Throwable sanitize(Throwable throwable) {
    if (throwable instanceof NGrinderRuntimeException) {
      if (((NGrinderRuntimeException) throwable).isSanitized()) {
        return throwable;
      }
    }
    Throwable t = throwable;
    while (t != null) {
      // Note that this getBoolean access may well be synced...
      StackTraceElement[] trace = t.getStackTrace();
      List<StackTraceElement> newTrace = CollectionUtils.newArrayList();
      for (StackTraceElement stackTraceElement : trace) {
        if (isApplicationClass(stackTraceElement.getClassName())) {
          newTrace.add(stackTraceElement);
        }
      }
      StackTraceElement[] clean = new StackTraceElement[newTrace.size()];
      newTrace.toArray(clean);
      t.setStackTrace(clean);
      t = t.getCause();
    }
    if (throwable instanceof NGrinderRuntimeException) {
      ((NGrinderRuntimeException) throwable).setSanitized(true);
    }
    return throwable;
  }

  /**
   * Check if the given class name is the application class or not.
   *
   * @param className  class name including package name
   * @return true if application class
   */
  private static boolean isApplicationClass(String className) {
    for (String each : getUninterestingPackages()) {
      if (className.startsWith(each)) {
        return false;
      }
    }
    return true;
  }

  private static final String[] NON_NGRINDER_PACKAGE = ("org.springframework.," + "javax.," + "org.apache.catalina.,"
      + "sun.," + "net.sf.," + "java.," + "org.ngrinder.common.exception.NGrinderRuntimeException,"
      + "com.springsource.," + "org.apache.coyote.," + "org.apache.tomact.,"
      + "org.ngrinder.common.util.ExceptionUtils.").split("(\\s|,)+");

  /**
   * Get interesting packages.
   *
   * @return interesting packages
   */
  protected static String[] getUninterestingPackages() {
    return NON_NGRINDER_PACKAGE;
  }

}
TOP

Related Classes of org.ngrinder.common.util.ExceptionUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.