fixed a regression issue where HSSFHyperlink failed to set inter-sheet and file links, see Bugzilla #47375

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@786442 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2009-06-19 10:37:24 +00:00
parent 66b67b1e1d
commit e1ff96d77d
7 changed files with 166 additions and 72 deletions

View File

@ -33,6 +33,7 @@
<changes> <changes>
<release version="3.5-beta7" date="2009-??-??"> <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">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> <action dev="POI-DEVELOPERS" type="fix">47372 - Fixed locale-sensitive unit tests to pass when running on non-US locale</action>
</release> </release>

View File

@ -81,6 +81,8 @@ public final class HyperlinkRecord extends StandardRecord {
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
GUID other = (GUID) obj; GUID other = (GUID) obj;
if (obj == null || !(obj instanceof GUID))
return false;
return _d1 == other._d1 && _d2 == other._d2 return _d1 == other._d1 && _d2 == other._d2
&& _d3 == other._d3 && _d4 == other._d4; && _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 * @return the address of this hyperlink
*/ */
public String getAddress() { 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 * @param address the address of this hyperlink
*/ */
public void setAddress(String address) { 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() { public String getShortFilename() {

View File

@ -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 * @return the address of this hyperlink
*/ */
@ -172,12 +172,23 @@ public class HSSFHyperlink implements Hyperlink {
public String getTextMark(){ public String getTextMark(){
return record.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) { public void setTextMark(String textMark) {
record.setTextMark(textMark); record.setTextMark(textMark);
} }
public String getShortFilename(){ public String getShortFilename(){
return record.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) { public void setShortFilename(String shortFilename) {
record.setShortFilename(shortFilename); record.setShortFilename(shortFilename);
} }

View File

@ -19,15 +19,16 @@ package org.apache.poi.xssf.usermodel;
import java.io.File; import java.io.File;
import junit.framework.TestCase; import org.apache.poi.ss.usermodel.*;
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.xssf.XSSFTestDataSamples; 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 @Override
protected void setUp() { protected void setUp() {
// Use system out logger // Use system out logger

View File

@ -281,7 +281,7 @@ public final class TestHyperlinkRecord extends TestCase {
assertEquals("file", link.getLabel()); assertEquals("file", link.getLabel());
assertEquals("link1.xls", link.getShortFilename()); assertEquals("link1.xls", link.getShortFilename());
assertEquals(null, link.getAddress()); assertEquals("link1.xls", link.getAddress());
} }
public void testReadEmailLink(){ public void testReadEmailLink(){
@ -317,7 +317,7 @@ public final class TestHyperlinkRecord extends TestCase {
assertEquals("place", link.getLabel()); assertEquals("place", link.getLabel());
assertEquals("Sheet1!A1", link.getTextMark()); assertEquals("Sheet1!A1", link.getTextMark());
assertEquals(null, link.getAddress()); assertEquals("Sheet1!A1", link.getAddress());
} }
private void serialize(byte[] data){ private void serialize(byte[] data){

View File

@ -17,25 +17,27 @@
package org.apache.poi.hssf.usermodel; package org.apache.poi.hssf.usermodel;
import junit.framework.TestCase;
import java.io.*;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.HSSFITestDataProvider;
import org.apache.poi.ss.usermodel.BaseTestHyperlink;
/** /**
* Tests HSSFHyperlink. * Tests HSSFHyperlink.
* *
* @author Yegor Kozlov * @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. * Test that we can read hyperlinks.
*/ */
public void testRead() { public void testRead() {
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls"); HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
HSSFSheet sheet; HSSFSheet sheet;
HSSFCell cell; HSSFCell cell;
@ -71,10 +73,11 @@ public final class TestHSSFHyperlink extends TestCase {
assertEquals("Link To First Sheet", link.getLabel()); assertEquals("Link To First Sheet", link.getLabel());
assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString()); assertEquals("Link To First Sheet", cell.getRichStringCellValue().getString());
assertEquals("WebLinks!A1", link.getTextMark()); assertEquals("WebLinks!A1", link.getTextMark());
assertEquals("WebLinks!A1", link.getAddress());
} }
public void testModify() throws Exception { public void testModify() throws Exception {
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("HyperlinksOnManySheets.xls"); HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("HyperlinksOnManySheets.xls");
HSSFSheet sheet; HSSFSheet sheet;
HSSFCell cell; HSSFCell cell;
@ -86,11 +89,7 @@ public final class TestHSSFHyperlink extends TestCase {
//modify the link //modify the link
link.setAddress("www.apache.org"); link.setAddress("www.apache.org");
//serialize and read again wb = getTestDataProvider().writeOutAndReadBack(wb);
ByteArrayOutputStream out = new ByteArrayOutputStream();
wb.write(out);
wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
sheet = wb.getSheet("WebLinks"); sheet = wb.getSheet("WebLinks");
cell = sheet.getRow(4).getCell(0); cell = sheet.getRow(4).getCell(0);
link = cell.getHyperlink(); 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:
HSSFCell cell; * link.setTextMark("'Target Sheet-1'!A1"); //HSSF-specific
HSSFSheet sheet = wb.createSheet("Hyperlinks"); * or
* link.setAddress("'Target Sheet-1'!A1"); //common between XSSF and HSSF
//URL */
cell = sheet.createRow(0).createCell(0); public void testCreateDocumentLink() throws Exception {
cell.setCellValue("URL Link"); HSSFWorkbook wb = getTestDataProvider().createWorkbook();
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 //link to a place in this workbook
HSSFHyperlink link;
HSSFCell cell;
HSSFSheet sheet = wb.createSheet("Hyperlinks");
//create a target sheet and cell //create a target sheet and cell
HSSFSheet sheet2 = wb.createSheet("Target Sheet"); HSSFSheet sheet2 = wb.createSheet("Target Sheet");
sheet2.createRow(0).createCell(0).setCellValue("Target Cell"); 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"); cell.setCellValue("Worksheet Link");
link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT); link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);
link.setTextMark("'Target Sheet'!A1"); link.setTextMark("'Target Sheet'!A1");
cell.setHyperlink(link); cell.setHyperlink(link);
//serialize and read again //cell B1 has a link to cell A1 on the same sheet
ByteArrayOutputStream out = new ByteArrayOutputStream(); cell = sheet.createRow(1).createCell(0);
wb.write(out); 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"); sheet = wb.getSheet("Hyperlinks");
cell = sheet.getRow(0).getCell(0); cell = sheet.getRow(0).getCell(0);
link = cell.getHyperlink(); link = cell.getHyperlink();
assertNotNull(link); 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); cell = sheet.getRow(1).getCell(0);
link = cell.getHyperlink(); link = cell.getHyperlink();
assertNotNull(link); assertNotNull(link);
assertEquals("link1.xls", link.getAddress()); assertEquals("'Hyperlinks'!A1", link.getTextMark());
assertEquals("'Hyperlinks'!A1", 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());
} }
public void testCloneSheet() { public void testCloneSheet() {
@ -190,7 +171,7 @@ public final class TestHSSFHyperlink extends TestCase {
* see bugs #46445 and #29957 * see bugs #46445 and #29957
*/ */
public void testShiftRows(){ public void testShiftRows(){
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("46445.xls"); HSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("46445.xls");
HSSFSheet sheet = wb.getSheetAt(0); HSSFSheet sheet = wb.getSheetAt(0);

View File

@ -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());
}
}