/*
 * Copyright 2002,2004 The Apache Software Foundation.
 *
 * 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.apache.commons.jelly;

/** 
 * <p>A <code>JellyTagException</code> is an exception generated by a Tag
 * implementation.</p>
 *
 * @author <a href="mailto:morgand@apache.org">Morgan Delagrange</a>
 * @version $Revision: 1.5 $
 */

public class JellyTagException extends JellyException {
    
    public JellyTagException() {
    }

    public JellyTagException(String message) {
        super(message);
    }

    public JellyTagException(String message, Throwable cause) {
        super(message,cause);
    }
    
    public JellyTagException(Throwable cause) {
        super(cause);
    }
    
    public JellyTagException(Throwable cause, String fileName, String elementName, int columnNumber, int lineNumber) {
        super(cause, fileName, elementName, columnNumber, lineNumber);
    }
    
    public JellyTagException(String reason, Throwable cause, String fileName, String elementName, int columnNumber, int lineNumber) {
        super(reason,cause,fileName,elementName,columnNumber,lineNumber);
    }
    
    public JellyTagException(String reason, String fileName, String elementName, int columnNumber, int lineNumber) {
        super(reason,fileName,elementName,columnNumber,lineNumber);
    }
    
}
