/*
 * 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.sis.referencing.factory;

import org.opengis.referencing.AuthorityFactory;


/**
 * Thrown when a whole factory can not be created because a resource is missing.
 * The most common case is when the {@link org.apache.sis.referencing.factory.sql.EPSGFactory}
 * has no connection to an EPSG database.
 *
 * <h2>Relationship with other exceptions</h2>
 * This exception means that the whole factory is unusable.
 * By contrast, {@link MissingFactoryResourceException} means that at least one particular object
 * can not be created, but other objects may be okay.
 *
 * @author  Martin Desruisseaux (IRD, Geomatys)
 * @version 0.7
 *
 * @see ConcurrentAuthorityFactory#newDataAccess()
 *
 * @since 0.7
 * @module
 */
public class UnavailableFactoryException extends MissingFactoryResourceException {
    /**
     * Serial number for inter-operability with different versions.
     */
    private static final long serialVersionUID = -661925454228937249L;

    /**
     * The factory that can not perform its work, or {@code null} if unknown.
     */
    private AuthorityFactory factory;

    /**
     * Construct an exception with no detail message.
     */
    public UnavailableFactoryException() {
    }

    /**
     * Construct an exception with the specified detail message.
     *
     * @param  message  the detail message. The detail message is saved
     *         for later retrieval by the {@link #getMessage()} method.
     */
    public UnavailableFactoryException(String message) {
        super(message);
    }

    /**
     * Construct an exception with the specified detail message and cause.
     * The cause is the exception thrown in the underlying database
     * (e.g. {@link java.io.IOException} or {@link java.sql.SQLException}).
     *
     * @param  message  the detail message. The detail message is saved
     *         for later retrieval by the {@link #getMessage()} method.
     * @param  cause  the cause for this exception. The cause is saved
     *         for later retrieval by the {@link #getCause()} method.
     */
    public UnavailableFactoryException(String message, Throwable cause) {
        super(message, cause);
    }

    /**
     * Specifies which factory is unavailable. This information can be provided when the exception occurred
     * at some later stage <em>after</em> the factory construction (never inside the factory constructor),
     * for example the first time that the factory tried to create an object.
     *
     * <div class="note"><b>Example:</b>
     * {@link org.apache.sis.referencing.factory.sql.EPSGFactory} may have been successfully created with
     * a valid {@link javax.sql.DataSource}. But the call to {@link javax.sql.DataSource#getConnection()}
     * happens only later (the first time that user invokes a method requiring a search in the database).
     * In case of failure to connect to the database, user may discover late that the factory is actually
     * unavailable. User may want to be informed about which factory is unavailable, for example in order
     * to remove it from the list of factory managed by {@link MultiAuthoritiesFactory}.</div>
     *
     * @param  factory  the factory which is unavailable.
     */
    public void setUnavailableFactory(final AuthorityFactory factory) {
        this.factory = factory;
    }

    /**
     * Returns the factory which has been found unavailable, or {@code null} if unspecified.
     * See {@link #setUnavailableFactory(AuthorityFactory)} for more details.
     *
     * @return the factory that should be considered as unavailable.
     */
    public AuthorityFactory getUnavailableFactory() {
        return factory;
    }
}
