1 28 29 package com.idaremedia.antx.capture; 30 31 import java.io.PrintStream ; 32 33 import org.apache.tools.ant.BuildException; 34 import org.apache.tools.ant.Project; 35 36 import com.idaremedia.antx.AntX; 37 import com.idaremedia.antx.NoiseLevel; 38 import com.idaremedia.antx.apis.BuildError; 39 import com.idaremedia.antx.apis.ProblemHandler; 40 import com.idaremedia.antx.apis.Responses; 41 import com.idaremedia.antx.ownhelpers.FeedbackSink; 42 import com.idaremedia.antx.starters.TaskSet; 43 44 80 81 public class CaptureStreamsTask extends TaskSet implements LogsRecorder 82 { 83 86 public CaptureStreamsTask() 87 { 88 super(AntX.capture+"CaptureStreamsTask:"); 89 } 90 91 92 96 public CaptureStreamsTask(String iam) 97 { 98 super(iam); 99 } 100 101 102 103 111 public void setFromStream(FeedbackSink ss) 112 { 113 require_(ss!=null, "setstrm- err|out|both"); 114 115 if (!FeedbackSink.isSystem(ss)) { 116 String ermsg = getAntXMsg("brul.logs.bad.capture.sink", 117 getTaskName(),ss.getValue()); 118 log(ermsg,Project.MSG_ERR); 119 throw new BuildException(ermsg,getLocation()); 120 } 121 m_streamChoice = ss; 122 } 123 124 125 126 131 public FeedbackSink getFromStream() 132 { 133 return m_streamChoice; 134 } 135 136 137 138 143 public final boolean isImportant(NoiseLevel nl) 144 { 145 require_(nl!=null,"isImportnt- nonzro NL"); 146 if (NoiseLevel.isAsBadAs(nl,NoiseLevel.WARNING)) { 147 return true; 148 } 149 return false; 150 } 151 152 153 154 160 public String copyOfImportantLogs() 161 { 162 if (m_mainFilterStream!=null) { 163 return m_mainFilterStream.copyBuffer(); 164 } 165 return ""; 166 } 167 168 169 170 176 public String copyOfSecondaryLogs() 177 { 178 if (m_secondFilterStream!=null) { 179 return m_secondFilterStream.copyBuffer(); 180 } 181 return ""; 182 } 183 184 185 186 195 public String copyOfAllLogs() 196 { 197 if (m_allBuffer!=null) { 198 return m_allBuffer.substring(0); 199 } 200 return m_mainFilterStream.copyBuffer(); 201 } 202 203 204 205 208 public void clearLogs() 209 { 210 if (m_allBuffer!=null) { 211 m_allBuffer.delete(0,m_allBuffer.length()); 212 } 213 if (m_secondFilterStream!=null) { 214 m_secondFilterStream.clearBuffer(); 215 } 216 if (m_mainFilterStream!=null) { 217 m_mainFilterStream.clearBuffer(); 218 } 219 } 220 221 222 223 231 protected void uninstallBuffers() 232 { 233 sysOut = null; 234 sysErr = null; 235 236 if (m_allBuffer!=null) { 237 m_allBuffer.delete(0,m_allBuffer.length()); 238 m_allBuffer = null; 239 } 240 if (m_secondFilterStream!=null) { 241 m_secondFilterStream.clearBuffer(); 242 m_secondFilterStream = null; 243 } 244 if (m_mainFilterStream!=null) { 245 m_mainFilterStream.clearBuffer(); 246 m_mainFilterStream = null; 247 } 248 } 249 250 251 252 267 protected void performNestedTasks() 268 { 269 Throwable uncaught=null; 270 try { 271 startCapturing(); 272 performTheEnclosedTaskList(); 273 } catch(Throwable anyX) { 274 uncaught = anyX; 275 if (anyX instanceof RuntimeException ) { 276 throw (RuntimeException )anyX; 277 } 278 throw (Error )anyX; 279 } finally { 280 stopCapturing(uncaught); 281 uninstallBuffers(); 282 } 283 } 284 285 286 287 294 protected void performTheEnclosedTaskList() 295 { 296 performTheTasksList(); 297 } 298 299 300 301 315 protected void startCapturing() 316 { 317 verify_(!m_netInstalled,"perform- not installed"); 318 verify_(!m_strmSwitched,"perform- not partially installed"); 319 320 if (shouldCapture(FeedbackSink.STDIO)) { 321 322 System.out.flush(); 323 sysOut = System.out; 324 325 System.err.flush(); 326 sysErr = System.err; 327 328 PrintStream filtered; 329 FeedbackSink ss = getFromStream(); 330 331 switch (ss.getIndex()) { 332 case FeedbackSink.STDIO_INDEX: { 333 m_allBuffer = new StringBuffer (320); 334 m_secondFilterStream = new MimOutputStream(sysOut,m_allBuffer); 335 filtered = new PrintStream (m_secondFilterStream); 336 System.setOut(filtered); 337 } 339 case FeedbackSink.STDERR_INDEX: { 340 m_mainFilterStream = new MimOutputStream(sysErr,m_allBuffer); 341 filtered = new PrintStream (m_mainFilterStream); 342 System.setErr(filtered); 343 break; 344 } 345 case FeedbackSink.STDOUT_INDEX: { 346 m_mainFilterStream = new MimOutputStream(sysOut,m_allBuffer); 347 filtered = new PrintStream (m_mainFilterStream); 348 System.setOut(filtered); 349 break; 350 } 351 default: { 352 throw new BuildError(ss.getValue()); } 354 } 355 m_strmSwitched = true; 356 357 CapturedLogs.installStdIORecorder(this, m_errHandler); 358 359 m_netInstalled = true; 360 } 361 } 362 363 364 365 372 protected void stopCapturing(Throwable cause) 373 { 374 if (m_netInstalled) { 375 m_netInstalled = false; 376 CapturedLogs.unwindStdIORecorder(m_errHandler); 377 } 378 if (m_strmSwitched) { System.setOut(sysOut); 380 System.setErr(sysErr); 381 } 382 } 383 384 385 391 protected boolean shouldCapture(FeedbackSink sel) 392 { 393 return true; 394 } 395 396 397 private volatile boolean m_netInstalled; 398 private boolean m_strmSwitched; 399 private ProblemHandler m_errHandler = new Responses.LogUsing(this); 400 private StringBuffer m_allBuffer; 401 private MimOutputStream m_secondFilterStream, m_mainFilterStream; 402 private FeedbackSink m_streamChoice= FeedbackSink.STDIO; private PrintStream sysOut; 404 private PrintStream sysErr; 405 } 406 407 408 | Popular Tags |