1 19 20 package org.netbeans.modules.junit.output; 21 22 import java.io.File ; 23 import org.apache.tools.ant.module.spi.AntEvent; 24 import org.apache.tools.ant.module.spi.AntLogger; 25 import org.apache.tools.ant.module.spi.AntSession; 26 import org.apache.tools.ant.module.spi.TaskStructure; 27 import org.netbeans.modules.junit.output.antutils.AntProject; 28 import org.netbeans.modules.junit.output.antutils.TestCounter; 29 30 40 public final class JUnitAntLogger extends AntLogger { 41 42 43 private static final int[] LEVELS_OF_INTEREST = { 44 AntEvent.LOG_INFO, 45 AntEvent.LOG_WARN, AntEvent.LOG_VERBOSE 47 }; 48 49 public static final String TASK_JAVA = "java"; public static final String TASK_JUNIT = "junit"; private static final String [] INTERESTING_TASKS = {TASK_JAVA, TASK_JUNIT}; 52 private static final String ANT_TEST_RUNNER_CLASS_NAME = 53 "org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner"; private static final String XML_FORMATTER_CLASS_NAME = 55 "org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter"; 57 58 public JUnitAntLogger() { } 59 60 public boolean interestedInSession(AntSession session) { 61 return true; 62 } 63 64 public String [] interestedInTargets(AntSession session) { 65 return AntLogger.ALL_TARGETS; 66 } 67 68 public String [] interestedInTasks(AntSession session) { 69 return INTERESTING_TASKS; 70 } 71 72 83 private static TaskType detectTaskType(AntEvent event) { 84 final String taskName = event.getTaskName(); 85 86 if (taskName == null) { 87 return null; 88 } 89 90 if (taskName.equals(TASK_JUNIT)) { 91 return TaskType.TEST_TASK; 92 } 93 94 if (taskName.equals(TASK_JAVA)) { 95 TaskStructure taskStructure = event.getTaskStructure(); 96 97 String className = taskStructure.getAttribute("classname"); if (className == null) { 99 return TaskType.OTHER_TASK; 100 } 101 102 className = event.evaluate(className); 103 if (className.equals("junit.textui.TestRunner") || className.equals( 105 "org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner")) { TaskStructure[] nestedElems = taskStructure.getChildren(); 107 for (TaskStructure ts : nestedElems) { 108 if (ts.getName().equals("jvmarg")) { String value = ts.getAttribute("value"); if ((value != null) 111 && event.evaluate(value) 112 .equals("-Xdebug")) { return TaskType.DEBUGGING_TEST_TASK; 114 } 115 } 116 } 117 return TaskType.TEST_TASK; 118 } 119 120 return TaskType.OTHER_TASK; 121 } 122 123 assert false : "Unhandled task name"; return TaskType.OTHER_TASK; 125 } 126 127 134 private static boolean isTestTaskType(TaskType taskType) { 135 return (taskType != null) && (taskType != TaskType.OTHER_TASK); 136 } 137 138 public boolean interestedInScript(File script, AntSession session) { 139 return true; 140 } 141 142 public int[] interestedInLogLevels(AntSession session) { 143 return LEVELS_OF_INTEREST; 144 } 145 146 148 public void messageLogged(final AntEvent event) { 149 if (isTestTaskRunning(event)) { 150 if (event.getLogLevel() != AntEvent.LOG_VERBOSE) { 151 getOutputReader(event).messageLogged(event); 152 } else { 153 154 getOutputReader(event).verboseMessageLogged(event); 155 } 156 } 157 } 158 159 161 private boolean isTestTaskRunning(AntEvent event) { 162 return isTestTaskType( 163 getSessionInfo(event.getSession()).currentTaskType); 164 } 165 166 168 public void taskStarted(final AntEvent event) { 169 TaskType taskType = detectTaskType(event); 170 if (isTestTaskType(taskType)) { 171 AntSessionInfo sessionInfo = getSessionInfo(event.getSession()); 172 assert !isTestTaskType(sessionInfo.currentTaskType); 173 sessionInfo.timeOfTestTaskStart = System.currentTimeMillis(); 174 sessionInfo.currentTaskType = taskType; 175 if (sessionInfo.sessionType == null) { 176 sessionInfo.sessionType = taskType; 177 } 178 final int testClassCount = TestCounter.getTestClassCount(event); 179 final boolean hasXmlOutput = hasXmlOutput(event); 180 getOutputReader(event).testTaskStarted(testClassCount, hasXmlOutput); 181 } 182 } 183 184 186 public void taskFinished(final AntEvent event) { 187 AntSessionInfo sessionInfo = getSessionInfo(event.getSession()); 188 if (isTestTaskType(sessionInfo.currentTaskType)) { 189 getOutputReader(event).testTaskFinished(); 190 sessionInfo.currentTaskType = null; 191 } 192 193 } 194 195 197 public void buildFinished(final AntEvent event) { 198 AntSession session = event.getSession(); 199 AntSessionInfo sessionInfo = getSessionInfo(session); 200 201 if (isTestTaskType(sessionInfo.sessionType)) { 202 getOutputReader(event).buildFinished(event); 203 } 204 205 session.putCustomData(this, null); } 207 208 214 private JUnitOutputReader getOutputReader(final AntEvent event) { 215 assert isTestTaskType(getSessionInfo(event.getSession()).sessionType); 216 217 final AntSession session = event.getSession(); 218 final AntSessionInfo sessionInfo = getSessionInfo(session); 219 JUnitOutputReader outputReader = sessionInfo.outputReader; 220 if (outputReader == null) { 221 outputReader = new JUnitOutputReader( 222 session, 223 sessionInfo.sessionType, 224 sessionInfo.getTimeOfTestTaskStart()); 225 sessionInfo.outputReader = outputReader; 226 } 227 return outputReader; 228 } 229 230 232 private AntSessionInfo getSessionInfo(final AntSession session) { 233 Object o = session.getCustomData(this); 234 assert (o == null) || (o instanceof AntSessionInfo); 235 236 AntSessionInfo sessionInfo; 237 if (o != null) { 238 sessionInfo = (AntSessionInfo) o; 239 } else { 240 sessionInfo = new AntSessionInfo(); 241 session.putCustomData(this, sessionInfo); 242 } 243 return sessionInfo; 244 } 245 246 249 private static boolean hasXmlOutput(AntEvent event) { 250 final String taskName = event.getTaskName(); 251 if (taskName.equals(TASK_JUNIT)) { 252 return hasXmlOutputJunit(event); 253 } else if (taskName.equals(TASK_JAVA)) { 254 return hasXmlOutputJava(event); 255 } else { 256 assert false; 257 return false; 258 } 259 } 260 261 264 private static boolean hasXmlOutputJunit(AntEvent event) { 265 TaskStructure taskStruct = event.getTaskStructure(); 266 for (TaskStructure child : taskStruct.getChildren()) { 267 String childName = child.getName(); 268 if (childName.equals("formatter")) { String type = child.getAttribute("type"); String usefile = child.getAttribute("usefile"); if ((type != null) && type.equals("xml") && (usefile != null) && !AntProject.toBoolean(usefile)) { 273 String ifPropName = child.getAttribute("if"); String unlessPropName =child.getAttribute("unless"); 276 if ((ifPropName == null 277 || event.getProperty(ifPropName) != null) 278 && (unlessPropName == null 279 || event.getProperty(unlessPropName) == null)) { 280 return true; 281 } 282 } 283 } 284 } 285 return false; 286 } 287 288 291 private static boolean hasXmlOutputJava(AntEvent event) { 292 TaskStructure taskStruct = event.getTaskStructure(); 293 294 String classname = taskStruct.getAttribute("classname"); if ((classname == null) || 296 !event.evaluate(classname).equals(ANT_TEST_RUNNER_CLASS_NAME)) { 297 return false; 298 } 299 300 for (TaskStructure child : taskStruct.getChildren()) { 301 String childName = child.getName(); 302 if (childName.equals("arg")) { String argValue = child.getAttribute("value"); if (argValue == null) { 305 continue; 306 } 307 argValue = event.evaluate(argValue); 308 if (argValue.startsWith("formatter=")) { int clsNameStartIndex = "formatter=".length(); if ((argValue.indexOf(',', clsNameStartIndex) == -1) 311 && argValue.substring(clsNameStartIndex) 312 .equals(XML_FORMATTER_CLASS_NAME)) { 313 return true; 314 } 315 } 316 } 317 } 318 return false; 319 } 320 321 } 322 | Popular Tags |