View Javadoc
1   package org.apache.maven.repository.internal.util;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.PrintStream;
23  import java.text.DecimalFormat;
24  import java.text.DecimalFormatSymbols;
25  import java.util.Locale;
26  import java.util.Map;
27  import java.util.concurrent.ConcurrentHashMap;
28  
29  import org.eclipse.aether.transfer.AbstractTransferListener;
30  import org.eclipse.aether.transfer.TransferEvent;
31  import org.eclipse.aether.transfer.TransferResource;
32  
33  public class ConsoleTransferListener
34      extends AbstractTransferListener
35  {
36  
37      private PrintStream out;
38  
39      private Map<TransferResource, Long> downloads = new ConcurrentHashMap<>();
40  
41      private int lastLength;
42  
43      public ConsoleTransferListener()
44      {
45          this( null );
46      }
47  
48      public ConsoleTransferListener( PrintStream out )
49      {
50          this.out = ( out != null ) ? out : System.out;
51      }
52  
53      @Override
54      public void transferInitiated( TransferEvent event )
55      {
56          String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
57  
58          println( "transferInitiated", message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
59      }
60  
61      @Override
62      public void transferProgressed( TransferEvent event )
63      {
64          TransferResource resource = event.getResource();
65          downloads.put( resource, event.getTransferredBytes() );
66  
67          StringBuilder buffer = new StringBuilder( 64 );
68  
69          for ( Map.Entry<TransferResource, Long> entry : downloads.entrySet() )
70          {
71              long total = entry.getKey().getContentLength();
72              long complete = entry.getValue();
73  
74              buffer.append( getStatus( complete, total ) ).append( "  " );
75          }
76  
77          int pad = lastLength - buffer.length();
78          lastLength = buffer.length();
79          pad( buffer, pad );
80          buffer.append( '\r' );
81  
82          print( "transferProgressed", buffer.toString() );
83      }
84  
85      private String getStatus( long complete, long total )
86      {
87          if ( total >= 1024 )
88          {
89              return toKB( complete ) + "/" + toKB( total ) + " KB ";
90          }
91          else if ( total >= 0 )
92          {
93              return complete + "/" + total + " B ";
94          }
95          else if ( complete >= 1024 )
96          {
97              return toKB( complete ) + " KB ";
98          }
99          else
100         {
101             return complete + " B ";
102         }
103     }
104 
105     private void pad( StringBuilder buffer, int spaces )
106     {
107         String block = "                                        ";
108         while ( spaces > 0 )
109         {
110             int n = Math.min( spaces, block.length() );
111             buffer.append( block, 0, n );
112             spaces -= n;
113         }
114     }
115 
116     @Override
117     public void transferSucceeded( TransferEvent event )
118     {
119         transferCompleted( event );
120 
121         TransferResource resource = event.getResource();
122         long contentLength = event.getTransferredBytes();
123         if ( contentLength >= 0 )
124         {
125             String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
126             String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
127 
128             String throughput = "";
129             long duration = System.currentTimeMillis() - resource.getTransferStartTime();
130             if ( duration > 0 )
131             {
132                 DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
133                 double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
134                 throughput = " at " + format.format( kbPerSec ) + " KB/sec";
135             }
136 
137             println( "transferSucceeded", type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " ("
138                 + len + throughput + ")" );
139         }
140     }
141 
142     @Override
143     public void transferFailed( TransferEvent event )
144     {
145         transferCompleted( event );
146 
147         println( "transferFailed", event.getException().getClass() + ": " + event.getException().getMessage()  );
148     }
149 
150     private void transferCompleted( TransferEvent event )
151     {
152         downloads.remove( event.getResource() );
153 
154         StringBuilder buffer = new StringBuilder( 64 );
155         pad( buffer, lastLength );
156         buffer.append( '\r' );
157         out.println( buffer );
158     }
159 
160     @Override
161     public void transferCorrupted( TransferEvent event )
162     {
163         println( "transferCorrupted", event.getException().getClass() + ": " + event.getException().getMessage() );
164     }
165 
166     protected long toKB( long bytes )
167     {
168         return ( bytes + 1023 ) / 1024;
169     }
170 
171     private void println( String event, String message )
172     {
173         print( event, message );
174         out.println();
175     }
176 
177     private void print( String event, String message )
178     {
179         out.print( "Aether Transfer - " + event );
180         if ( message != null )
181         {
182             out.print( ": " );
183             out.print( message );
184         }
185     }
186 }