1 19 20 package org.netbeans.modules.junit.output; 21 22 import java.lang.ref.Reference ; 23 import java.lang.ref.WeakReference ; 24 import java.util.regex.Pattern ; 25 import org.netbeans.modules.junit.RegexpPatterns; 26 27 32 final class RegexpUtils { 33 34 35 static final String TESTSUITE_PREFIX = "Testsuite: "; 37 static final String TESTSUITE_STATS_PREFIX = "Tests run: "; 39 static final String FLOAT_NUMBER_REGEX 40 = "[0-9]*(?:\\.[0-9]+)?"; 42 static final String TIME_SECS_REGEX 43 = '(' + FLOAT_NUMBER_REGEX + ')' 44 + " +s(?:ec(?:ond)?(?:s|\\(s\\))?)?"; 46 static final String TESTSUITE_STATS_REGEX 47 = "Tests run: +([0-9]+)," + " +Failures: +([0-9]+), +Errors: +([0-9]+)," + " +Time elapsed: +" + TIME_SECS_REGEX; 51 static final String OUTPUT_DELIMITER_PREFIX = "--------"; 53 static final String STDOUT_LABEL = "Output"; 55 static final String STDERR_LABEL = "Error"; 57 static final String OUTPUT_DELIMITER_REGEX 58 = "-{8,} (?:Standard (" + STDOUT_LABEL + '|' + STDERR_LABEL + ")|-{3,}) -{8,}"; 61 static final String TESTCASE_PREFIX = "Testcase: "; 63 static final String TESTCASE_ISSUE_REGEX 64 = "\\p{Blank}*(?:(FAILED) *|(?i:.*\\berror\\b.*))"; 66 static final String TESTCASE_HEADER_PLAIN_REGEX 67 = "\\p{Blank}*(" + RegexpPatterns.JAVA_ID_REGEX + ")\\p{Blank}+took\\p{Blank}+" + TIME_SECS_REGEX; 70 static final String TESTCASE_HEADER_BRIEF_REGEX 71 = "\\p{Blank}*(" + RegexpPatterns.JAVA_ID_REGEX + ") *\\( *(" + RegexpPatterns.JAVA_ID_REGEX_FULL + ") *\\) *:" + TESTCASE_ISSUE_REGEX; 75 static final String TESTCASE_EXCEPTION_REGEX 76 = "((?:" + RegexpPatterns.JAVA_ID_REGEX_FULL + "\\.?(?:Exception|Error|ComparisonFailure))" + "|java\\.lang\\.Throwable)" + "(?: *: *(.*))?"; 81 static final String CALLSTACK_LINE_PREFIX = "at "; 83 static final String CALLSTACK_LINE_PREFIX_CATCH = "[catch] "; 85 static final String CALLSTACK_LINE_REGEX 86 = "(?:\\t\\t?| +| *\\t? *\\[catch\\] )" + CALLSTACK_LINE_PREFIX 88 + RegexpPatterns.JAVA_ID_REGEX + "(?:\\." + RegexpPatterns.JAVA_ID_REGEX + ")+" + "(?: ?\\([^()]+\\))?"; 92 static final String NESTED_EXCEPTION_PREFIX = "Caused by: "; 94 static final String NESTED_EXCEPTION_REGEX 95 = "(" + RegexpPatterns.JAVA_ID_REGEX_FULL + ")(?:: (.*))?"; static final String LOCATION_IN_FILE_REGEX 97 = RegexpPatterns.JAVA_ID_REGEX_FULL + "(?:\\:[0-9]+)?"; 99 static final String XML_DECL_PREFIX = "<?xml"; 101 static final String XML_SPACE_REGEX 102 = "[ \\t\\r\\n]"; 104 static final String XML_EQ_REGEX 105 = XML_SPACE_REGEX + '*' + '=' + XML_SPACE_REGEX + '*'; 106 107 static final String XML_ENC_REGEX 108 = "[A-Za-z][-A-Za-z0-9._]*"; 110 static final String XML_DECL_REGEX 111 = "\\Q" + XML_DECL_PREFIX + "\\E" + XML_SPACE_REGEX + '+' + "version" + XML_EQ_REGEX + "(?:\"1\\.0\"|'1\\.0')" + "(?:" + XML_SPACE_REGEX + '+' + "encoding" + XML_EQ_REGEX + "(['\"])[A-Za-z][-A-Za-z0-9._]*\\1" + ")?" + "(?:" + XML_SPACE_REGEX + '+' + "standalone" + XML_EQ_REGEX + "(['\"])(?:yes|no)\\2" + ")?" + XML_SPACE_REGEX + '*' + "\\?>"; 124 135 static final Pattern CLASSPATH_ARGS 136 = Pattern.compile("\r?\n'-classpath'\r?\n'(.*)'\r?\n"); 143 static final Pattern JAVA_EXECUTABLE 144 = Pattern.compile("^Executing '(.*)' with arguments:$", Pattern.MULTILINE); 146 147 148 private static Reference <RegexpUtils> instRef; 149 150 152 static synchronized RegexpUtils getInstance() { 153 RegexpUtils instance = (instRef != null) ? instRef.get() : null; 154 if (instance == null) { 155 instance = new RegexpUtils(); 156 instRef = new WeakReference <RegexpUtils>(instance); 157 } 158 return instance; 159 } 160 161 162 private RegexpUtils() { } 163 164 private volatile Pattern fullJavaIdPattern, suiteStatsPattern, 165 outputDelimPattern, testcaseIssuePattern, 166 testcaseExceptPattern, callstackLinePattern, 167 nestedExceptPattern, 168 locationInFilePattern, 169 testcaseHeaderBriefPattern, 170 testcaseHeaderPlainPattern, 171 xmlDeclPattern, floatNumPattern; 172 173 186 188 189 Pattern getFullJavaIdPattern() { 190 if (fullJavaIdPattern == null) { 191 fullJavaIdPattern 192 = Pattern.compile(RegexpPatterns.JAVA_ID_REGEX_FULL); 193 } 194 return fullJavaIdPattern; 195 } 196 197 198 Pattern getSuiteStatsPattern() { 199 if (suiteStatsPattern == null) { 200 suiteStatsPattern = Pattern.compile(TESTSUITE_STATS_REGEX); 201 } 202 return suiteStatsPattern; 203 } 204 205 206 Pattern getOutputDelimPattern() { 207 if (outputDelimPattern == null) { 208 outputDelimPattern = Pattern.compile(OUTPUT_DELIMITER_REGEX); 209 } 210 return outputDelimPattern; 211 } 212 213 214 Pattern getTestcaseHeaderBriefPattern() { 215 if (testcaseHeaderBriefPattern == null) { 216 testcaseHeaderBriefPattern = Pattern.compile(TESTCASE_HEADER_BRIEF_REGEX); 217 } 218 return testcaseHeaderBriefPattern; 219 } 220 221 222 Pattern getTestcaseHeaderPlainPattern() { 223 if (testcaseHeaderPlainPattern == null) { 224 testcaseHeaderPlainPattern = Pattern.compile(TESTCASE_HEADER_PLAIN_REGEX); 225 } 226 return testcaseHeaderPlainPattern; 227 } 228 229 230 Pattern getTestcaseIssuePattern() { 231 if (testcaseIssuePattern == null) { 232 testcaseIssuePattern = Pattern.compile(TESTCASE_ISSUE_REGEX); 233 } 234 return testcaseIssuePattern; 235 } 236 237 238 Pattern getTestcaseExceptionPattern() { 239 if (testcaseExceptPattern == null) { 240 testcaseExceptPattern = Pattern.compile(TESTCASE_EXCEPTION_REGEX); 241 } 242 return testcaseExceptPattern; 243 } 244 245 247 Pattern getNestedExceptionPattern() { 248 if (nestedExceptPattern == null) { 249 nestedExceptPattern = Pattern.compile(NESTED_EXCEPTION_REGEX); 250 } 251 return nestedExceptPattern; 252 } 253 254 255 Pattern getCallstackLinePattern() { 256 if (callstackLinePattern == null) { 257 callstackLinePattern = Pattern.compile(CALLSTACK_LINE_REGEX); 258 } 259 return callstackLinePattern; 260 } 261 262 263 Pattern getLocationInFilePattern() { 264 if (locationInFilePattern == null) { 265 locationInFilePattern = Pattern.compile(LOCATION_IN_FILE_REGEX); 266 } 267 return locationInFilePattern; 268 } 269 270 271 Pattern getXmlDeclPattern() { 272 if (xmlDeclPattern == null) { 273 xmlDeclPattern = Pattern.compile(XML_DECL_REGEX); 274 } 275 return xmlDeclPattern; 276 } 277 278 279 Pattern getFloatNumPattern() { 280 if (floatNumPattern == null) { 281 floatNumPattern = Pattern.compile(FLOAT_NUMBER_REGEX); 282 } 283 return floatNumPattern; 284 } 285 286 296 int parseTimeMillis(String timeString) throws NumberFormatException { 297 int secs, millis; 298 final int dotIndex = timeString.indexOf('.'); 299 if (dotIndex == -1) { 300 secs = Integer.parseInt(timeString); 301 millis = 0; 302 } else { 303 secs = (dotIndex == 0) 304 ? 0 305 : Integer.parseInt(timeString.substring(0, dotIndex)); 306 307 String fractString = timeString.substring(dotIndex + 1); 308 if (fractString.length() > 4) { 309 fractString = fractString.substring(0, 4); 310 } 311 int fractNum = Integer.parseInt(fractString); 312 switch (fractString.length()) { 313 case 1: 314 millis = 100 * fractNum; 315 break; 316 case 2: 317 millis = 10 * fractNum; 318 break; 319 case 3: 320 millis = fractNum; 321 break; 322 case 4: 323 millis = (fractNum + 5) / 10; 324 break; 325 default: 326 assert false; 327 millis = 0; 328 break; 329 } 330 } 331 return 1000 * secs + millis; 332 } 333 334 343 int parseTimeMillisNoNFE(String timeStr) { 344 if ((timeStr == null) 345 || !getFloatNumPattern().matcher(timeStr).matches()) { 346 return -1; 347 } 348 try { 349 return parseTimeMillis(timeStr); 350 } catch (NumberFormatException ex) { 351 assert false; 352 return -1; 353 } 354 } 355 356 363 static String specialTrim(String string) { 364 365 366 final int len = string.length(); 367 if (len == 0) { 368 return string; 369 } 370 371 final char[] chars = string.toCharArray(); 372 char c; 373 374 int lead = 0; 375 while (lead < len) { 376 c = chars[lead]; 377 if ((c != ' ') && (c != '\t')) { 378 break; 379 } 380 lead++; 381 } 382 383 384 if (lead == len) { 385 return string.substring(len); 386 } 387 388 int trail = len; 389 do { 390 c = chars[--trail]; 391 } while ((c == ' ') || (c == '\t')); 392 393 if ((lead == 0) && (trail == len - 1)) { 394 return string; 395 } else { 396 return string.substring(lead, trail + 1); 397 } 398 } 399 400 } 401 | Popular Tags |