📄 testeventsfilter.java
字号:
package org.momeunit.ant.event;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import org.momeunit.ant.core.OutputPipe;/** * Class intended to filter out test events from input stream. Notifies test * event listeners about test events occurred. Sends filtered stream to pipe if * requested. * * @author Sergio Morozov * @version 1.1.2 */public class TestEventsFilter extends OutputPipe implements Runnable{ /** * Test event keyword. */ private static final String TESTEVENTS_KEWORD = "<<!!MOMEUNIT_TESTEVENT!!>>"; /** * Test event keyword length. */ private static final int TESTEVENTS_KEWORD_LENGTH = TESTEVENTS_KEWORD .length(); /** * Test event here document string. */ private static final String TESTEVENTS_HEREDOCUMENT_KEWORD = "<<<-" + TESTEVENTS_KEWORD; /** * Test event here document string length. */ private static final int TESTEVENTS_HEREDOCUMENT_KEWORD_LENGTH = TESTEVENTS_HEREDOCUMENT_KEWORD .length(); /** * Stack trace keyword. */ private static final String STACK_TRACE_KEYWORD = "<<!!STACK_TRACE!!>>"; /** * Stack trace keyword length. */ private static final int STACK_TRACE_KEYWORD_LENGTH = STACK_TRACE_KEYWORD .length(); /** * Test event type keywords. */ private static final String[] TESTEVENTS_KEYWORDS = { "TEST_EVENT:", "TEST_START:", "TEST_FAIL:", "TEST_ERROR:", "TEST_END:" }; /** * Test event type keywords lengthes. */ private static final int[] TESTEVENTS_KEYWORDS_LENGTHES = new int[TESTEVENTS_KEYWORDS.length]; static { for (int i = TESTEVENTS_KEYWORDS.length - 1; i >= 0; i--) TESTEVENTS_KEYWORDS_LENGTHES[i] = TESTEVENTS_KEYWORDS[i].length(); } /** * Event listeners that will be notified of test events. */ private Set eventListeners = null; /** * Indicates that test evend ends, */ private boolean endOfEvent = false; /** * Current test event. */ private TestEvent event = null; /** * Buffer being used to generate test events. */ private StringBuffer testsSB = null; /** * Instantiates TestEventsFilter with given {@link InputStream} and set of * test event listeners. * * @param in * input stream. * @param eventListeners * event listeners. * @since 1.1 */ public TestEventsFilter(InputStream in, Set eventListeners) { super(in); setEventListeners(eventListeners); } /** * Sets test event listeners to be notified about test events occurred. * * @param eventListeners * set of test event listeners. * @since 1.1 */ public void setEventListeners(Set eventListeners) { if (eventListeners == null) throw new NullPointerException("eventListeners"); this.eventListeners = new HashSet(eventListeners); } /** * Adds given test event listener. * * @param listener * test event listener to add. * @return <code>true</code> if added, <code>false</code> otherwise. * @since 1.1 */ public boolean addEventListener(TestEventListener listener) { boolean res = false; if (listener != null) res = this.eventListeners.add(listener); return res; } /** * Removes given test event listener. * * @param listener * test event listener to remove. * @return <code>true</code> if removed, <code>false</code> otherwise. * @since 1.1 */ public boolean removeEventListener(TestEventListener listener) { boolean res = false; if (listener != null) res = this.eventListeners.remove(listener); return res; } /** * Starts filtering out test events from input stream until it is closed. * * @see java.lang.Runnable#run() */ public void run() { if (this.getInputStream() != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(this .getInputStream())); this.testsSB = new StringBuffer(); Writer writer = null; if (this.getOutpuStream() != null) writer = new OutputStreamWriter(this .getOutpuStream()); try { for (String line; (line = reader.readLine()) != null;) { String toParse = line; if (this.event == null && toParse.startsWith(TESTEVENTS_HEREDOCUMENT_KEWORD)) { this.event = new TestEvent(); this.endOfEvent = false; toParse = toParse.substring(TESTEVENTS_HEREDOCUMENT_KEWORD_LENGTH) .trim(); } if (this.event != null) { int pos = toParse.indexOf(TESTEVENTS_KEWORD); if (this.endOfEvent = (pos >= 0)) { line = toParse.substring(pos + TESTEVENTS_KEWORD_LENGTH).trim(); toParse = toParse.substring(0, pos); } this.parseTestEventString(toParse); } if (this.event == null && writer != null && line.length() > 0) { writer.write(line + '\n'); writer.flush(); } } } catch (IOException e) {} finally { try { if (this.getOutpuStream() != System.err && this.getOutpuStream() != System.out) writer.close(); if (reader != null) reader.close(); } catch (IOException e) {} } } } private void pushEvent() { for (Iterator i = this.eventListeners.iterator(); i.hasNext();) ((TestEventListener) i.next()).onEvevnt(this.event); this.event = null; } /** * @param line * @throws IOException */ private void parseTestEventString(String line) throws IOException { int i = TESTEVENTS_KEYWORDS.length - 1; for (; i >= 0 && !line.startsWith(TESTEVENTS_KEYWORDS[i]); i--); if (i >= 0) { this.event.setType(i); line = line.substring(TESTEVENTS_KEYWORDS_LENGTHES[i]).trim(); this.parseTestCase(line); } else if (line.startsWith(STACK_TRACE_KEYWORD)) { this.event.setMsg(this.testsSB.toString()); this.testsSB.setLength(0); line = line.substring(STACK_TRACE_KEYWORD_LENGTH).trim(); if (line.length() > 0) this.testsSB.append(line + '\n'); } else if (line.length() > 0) this.testsSB.append('\n').append(line); if (this.endOfEvent) { if (this.event.getMsg() == null) this.event.setMsg(this.testsSB .toString()); else this.event.setStackTrace(this.testsSB.toString()); this.pushEvent(); } } private void parseTestCase(String line) { int pos = line.indexOf(','); if (pos < 0) pos = line.length(); this.event.setTimestamp(Long.parseLong(line.substring(0, pos))); if (line.length() > pos) { line = line.substring(++pos).trim(); pos = line.indexOf(','); if (pos < 0) pos = line.length(); this.event.setTestName(line.substring(0, pos)); } if (line.length() > pos) { line = line.substring(++pos).trim(); pos = line.indexOf(','); if (pos < 0) pos = line.length(); this.event.setTestClassName(line.substring(0, pos)); } if (line.length() > pos) { line = line.substring(++pos).trim(); pos = line.indexOf(','); if (pos < 0) pos = line.length(); this.event.setErrorClassName(line.substring(0, pos)); } if (line.length() > pos) { line = line.substring(++pos).trim(); this.testsSB.setLength(0); this.testsSB.append(line); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -