View Javadoc
1   package org.apache.maven.resolver.examples.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.MetadataNotFoundException;
31  import org.eclipse.aether.transfer.TransferEvent;
32  import org.eclipse.aether.transfer.TransferResource;
33  
34  /**
35   * A simplistic transfer listener that logs uploads/downloads to the console.
36   */
37  public class ConsoleTransferListener
38      extends AbstractTransferListener
39  {
40  
41      private PrintStream out;
42  
43      private Map<TransferResource, Long> downloads = new ConcurrentHashMap<TransferResource, Long>();
44  
45      private int lastLength;
46  
47      public ConsoleTransferListener()
48      {
49          this( null );
50      }
51  
52      public ConsoleTransferListener( PrintStream out )
53      {
54          this.out = ( out != null ) ? out : System.out;
55      }
56  
57      @Override
58      public void transferInitiated( TransferEvent event )
59      {
60          String message = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
61  
62          out.println( message + ": " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName() );
63      }
64  
65      @Override
66      public void transferProgressed( TransferEvent event )
67      {
68          TransferResource resource = event.getResource();
69          downloads.put( resource, Long.valueOf( event.getTransferredBytes() ) );
70  
71          StringBuilder buffer = new StringBuilder( 64 );
72  
73          for ( Map.Entry<TransferResource, Long> entry : downloads.entrySet() )
74          {
75              long total = entry.getKey().getContentLength();
76              long complete = entry.getValue().longValue();
77  
78              buffer.append( getStatus( complete, total ) ).append( "  " );
79          }
80  
81          int pad = lastLength - buffer.length();
82          lastLength = buffer.length();
83          pad( buffer, pad );
84          buffer.append( '\r' );
85  
86          out.print( buffer );
87      }
88  
89      private String getStatus( long complete, long total )
90      {
91          if ( total >= 1024 )
92          {
93              return toKB( complete ) + "/" + toKB( total ) + " KB ";
94          }
95          else if ( total >= 0 )
96          {
97              return complete + "/" + total + " B ";
98          }
99          else if ( complete >= 1024 )
100         {
101             return toKB( complete ) + " KB ";
102         }
103         else
104         {
105             return complete + " B ";
106         }
107     }
108 
109     private void pad( StringBuilder buffer, int spaces )
110     {
111         String block = "                                        ";
112         while ( spaces > 0 )
113         {
114             int n = Math.min( spaces, block.length() );
115             buffer.append( block, 0, n );
116             spaces -= n;
117         }
118     }
119 
120     @Override
121     public void transferSucceeded( TransferEvent event )
122     {
123         transferCompleted( event );
124 
125         TransferResource resource = event.getResource();
126         long contentLength = event.getTransferredBytes();
127         if ( contentLength >= 0 )
128         {
129             String type = ( event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded" );
130             String len = contentLength >= 1024 ? toKB( contentLength ) + " KB" : contentLength + " B";
131 
132             String throughput = "";
133             long duration = System.currentTimeMillis() - resource.getTransferStartTime();
134             if ( duration > 0 )
135             {
136                 long bytes = contentLength - resource.getResumeOffset();
137                 DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
138                 double kbPerSec = ( bytes / 1024.0 ) / ( duration / 1000.0 );
139                 throughput = " at " + format.format( kbPerSec ) + " KB/sec";
140             }
141 
142             out.println( type + ": " + resource.getRepositoryUrl() + resource.getResourceName() + " (" + len
143                 + throughput + ")" );
144         }
145     }
146 
147     @Override
148     public void transferFailed( TransferEvent event )
149     {
150         transferCompleted( event );
151 
152         if ( !( event.getException() instanceof MetadataNotFoundException ) )
153         {
154             event.getException().printStackTrace( out );
155         }
156     }
157 
158     private void transferCompleted( TransferEvent event )
159     {
160         downloads.remove( event.getResource() );
161 
162         StringBuilder buffer = new StringBuilder( 64 );
163         pad( buffer, lastLength );
164         buffer.append( '\r' );
165         out.print( buffer );
166     }
167 
168     public void transferCorrupted( TransferEvent event )
169     {
170         event.getException().printStackTrace( out );
171     }
172 
173     protected long toKB( long bytes )
174     {
175         return ( bytes + 1023 ) / 1024;
176     }
177 
178 }