/*
 *  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.myfaces.buildtools.maven2.plugin.javascript.jmt.compress;

import java.io.File;

/**
 * Exception during compression of some JavaScript file
 */
public class CompressionException extends Exception {

    /** generated */
    private static final long serialVersionUID = 1282418066985382856L;
    
    /** The script that cannot be compressed */
    private File script;
    
    public CompressionException() {
        super();
    }
    
    public CompressionException( File script ) {
        super();
        this.script = script;
    }

    public CompressionException(String message, Throwable cause, File script) {
        super(message, cause);
        this.script = script;
    }

    public CompressionException(String message, File script) {
        super(message);
        this.script = script;
    }

    public CompressionException(Throwable cause, File script) {
        super(cause);
        this.script = script;
    }

    public File getScript() {
        return script;
    }

}
