/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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
 *
 * 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.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.crunch;

/**
 * A {@code RuntimeException} implementation that includes some additional options
 * for the Crunch execution engine to track reporting status. Clients may
 * use instances of this class in their own {@code DoFn} implementations.
 */
public class CrunchRuntimeException extends RuntimeException {

  private boolean logged = false;

  public CrunchRuntimeException(String msg) {
    super(msg);
  }

  public CrunchRuntimeException(Exception e) {
    super(e);
  }

  public CrunchRuntimeException(String msg, Exception e) {
    super(msg, e);
  }

  /**
   * Returns true if this exception was written to the debug logs.
   */
  public boolean wasLogged() {
    return logged;
  }

  /**
   * Indicate that this exception has been written to the debug logs.
   */
  public void markLogged() {
    this.logged = true;
  }
}
