]> source.dussan.org Git - poi.git/commitdiff
Bugzilla 52716 - tolerate hyperlinks that have neither location nor relation
authorYegor Kozlov <yegor@apache.org>
Wed, 22 Feb 2012 14:04:17 +0000 (14:04 +0000)
committerYegor Kozlov <yegor@apache.org>
Wed, 22 Feb 2012 14:04:17 +0000 (14:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1292295 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFHyperlink.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java
test-data/spreadsheet/52716.xlsx [new file with mode: 0644]

index d2367da5220467942986d1677f33375898e56292..d2d7aebf8591cc4ae1b2fc68f7f4940e7cb8496b 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta6" date="2012-??-??">
+           <action dev="poi-developers" type="fix">52716 - tolerate hyperlinks that have neither location nor relation </action>
            <action dev="poi-developers" type="fix">52599 - avoid duplicate text when rendering slides in HSLF</action>
            <action dev="poi-developers" type="fix">52598 - respect slide background when rendering slides in HSLF</action>
            <action dev="poi-developers" type="fix">51731 - fixed painting shape outlines in HSLF</action>
index 2fd47d9d4228b1483c77e2db54ebabdc8c1d2e29..84a9ea51d805b6c3115ec31a93b09e329e844d86 100644 (file)
@@ -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);
+    }
 }
index 49f79365f33fbe077b550f3182841cb3571fbca1..0358133a2354aea7a78085f6288635bf88803e0e 100644 (file)
@@ -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 (file)
index 0000000..ba4f120
Binary files /dev/null and b/test-data/spreadsheet/52716.xlsx differ