001package org.apache.maven.repository.legacy;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.util.IdentityHashMap;
023import java.util.Map;
024
025import org.apache.maven.repository.ArtifactTransferEvent;
026import org.apache.maven.repository.ArtifactTransferListener;
027import org.apache.maven.repository.ArtifactTransferResource;
028import org.apache.maven.wagon.events.TransferEvent;
029import org.apache.maven.wagon.events.TransferListener;
030import org.apache.maven.wagon.repository.Repository;
031import org.apache.maven.wagon.resource.Resource;
032
033public class TransferListenerAdapter
034    implements TransferListener
035{
036
037    private final ArtifactTransferListener listener;
038
039    private final Map<Resource, ArtifactTransferResource> artifacts;
040
041    private final Map<Resource, Long> transfers;
042
043    public static TransferListener newAdapter( ArtifactTransferListener listener )
044    {
045        if ( listener == null )
046        {
047            return null;
048        }
049        else
050        {
051            return new TransferListenerAdapter( listener );
052        }
053    }
054
055    private TransferListenerAdapter( ArtifactTransferListener listener )
056    {
057        this.listener = listener;
058        this.artifacts = new IdentityHashMap<>();
059        this.transfers = new IdentityHashMap<>();
060    }
061
062    public void debug( String message )
063    {
064    }
065
066    public void transferCompleted( TransferEvent transferEvent )
067    {
068        ArtifactTransferEvent event = wrap( transferEvent );
069
070        Long transferred;
071        synchronized ( transfers )
072        {
073            transferred = transfers.remove( transferEvent.getResource() );
074        }
075        if ( transferred != null )
076        {
077            event.setTransferredBytes( transferred );
078        }
079
080        synchronized ( artifacts )
081        {
082            artifacts.remove( transferEvent.getResource() );
083        }
084
085        listener.transferCompleted( event );
086    }
087
088    public void transferError( TransferEvent transferEvent )
089    {
090        synchronized ( transfers )
091        {
092            transfers.remove( transferEvent.getResource() );
093        }
094        synchronized ( artifacts )
095        {
096            artifacts.remove( transferEvent.getResource() );
097        }
098    }
099
100    public void transferInitiated( TransferEvent transferEvent )
101    {
102        listener.transferInitiated( wrap( transferEvent ) );
103    }
104
105    public void transferProgress( TransferEvent transferEvent, byte[] buffer, int length )
106    {
107        Long transferred;
108        synchronized ( transfers )
109        {
110            transferred = transfers.get( transferEvent.getResource() );
111            if ( transferred == null )
112            {
113                transferred = (long) length;
114            }
115            else
116            {
117                transferred = transferred + length;
118            }
119            transfers.put( transferEvent.getResource(), transferred );
120        }
121
122        ArtifactTransferEvent event = wrap( transferEvent );
123        event.setDataBuffer( buffer );
124        event.setDataOffset( 0 );
125        event.setDataLength( length );
126        event.setTransferredBytes( transferred );
127
128        listener.transferProgress( event );
129    }
130
131    public void transferStarted( TransferEvent transferEvent )
132    {
133        listener.transferStarted( wrap( transferEvent ) );
134    }
135
136    private ArtifactTransferEvent wrap( TransferEvent event )
137    {
138        if ( event == null )
139        {
140            return null;
141        }
142        else
143        {
144            String wagon = event.getWagon().getClass().getName();
145
146            ArtifactTransferResource artifact = wrap( event.getWagon().getRepository(), event.getResource() );
147
148            ArtifactTransferEvent evt;
149            if ( event.getException() != null )
150            {
151                evt = new ArtifactTransferEvent( wagon, event.getException(), event.getRequestType(), artifact );
152            }
153            else
154            {
155                evt = new ArtifactTransferEvent( wagon, event.getEventType(), event.getRequestType(), artifact );
156            }
157
158            evt.setLocalFile( event.getLocalFile() );
159
160            return evt;
161        }
162    }
163
164    private ArtifactTransferResource wrap( Repository repository, Resource resource )
165    {
166        if ( resource == null )
167        {
168            return null;
169        }
170        else
171        {
172            synchronized ( artifacts )
173            {
174                ArtifactTransferResource artifact = artifacts.get( resource );
175
176                if ( artifact == null )
177                {
178                    artifact = new MavenArtifact( repository.getUrl(), resource );
179                    artifacts.put( resource, artifact );
180                }
181
182                return artifact;
183            }
184        }
185    }
186
187}