Lines 42-52
Link Here
|
42 |
import org.apache.commons.httpclient.methods.multipart.PartBase; |
42 |
import org.apache.commons.httpclient.methods.multipart.PartBase; |
43 |
import org.apache.commons.httpclient.methods.multipart.StringPart; |
43 |
import org.apache.commons.httpclient.methods.multipart.StringPart; |
44 |
import org.apache.commons.httpclient.params.HttpMethodParams; |
44 |
import org.apache.commons.httpclient.params.HttpMethodParams; |
|
|
45 |
import org.eclipse.core.runtime.Assert; |
45 |
import org.eclipse.core.runtime.CoreException; |
46 |
import org.eclipse.core.runtime.CoreException; |
46 |
import org.eclipse.core.runtime.IStatus; |
47 |
import org.eclipse.core.runtime.IStatus; |
47 |
import org.eclipse.core.runtime.Status; |
48 |
import org.eclipse.core.runtime.Status; |
48 |
import org.eclipse.mylyn.internal.bugzilla.core.history.BugzillaTaskHistoryParser; |
49 |
import org.eclipse.mylyn.internal.bugzilla.core.history.BugzillaTaskHistoryParser; |
49 |
import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory; |
50 |
import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory; |
|
|
51 |
import org.eclipse.mylyn.tasks.core.AbstractPostTaskDataResult; |
50 |
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; |
52 |
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; |
51 |
import org.eclipse.mylyn.tasks.core.ITaskAttachment; |
53 |
import org.eclipse.mylyn.tasks.core.ITaskAttachment; |
52 |
import org.eclipse.mylyn.tasks.core.ITaskCollector; |
54 |
import org.eclipse.mylyn.tasks.core.ITaskCollector; |
Lines 1341-1344
Link Here
|
1341 |
+ " failed. Please verify connection and authentication information.")); |
1343 |
+ " failed. Please verify connection and authentication information.")); |
1342 |
} |
1344 |
} |
1343 |
|
1345 |
|
|
|
1346 |
public void postTaskData(RepositoryTaskData taskData, AbstractPostTaskDataResult abstractPostTaskDataResult) throws IOException, CoreException { |
1347 |
Assert.isNotNull(abstractPostTaskDataResult); |
1348 |
NameValuePair[] formData = null; |
1349 |
String prefix = null; |
1350 |
String prefix2 = null; |
1351 |
String postfix = null; |
1352 |
String postfix2 = null; |
1353 |
|
1354 |
if (taskData == null) { |
1355 |
return; |
1356 |
} else if (taskData.isNew()) { |
1357 |
formData = getPairsForNew(taskData); |
1358 |
prefix = IBugzillaConstants.FORM_PREFIX_BUG_218; |
1359 |
prefix2 = IBugzillaConstants.FORM_PREFIX_BUG_220; |
1360 |
postfix = IBugzillaConstants.FORM_POSTFIX_216; |
1361 |
postfix2 = IBugzillaConstants.FORM_POSTFIX_218; |
1362 |
} else { |
1363 |
formData = getPairsForExisting(taskData); |
1364 |
} |
1365 |
|
1366 |
GzipPostMethod method = null; |
1367 |
try { |
1368 |
if (taskData.isNew()) { |
1369 |
method = postFormData(POST_BUG_CGI, formData); |
1370 |
} else { |
1371 |
method = postFormData(PROCESS_BUG_CGI, formData); |
1372 |
} |
1373 |
|
1374 |
if (method == null) { |
1375 |
throw new IOException("Could not post form, client returned null method."); |
1376 |
} |
1377 |
BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsUnzippedStream(), |
1378 |
method.getRequestCharSet())); |
1379 |
in.mark(40960); |
1380 |
HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null); |
1381 |
|
1382 |
boolean existingBugPosted = false; |
1383 |
boolean isTitle = false; |
1384 |
String title = ""; |
1385 |
boolean isBodyDT = false; |
1386 |
boolean isBodyCode = false; |
1387 |
String divIDName = ""; |
1388 |
String dtName = ""; |
1389 |
String codeName = ""; |
1390 |
String bugzillaBody = ""; |
1391 |
|
1392 |
for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) { |
1393 |
|
1394 |
if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE |
1395 |
&& !((HtmlTag) (token.getValue())).isEndTag()) { |
1396 |
isTitle = true; |
1397 |
continue; |
1398 |
} |
1399 |
|
1400 |
if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.DIV) { |
1401 |
divIDName = ((HtmlTag) (token.getValue())).getAttribute("id"); |
1402 |
} |
1403 |
|
1404 |
if (divIDName != null && divIDName.equals("bugzilla-body")) { |
1405 |
bugzillaBody += token.toString(); |
1406 |
if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.DT |
1407 |
&& ((HtmlTag) (token.getValue())).isEndTag()) { |
1408 |
isBodyDT = false; |
1409 |
continue; |
1410 |
} |
1411 |
if (token.getType() == Token.TAG |
1412 |
&& ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.CODE |
1413 |
&& ((HtmlTag) (token.getValue())).isEndTag()) { |
1414 |
isBodyCode = false; |
1415 |
abstractPostTaskDataResult.addResponseData(dtName, codeName); |
1416 |
continue; |
1417 |
} |
1418 |
if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.DT) { |
1419 |
isBodyDT = true; |
1420 |
dtName = ""; |
1421 |
codeName = ""; |
1422 |
} |
1423 |
if (token.getType() == Token.TAG |
1424 |
&& ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.CODE) { |
1425 |
isBodyCode = true; |
1426 |
codeName = ""; |
1427 |
} |
1428 |
|
1429 |
if (token.getType() != Token.TAG) { |
1430 |
if (isBodyDT) |
1431 |
dtName += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; |
1432 |
if (isBodyCode) |
1433 |
codeName += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; |
1434 |
continue; |
1435 |
} |
1436 |
} |
1437 |
|
1438 |
if (isTitle) { |
1439 |
// get all of the data in the title tag |
1440 |
if (token.getType() != Token.TAG) { |
1441 |
title += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; |
1442 |
continue; |
1443 |
} else if (token.getType() == Token.TAG |
1444 |
&& ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE |
1445 |
&& ((HtmlTag) token.getValue()).isEndTag()) { |
1446 |
|
1447 |
boolean found = false; |
1448 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1449 |
BugzillaLanguageSettings.COMMAND_PROCESSED).iterator(); iterator.hasNext() && !found;) { |
1450 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1451 |
found = found || title.indexOf(value) != -1; |
1452 |
} |
1453 |
if (!taskData.isNew() && found) { |
1454 |
existingBugPosted = true; |
1455 |
} else if (taskData.isNew() && prefix != null && prefix2 != null && postfix != null |
1456 |
&& postfix2 != null) { |
1457 |
int startIndex = -1; |
1458 |
int startIndexPrefix = title.toLowerCase(Locale.ENGLISH).indexOf( |
1459 |
prefix.toLowerCase(Locale.ENGLISH)); |
1460 |
int startIndexPrefix2 = title.toLowerCase(Locale.ENGLISH).indexOf( |
1461 |
prefix2.toLowerCase(Locale.ENGLISH)); |
1462 |
|
1463 |
if (startIndexPrefix != -1 || startIndexPrefix2 != -1) { |
1464 |
if (startIndexPrefix != -1) { |
1465 |
startIndex = startIndexPrefix + prefix.length(); |
1466 |
} else { |
1467 |
startIndex = startIndexPrefix2 + prefix2.length(); |
1468 |
} |
1469 |
int stopIndex = title.toLowerCase(Locale.ENGLISH).indexOf( |
1470 |
postfix.toLowerCase(Locale.ENGLISH), startIndex); |
1471 |
if (stopIndex == -1) |
1472 |
stopIndex = title.toLowerCase(Locale.ENGLISH).indexOf( |
1473 |
postfix2.toLowerCase(Locale.ENGLISH), startIndex); |
1474 |
if (stopIndex > -1) { |
1475 |
abstractPostTaskDataResult.setNewTaskID((title.substring(startIndex, stopIndex)).trim()); |
1476 |
} |
1477 |
} |
1478 |
} |
1479 |
isTitle = false; |
1480 |
} |
1481 |
} |
1482 |
} |
1483 |
|
1484 |
if ((!taskData.isNew() && existingBugPosted != true) || (taskData.isNew() && abstractPostTaskDataResult.getNewTaskID() == null)) { |
1485 |
try { |
1486 |
in.reset(); |
1487 |
} catch (IOException e) { |
1488 |
// ignore |
1489 |
} |
1490 |
parseHtmlError(in, abstractPostTaskDataResult); |
1491 |
} |
1492 |
|
1493 |
return; |
1494 |
} catch (ParseException e) { |
1495 |
authenticated = false; |
1496 |
throw new CoreException(new BugzillaStatus(Status.ERROR, BugzillaCorePlugin.PLUGIN_ID, |
1497 |
RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); |
1498 |
} finally { |
1499 |
if (method != null) { |
1500 |
method.releaseConnection(); |
1501 |
} |
1502 |
} |
1503 |
|
1504 |
} |
1505 |
|
1506 |
/** |
1507 |
* Utility method for determining what potential error has occurred from a bugzilla html reponse page |
1508 |
*/ |
1509 |
public void parseHtmlError(BufferedReader in, AbstractPostTaskDataResult abstractPostTaskDataResult) throws IOException, CoreException { |
1510 |
Assert.isNotNull(abstractPostTaskDataResult); |
1511 |
HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null); |
1512 |
boolean isTitle = false; |
1513 |
String title = ""; |
1514 |
String body = ""; |
1515 |
|
1516 |
try { |
1517 |
for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) { |
1518 |
body += token.toString(); |
1519 |
if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE |
1520 |
&& !((HtmlTag) (token.getValue())).isEndTag()) { |
1521 |
isTitle = true; |
1522 |
continue; |
1523 |
} |
1524 |
|
1525 |
if (isTitle) { |
1526 |
// get all of the data in the title tag |
1527 |
if (token.getType() != Token.TAG) { |
1528 |
title += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; |
1529 |
continue; |
1530 |
} else if (token.getType() == Token.TAG |
1531 |
&& ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE |
1532 |
&& ((HtmlTag) token.getValue()).isEndTag()) { |
1533 |
|
1534 |
boolean found = false; |
1535 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1536 |
BugzillaLanguageSettings.COMMAND_ERROR_LOGIN).iterator(); iterator.hasNext() && !found;) { |
1537 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1538 |
found = found || title.indexOf(value) != -1; |
1539 |
} |
1540 |
if (found) { |
1541 |
authenticated = false; |
1542 |
abstractPostTaskDataResult.setErrorStatus("ERROR_REPOSITORY_LOGIN"); |
1543 |
throw new CoreException(new BugzillaStatus(Status.ERROR, BugzillaCorePlugin.PLUGIN_ID, |
1544 |
RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(), title)); |
1545 |
} |
1546 |
found = false; |
1547 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1548 |
BugzillaLanguageSettings.COMMAND_ERROR_COLLISION).iterator(); iterator.hasNext() |
1549 |
&& !found;) { |
1550 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1551 |
found = found || title.indexOf(value) != -1; |
1552 |
} |
1553 |
if (found) { |
1554 |
abstractPostTaskDataResult.setErrorStatus("REPOSITORY_COLLISION"); |
1555 |
throw new CoreException(new BugzillaStatus(Status.ERROR, BugzillaCorePlugin.PLUGIN_ID, |
1556 |
RepositoryStatus.REPOSITORY_COLLISION, repositoryUrl.toString())); |
1557 |
} |
1558 |
found = false; |
1559 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1560 |
BugzillaLanguageSettings.COMMAND_ERROR_COMMENT_REQUIRED).iterator(); iterator.hasNext() |
1561 |
&& !found;) { |
1562 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1563 |
found = found || title.indexOf(value) != -1; |
1564 |
} |
1565 |
if (found) { |
1566 |
abstractPostTaskDataResult.setErrorStatus("REPOSITORY_COMMENT_REQUIRED"); |
1567 |
throw new CoreException(new BugzillaStatus(Status.INFO, BugzillaCorePlugin.PLUGIN_ID, |
1568 |
RepositoryStatus.REPOSITORY_COMMENT_REQUIRED)); |
1569 |
} |
1570 |
found = false; |
1571 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1572 |
BugzillaLanguageSettings.COMMAND_ERROR_LOGGED_OUT).iterator(); iterator.hasNext() |
1573 |
&& !found;) { |
1574 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1575 |
found = found || title.indexOf(value) != -1; |
1576 |
} |
1577 |
if (found) { |
1578 |
authenticated = false; |
1579 |
// throw new |
1580 |
// BugzillaException(IBugzillaConstants.LOGGED_OUT); |
1581 |
abstractPostTaskDataResult.setErrorStatus("REPOSITORY_LOGGED_OUT"); |
1582 |
throw new CoreException(new BugzillaStatus(Status.INFO, BugzillaCorePlugin.PLUGIN_ID, |
1583 |
RepositoryStatus.REPOSITORY_LOGGED_OUT, |
1584 |
"You have been logged out. Please retry operation.")); |
1585 |
} |
1586 |
found = false; |
1587 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1588 |
BugzillaLanguageSettings.COMMAND_ERROR_CONFIRM_MATCH).iterator(); iterator.hasNext() |
1589 |
&& !found;) { |
1590 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1591 |
found = found || title.indexOf(value) != -1; |
1592 |
} |
1593 |
if (found) { |
1594 |
abstractPostTaskDataResult.setErrorStatus("COMMAND_ERROR_CONFIRM_MATCH"); |
1595 |
try { |
1596 |
in.reset(); |
1597 |
} catch (IOException e) { |
1598 |
// ignore |
1599 |
} |
1600 |
parseResultConfirmMatch(in, abstractPostTaskDataResult); |
1601 |
} |
1602 |
found = false; |
1603 |
for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand( |
1604 |
BugzillaLanguageSettings.COMMAND_CHANGES_SUBMITTED).iterator(); iterator.hasNext() |
1605 |
&& !found;) { |
1606 |
String value = iterator.next().toLowerCase(Locale.ENGLISH); |
1607 |
found = found || title.indexOf(value) != -1; |
1608 |
} |
1609 |
if (found) { |
1610 |
return; |
1611 |
} |
1612 |
isTitle = false; |
1613 |
} |
1614 |
} |
1615 |
} |
1616 |
|
1617 |
abstractPostTaskDataResult.setErrorStatus("A repository error has occurred."); |
1618 |
throw new CoreException(RepositoryStatus.createHtmlStatus(repositoryUrl.toString(), IStatus.INFO, |
1619 |
BugzillaCorePlugin.PLUGIN_ID, RepositoryStatus.ERROR_REPOSITORY, |
1620 |
"A repository error has occurred.", body)); |
1621 |
|
1622 |
} catch (ParseException e) { |
1623 |
authenticated = false; |
1624 |
abstractPostTaskDataResult.setErrorStatus("ERROR_INTERNAL: Unable to parse response from " + repositoryUrl.toString() + "."); |
1625 |
throw new CoreException(new BugzillaStatus(Status.ERROR, BugzillaCorePlugin.PLUGIN_ID, |
1626 |
RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); |
1627 |
} finally { |
1628 |
in.close(); |
1629 |
} |
1630 |
} |
1631 |
|
1632 |
public void parseResultConfirmMatch(BufferedReader in, AbstractPostTaskDataResult postResult) throws IOException, |
1633 |
CoreException { |
1634 |
HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null); |
1635 |
|
1636 |
boolean isSelect = false; |
1637 |
String select = ""; |
1638 |
String body = ""; |
1639 |
String name = ""; |
1640 |
String value = ""; |
1641 |
try { |
1642 |
for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) { |
1643 |
body += token.toString(); |
1644 |
if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.SELECT |
1645 |
&& !((HtmlTag) (token.getValue())).isEndTag()) { |
1646 |
isSelect = true; |
1647 |
select += token.toString().toLowerCase(Locale.ENGLISH); |
1648 |
name = ((HtmlTag) (token.getValue())).getAttribute("id"); |
1649 |
continue; |
1650 |
} |
1651 |
|
1652 |
if (isSelect) { |
1653 |
if (token.getType() == Token.TAG |
1654 |
&& ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.OPTION |
1655 |
&& !((HtmlTag) (token.getValue())).isEndTag()) { |
1656 |
value = ((HtmlTag) (token.getValue())).getAttribute("value"); |
1657 |
postResult.addResponseData(name, value); |
1658 |
} |
1659 |
if (token.getType() == Token.TAG |
1660 |
&& ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.SELECT |
1661 |
&& ((HtmlTag) token.getValue()).isEndTag()) { |
1662 |
isSelect = false; |
1663 |
} |
1664 |
} |
1665 |
} |
1666 |
postResult.setErrorStatus("ERROR_CONFIRM_MATCH"); |
1667 |
throw new CoreException(new BugzillaStatus(Status.ERROR, BugzillaCorePlugin.PLUGIN_ID, |
1668 |
RepositoryStatus.ERROR_CONFIRM_MATCH, repositoryUrl.toString(), "confirm match")); |
1669 |
} catch (ParseException e) { |
1670 |
throw new CoreException(new BugzillaStatus(Status.ERROR, BugzillaCorePlugin.PLUGIN_ID, |
1671 |
RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); |
1672 |
} finally { |
1673 |
in.close(); |
1674 |
} |
1675 |
} |
1676 |
|
1344 |
} |
1677 |
} |