1   package org.codehaus.mojo.jaxb2;
2   
3   import org.apache.maven.plugin.logging.Log;
4   import org.codehaus.mojo.jaxb2.shared.Validate;
5   
6   import java.text.NumberFormat;
7   import java.util.Map;
8   import java.util.SortedMap;
9   import java.util.TreeMap;
10  
11  
12  
13  
14  
15  
16  
17  public class BufferingLog implements Log {
18  
19      public enum LogLevel {
20          DEBUG,
21          INFO,
22          WARN,
23          ERROR,
24          NONE
25      }
26  
27      
28      private static final NumberFormat INTEGER_FORMAT = NumberFormat.getIntegerInstance();
29      private LogLevel minLevel;
30      private final Object lock = new Object();
31      private SortedMap<String, Throwable> logBuffer;
32  
33      static {
34          setMinimumIntegerDigits(3);
35      }
36  
37      public BufferingLog() {
38          this(LogLevel.INFO);
39      }
40  
41      public BufferingLog(final LogLevel minLevel) {
42  
43          
44          Validate.notNull(minLevel, "minLevel");
45  
46          
47          logBuffer = new TreeMap<String, Throwable>();
48          this.minLevel = minLevel;
49      }
50  
51      
52  
53  
54      public LogLevel getMinimumLogLevel() {
55          return minLevel;
56      }
57  
58      
59  
60  
61      public SortedMap<String, Throwable> getLogBuffer() {
62          return logBuffer;
63      }
64  
65      
66  
67  
68  
69  
70      public SortedMap<String, Throwable> getAndResetLogBuffer() {
71  
72          final SortedMap<String, Throwable> toReturn = logBuffer;
73          synchronized (lock) {
74              this.logBuffer = new TreeMap<String, Throwable>();
75          }
76  
77          return toReturn;
78      }
79  
80      
81  
82  
83  
84  
85      public static void setMinimumIntegerDigits(final int minimumIntegerDigits) {
86          INTEGER_FORMAT.setMinimumIntegerDigits(minimumIntegerDigits);
87      }
88  
89      
90  
91  
92      public String getPrettyPrintedLog() {
93  
94          final StringBuilder builder = new StringBuilder();
95          for (Map.Entry<String, Throwable> current : logBuffer.entrySet()) {
96              builder.append("\n").append(current.getKey());
97  
98              final Throwable error = current.getValue();
99              if (error != null) {
100                 builder.append(" [" + error.getMessage() + "]: " + error.getClass().getSimpleName());
101             }
102         }
103 
104         
105         return builder.toString();
106     }
107 
108     
109 
110 
111     public void debug(CharSequence content, Throwable error) {
112         addLogEntry(LogLevel.DEBUG, content, error);
113     }
114 
115     
116 
117 
118     public void debug(CharSequence content) {
119         debug(content, null);
120     }
121 
122     
123 
124 
125     public void debug(Throwable error) {
126         debug("", error);
127     }
128 
129     
130 
131 
132     public void info(CharSequence content, Throwable error) {
133         addLogEntry(LogLevel.INFO, content, error);
134     }
135 
136     
137 
138 
139     public void info(CharSequence content) {
140         info(content, null);
141     }
142 
143     
144 
145 
146     public void info(Throwable error) {
147         info("", error);
148     }
149 
150     
151 
152 
153     public void warn(CharSequence content, Throwable error) {
154         addLogEntry(LogLevel.WARN, content, error);
155     }
156 
157     
158 
159 
160     public void warn(CharSequence content) {
161         warn(content, null);
162     }
163 
164     
165 
166 
167     public void warn(Throwable error) {
168         warn("", error);
169     }
170 
171     
172 
173 
174     public void error(final CharSequence content, final Throwable error) {
175         addLogEntry(LogLevel.ERROR, content, error);
176     }
177 
178     
179 
180 
181     public void error(CharSequence content) {
182         error(content, null);
183     }
184 
185     
186 
187 
188     public void error(final Throwable error) {
189         error("", error);
190     }
191 
192     
193 
194 
195     public boolean isDebugEnabled() {
196         return isLogEnabledFor(LogLevel.DEBUG);
197     }
198 
199     
200 
201 
202     public boolean isInfoEnabled() {
203         return isLogEnabledFor(LogLevel.INFO);
204     }
205 
206     
207 
208 
209     public boolean isWarnEnabled() {
210         return isLogEnabledFor(LogLevel.WARN);
211     }
212 
213     
214 
215 
216     public boolean isErrorEnabled() {
217         return isLogEnabledFor(LogLevel.ERROR);
218     }
219 
220     
221     
222     
223 
224     private void addLogEntry(final LogLevel level, final CharSequence message, final Throwable throwable) {
225 
226         synchronized (lock) {
227             if (isLogEnabledFor(level)) {
228 
229                 final int index = logBuffer.size();
230                 final String logMessage = "" + INTEGER_FORMAT.format(index) + ": (" + level + ") " + message;
231                 logBuffer.put(logMessage, throwable);
232             }
233         }
234     }
235 
236     private boolean isLogEnabledFor(final LogLevel level) {
237         return level.compareTo(minLevel) >= 0;
238     }
239 }