/*
 * 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.eclipse.aether.connector.basic;

import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.spi.connector.ArtifactTransfer;
import org.eclipse.aether.spi.connector.transport.Transporter;
import org.eclipse.aether.transfer.ArtifactNotFoundException;
import org.eclipse.aether.transfer.ArtifactTransferException;
import org.eclipse.aether.transfer.TransferEvent;

final class ArtifactTransportListener
    extends TransferTransportListener<ArtifactTransfer>
{

    private final RemoteRepository repository;

    public ArtifactTransportListener( ArtifactTransfer transfer, RemoteRepository repository,
                                      TransferEvent.Builder eventBuilder )
    {
        super( transfer, eventBuilder );
        this.repository = repository;
    }

    @Override
    public void transferFailed( Exception exception, int classification )
    {
        ArtifactTransferException e;
        if ( classification == Transporter.ERROR_NOT_FOUND )
        {
            e = new ArtifactNotFoundException( getTransfer().getArtifact(), repository );
        }
        else
        {
            e = new ArtifactTransferException( getTransfer().getArtifact(), repository, exception );
        }
        getTransfer().setException( e );
        super.transferFailed( e, classification );
    }

}
