You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2009/07/12 09:18:43 UTC
svn commit: r793280 - in /poi/trunk/src: ooxml/java/org/apache/poi/
ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/
ooxml/java/org/apache/poi/util/ ooxml/testcases/org/apache/poi/openxml4j/opc/
ooxml/testcases/org/apache/poi/xssf/ ooxml/t...
Author: yegor
Date: Sun Jul 12 07:18:42 2009
New Revision: 793280
URL: http://svn.apache.org/viewvc?rev=793280&view=rev
Log:
fixed XSSF and OpenXml4J to read/write relationships with targets starting with '#' (internal locations), see Bugzilla 47504
Added:
poi/trunk/src/testcases/org/apache/poi/hssf/data/47504.xlsx (with props)
Modified:
poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java
poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java
poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java
poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
Modified: poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java Sun Jul 12 07:18:42 2009
@@ -19,6 +19,7 @@
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
+import java.net.URI;
import org.apache.xmlbeans.XmlOptions;
import org.apache.poi.util.POILogger;
@@ -142,7 +143,7 @@
@Override
public String toString(){
- return packagePart.toString();
+ return packagePart == null ? null : packagePart.toString();
}
/**
@@ -231,17 +232,28 @@
PackageRelationshipCollection rels = packagePart.getRelationships();
for (PackageRelationship rel : rels) {
if(rel.getTargetMode() == TargetMode.INTERNAL){
- PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
- PackagePart p = packagePart.getPackage().getPart(relName);
- if(p == null) {
- logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI());
- continue;
+ URI uri = rel.getTargetURI();
+
+ PackagePart p;
+ if(uri.getRawFragment() != null) {
+ /*
+ * For internal references (e.g. '#Sheet1!A1') the package part is null
+ */
+ p = null;
+ } else {
+ PackagePartName relName = PackagingURIHelper.createPartName(uri);
+ p = packagePart.getPackage().getPart(relName);
+ if(p == null) {
+ logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI());
+ continue;
+ }
}
+
POIXMLDocumentPart childPart = factory.createDocumentPart(rel, p);
childPart.parent = this;
addRelation(childPart);
- if(p.hasRelationships()) childPart.read(factory);
+ if(p != null && p.hasRelationships()) childPart.read(factory);
}
}
}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java Sun Jul 12 07:18:42 2009
@@ -161,8 +161,12 @@
PackageRelationship.TARGET_MODE_ATTRIBUTE_NAME,
"External");
} else {
- targetValue = PackagingURIHelper.relativizeURI(
- sourcePartURI, rel.getTargetURI()).getPath();
+ URI targetURI = rel.getTargetURI();
+ targetValue = PackagingURIHelper.relativizeURI(
+ sourcePartURI, targetURI).getPath();
+ if (targetURI.getRawFragment() != null) {
+ targetValue += "#" + targetURI.getRawFragment();
+ }
}
relElem.addAttribute(PackageRelationship.TARGET_ATTRIBUTE_NAME,
targetValue);
Modified: poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/util/PackageHelper.java Sun Jul 12 07:18:42 2009
@@ -22,6 +22,7 @@
import org.apache.poi.util.IOUtils;
import java.io.*;
+import java.net.URI;
/**
* Provides handy methods to work with OOXML packages
@@ -83,11 +84,10 @@
* Creates an empty file in the default temporary-file directory,
*/
public static File createTempFile() throws IOException {
- File file = File.createTempFile("poi-ooxml-", ".tmp");
+ File file = TempFile.createTempFile("poi-ooxml-", ".tmp");
//there is no way to pass an existing file to Package.create(file),
//delete first, the file will be re-created in Packe.create(file)
file.delete();
- file.deleteOnExit();
return file;
}
@@ -104,11 +104,18 @@
//external relations don't have associated package parts
continue;
} else {
- PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
- p = pkg.getPart(relName);
+ URI uri = rel.getTargetURI();
+
+ if(uri.getRawFragment() != null) {
+ part_tgt.addRelationship(uri, rel.getTargetMode(), rel.getRelationshipType(), rel.getId());
+ continue;
+ } else {
+ PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
+ p = pkg.getPart(relName);
+ part_tgt.addRelationship(p.getPartName(), rel.getTargetMode(), rel.getRelationshipType(), rel.getId());
+ }
}
- part_tgt.addRelationship(p.getPartName(), rel.getTargetMode(), rel.getRelationshipType(), rel.getId());
PackagePart dest;
if(!tgt.containPart(p.getPartName())){
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java Sun Jul 12 07:18:42 2009
@@ -35,6 +35,7 @@
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.internal.ContentTypeManager;
import org.apache.poi.openxml4j.opc.internal.FileHelper;
+import org.apache.poi.util.TempFile;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
@@ -167,8 +168,10 @@
coreOut = corePart.getOutputStream();
coreOut.write("<dummy-xml2 />".getBytes());
coreOut.close();
-
-
+
+ //add a relationship with internal target: "#Sheet1!A1"
+ corePart.addRelationship(new URI("#Sheet1!A1"), TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", "rId2");
+
// Check things are as expected
PackageRelationshipCollection coreRels =
pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
@@ -181,11 +184,12 @@
// Save and re-load
pkg.close();
- FileOutputStream fout = new FileOutputStream(File.createTempFile("testCreatePackageWithCoreDocument", ".zip"));
+ File tmp = TempFile.createTempFile("testCreatePackageWithCoreDocument", ".zip");
+ FileOutputStream fout = new FileOutputStream(tmp);
fout.write(baos.toByteArray());
fout.close();
- pkg = OPCPackage.open(new ByteArrayInputStream(baos.toByteArray()));
-
+ pkg = OPCPackage.open(tmp.getPath());
+ //tmp.delete();
// Check still right
coreRels = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
@@ -193,8 +197,16 @@
coreRel = coreRels.getRelationship(0);
assertEquals("/", coreRel.getSourceURI().toString());
assertEquals("/xl/workbook.xml", coreRel.getTargetURI().toString());
- assertNotNull(pkg.getPart(coreRel));
- }
+ corePart = pkg.getPart(coreRel);
+ assertNotNull(corePart);
+
+ PackageRelationshipCollection rels = corePart.getRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink");
+ assertEquals(1, rels.size());
+ rel = rels.getRelationship(0);
+ assertEquals("Sheet1!A1", rel.getTargetURI().getRawFragment());
+
+
+ }
/**
* Test package opening.
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestRelationships.java Sun Jul 12 07:18:42 2009
@@ -17,9 +17,7 @@
package org.apache.poi.openxml4j.opc;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
+import java.io.*;
import junit.framework.TestCase;
@@ -254,4 +252,5 @@
assertEquals("/docProps/core.xml",
pkg.getRelationshipsByType("http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties").getRelationship(0).getTargetURI().toString());
}
+
}
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java Sun Jul 12 07:18:42 2009
@@ -30,6 +30,7 @@
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.util.TempFile;
/**
* Centralises logic for finding/opening sample files in the src/testcases/org/apache/poi/hssf/hssf/data folder.
@@ -57,8 +58,7 @@
InputStream is = new ByteArrayInputStream(baos.toByteArray());
result = new HSSFWorkbook(is);
} else if (wb instanceof XSSFWorkbook) {
- File tmp = File.createTempFile("poi-ooxml-", ".xlsx");
- tmp.deleteOnExit();
+ File tmp = TempFile.createTempFile("poi-ooxml-", ".xlsx");
FileOutputStream out = new FileOutputStream(tmp);
wb.write(out);
out.close();
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Sun Jul 12 07:18:42 2009
@@ -18,6 +18,7 @@
package org.apache.poi.xssf.usermodel;
import java.io.File;
+import java.util.List;
import junit.framework.TestCase;
@@ -28,6 +29,7 @@
import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
+import org.apache.poi.POIXMLDocumentPart;
public class TestXSSFBugs extends BaseTestBugzillaIssues {
@Override
@@ -121,4 +123,24 @@
);
assertNotNull(drw);
}
+ public void test47504() {
+ XSSFWorkbook wb = getTestDataProvider().openSampleWorkbook("47504.xlsx");
+ assertEquals(1, wb.getNumberOfSheets());
+ XSSFSheet sh = wb.getSheetAt(0);
+ XSSFDrawing drawing = sh.createDrawingPatriarch();
+ List<POIXMLDocumentPart> rels = drawing.getRelations();
+ assertEquals(1, rels.size());
+ assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
+
+ // And again, just to be sure
+ wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+ assertEquals(1, wb.getNumberOfSheets());
+ sh = wb.getSheetAt(0);
+ drawing = sh.createDrawingPatriarch();
+ rels = drawing.getRelations();
+ assertEquals(1, rels.size());
+ assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
+
+ }
+
}
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java?rev=793280&r1=793279&r2=793280&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java Sun Jul 12 07:18:42 2009
@@ -33,6 +33,7 @@
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
+import org.apache.poi.util.TempFile;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr;
@@ -74,7 +75,7 @@
assertEquals(0, workbook.getSheetAt(2).getFirstRowNum());
assertEquals(0, workbook.getSheetAt(2).getLastRowNum());
- File file = File.createTempFile("poi-", ".xlsx");
+ File file = TempFile.createTempFile("poi-", ".xlsx");
OutputStream out = new FileOutputStream(file);
workbook.write(out);
out.close();
Added: poi/trunk/src/testcases/org/apache/poi/hssf/data/47504.xlsx
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/47504.xlsx?rev=793280&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/47504.xlsx
------------------------------------------------------------------------------
svn:executable = *
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/47504.xlsx
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org