Merge pull request #2263 from OpenRefine/issue-2213-xlsx-export-url

More robust URI detection in tabular exporter.
This commit is contained in:
Antonin Delpeuch 2019-12-30 21:52:45 +01:00 committed by GitHub
commit 60089ab716
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 10 deletions

View File

@ -34,6 +34,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package com.google.refine.exporters; package com.google.refine.exporters;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
@ -371,10 +373,13 @@ abstract public class CustomizableTabularExporterUtilities {
if (value instanceof String) { if (value instanceof String) {
text = (String) value; text = (String) value;
if(text.contains(":")) { if(text.contains(":") && urlValidator.isValid(text)) {
if(urlValidator.isValid(text)) { // Extra check for https://github.com/OpenRefine/OpenRefine/issues/2213
link = text; try {
} link = new URI(text).toString();
} catch(URISyntaxException e) {
;
}
} }
} else if (value instanceof OffsetDateTime) { } else if (value instanceof OffsetDateTime) {
text = ((OffsetDateTime) value).format(DateTimeFormatter.ISO_INSTANT); text = ((OffsetDateTime) value).format(DateTimeFormatter.ISO_INSTANT);

View File

@ -39,7 +39,7 @@ import java.time.OffsetDateTime;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.apache.poi.common.usermodel.Hyperlink; import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
@ -127,9 +127,15 @@ public class XlsExporter implements StreamExporter {
} }
if (cellData.link != null) { if (cellData.link != null) {
Hyperlink hl = wb.getCreationHelper().createHyperlink(HyperlinkType.URL); try {
hl.setLabel(cellData.text); Hyperlink hl = wb.getCreationHelper().createHyperlink(HyperlinkType.URL);
hl.setAddress(cellData.link); hl.setLabel(cellData.text);
hl.setAddress(cellData.link);
c.setHyperlink(hl);
} catch(IllegalArgumentException e) {
// If we failed to create the hyperlink and add it to the cell,
// we just use the string value as fallback
}
} }
} }
} }

View File

@ -43,6 +43,7 @@ import static org.mockito.Mockito.mock;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.util.Properties; import java.util.Properties;
@ -155,6 +156,30 @@ public class XlsxExporterTests extends RefineTest {
Assert.fail(); Assert.fail();
} }
} }
@Test
public void exportXlsxStringWithURLs() throws IOException{
String url = "GET /primo-library/,http:%2F%2Fcatalogue.unice.fr HTTP/1.1";
createDateGrid(2, 2, url);
try {
SUT.export(project, options, engine, stream);
} catch (IOException e) {
Assert.fail();
}
ByteArrayInputStream inStream = new ByteArrayInputStream( stream.toByteArray() );
try {
XSSFWorkbook wb = new XSSFWorkbook(inStream);
XSSFSheet ws = wb.getSheetAt(0);
XSSFRow row1 = ws.getRow(1);
XSSFCell cell0 = row1.getCell(0);
Assert.assertTrue(cell0.toString().contains("primo-library"));
wb.close();
} catch (IOException e) {
Assert.fail();
}
}
//helper methods //helper methods
@ -180,13 +205,13 @@ public class XlsxExporterTests extends RefineTest {
} }
} }
private void createDateGrid(int noOfRows, int noOfColumns, OffsetDateTime now){ private void createDateGrid(int noOfRows, int noOfColumns, Serializable value){
CreateColumns(noOfColumns); CreateColumns(noOfColumns);
for(int i = 0; i < noOfRows; i++){ for(int i = 0; i < noOfRows; i++){
Row row = new Row(noOfColumns); Row row = new Row(noOfColumns);
for(int j = 0; j < noOfColumns; j++){ for(int j = 0; j < noOfColumns; j++){
row.cells.add(new Cell(now, null)); row.cells.add(new Cell(value, null));
} }
project.rows.add(row); project.rows.add(row);
} }