001/*
002 * acme4j - Java ACME client
003 *
004 * Copyright (C) 2016 Richard "Shred" Körber
005 *   http://acme4j.shredzone.org
006 *
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
013 */
014package org.shredzone.acme4j.exception;
015
016import static java.util.Objects.requireNonNull;
017
018import java.net.URL;
019
020import org.shredzone.acme4j.AcmeResource;
021
022/**
023 * A runtime exception that is thrown when an {@link AcmeException} occured while trying
024 * to lazy-load a resource from the ACME server. It contains the original cause of the
025 * exception and a reference to the resource that could not be lazy-loaded. It is usually
026 * thrown by getter methods, so the API is not polluted with checked exceptions.
027 */
028public class AcmeLazyLoadingException extends RuntimeException {
029    private static final long serialVersionUID = 1000353433913721901L;
030
031    private final Class<? extends AcmeResource> type;
032    private final URL location;
033
034    /**
035     * Creates a new {@link AcmeLazyLoadingException}.
036     *
037     * @param resource
038     *            {@link AcmeResource} to be loaded
039     * @param cause
040     *            {@link AcmeException} that was raised
041     */
042    public AcmeLazyLoadingException(AcmeResource resource, AcmeException cause) {
043        this(requireNonNull(resource).getClass(), requireNonNull(resource).getLocation(), cause);
044    }
045
046    /**
047     * Creates a new {@link AcmeLazyLoadingException}.
048     * <p>
049     * This constructor is used if there is no actual instance of the resource.
050     *
051     * @param type
052     *         {@link AcmeResource} type to be loaded
053     * @param location
054     *         Resource location
055     * @param cause
056     *         {@link AcmeException} that was raised
057     * @since 2.8
058     */
059    public AcmeLazyLoadingException(Class<? extends AcmeResource> type, URL location, AcmeException cause) {
060        super(requireNonNull(type).getSimpleName() + " " + requireNonNull(location), requireNonNull(cause));
061        this.type = type;
062        this.location = location;
063    }
064
065    /**
066     * Returns the {@link AcmeResource} type of the resource that could not be loaded.
067     */
068    public Class<? extends AcmeResource> getType() {
069        return type;
070    }
071
072    /**
073     * Returns the location of the resource that could not be loaded.
074     */
075    public URL getLocation() {
076        return location;
077    }
078
079}