From 37149e9d6b8daed7d8820a8e3d01ee7da376566e Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Wed, 22 Feb 2012 14:04:17 +0000 Subject: [PATCH] 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 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/xssf/usermodel/XSSFHyperlink.java | 44 ++++++++++++------ .../poi/xssf/usermodel/TestXSSFHyperlink.java | 20 ++++++++ test-data/spreadsheet/52716.xlsx | Bin 0 -> 14009 bytes 4 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 test-data/spreadsheet/52716.xlsx 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 0000000000000000000000000000000000000000..ba4f120c70be420fc502771a2132057199c89690 GIT binary patch literal 14009 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