/*
 * Copyright 2016 Open Networking Laboratory
 *
 * 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
 *
 * 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.onosproject.yangutils.parser.exceptions;

/**
 * Base class for exceptions in parser operations.
 */
public class ParserException extends RuntimeException {

    private static final long serialVersionUID = 20160211L;
    private int lineNumber;
    private int charPositionInLine;
    private String fileName;

    /**
     * Create a new parser exception.
     */
    public ParserException() {
        super();
    }

    /**
     * Creates a new parser exception with given message.
     *
     * @param message the detail of exception in string
     */
    public ParserException(String message) {
        super(message);
    }

    /**
     * Creates a new parser exception from given message and cause.
     *
     * @param message the detail of exception in string
     * @param cause underlying cause of the error
     */
    public ParserException(final String message, final Throwable cause) {
        super(message, cause);
    }

    /**
     * Creates a new parser exception from cause.
     *
     * @param cause underlying cause of the error
     */
    public ParserException(final Throwable cause) {
        super(cause);
    }

    /**
     * Returns line number of the exception.
     *
     * @return line number of the exception
     */
    public int getLineNumber() {
        return this.lineNumber;
    }

    /**
     * Returns YANG file name of the exception.
     *
     * @return YANG file name of the exception
     */
    public String getFileName() {
        return this.fileName;
    }

    /**
     * Returns position of the exception.
     *
     * @return position of the exception
     */
    public int getCharPositionInLine() {
        return this.charPositionInLine;
    }

    /**
     * Sets line number of YANG file.
     *
     * @param line line number of YANG file
     */
    public void setLine(int line) {
        this.lineNumber = line;
    }

    /**
     * Sets position of exception.
     *
     * @param charPosition position of exception
     */
    public void setCharPosition(int charPosition) {
        this.charPositionInLine = charPosition;
    }

    /**
     * Sets file name in parser exception.
     *
     * @param fileName YANG file name
     */
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}
