    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 *   https://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019
    020package org.apache.commons.compress;
    021
    022import java.io.IOException;
    023import java.util.function.Supplier;
    024
    025import org.apache.commons.lang3.function.Suppliers;
    026
    027/**
    028 * Signals that a Pack200 Compress exception of some sort has occurred.
    029 *
    030 * @since 1.28.0
    031 */
    032public class CompressException extends IOException {
    033
    034    /** Serial. */
    035    private static final long serialVersionUID = 1;
    036
    037    /**
    038     * Checks that the specified object reference is not {@code null} and throws a customized {@link CompressException} if it is. *
    039     *
    040     * @param <T>             The type of the reference.
    041     * @param <E>             The type of the exception.
    042     * @param cls             The exception class.
    043     * @param obj             The object reference to check for nullity.
    044     * @param messageSupplier supplier of the detail message to be used in the event that a {@code ArchiveException} is thrown
    045     * @return {@code obj} if not {@code null}.
    046     * @throws E if {@code obj} is {@code null}.
    047     */
    048    protected static <T, E extends Throwable> T requireNonNull(final Class<? super E> cls, final T obj, final Supplier<String> messageSupplier) throws E {
    049        if (obj == null) {
    050            try {
    051                cls.getConstructor(String.class).newInstance(Suppliers.get(messageSupplier));
    052            } catch (ReflectiveOperationException | SecurityException e) {
    053                new CompressException(Suppliers.get(messageSupplier), e);
    054            }
    055        }
    056        return obj;
    057    }
    058
    059    /**
    060     * Constructs an {@code CompressException} with {@code null} as its error detail message.
    061     */
    062    public CompressException() {
    063        // empty
    064    }
    065
    066    /**
    067     * Constructs a new exception with the specified detail message. The cause is not initialized.
    068     *
    069     * @param message The message (which is saved for later retrieval by the {@link #getMessage()} method).
    070     */
    071    public CompressException(final String message) {
    072        super(message);
    073    }
    074
    075    /**
    076     * Constructs a new exception with the specified detail message and cause.
    077     *
    078     * @param message The message (which is saved for later retrieval by the {@link #getMessage()} method).
    079     * @param cause   The cause (which is saved for later retrieval by the {@link #getCause()} method). A null value indicates that the cause is nonexistent or
    080     *                unknown.
    081     */
    082    public CompressException(final String message, final Throwable cause) {
    083        super(message, cause);
    084    }
    085
    086    /**
    087     * Constructs a {@code CompressException} with the specified cause and a detail message.
    088     *
    089     * @param cause The cause (which is saved for later retrieval by the {@link #getCause()} method). (A null value is permitted, and indicates that the cause
    090     *              is nonexistent or unknown.)
    091     */
    092    public CompressException(final Throwable cause) {
    093        super(cause);
    094    }
    095}