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 *   http://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 */
019package org.eclipse.aether.resolution;
020
021import org.eclipse.aether.RepositoryException;
022
023/**
024 * Thrown in case of an unresolvable metaversion.
025 */
026public class VersionResolutionException extends RepositoryException {
027
028    private final transient VersionResult result;
029
030    /**
031     * Creates a new exception with the specified result.
032     *
033     * @param result The version result at the point the exception occurred, may be {@code null}.
034     */
035    public VersionResolutionException(VersionResult result) {
036        super(getMessage(result), getCause(result));
037        this.result = result;
038    }
039
040    private static String getMessage(VersionResult result) {
041        StringBuilder buffer = new StringBuilder(256);
042        buffer.append("Failed to resolve version");
043        if (result != null) {
044            buffer.append(" for ").append(result.getRequest().getArtifact());
045            if (!result.getExceptions().isEmpty()) {
046                buffer.append(": ")
047                        .append(result.getExceptions().iterator().next().getMessage());
048            }
049        }
050        return buffer.toString();
051    }
052
053    private static Throwable getCause(VersionResult result) {
054        Throwable cause = null;
055        if (result != null && !result.getExceptions().isEmpty()) {
056            cause = result.getExceptions().get(0);
057        }
058        return cause;
059    }
060
061    /**
062     * Creates a new exception with the specified result and detail message.
063     *
064     * @param result The version result at the point the exception occurred, may be {@code null}.
065     * @param message The detail message, may be {@code null}.
066     */
067    public VersionResolutionException(VersionResult result, String message) {
068        super(message, getCause(result));
069        this.result = result;
070    }
071
072    /**
073     * Creates a new exception with the specified result, detail message and cause.
074     *
075     * @param result The version result at the point the exception occurred, may be {@code null}.
076     * @param message The detail message, may be {@code null}.
077     * @param cause The exception that caused this one, may be {@code null}.
078     */
079    public VersionResolutionException(VersionResult result, String message, Throwable cause) {
080        super(message, cause);
081        this.result = result;
082    }
083
084    /**
085     * Gets the version result at the point the exception occurred. Despite being incomplete, callers might want to use
086     * this result to fail gracefully and continue their operation with whatever interim data has been gathered.
087     *
088     * @return The version result or {@code null} if unknown.
089     */
090    public VersionResult getResult() {
091        return result;
092    }
093}