View Javadoc
1   /*
2    * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
3    * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
4    * and other copyright owners as documented in the project's IP log.
5    *
6    * This program and the accompanying materials are made available
7    * under the terms of the Eclipse Distribution License v1.0 which
8    * accompanies this distribution, is reproduced below, and is
9    * available at http://www.eclipse.org/org/documents/edl-v10.php
10   *
11   * All rights reserved.
12   *
13   * Redistribution and use in source and binary forms, with or
14   * without modification, are permitted provided that the following
15   * conditions are met:
16   *
17   * - Redistributions of source code must retain the above copyright
18   *   notice, this list of conditions and the following disclaimer.
19   *
20   * - Redistributions in binary form must reproduce the above
21   *   copyright notice, this list of conditions and the following
22   *   disclaimer in the documentation and/or other materials provided
23   *   with the distribution.
24   *
25   * - Neither the name of the Eclipse Foundation, Inc. nor the
26   *   names of its contributors may be used to endorse or promote
27   *   products derived from this software without specific prior
28   *   written permission.
29   *
30   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
31   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
32   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
35   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
39   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
42   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43   */
44  
45  package org.eclipse.jgit.lib;
46  
47  import java.io.IOException;
48  import java.io.PrintWriter;
49  import java.io.Writer;
50  
51  /** A simple progress reporter printing on a stream. */
52  public class TextProgressMonitor extends BatchingProgressMonitor {
53  	private final Writer out;
54  
55  	private boolean write;
56  
57  	/** Initialize a new progress monitor. */
58  	public TextProgressMonitor() {
59  		this(new PrintWriter(System.err));
60  	}
61  
62  	/**
63  	 * Initialize a new progress monitor.
64  	 *
65  	 * @param out
66  	 *            the stream to receive messages on.
67  	 */
68  	public TextProgressMonitor(Writer out) {
69  		this.out = out;
70  		this.write = true;
71  	}
72  
73  	@Override
74  	protected void onUpdate(String taskName, int workCurr) {
75  		StringBuilder s = new StringBuilder();
76  		format(s, taskName, workCurr);
77  		send(s);
78  	}
79  
80  	@Override
81  	protected void onEndTask(String taskName, int workCurr) {
82  		StringBuilder s = new StringBuilder();
83  		format(s, taskName, workCurr);
84  		s.append("\n"); //$NON-NLS-1$
85  		send(s);
86  	}
87  
88  	private void format(StringBuilder s, String taskName, int workCurr) {
89  		s.append("\r"); //$NON-NLS-1$
90  		s.append(taskName);
91  		s.append(": "); //$NON-NLS-1$
92  		while (s.length() < 25)
93  			s.append(' ');
94  		s.append(workCurr);
95  	}
96  
97  	@Override
98  	protected void onUpdate(String taskName, int cmp, int totalWork, int pcnt) {
99  		StringBuilder s = new StringBuilder();
100 		format(s, taskName, cmp, totalWork, pcnt);
101 		send(s);
102 	}
103 
104 	@Override
105 	protected void onEndTask(String taskName, int cmp, int totalWork, int pcnt) {
106 		StringBuilder s = new StringBuilder();
107 		format(s, taskName, cmp, totalWork, pcnt);
108 		s.append("\n"); //$NON-NLS-1$
109 		send(s);
110 	}
111 
112 	private void format(StringBuilder s, String taskName, int cmp,
113 			int totalWork, int pcnt) {
114 		s.append("\r"); //$NON-NLS-1$
115 		s.append(taskName);
116 		s.append(": "); //$NON-NLS-1$
117 		while (s.length() < 25)
118 			s.append(' ');
119 
120 		String endStr = String.valueOf(totalWork);
121 		String curStr = String.valueOf(cmp);
122 		while (curStr.length() < endStr.length())
123 			curStr = " " + curStr; //$NON-NLS-1$
124 		if (pcnt < 100)
125 			s.append(' ');
126 		if (pcnt < 10)
127 			s.append(' ');
128 		s.append(pcnt);
129 		s.append("% ("); //$NON-NLS-1$
130 		s.append(curStr);
131 		s.append("/"); //$NON-NLS-1$
132 		s.append(endStr);
133 		s.append(")"); //$NON-NLS-1$
134 	}
135 
136 	private void send(StringBuilder s) {
137 		if (write) {
138 			try {
139 				out.write(s.toString());
140 				out.flush();
141 			} catch (IOException err) {
142 				write = false;
143 			}
144 		}
145 	}
146 }