]> source.dussan.org Git - poi.git/commitdiff
fixed a regression issue where HSSFHyperlink failed to set inter-sheet and file links...
authorYegor Kozlov <yegor@apache.org>
Fri, 19 Jun 2009 10:37:24 +0000 (10:37 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 19 Jun 2009 10:37:24 +0000 (10:37 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@786442 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/HyperlinkRecord.java
src/java/org/apache/poi/hssf/usermodel/HSSFHyperlink.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFHyperlink.java
src/testcases/org/apache/poi/hssf/record/TestHyperlinkRecord.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFHyperlink.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestHyperlink.java [new file with mode: 0755]

index fd3c3300460d86a83160f12bba65446320b8f05a..e81bf101ad868000031d90033c7fe25e02e48de7 100644 (file)
@@ -33,6 +33,7 @@
 
     <changes>
         <release version="3.5-beta7" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">47375 - Fixed HSSFHyperlink to correctly set inter-sheet and file links</action>
            <action dev="POI-DEVELOPERS" type="fix">47384 - Fixed ExternalNameRecord to handle unicode names</action>
            <action dev="POI-DEVELOPERS" type="fix">47372 - Fixed locale-sensitive unit tests to pass when running on non-US locale</action>
         </release>
index 190613294ff37324377731ee1348f0d9b3d8f769..f94605432d6533eb76196cca24cdf27bd1e125ec 100644 (file)
@@ -81,7 +81,9 @@ public final class HyperlinkRecord extends StandardRecord {
                @Override
                public boolean equals(Object obj) {
                        GUID other = (GUID) obj;
-                       return _d1 == other._d1 && _d2 == other._d2 
+            if (obj == null || !(obj instanceof GUID))
+                return false;
+                       return _d1 == other._d1 && _d2 == other._d2
                            && _d3 == other._d3 && _d4 == other._d4;
                }
 
@@ -360,21 +362,31 @@ public final class HyperlinkRecord extends StandardRecord {
     }
 
     /**
-     * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, patrh to a file, etc.
+     * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
      *
      * @return  the address of this hyperlink
      */
     public String getAddress() {
-        return cleanString(_address);
+        if ((_linkOpts & HLINK_URL) != 0 && FILE_MONIKER.equals(_moniker))
+            return cleanString(_address != null ? _address : _shortFilename);
+        else if((_linkOpts & HLINK_PLACE) != 0)
+            return cleanString(_textMark);
+        else
+            return cleanString(_address);
     }
 
     /**
-     * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, patrh to a file, etc.
+     * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
      *
      * @param address  the address of this hyperlink
      */
     public void setAddress(String address) {
-        _address = appendNullTerm(address);
+        if ((_linkOpts & HLINK_URL) != 0 && FILE_MONIKER.equals(_moniker))
+            _shortFilename = appendNullTerm(address);
+        else if((_linkOpts & HLINK_PLACE) != 0)
+            _textMark = appendNullTerm(address);
+        else
+            _address = appendNullTerm(address);
     }
 
     public String getShortFilename() {
index 9a812914d5b1134975c324154f13bcefabdab4d6..669f52f06514724d9c346cb5ffb039ff65cdb608 100755 (executable)
@@ -162,7 +162,7 @@ public class HSSFHyperlink implements Hyperlink {
     }
 
     /**
-     * Hypelink address. Depending on the hyperlink type it can be URL, e-mail, patrh to a file, etc.
+     * Hypelink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
      *
      * @return  the address of this hyperlink
      */
@@ -172,12 +172,23 @@ public class HSSFHyperlink implements Hyperlink {
     public String getTextMark(){
         return record.getTextMark();
     }
+
+    /**
+     * Convenience method equivalent to {@link #setAddress(String)}
+     *
+     * @param textMark the place in worksheet this hypelrink referes to, e.g. 'Target Sheet'!A1'
+     */
     public void setTextMark(String textMark) {
         record.setTextMark(textMark);
     }
     public String getShortFilename(){
         return record.getShortFilename();
     }
+    /**
+     * Convenience method equivalent to {@link #setAddress(String)}
+     *
+     * @param shortFilename the path to a file this hypelrink points to, e.g. 'readme.txt'
+     */
     public void setShortFilename(String shortFilename) {
         record.setShortFilename(shortFilename);
     }
index 28ee4fd689bc5efb27a0cf6dbd816904c5e2084a..4e08e7274dfdc719f7bacd4ab5f32b3ca502b65a 100644 (file)
@@ -19,15 +19,16 @@ package org.apache.poi.xssf.usermodel;
 
 import java.io.File;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CreationHelper;
-import org.apache.poi.ss.usermodel.Hyperlink;
-import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+
+public final class TestXSSFHyperlink extends BaseTestHyperlink {
+    @Override
+    protected XSSFITestDataProvider getTestDataProvider() {
+        return XSSFITestDataProvider.getInstance();
+    }
 
-public final class TestXSSFHyperlink extends TestCase {
        @Override
        protected void setUp() {
                // Use system out logger
index 7bb05f4f1225f654ab6ca53274d68dec8b366b07..4232af7c78fb5d490e046514047dfe38295214be 100644 (file)
@@ -281,7 +281,7 @@ public final class TestHyperlinkRecord extends TestCase {
 
         assertEquals("file", link.getLabel());
         assertEquals("link1.xls", link.getShortFilename());
-        assertEquals(null, link.getAddress());
+        assertEquals("link1.xls", link.getAddress());
     }
 
     public void testReadEmailLink(){
@@ -317,7 +317,7 @@ public final class TestHyperlinkRecord extends TestCase {
 
         assertEquals("place", link.getLabel());
         assertEquals("Sheet1!A1", link.getTextMark());
-        assertEquals(null, link.getAddress());
+        assertEquals("Sheet1!A1", link.getAddress());
     }
 
     private void serialize(byte[] data){
index 9474a08c49035ecc785eaf0db7ded2946434295d..2d56482173678ff8af744c5f661a5a84344d947f 100755 (executable)
 
 package org.apache.poi.hssf.usermodel;
 
-import junit.framework.TestCase;
-
-import java.io.*;
-
 import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.HSSFITestDataProvider;
+import org.apache.poi.ss.usermodel.BaseTestHyperlink;
 
 /**
  * Tests HSSFHyperlink.
  *
  * @author  Yegor Kozlov
  */
-public final class TestHSSFHyperlink extends TestCase {
+public final class TestHSSFHyperlink extends BaseTestHyperlink {
 
+    @Override
+    protected HSSFITestDataProvider getTestDataProvider(){
+        return HSSFITestDataProvider.getInstance();
+    }
     /**
      * Test that we can read hyperlinks.
      */
     public void testRead() {
 
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls");
+        HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
 
         HSSFSheet sheet;
         HSSFCell cell;
@@ -71,10 +73,11 @@ public final class TestHSSFHyperlink extends TestCase {
         assertEquals("Link To First Sheet", link.getLabel());
         assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString());
         assertEquals("WebLinks!A1", link.getTextMark());
+        assertEquals("WebLinks!A1", link.getAddress());
     }
 
     public void testModify() throws Exception {
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls");
+        HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
 
         HSSFSheet sheet;
         HSSFCell cell;
@@ -86,11 +89,7 @@ public final class TestHSSFHyperlink extends TestCase {
         //modify the link
         link.setAddress("www.apache.org");
 
-        //serialize and read again
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        wb.write(out);
-
-        wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
+        wb = getTestDataProvider().writeOutAndReadBack(wb);
         sheet = wb.getSheet("WebLinks");
         cell = sheet.getRow(4).getCell(0);
         link = cell.getHyperlink();
@@ -99,71 +98,53 @@ public final class TestHSSFHyperlink extends TestCase {
 
     }
 
-    public void testCreate() throws Exception {
-        HSSFWorkbook wb = new HSSFWorkbook();
+    /**
+     * HSSF-specific ways of creating links to a place in workbook.
+     * You can set the target  in two ways:
+     *  link.setTextMark("'Target Sheet-1'!A1"); //HSSF-specific
+     *  or
+     *  link.setAddress("'Target Sheet-1'!A1"); //common between XSSF and HSSF
+     */
+    public void testCreateDocumentLink() throws Exception {
+        HSSFWorkbook wb = getTestDataProvider().createWorkbook();
 
+        //link to a place in this workbook
+        HSSFHyperlink link;
         HSSFCell cell;
         HSSFSheet sheet = wb.createSheet("Hyperlinks");
 
-        //URL
-        cell = sheet.createRow(0).createCell(0);
-        cell.setCellValue("URL Link");
-        HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
-        link.setAddress("http://poi.apache.org/");
-        cell.setHyperlink(link);
-
-        //link to a file in the current directory
-        cell = sheet.createRow(1).createCell(0);
-        cell.setCellValue("File Link");
-        link = new HSSFHyperlink(HSSFHyperlink.LINK_FILE);
-        link.setAddress("link1.xls");
-        cell.setHyperlink(link);
-
-        //e-mail link
-        cell = sheet.createRow(2).createCell(0);
-        cell.setCellValue("Email Link");
-        link = new HSSFHyperlink(HSSFHyperlink.LINK_EMAIL);
-        //note, if subject contains white spaces, make sure they are url-encoded
-        link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");
-        cell.setHyperlink(link);
-
-        //link to a place in this workbook
-
         //create a target sheet and cell
         HSSFSheet sheet2 = wb.createSheet("Target Sheet");
         sheet2.createRow(0).createCell(0).setCellValue("Target Cell");
 
-        cell = sheet.createRow(3).createCell(0);
+        //cell A1 has a link to 'Target Sheet-1'!A1
+        cell = sheet.createRow(0).createCell(0);
         cell.setCellValue("Worksheet Link");
         link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
         link.setTextMark("'Target Sheet'!A1");
         cell.setHyperlink(link);
 
-        //serialize and read again
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        wb.write(out);
+        //cell B1 has a link to cell A1 on the same sheet
+        cell = sheet.createRow(1).createCell(0);
+        cell.setCellValue("Worksheet Link");
+        link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
+        link.setAddress("'Hyperlinks'!A1");
+        cell.setHyperlink(link);
 
-        wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
+        wb = getTestDataProvider().writeOutAndReadBack(wb);
         sheet = wb.getSheet("Hyperlinks");
+
         cell = sheet.getRow(0).getCell(0);
         link = cell.getHyperlink();
         assertNotNull(link);
-        assertEquals("http://poi.apache.org/", link.getAddress());
+        assertEquals("'Target Sheet'!A1", link.getTextMark());
+        assertEquals("'Target Sheet'!A1", link.getAddress());
 
         cell = sheet.getRow(1).getCell(0);
         link = cell.getHyperlink();
         assertNotNull(link);
-        assertEquals("link1.xls", link.getAddress());
-
-        cell = sheet.getRow(2).getCell(0);
-        link = cell.getHyperlink();
-        assertNotNull(link);
-        assertEquals("mailto:poi@apache.org?subject=Hyperlinks", link.getAddress());
-
-        cell = sheet.getRow(3).getCell(0);
-        link = cell.getHyperlink();
-        assertNotNull(link);
-        assertEquals("'Target Sheet'!A1", link.getTextMark());
+        assertEquals("'Hyperlinks'!A1", link.getTextMark());
+        assertEquals("'Hyperlinks'!A1", link.getAddress());
     }
 
     public void testCloneSheet() {
@@ -190,7 +171,7 @@ public final class TestHSSFHyperlink extends TestCase {
      * see bugs #46445 and #29957
      */
     public void testShiftRows(){
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("46445.xls");
+        HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("46445.xls");
 
 
         HSSFSheet sheet = wb.getSheetAt(0);
diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestHyperlink.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestHyperlink.java
new file mode 100755 (executable)
index 0000000..ae71841
--- /dev/null
@@ -0,0 +1,88 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.ss.ITestDataProvider;
+
+/**
+ * Test diffrent types of Excel hyperlinks
+ *
+ * @author Yegor Kozlov
+ */
+public abstract class BaseTestHyperlink extends TestCase {
+
+    protected abstract ITestDataProvider getTestDataProvider();
+
+    public void testBasicTypes(){
+        Workbook wb = getTestDataProvider().createWorkbook();
+        CreationHelper createHelper = wb.getCreationHelper();
+
+        Cell cell;
+        Hyperlink link;
+        Sheet sheet = wb.createSheet("Hyperlinks");
+
+        //URL
+        cell = sheet.createRow(0).createCell((short) 0);
+        cell.setCellValue("URL Link");
+        link = createHelper.createHyperlink(Hyperlink.LINK_URL);
+        link.setAddress("http://poi.apache.org/");
+        cell.setHyperlink(link);
+
+        //link to a file in the current directory
+        cell = sheet.createRow(1).createCell((short) 0);
+        cell.setCellValue("File Link");
+        link = createHelper.createHyperlink(Hyperlink.LINK_FILE);
+        link.setAddress("hyperinks-beta4-dump.txt");
+        cell.setHyperlink(link);
+
+        //e-mail link
+        cell = sheet.createRow(2).createCell((short) 0);
+        cell.setCellValue("Email Link");
+        link = createHelper.createHyperlink(Hyperlink.LINK_EMAIL);
+        //note, if subject contains white spaces, make sure they are url-encoded
+        link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");
+        cell.setHyperlink(link);
+
+        //link to a place in this workbook
+
+        //create a target sheet and cell
+        Sheet sheet2 = wb.createSheet("Target Sheet");
+        sheet2.createRow(0).createCell((short) 0).setCellValue("Target Cell");
+
+        cell = sheet.createRow(3).createCell((short) 0);
+        cell.setCellValue("Worksheet Link");
+        link = createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);
+        link.setAddress("'Target Sheet'!A1");
+        cell.setHyperlink(link);
+
+        wb = getTestDataProvider().writeOutAndReadBack(wb);
+
+        sheet = wb.getSheetAt(0);
+        link = sheet.getRow(0).getCell(0).getHyperlink();
+
+        assertEquals("http://poi.apache.org/", link.getAddress());
+        link = sheet.getRow(1).getCell(0).getHyperlink();
+        assertEquals("hyperinks-beta4-dump.txt", link.getAddress());
+        link = sheet.getRow(2).getCell(0).getHyperlink();
+        assertEquals("mailto:poi@apache.org?subject=Hyperlinks", link.getAddress());
+        link = sheet.getRow(3).getCell(0).getHyperlink();
+        assertEquals("'Target Sheet'!A1", link.getAddress());
+       }
+}
\ No newline at end of file