From: Yegor Kozlov Date: Wed, 22 Feb 2012 14:04:17 +0000 (+0000) Subject: Bugzilla 52716 - tolerate hyperlinks that have neither location nor relation X-Git-Tag: REL_3_8_FINAL~36 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=37149e9d6b8daed7d8820a8e3d01ee7da376566e;p=poi.git Bugzilla 52716 - tolerate hyperlinks that have neither location nor relation git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1292295 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index d2367da522..d2d7aebf85 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52716 - tolerate hyperlinks that have neither location nor relation 52599 - avoid duplicate text when rendering slides in HSLF 52598 - respect slide background when rendering slides in HSLF 51731 - fixed painting shape outlines in HSLF diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java index 2fd47d9d42..84a9ea51d8 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java @@ -68,23 +68,27 @@ public class XSSFHyperlink implements Hyperlink { // the relation to see how if (_externalRel == null) { if (ctHyperlink.getId() != null) { - throw new IllegalStateException("The hyperlink for cell " + ctHyperlink.getRef() + " references relation " + ctHyperlink.getId() + ", but that didn't exist!"); + throw new IllegalStateException("The hyperlink for cell " + ctHyperlink.getRef() + + " references relation " + ctHyperlink.getId() + ", but that didn't exist!"); + } + // hyperlink is internal and is not related to other parts + _type = Hyperlink.LINK_DOCUMENT; + } else { + URI target = _externalRel.getTargetURI(); + _location = target.toString(); + + // Try to figure out the type + if (_location.startsWith("http://") || _location.startsWith("https://") + || _location.startsWith("ftp://")) { + _type = Hyperlink.LINK_URL; + } else if (_location.startsWith("mailto:")) { + _type = Hyperlink.LINK_EMAIL; + } else { + _type = Hyperlink.LINK_FILE; } - throw new IllegalStateException("A sheet hyperlink must either have a location, or a relationship. Found:\n" + ctHyperlink); } - URI target = _externalRel.getTargetURI(); - _location = target.toString(); - // Try to figure out the type - if (_location.startsWith("http://") || _location.startsWith("https://") - || _location.startsWith("ftp://")) { - _type = Hyperlink.LINK_URL; - } else if (_location.startsWith("mailto:")) { - _type = Hyperlink.LINK_EMAIL; - } else { - _type = Hyperlink.LINK_FILE; - } } } @@ -306,4 +310,18 @@ public class XSSFHyperlink implements Hyperlink { public void setLastRow(int row) { setFirstRow(row); } + + /** + * @return additional text to help the user understand more about the hyperlink + */ + public String getTooltip() { + return _ctHyperlink.getTooltip(); + } + + /** + * @param text additional text to help the user understand more about the hyperlink + */ + public void setTooltip(String text) { + _ctHyperlink.setTooltip(text); + } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java index 49f79365f3..0358133a23 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java @@ -189,4 +189,24 @@ public final class TestXSSFHyperlink extends BaseTestHyperlink { assertEquals("mailto:dev@poi.apache.org?subject=XSSF%20Hyperlinks", sheet.getRow(16).getCell(2).getHyperlink().getAddress()); } + + public void test52716() { + XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("52716.xlsx"); + XSSFSheet sh1 = wb1.getSheetAt(0); + + XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1); + XSSFSheet sh2 = wb2.getSheetAt(0); + + assertEquals(sh1.getNumberOfComments(), sh2.getNumberOfComments()); + XSSFHyperlink l1 = sh1.getHyperlink(0, 1); + assertEquals(XSSFHyperlink.LINK_DOCUMENT, l1.getType()); + assertEquals("B1", l1.getCellRef()); + assertEquals("Sort on Titel", l1.getTooltip()); + + XSSFHyperlink l2 = sh2.getHyperlink(0, 1); + assertEquals(l1.getTooltip(), l2.getTooltip()); + assertEquals(XSSFHyperlink.LINK_DOCUMENT, l2.getType()); + assertEquals("B1", l2.getCellRef()); + } + } diff --git a/test-data/spreadsheet/52716.xlsx b/test-data/spreadsheet/52716.xlsx new file mode 100644 index 0000000000..ba4f120c70 Binary files /dev/null and b/test-data/spreadsheet/52716.xlsx differ