Browse Source

#54916 - POI does not always read all the slides in pptx files

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1723966 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_14_FINAL
Andreas Beeker 8 years ago
parent
commit
c47f676397
73 changed files with 1389 additions and 650 deletions
  1. 10
    0
      src/integrationtest/org/apache/poi/TestAllFiles.java
  2. 26
    0
      src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java
  3. 2
    0
      src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java
  4. 251
    81
      src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
  5. 96
    5
      src/ooxml/java/org/apache/poi/POIXMLFactory.java
  6. 1
    1
      src/ooxml/java/org/apache/poi/POIXMLRelation.java
  7. 5
    5
      src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java
  8. 13
    2
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFBaseContents.java
  9. 32
    49
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFFactory.java
  10. 14
    3
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFMasterContents.java
  11. 20
    6
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFMasters.java
  12. 13
    2
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFPageContents.java
  13. 13
    2
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFPages.java
  14. 2
    5
      src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFRelation.java
  15. 14
    4
      src/ooxml/java/org/apache/poi/xdgf/xml/XDGFXMLDocumentPart.java
  16. 24
    39
      src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
  17. 28
    13
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java
  18. 19
    5
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommentAuthors.java
  19. 19
    4
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java
  20. 16
    36
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFFactory.java
  21. 12
    2
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
  22. 13
    2
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java
  23. 14
    1
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java
  24. 2
    3
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java
  25. 18
    11
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
  26. 13
    5
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
  27. 12
    2
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java
  28. 13
    2
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java
  29. 13
    2
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableStyles.java
  30. 13
    2
      src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java
  31. 12
    6
      src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
  32. 13
    2
      src/ooxml/java/org/apache/poi/xssf/model/CalculationChain.java
  33. 13
    2
      src/ooxml/java/org/apache/poi/xssf/model/CommentsTable.java
  34. 13
    2
      src/ooxml/java/org/apache/poi/xssf/model/ExternalLinksTable.java
  35. 13
    4
      src/ooxml/java/org/apache/poi/xssf/model/MapInfo.java
  36. 12
    2
      src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java
  37. 13
    3
      src/ooxml/java/org/apache/poi/xssf/model/SingleXmlCells.java
  38. 13
    2
      src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
  39. 12
    2
      src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java
  40. 13
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java
  41. 13
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java
  42. 3
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDialogsheet.java
  43. 20
    11
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
  44. 15
    34
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java
  45. 6
    8
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFMap.java
  46. 12
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
  47. 12
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCache.java
  48. 12
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java
  49. 12
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheRecords.java
  50. 12
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java
  51. 1
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
  52. 34
    16
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
  53. 13
    3
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTable.java
  54. 12
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFVBAPart.java
  55. 11
    2
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFVMLDrawing.java
  56. 62
    36
      src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
  57. 6
    10
      src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java
  58. 10
    17
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
  59. 34
    55
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFactory.java
  60. 17
    2
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFooter.java
  61. 25
    10
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFootnotes.java
  62. 17
    2
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeader.java
  63. 15
    12
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java
  64. 31
    19
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java
  65. 15
    7
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java
  66. 2
    3
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java
  67. 7
    7
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
  68. 13
    2
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java
  69. 23
    12
      src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFStyles.java
  70. 10
    6
      src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
  71. 8
    14
      src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
  72. 17
    7
      src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
  73. 21
    16
      src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java

+ 10
- 0
src/integrationtest/org/apache/poi/TestAllFiles.java View File

@@ -259,12 +259,22 @@ public class TestAllFiles {
// non-TNEF files
EXPECTED_FAILURES.add("ddf/Container.dat");
EXPECTED_FAILURES.add("ddf/47143.dat");

// sheet cloning errors
EXPECTED_FAILURES.add("spreadsheet/47813.xlsx");
EXPECTED_FAILURES.add("spreadsheet/56450.xls");
EXPECTED_FAILURES.add("spreadsheet/57231_MixedGasReport.xls");
EXPECTED_FAILURES.add("spreadsheet/OddStyleRecord.xls");
EXPECTED_FAILURES.add("spreadsheet/WithChartSheet.xlsx");
EXPECTED_FAILURES.add("spreadsheet/chart_sheet.xlsx");
}

private static final Set<String> IGNORED = new HashSet<String>();
static {
// need JDK8+ - https://bugs.openjdk.java.net/browse/JDK-8038081
IGNORED.add("slideshow/42474-2.ppt");
// OPC handler works / XSSF handler fails
IGNORED.add("spreadsheet/57181.xlsm");
}
@Parameters(name="{index}: {0} using {1}")

+ 26
- 0
src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java View File

@@ -29,6 +29,7 @@ import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.util.RecordFormatException;

public abstract class SpreadsheetHandler extends AbstractFileHandler {
public void handleWorkbook(Workbook wb, String extension) throws IOException {
@@ -54,6 +55,10 @@ public abstract class SpreadsheetHandler extends AbstractFileHandler {
assertNotNull(read);
readContent(read);
modifyContent(read);

read.close();
}

private ByteArrayOutputStream writeToArray(Workbook wb)
@@ -88,4 +93,25 @@ public abstract class SpreadsheetHandler extends AbstractFileHandler {
}
}
}
private void modifyContent(Workbook wb) {
for (int i=wb.getNumberOfSheets()-1; i>=0; i--) {
try {
wb.cloneSheet(i);
} catch (RecordFormatException e) {
if (e.getCause() instanceof CloneNotSupportedException) {
// ignore me
continue;
}
throw e;
} catch (RuntimeException e) {
if ("Could not find 'internal references' EXTERNALBOOK".equals(e.getMessage())) {
continue;
} else if ("CountryRecord not found".equals(e.getMessage())) {
continue;
}
throw e;
}
}
}
}

+ 2
- 0
src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java View File

@@ -68,6 +68,8 @@ public class XSSFFileHandler extends SpreadsheetHandler {
exportToXML(wb);

checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(bytes)));
wb.close();
}



+ 251
- 81
src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java View File

@@ -20,11 +20,9 @@ import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@@ -56,9 +54,39 @@ public class POIXMLDocumentPart {

private String coreDocumentRel = PackageRelationshipTypes.CORE_DOCUMENT;
private PackagePart packagePart;
private PackageRelationship packageRel;
private POIXMLDocumentPart parent;
private Map<String,POIXMLDocumentPart> relations = new LinkedHashMap<String,POIXMLDocumentPart>();
private Map<String,RelationPart> relations = new LinkedHashMap<String,RelationPart>();

/**
* The RelationPart is a cached relationship between the document, which contains the RelationPart,
* and one of its referenced child document parts.
* The child document parts may only belong to one parent, but it's often referenced by other
* parents too, having varying {@link PackageRelationship#getId() relationship ids} pointing to it.
*/
public static class RelationPart {
private final PackageRelationship relationship;
private final POIXMLDocumentPart documentPart;
RelationPart(PackageRelationship relationship, POIXMLDocumentPart documentPart) {
this.relationship = relationship;
this.documentPart = documentPart;
}
/**
* @return the cached relationship, which uniquely identifies this child document part within the parent
*/
public PackageRelationship getRelationship() {
return relationship;
}
/**
* @return the child document part
*/
@SuppressWarnings("unchecked")
public <T extends POIXMLDocumentPart> T getDocumentPart() {
return (T)documentPart;
}
}

/**
* Counter that provides the amount of incoming relations from other parts
@@ -86,47 +114,64 @@ public class POIXMLDocumentPart {
public POIXMLDocumentPart(OPCPackage pkg) {
this(pkg, PackageRelationshipTypes.CORE_DOCUMENT);
}
/**
* Construct POIXMLDocumentPart representing a custom "core document" package part.
*/
public POIXMLDocumentPart(OPCPackage pkg, String coreDocumentRel) {
this(getPartFromOPCPackage(pkg, coreDocumentRel));
this.coreDocumentRel = coreDocumentRel;
PackageRelationship coreRel = pkg.getRelationshipsByType(this.coreDocumentRel).getRelationship(0);

if (coreRel == null) {
coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
if (coreRel != null) {
throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
}
}
if (coreRel == null) {
throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
}

this.packagePart = pkg.getPart(coreRel);
this.packageRel = coreRel;
}
/**
* Creates new POIXMLDocumentPart - called by client code to create new parts from scratch.
*
* @see #createRelationship(POIXMLRelation, POIXMLFactory, int, boolean)
*/
public POIXMLDocumentPart(){
public POIXMLDocumentPart() {
}

/**
* Creates an POIXMLDocumentPart representing the given package part and relationship.
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an exisiting file.
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an existing file.
*
* @param part - The package part that holds xml data represenring this sheet.
* @param part - The package part that holds xml data representing this sheet.
* @see #read(POIXMLFactory, java.util.Map)
*
* @since POI 3.14-Beta1
*/
public POIXMLDocumentPart(PackagePart part) {
this(null, part);
}

/**
* Creates an POIXMLDocumentPart representing the given package part, relationship and parent
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an existing file.
*
* @param parent - Parent part
* @param part - The package part that holds xml data representing this sheet.
* @see #read(POIXMLFactory, java.util.Map)
*
* @since POI 3.14-Beta1
*/
public POIXMLDocumentPart(POIXMLDocumentPart parent, PackagePart part) {
this.packagePart = part;
this.parent = parent;
}

/**
* Creates an POIXMLDocumentPart representing the given package part and relationship.
* Called by {@link #read(POIXMLFactory, java.util.Map)} when reading in an existing file.
*
* @param part - The package part that holds xml data representing this sheet.
* @param rel - the relationship of the given package part
* @see #read(POIXMLFactory, java.util.Map)
* @see #read(POIXMLFactory, java.util.Map)
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public POIXMLDocumentPart(PackagePart part, PackageRelationship rel){
this.packagePart = part;
this.packageRel = rel;
this(null, part);
}

/**
@@ -137,17 +182,18 @@ public class POIXMLDocumentPart {
* @param part - The package part that holds xml data represenring this sheet.
* @param rel - the relationship of the given package part
* @see #read(POIXMLFactory, java.util.Map)
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public POIXMLDocumentPart(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel){
this.packagePart = part;
this.packageRel = rel;
this.parent = parent;
this(parent, part);
}

/**
* When you open something like a theme, call this to
* re-base the XML Document onto the core child of the
* current core document
* current core document
*/
protected final void rebase(OPCPackage pkg) throws InvalidFormatException {
PackageRelationshipCollection cores =
@@ -158,8 +204,7 @@ public class POIXMLDocumentPart {
" but found " + cores.size() + " parts of the right type"
);
}
packageRel = cores.getRelationship(0);
packagePart = packagePart.getRelatedPart(packageRel);
packagePart = packagePart.getRelatedPart(cores.getRelationship(0));
}

/**
@@ -175,9 +220,28 @@ public class POIXMLDocumentPart {
* Provides access to the PackageRelationship that identifies this POIXMLDocumentPart
*
* @return the PackageRelationship that identifies this POIXMLDocumentPart
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
public final PackageRelationship getPackageRelationship(){
return packageRel;
@Deprecated
@SuppressWarnings("resource")
public final PackageRelationship getPackageRelationship() {
if (this.parent != null) {
for (RelationPart rp : parent.getRelationParts()) {
if (rp.getDocumentPart() == this) {
return rp.getRelationship();
}
}
} else {
OPCPackage pkg = getPackagePart().getPackage();
String partName = getPackagePart().getPartName().getName();
for (PackageRelationship rel : pkg.getRelationships()) {
if (rel.getTargetURI().toASCIIString().equals(partName)) {
return rel;
}
}
}
return null;
}

/**
@@ -186,7 +250,21 @@ public class POIXMLDocumentPart {
* @return child relations
*/
public final List<POIXMLDocumentPart> getRelations(){
return Collections.unmodifiableList(new ArrayList<POIXMLDocumentPart>(relations.values()));
List<POIXMLDocumentPart> l = new ArrayList<POIXMLDocumentPart>();
for (RelationPart rp : relations.values()) {
l.add(rp.getDocumentPart());
}
return Collections.unmodifiableList(l);
}

/**
* Returns the list of child relations for this POIXMLDocumentPart
*
* @return child relations
*/
public final List<RelationPart> getRelationParts() {
List<RelationPart> l = new ArrayList<RelationPart>(relations.values());
return Collections.unmodifiableList(l);
}

/**
@@ -195,13 +273,14 @@ public class POIXMLDocumentPart {
* {@link POIXMLDocumentPart} to the {@link PackagePart} of the target
* {@link POIXMLDocumentPart} with a {@link PackageRelationship#getId()}
* matching the given parameter value.
*
*
* @param id
* The relation id to look for
* @return the target part of the relation, or null, if none exists
*/
public final POIXMLDocumentPart getRelationById(String id) {
return relations.get(id);
RelationPart rp = relations.get(id);
return (rp == null) ? null : rp.getDocumentPart();
}

/**
@@ -209,7 +288,7 @@ public class POIXMLDocumentPart {
* {@link PackageRelationship}, that sources from the {@link PackagePart} of
* this {@link POIXMLDocumentPart} to the {@link PackagePart} of the given
* parameter value.
*
*
* @param part
* The {@link POIXMLDocumentPart} for which the according
* relation-id shall be found.
@@ -217,12 +296,9 @@ public class POIXMLDocumentPart {
* parts are not related.
*/
public final String getRelationId(POIXMLDocumentPart part) {
Iterator<Entry<String, POIXMLDocumentPart>> iter = relations.entrySet().iterator();
while (iter.hasNext())
{
Entry<String, POIXMLDocumentPart> entry = iter.next();
if (entry.getValue() == part) {
return entry.getKey();
for (RelationPart rp : relations.values()) {
if (rp.getDocumentPart() == part) {
return rp.getRelationship().getId();
}
}
return null;
@@ -232,10 +308,66 @@ public class POIXMLDocumentPart {
* Add a new child POIXMLDocumentPart
*
* @param part the child to add
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public final void addRelation(String id,POIXMLDocumentPart part) {
PackageRelationship pr = part.getPackagePart().getRelationship(id);
addRelation(pr, part);
}

/**
* Add a new child POIXMLDocumentPart
*
* @param relId the preferred relation id, when null the next free relation id will be used
* @param relationshipType the package relationship type
* @param part the child to add
*
* @since 3.14-Beta1
*/
public final RelationPart addRelation(String relId, POIXMLRelation relationshipType, POIXMLDocumentPart part) {
PackageRelationship pr = findExistingRelation(part);
if (pr == null) {
PackagePartName ppn = part.getPackagePart().getPartName();
String relType = relationshipType.getRelation();
pr = packagePart.addRelationship(ppn, TargetMode.INTERNAL, relType, relId);
}
addRelation(pr, part);
return new RelationPart(pr, part);
}

/**
* Add a new child POIXMLDocumentPart
*
* @param pr the relationship of the child
* @param part the child to add
*/
public final void addRelation(String id,POIXMLDocumentPart part){
relations.put(id,part);
private void addRelation(PackageRelationship pr, POIXMLDocumentPart part) {
relations.put(pr.getId(), new RelationPart(pr,part));
part.incrementRelationCounter();

}

/**
* Check if the new part was already added before via PackagePart.addRelationship()
*
* @param part
* @return
*/
private PackageRelationship findExistingRelation(POIXMLDocumentPart part) {
String ppn = part.getPackagePart().getPartName().getName();
try {
for (PackageRelationship pr : packagePart.getRelationships()) {
PackagePart pp = packagePart.getRelatedPart(pr);
if (ppn.equals(pp.getPartName().getName())) {
return pr;
}
}
} catch (InvalidFormatException e) {
throw new POIXMLException("invalid package relationships", e);
}
return null;
}

/**
@@ -249,7 +381,7 @@ public class POIXMLDocumentPart {
/**
* Remove the relation to the specified part in this package and remove the
* part, if it is no longer needed and flag is set to true.
*
*
* @param part
* The related part, to which the relation shall be removed.
* @param removeUnusedParts
@@ -331,7 +463,8 @@ public class POIXMLDocumentPart {

commit();
alreadySaved.add(this.getPackagePart());
for(POIXMLDocumentPart p : relations.values()){
for(RelationPart rp : relations.values()){
POIXMLDocumentPart p = rp.getDocumentPart();
if (!alreadySaved.contains(p.getPackagePart())) {
p.onSave(alreadySaved);
}
@@ -339,10 +472,10 @@ public class POIXMLDocumentPart {
}

/**
* Ensure that a memory based package part does not have lingering data from previous
* commit() calls.
*
* Note: This is overwritten for some objects, as *PictureData seem to store the actual content
* Ensure that a memory based package part does not have lingering data from previous
* commit() calls.
*
* Note: This is overwritten for some objects, as *PictureData seem to store the actual content
* in the part directly without keeping a copy like all others therefore we need to handle them differently.
*/
protected void prepareForCommit() {
@@ -364,7 +497,7 @@ public class POIXMLDocumentPart {
* create nor recognize packages with equivalent part names.
*/
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory){
return createRelationship(descriptor, factory, -1, false);
return createRelationship(descriptor, factory, -1, false).getDocumentPart();
}

/**
@@ -380,7 +513,7 @@ public class POIXMLDocumentPart {
* create nor recognize packages with equivalent part names.
*/
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx){
return createRelationship(descriptor, factory, idx, false);
return createRelationship(descriptor, factory, idx, false).getDocumentPart();
}

/**
@@ -396,7 +529,7 @@ public class POIXMLDocumentPart {
* equivalent part names and package implementers shall neither
* create nor recognize packages with equivalent part names.
*/
protected final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){
protected final RelationPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){
try {
PackagePartName ppName = PackagingURIHelper.createPartName(descriptor.getFileName(idx));
PackageRelationship rel = null;
@@ -406,14 +539,14 @@ public class POIXMLDocumentPart {
rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation());
}
POIXMLDocumentPart doc = factory.newDocumentPart(descriptor);
doc.packageRel = rel;
doc.packagePart = part;
doc.parent = this;
if(!noRelation) {
if (!noRelation) {
/* only add to relations, if according relationship is being created. */
addRelation(rel.getId(),doc);
addRelation(rel,doc);
}
return doc;

return new RelationPart(rel,doc);
} catch (PartAlreadyExistsException pae) {
// Return the specific exception so the user knows
// that the name is already taken
@@ -432,42 +565,55 @@ public class POIXMLDocumentPart {
* @param context context map containing already visited noted keyed by targetURI
*/
protected void read(POIXMLFactory factory, Map<PackagePart, POIXMLDocumentPart> context) throws OpenXML4JException {
PackagePart pp = getPackagePart();
// add mapping a second time, in case of initial caller hasn't done so
POIXMLDocumentPart otherChild = context.put(pp, this);
if (otherChild != null && otherChild != this) {
throw new POIXMLException("Unique PackagePart-POIXMLDocumentPart relation broken!");
}

if (!pp.hasRelationships()) return;

PackageRelationshipCollection rels = packagePart.getRelationships();
List<POIXMLDocumentPart> readLater = new ArrayList<POIXMLDocumentPart>();

// scan breadth-first, so parent-relations are hopefully the shallowest element
for (PackageRelationship rel : rels) {
if(rel.getTargetMode() == TargetMode.INTERNAL){
URI uri = rel.getTargetURI();

PackagePart p;
// check for internal references (e.g. '#Sheet1!A1')
PackagePartName relName;
if(uri.getRawFragment() != null) {
/*
* For internal references (e.g. '#Sheet1!A1') the package part is null
*/
p = null;
relName = PackagingURIHelper.createPartName(uri.getPath());
} else {
PackagePartName relName = PackagingURIHelper.createPartName(uri);
p = packagePart.getPackage().getPart(relName);
if(p == null) {
logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI());
continue;
}
relName = PackagingURIHelper.createPartName(uri);
}

if (!context.containsKey(p)) {
POIXMLDocumentPart childPart = factory.createDocumentPart(this, rel, p);
childPart.parent = this;
addRelation(rel.getId(),childPart);
if(p != null){
context.put(p, childPart);
if(p.hasRelationships()) childPart.read(factory, context);
}
final PackagePart p = packagePart.getPackage().getPart(relName);
if (p == null) {
logger.log(POILogger.ERROR, "Skipped invalid entry " + rel.getTargetURI());
continue;
}
else {
addRelation(rel.getId(),context.get(p));

POIXMLDocumentPart childPart = context.get(p);
if (childPart == null) {
childPart = factory.createDocumentPart(this, p);
childPart.parent = this;
// already add child to context, so other children can reference it
context.put(p, childPart);
readLater.add(childPart);
}

addRelation(rel,childPart);
}
}

for (POIXMLDocumentPart childPart : readLater) {
childPart.read(factory, context);
}
}
/**
* Get the PackagePart that is the target of a relationship from this Part.
*
@@ -511,4 +657,28 @@ public class POIXMLDocumentPart {
public static void _invokeOnDocumentRead(POIXMLDocumentPart part) throws IOException {
part.onDocumentRead();
}

/**
* Retrieves the core document part
*
* @since POI 3.14-Beta1
*/
private static PackagePart getPartFromOPCPackage(OPCPackage pkg, String coreDocumentRel) {
PackageRelationship coreRel = pkg.getRelationshipsByType(coreDocumentRel).getRelationship(0);

if (coreRel != null) {
PackagePart pp = pkg.getPart(coreRel);
if (pp == null) {
throw new POIXMLException("OOXML file structure broken/invalid - core document '"+coreRel.getTargetURI()+"' not found.");
}
return pp;
}
coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
if (coreRel != null) {
throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
}

throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
}
}

+ 96
- 5
src/ooxml/java/org/apache/poi/POIXMLFactory.java View File

@@ -16,16 +16,25 @@
==================================================================== */
package org.apache.poi;

import org.apache.poi.openxml4j.opc.PackageRelationship;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.apache.poi.POIXMLDocumentPart.RelationPart;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

/**
* Defines a factory API that enables sub-classes to create instances of <code>POIXMLDocumentPart</code>
*
* @author Yegor Kozlov
*/
public abstract class POIXMLFactory {
private static final POILogger LOGGER = POILogFactory.getLogger(POIXMLFactory.class);

private static final Class<?>[] PARENT_PART = {POIXMLDocumentPart.class, PackagePart.class};
private static final Class<?>[] ORPHAN_PART = {PackagePart.class};
/**
* Create a POIXMLDocumentPart from existing package part and relation. This method is called
* from {@link POIXMLDocument#load(POIXMLFactory)} when parsing a document
@@ -34,8 +43,62 @@ public abstract class POIXMLFactory {
* @param rel the package part relationship
* @param part the PackagePart representing the created instance
* @return A new instance of a POIXMLDocumentPart.
*
* @since by POI 3.14-Beta1
*/
public abstract POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part);
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackagePart part) {
PackageRelationship rel = getPackageRelationship(parent, part);
POIXMLRelation descriptor = getDescriptor(rel.getRelationshipType());
if (descriptor == null || descriptor.getRelationClass() == null) {
LOGGER.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
return new POIXMLDocumentPart(parent, part);
}

Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
try {
try {
return createDocumentPart(cls, PARENT_PART, new Object[]{parent, part});
} catch (NoSuchMethodException e) {
return createDocumentPart(cls, ORPHAN_PART, new Object[]{part});
}
} catch (Exception e) {
throw new POIXMLException(e);
}
}
/**
* Need to delegate instantiation to sub class because of constructor visibility
* @since POI 3.14-Beta1
*/
protected abstract POIXMLDocumentPart createDocumentPart
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
/**
* returns the descriptor for the given relationship type
*
* @return the descriptor or null if type is unknown
*
* @since POI 3.14-Beta1
*/
protected abstract POIXMLRelation getDescriptor(String relationshipType);
/**
* Create a POIXMLDocumentPart from existing package part and relation. This method is called
* from {@link POIXMLDocument#load(POIXMLFactory)} when parsing a document
*
* @param parent parent part
* @param rel the package part relationship
* @param part the PackagePart representing the created instance
* @return A new instance of a POIXMLDocumentPart.
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public final POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part) {
return createDocumentPart(parent, part);
}

/**
* Create a new POIXMLDocumentPart using the supplied descriptor. This method is used when adding new parts
@@ -44,5 +107,33 @@ public abstract class POIXMLFactory {
* @param descriptor describes the object to create
* @return A new instance of a POIXMLDocumentPart.
*/
public abstract POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor);
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
try {
return createDocumentPart(cls, null, null);
} catch (Exception e) {
throw new POIXMLException(e);
}
}

/**
* Retrieves the package relationship of the child part within the parent
*
* @since POI 3.14-Beta1
*/
protected PackageRelationship getPackageRelationship(POIXMLDocumentPart parent, PackagePart part) {
try {
String partName = part.getPartName().getName();
for (PackageRelationship pr : parent.getPackagePart().getRelationships()) {
String packName = pr.getTargetURI().toASCIIString();
if (packName.equalsIgnoreCase(partName)) {
return pr;
}
}
} catch (InvalidFormatException e) {
throw new POIXMLException("error while determining package relations", e);
}
throw new POIXMLException("package part isn't a child of the parent document.");
}
}

+ 1
- 1
src/ooxml/java/org/apache/poi/POIXMLRelation.java View File

@@ -117,7 +117,7 @@ public abstract class POIXMLRelation {
*/
public Integer getFileNameIndex(POIXMLDocumentPart part) {
String regex = _defaultName.replace("#", "(\\d+)");
return Integer.parseInt(part.getPackageRelationship().getTargetURI().getPath().replaceAll(regex, "$1"));
return Integer.valueOf(part.getPackagePart().getPartName().getName().replaceAll(regex, "$1"));
}
/**

+ 5
- 5
src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationship.java View File

@@ -55,7 +55,7 @@ public final class PackageRelationship {
/* End XML markup */

/**
* L'ID de la relation.
* Relation id.
*/
private String id;

@@ -65,22 +65,22 @@ public final class PackageRelationship {
private OPCPackage container;

/**
* Type de relation.
* Relationship type
*/
private String relationshipType;

/**
* Partie source de cette relation.
* Part of this relationship source
*/
private PackagePart source;

/**
* Le mode de ciblage [Internal|External]
* Targeting mode [Internal|External]
*/
private TargetMode targetMode;

/**
* URI de la partie cible.
* Target URI
*/
private URI targetUri;


+ 13
- 2
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFBaseContents.java View File

@@ -53,10 +53,21 @@ public class XDGFBaseContents extends XDGFXMLDocumentPart {
protected Map<Long, XDGFShape> _shapes = new HashMap<Long, XDGFShape>();
protected List<XDGFConnection> _connections = new ArrayList<XDGFConnection>();

public XDGFBaseContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
super(part, rel, document);
/**
* @since POI 3.14-Beta1
*/
public XDGFBaseContents(PackagePart part, XDGFDocument document) {
super(part, document);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XDGFBaseContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
this(part, document);
}
@Internal
public PageContentsType getXmlObject() {
return _pageContents;

+ 32
- 49
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFFactory.java View File

@@ -18,69 +18,52 @@
package org.apache.poi.xdgf.usermodel;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLFactory;
import org.apache.poi.POIXMLRelation;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

/**
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
*/
public class XDGFFactory extends POIXMLFactory {

private static final POILogger logger = POILogFactory
.getLogger(XDGFFactory.class);

private XDGFDocument _document;
private final XDGFDocument document;

public XDGFFactory(XDGFDocument document) {
_document = document;
this.document = document;
}

@Override
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent,
PackageRelationship rel, PackagePart part) {
POIXMLRelation descriptor = XDGFRelation.getInstance(rel
.getRelationshipType());
if (descriptor == null || descriptor.getRelationClass() == null) {
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for "
+ rel.getRelationshipType());
return new POIXMLDocumentPart(part, rel);
}

try {
Class<? extends POIXMLDocumentPart> cls = descriptor
.getRelationClass();
try {
Constructor<? extends POIXMLDocumentPart> constructor = cls
.getDeclaredConstructor(POIXMLDocumentPart.class,
PackagePart.class, PackageRelationship.class,
XDGFDocument.class);
return constructor.newInstance(parent, part, rel, _document);
} catch (NoSuchMethodException e) {
Constructor<? extends POIXMLDocumentPart> constructor = cls
.getDeclaredConstructor(PackagePart.class,
PackageRelationship.class, XDGFDocument.class);
return constructor.newInstance(part, rel, _document);
}
} catch (Exception e) {
throw new POIXMLException(e);
}
/**
* @since POI 3.14-Beta1
*/
protected POIXMLRelation getDescriptor(String relationshipType) {
return XDGFRelation.getInstance(relationshipType);
}

/**
* @since POI 3.14-Beta1
*/
@Override
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {
try {
Class<? extends POIXMLDocumentPart> cls = descriptor
.getRelationClass();
Constructor<? extends POIXMLDocumentPart> constructor = cls
.getDeclaredConstructor();
return constructor.newInstance();
} catch (Exception e) {
throw new POIXMLException(e);
protected POIXMLDocumentPart createDocumentPart
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class<?>[] cl;
Object[] vals;
if (classes == null) {
cl = new Class<?>[]{XDGFDocument.class};
vals = new Object[]{document};
} else {
cl = new Class<?>[classes.length+1];
System.arraycopy(classes, 0, cl, 0, classes.length);
cl[classes.length] = XDGFDocument.class;
vals = new Object[values.length+1];
System.arraycopy(values, 0, vals, 0, values.length);
vals[values.length] = document;
}
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(cl);
return constructor.newInstance(vals);
}

}

+ 14
- 3
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFMasterContents.java View File

@@ -34,11 +34,22 @@ public class XDGFMasterContents extends XDGFBaseContents {

protected XDGFMaster _master;

public XDGFMasterContents(PackagePart part, PackageRelationship rel,
XDGFDocument document) {
super(part, rel, document);
/**
* @since POI 3.14-Beta1
*/
public XDGFMasterContents(PackagePart part, XDGFDocument document) {
super(part, document);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XDGFMasterContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
this(part, document);
}

@Override
protected void onDocumentRead() {


+ 20
- 6
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFMasters.java View File

@@ -46,10 +46,21 @@ public class XDGFMasters extends XDGFXMLDocumentPart {
// key: id of master
protected Map<Long, XDGFMaster> _masters = new HashMap<Long, XDGFMaster>();

public XDGFMasters(PackagePart part, PackageRelationship rel, XDGFDocument document) {
super(part, rel, document);
/**
* @since POI 3.14-Beta1
*/
public XDGFMasters(PackagePart part, XDGFDocument document) {
super(part, document);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XDGFMasters(PackagePart part, PackageRelationship rel, XDGFDocument document) {
this(part, document);
}
@Internal
protected MastersType getXmlObject() {
return _mastersObject;
@@ -72,16 +83,19 @@ public class XDGFMasters extends XDGFXMLDocumentPart {
}

// create the masters
for (POIXMLDocumentPart part: getRelations()) {
for (RelationPart rp : getRelationParts()) {
POIXMLDocumentPart part = rp.getDocumentPart();

String relId = part.getPackageRelationship().getId();
String relId = rp.getRelationship().getId();
MasterType settings = masterSettings.get(relId);

if (settings == null)
if (settings == null) {
throw new POIXMLException("Master relationship for " + relId + " not found");
}

if (!(part instanceof XDGFMasterContents))
if (!(part instanceof XDGFMasterContents)) {
throw new POIXMLException("Unexpected masters relationship for " + relId + ": " + part);
}

XDGFMasterContents contents = (XDGFMasterContents)part;
contents.onDocumentRead();

+ 13
- 2
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFPageContents.java View File

@@ -35,10 +35,21 @@ public class XDGFPageContents extends XDGFBaseContents {
protected Map<Long, XDGFMaster> _masters = new HashMap<Long, XDGFMaster>();
protected XDGFPage _page;

public XDGFPageContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
super(part, rel, document);
/**
* @since POI 3.14-Beta1
*/
public XDGFPageContents(PackagePart part, XDGFDocument document) {
super(part, document);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XDGFPageContents(PackagePart part, PackageRelationship rel, XDGFDocument document) {
this(part, document);
}
@Override
protected void onDocumentRead() {
try {

+ 13
- 2
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFPages.java View File

@@ -45,10 +45,21 @@ public class XDGFPages extends XDGFXMLDocumentPart {
// ordered by page number
List<XDGFPage> _pages = new ArrayList<XDGFPage>();

public XDGFPages(PackagePart part, PackageRelationship rel, XDGFDocument document) {
super(part, rel, document);
/**
* @since POI 3.14-Beta1
*/
public XDGFPages(PackagePart part, XDGFDocument document) {
super(part, document);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XDGFPages(PackagePart part, PackageRelationship rel, XDGFDocument document) {
this(part, document);
}
@Internal
PagesType getXmlObject() {
return _pagesObject;

+ 2
- 5
src/ooxml/java/org/apache/poi/xdgf/usermodel/XDGFRelation.java View File

@@ -65,12 +65,9 @@ public class XDGFRelation extends POIXMLRelation {
"http://schemas.microsoft.com/visio/2010/relationships/windows",
"/visio/windows.xml", null);

private XDGFRelation(String type, String rel, String defaultName,
Class<? extends XDGFXMLDocumentPart> cls) {
private XDGFRelation(String type, String rel, String defaultName, Class<? extends XDGFXMLDocumentPart> cls) {
super(type, rel, defaultName, cls);

if (cls != null && !_table.containsKey(rel))
_table.put(rel, this);
_table.put(rel, this);
}

/**

+ 14
- 4
src/ooxml/java/org/apache/poi/xdgf/xml/XDGFXMLDocumentPart.java View File

@@ -24,11 +24,21 @@ import org.apache.poi.xdgf.usermodel.XDGFDocument;
public class XDGFXMLDocumentPart extends POIXMLDocumentPart {

protected XDGFDocument _document;

public XDGFXMLDocumentPart(PackagePart part, PackageRelationship rel,
XDGFDocument document) {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public XDGFXMLDocumentPart(PackagePart part, XDGFDocument document) {
super(part);
_document = document;
}
/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XDGFXMLDocumentPart(PackagePart part, PackageRelationship rel, XDGFDocument document) {
this(part, document);
}

}

+ 24
- 39
src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java View File

@@ -36,8 +36,6 @@ import org.apache.poi.POIXMLException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.sl.usermodel.MasterSheet;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
import org.apache.poi.sl.usermodel.Resources;
@@ -132,9 +130,10 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {

Map<String, XSLFSlideMaster> masterMap = new HashMap<String, XSLFSlideMaster>();
Map<String, XSLFSlide> shIdMap = new HashMap<String, XSLFSlide>();
for (POIXMLDocumentPart p : getRelations()) {
for (RelationPart rp : getRelationParts()) {
POIXMLDocumentPart p = rp.getDocumentPart();
if (p instanceof XSLFSlide) {
shIdMap.put(p.getPackageRelationship().getId(), (XSLFSlide) p);
shIdMap.put(rp.getRelationship().getId(), (XSLFSlide) p);
} else if (p instanceof XSLFSlideMaster) {
masterMap.put(getRelationId(p), (XSLFSlideMaster) p);
} else if (p instanceof XSLFTableStyles){
@@ -218,19 +217,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
}
}

XSLFSlide slide = (XSLFSlide)createRelationship(
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt);
RelationPart rp = createRelationship(
XSLFRelation.SLIDE, XSLFFactory.getInstance(), cnt, false);
XSLFSlide slide = (XSLFSlide)rp.getDocumentPart();

CTSlideIdListEntry slideId = slideList.addNewSldId();
slideId.setId(slideNumber);
slideId.setId2(slide.getPackageRelationship().getId());
slideId.setId2(rp.getRelationship().getId());

layout.copyLayout(slide);
slide.addRelation(layout.getPackageRelationship().getId(), layout);

PackagePartName ppName = layout.getPackagePart().getPartName();
slide.getPackagePart().addRelationship(ppName, TargetMode.INTERNAL,
layout.getPackageRelationship().getRelationshipType());
slide.addRelation(null, XSLFRelation.SLIDE_LAYOUT, layout);

_slides.add(slide);
return slide;
@@ -271,22 +267,13 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
Integer slideIndex = XSLFRelation.SLIDE.getFileNameIndex(slide);
XSLFNotes notesSlide = (XSLFNotes) createRelationship(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
notesSlide.addRelation(_notesMaster.getPackageRelationship().getId(), _notesMaster);
PackagePartName notesMasterPackagePartName = _notesMaster.getPackagePart().getPartName();
notesSlide.getPackagePart().addRelationship(notesMasterPackagePartName, TargetMode.INTERNAL,
_notesMaster.getPackageRelationship().getRelationshipType());
slide.addRelation(notesSlide.getPackageRelationship().getId(), notesSlide);
PackagePartName notesSlidesPackagePartName = notesSlide.getPackagePart().getPartName();
slide.getPackagePart().addRelationship(notesSlidesPackagePartName, TargetMode.INTERNAL,
notesSlide.getPackageRelationship().getRelationshipType());

notesSlide.addRelation(slide.getPackageRelationship().getId(), slide);
PackagePartName slidesPackagePartName = slide.getPackagePart().getPartName();
notesSlide.getPackagePart().addRelationship(slidesPackagePartName, TargetMode.INTERNAL,
slide.getPackageRelationship().getRelationshipType());
// add notes slide to presentation
XSLFNotes notesSlide = (XSLFNotes) createRelationship
(XSLFRelation.NOTES, XSLFFactory.getInstance(), slideIndex);
// link slide and notes slide with each other
slide.addRelation(null, XSLFRelation.NOTES, notesSlide);
notesSlide.addRelation(null, XSLFRelation.NOTES_MASTER, _notesMaster);
notesSlide.addRelation(null, XSLFRelation.SLIDE, slide);

notesSlide.importContent(_notesMaster);
@@ -297,15 +284,16 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
* Create a notes master.
*/
public void createNotesMaster() {
_notesMaster = (XSLFNotesMaster) createRelationship(XSLFRelation.NOTES_MASTER,
XSLFFactory.getInstance(), 1);
RelationPart rp = createRelationship
(XSLFRelation.NOTES_MASTER, XSLFFactory.getInstance(), 1, false);
_notesMaster = (XSLFNotesMaster)rp.getDocumentPart();
CTNotesMasterIdList notesMasterIdList = _presentation.addNewNotesMasterIdLst();
CTNotesMasterIdListEntry notesMasterId = notesMasterIdList.addNewNotesMasterId();
notesMasterId.setId(_notesMaster.getPackageRelationship().getId());
notesMasterId.setId(rp.getRelationship().getId());
Integer themeIndex = 1;
// TODO: check if that list can be replaced by idx = Math.max(idx,themeIdx)
List<Integer> themeIndexList = new ArrayList<Integer>();
for (POIXMLDocumentPart p : getRelations()) {
if (p instanceof XSLFTheme) {
@@ -326,14 +314,11 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
}
}
XSLFTheme theme = (XSLFTheme) createRelationship(XSLFRelation.THEME,
XSLFFactory.getInstance(), themeIndex);
XSLFTheme theme = (XSLFTheme) createRelationship
(XSLFRelation.THEME, XSLFFactory.getInstance(), themeIndex);
theme.importTheme(getSlides().get(0).getTheme());
_notesMaster.addRelation(theme.getPackageRelationship().getId(), theme);
PackagePartName themePackagePartName = theme.getPackagePart().getPartName();
_notesMaster.getPackagePart().addRelationship(themePackagePartName, TargetMode.INTERNAL,
theme.getPackageRelationship().getRelationshipType());
_notesMaster.addRelation(null, XSLFRelation.THEME, theme);
}
/**
@@ -436,7 +421,7 @@ implements SlideShow<XSLFShape,XSLFTextParagraph> {
if (relType == null) {
throw new IllegalArgumentException("Picture type "+format+" is not supported.");
}
img = (XSLFPictureData) createRelationship(relType, XSLFFactory.getInstance(), imageNumber + 1, true);
img = (XSLFPictureData) createRelationship(relType, XSLFFactory.getInstance(), imageNumber + 1, true).getDocumentPart();
img.setIndex(imageNumber);
_pictures.add(img);
try {

+ 28
- 13
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFChart.java View File

@@ -55,20 +55,35 @@ public final class XSLFChart extends POIXMLDocumentPart {
*/
private CTChart chart;

/**
* Construct a chart from a package part.
*
* @param part the package part holding the chart data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
* @param rel the package relationship holding this chart,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
*/
protected XSLFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
/**
* Construct a chart from a package part.
*
* @param part the package part holding the chart data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
*
* @since POI 3.14-Beta1
*/
protected XSLFChart(PackagePart part) throws IOException, XmlException {
super(part);

chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
}

chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
}
/**
* Construct a chart from a package part.
*
* @param part the package part holding the chart data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
* @param rel the package relationship holding this chart,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSLFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}

/**
* Return the underlying CTChartSpace bean, the root element of the Chart part.

+ 19
- 5
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFCommentAuthors.java View File

@@ -48,16 +48,30 @@ public class XSLFCommentAuthors extends POIXMLDocumentPart {
*
* @param part the package part holding the comment authors data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.commentAuthors+xml</code>
* @param rel the package relationship holding this comment authors,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors
*
* @since POI 3.14-Beta1
*/
XSLFCommentAuthors(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);

XSLFCommentAuthors(PackagePart part) throws IOException, XmlException {
super(part);
CmAuthorLstDocument doc =
CmAuthorLstDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
_authors = doc.getCmAuthorLst();
}

/**
* Construct a SpreadsheetML slide authors from a package part
*
* @param part the package part holding the comment authors data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.commentAuthors+xml</code>
* @param rel the package relationship holding this comment authors,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
XSLFCommentAuthors(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
public CTCommentAuthorList getCTCommentAuthorsList() {
return _authors;

+ 19
- 4
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFComments.java View File

@@ -48,16 +48,31 @@ public class XSLFComments extends POIXMLDocumentPart {
*
* @param part the package part holding the comments data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.comments+xml</code>
* @param rel the package relationship holding this comments,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments
*
* @since POI 3.14-Beta1
*/
XSLFComments(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
XSLFComments(PackagePart part) throws IOException, XmlException {
super(part);

CmLstDocument doc =
CmLstDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
_comments = doc.getCmLst();
}

/**
* Construct a SpreadsheetML slide comments from a package part
*
* @param part the package part holding the comments data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.comments+xml</code>
* @param rel the package relationship holding this comments,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments
*
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
XSLFComments(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
public CTCommentList getCTCommentsList() {
return _comments;

+ 16
- 36
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFFactory.java View File

@@ -19,27 +19,17 @@

package org.apache.poi.xslf.usermodel;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLFactory;
import org.apache.poi.POIXMLRelation;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.util.Beta;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

import java.lang.reflect.Constructor;

/**
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
*
* @author Yegor Kozlov
*/
@Beta
public final class XSLFFactory extends POIXMLFactory {
private static final POILogger logger = POILogFactory.getLogger(XSLFFactory.class);

private XSLFFactory(){

}
@@ -50,32 +40,22 @@ public final class XSLFFactory extends POIXMLFactory {
return inst;
}

/**
* @since POI 3.14-Beta1
*/
@Override
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part){
POIXMLRelation descriptor = XSLFRelation.getInstance(rel.getRelationshipType());
if(descriptor == null || descriptor.getRelationClass() == null){
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
return new POIXMLDocumentPart(part, rel);
}

try {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(PackagePart.class, PackageRelationship.class);
return constructor.newInstance(part, rel);
} catch (Exception e){
throw new POIXMLException(e);
}
protected POIXMLRelation getDescriptor(String relationshipType) {
return XSLFRelation.getInstance(relationshipType);
}

/**
* @since POI 3.14-Beta1
*/
@Override
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
try {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();
return constructor.newInstance();
} catch (Exception e){
throw new POIXMLException(e);
}
protected POIXMLDocumentPart createDocumentPart
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(classes);
return constructor.newInstance(values);
}

}

+ 12
- 2
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java View File

@@ -53,9 +53,11 @@ implements Notes<XSLFShape,XSLFTextParagraph> {
* the content type must be <code>application/vnd.openxmlformats-officedocument.notes+xml</code>
* @param rel the package relationship holding this notes,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/notes
*
* @since POI 3.14-Beta1
*/
XSLFNotes(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
XSLFNotes(PackagePart part) throws IOException, XmlException {
super(part);

NotesDocument doc =
NotesDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
@@ -63,6 +65,14 @@ implements Notes<XSLFShape,XSLFTextParagraph> {
setCommonSlideData(_notes.getCSld());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
XSLFNotes(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
private static CTNotesSlide prototype(){
CTNotesSlide ctNotes = CTNotesSlide.Factory.newInstance();
CTCommonSlideData cSld = ctNotes.addNewCSld();

+ 13
- 2
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java View File

@@ -59,14 +59,25 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
_slide = prototype();
}

protected XSLFNotesMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
protected XSLFNotesMaster(PackagePart part) throws IOException, XmlException {
super(part);
NotesMasterDocument doc =
NotesMasterDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
_slide = doc.getNotesMaster();
setCommonSlideData(_slide.getCSld());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSLFNotesMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
private static CTNotesMaster prototype() {
InputStream is = XSLFNotesMaster.class.getResourceAsStream("notesMaster.xml");
if (is == null) {

+ 14
- 1
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java View File

@@ -64,15 +64,28 @@ public final class XSLFPictureData extends POIXMLDocumentPart implements Picture
super();
}

/**
* Construct XSLFPictureData from a package part
*
* @param part the package part holding the drawing data
*
* @since POI 3.14-Beta1
*/
public XSLFPictureData(PackagePart part) {
super(part);
}
/**
* Construct XSLFPictureData from a package part
*
* @param part the package part holding the drawing data,
* @param rel the package relationship holding this drawing,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSLFPictureData(PackagePart part, PackageRelationship rel) {
super(part, rel);
this(part);
}

/**

+ 2
- 3
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java View File

@@ -221,7 +221,7 @@ public class XSLFRelation extends POIXMLRelation {
null,
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
null,
null
XSLFPictureData.class
);

public static final XSLFRelation TABLE_STYLES = new XSLFRelation(
@@ -233,8 +233,7 @@ public class XSLFRelation extends POIXMLRelation {

private XSLFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
super(type, rel, defaultName, cls);

if(cls != null && !_table.containsKey(rel)) _table.put(rel, this);
_table.put(rel, this);
}

/**

+ 18
- 11
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java View File

@@ -72,9 +72,20 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
public XSLFSheet() {
super();
}
/**
* @since POI 3.14-Beta1
*/
public XSLFSheet(PackagePart part) {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSLFSheet(PackagePart part, PackageRelationship rel){
super(part, rel);
this(part);
}

/**
@@ -212,11 +223,9 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
XSLFPictureData xPictureData = (XSLFPictureData)pictureData;
PackagePart pic = xPictureData.getPackagePart();

PackageRelationship rel = getPackagePart().addRelationship(
pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());
addRelation(rel.getId(), new XSLFPictureData(pic, rel));
RelationPart rp = addRelation(null, XSLFRelation.IMAGES, new XSLFPictureData(pic));

XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
XSLFPictureShape sh = getDrawing().createPicture(rp.getRelationship().getId());
new DrawPictureShape(sh).resize();
getShapes().add(sh);
sh.setParent(this);
@@ -550,17 +559,15 @@ implements XSLFShapeContainer, Sheet<XSLFShape,XSLFTextParagraph> {
} catch (InvalidFormatException e){
throw new POIXMLException(e);
}
XSLFPictureData data = new XSLFPictureData(blipPart, null);
XSLFPictureData data = new XSLFPictureData(blipPart);

XMLSlideShow ppt = getSlideShow();
XSLFPictureData pictureData = ppt.addPicture(data.getData(), data.getType());
PackagePart pic = pictureData.getPackagePart();

PackageRelationship rel = getPackagePart().addRelationship(
pic.getPartName(), TargetMode.INTERNAL, blipRel.getRelationshipType());
addRelation(rel.getId(), new XSLFPictureData(pic, rel));

return rel.getId();
RelationPart rp = addRelation(blipId, XSLFRelation.IMAGES, new XSLFPictureData(pic));
return rp.getRelationship().getId();
}

/**

+ 13
- 5
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java View File

@@ -66,11 +66,11 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
*
* @param part the package part holding the slide data,
* the content type must be <code>application/vnd.openxmlformats-officedocument.slide+xml</code>
* @param rel the package relationship holding this slide,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide
*
* @since POI 3.14-Beta1
*/
XSLFSlide(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
XSLFSlide(PackagePart part) throws IOException, XmlException {
super(part);

SldDocument doc =
SldDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
@@ -78,7 +78,15 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
setCommonSlideData(_slide.getCSld());
}


/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
XSLFSlide(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
private static CTSlide prototype(){
CTSlide ctSlide = CTSlide.Factory.newInstance();
CTCommonSlideData cSld = ctSlide.addNewCSld();

+ 12
- 2
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java View File

@@ -44,14 +44,24 @@ implements MasterSheet<XSLFShape,XSLFTextParagraph> {
_layout = CTSlideLayout.Factory.newInstance();
}

public XSLFSlideLayout(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public XSLFSlideLayout(PackagePart part) throws IOException, XmlException {
super(part);
SldLayoutDocument doc =
SldLayoutDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
_layout = doc.getSldLayout();
setCommonSlideData(_layout.getCSld());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSLFSlideLayout(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}

public String getName() {
return _layout.getCSld().getName();

+ 13
- 2
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java View File

@@ -69,14 +69,25 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldMasterDocument;
_slide = CTSlideMaster.Factory.newInstance();
}

protected XSLFSlideMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
protected XSLFSlideMaster(PackagePart part) throws IOException, XmlException {
super(part);
SldMasterDocument doc =
SldMasterDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
_slide = doc.getSldMaster();
setCommonSlideData(_slide.getCSld());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSLFSlideMaster(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
@Override
public CTSlideMaster getXmlObject() {
return _slide;

+ 13
- 2
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableStyles.java View File

@@ -41,8 +41,11 @@ public class XSLFTableStyles extends POIXMLDocumentPart implements Iterable<XSLF
super();
}

public XSLFTableStyles(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public XSLFTableStyles(PackagePart part) throws IOException, XmlException {
super(part);

_tblStyleLst = CTTableStyleList.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
CTTableStyle[] tblStyleArray = _tblStyleLst.getTblStyleArray();
@@ -52,6 +55,14 @@ public class XSLFTableStyles extends POIXMLDocumentPart implements Iterable<XSLF
}
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSLFTableStyles(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
public CTTableStyleList getXmlObject(){
return _tblStyleLst;
}

+ 13
- 2
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java View File

@@ -56,13 +56,24 @@ public class XSLFTheme extends POIXMLDocumentPart {
_theme = CTOfficeStyleSheet.Factory.newInstance();
}
public XSLFTheme(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public XSLFTheme(PackagePart part) throws IOException, XmlException {
super(part);
ThemeDocument doc =
ThemeDocument.Factory.parse(getPackagePart().getInputStream(), DEFAULT_XML_OPTIONS);
_theme = doc.getTheme();
initialize();
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSLFTheme(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
public void importTheme(XSLFTheme theme) {
_theme = theme.getXmlObject();

+ 12
- 6
src/ooxml/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java View File

@@ -113,16 +113,22 @@ public class ReadOnlySharedStringsTable extends DefaultHandler {

/**
* Like POIXMLDocumentPart constructor
*
* @param part
* @param rel_ignored
* @throws IOException
*
* @since POI 3.14-Beta1
*/
public ReadOnlySharedStringsTable(PackagePart part, PackageRelationship rel_ignored)
throws IOException, SAXException {
public ReadOnlySharedStringsTable(PackagePart part) throws IOException, SAXException {
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public ReadOnlySharedStringsTable(PackagePart part, PackageRelationship rel_ignored)
throws IOException, SAXException {
this(part);
}
/**
* Read this shared strings table from an XML file.
*

+ 13
- 2
src/ooxml/java/org/apache/poi/xssf/model/CalculationChain.java View File

@@ -44,11 +44,22 @@ public class CalculationChain extends POIXMLDocumentPart {
chain = CTCalcChain.Factory.newInstance();
}

public CalculationChain(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public CalculationChain(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public CalculationChain(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
public void readFrom(InputStream is) throws IOException {
try {
CalcChainDocument doc = CalcChainDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);

+ 13
- 2
src/ooxml/java/org/apache/poi/xssf/model/CommentsTable.java View File

@@ -60,11 +60,22 @@ public class CommentsTable extends POIXMLDocumentPart {
comments.addNewAuthors().addAuthor(DEFAULT_AUTHOR);
}

public CommentsTable(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public CommentsTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public CommentsTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
public void readFrom(InputStream is) throws IOException {
try {
CommentsDocument doc = CommentsDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);

+ 13
- 2
src/ooxml/java/org/apache/poi/xssf/model/ExternalLinksTable.java View File

@@ -49,11 +49,22 @@ public class ExternalLinksTable extends POIXMLDocumentPart {
link.addNewExternalBook();
}

public ExternalLinksTable(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public ExternalLinksTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public ExternalLinksTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
public void readFrom(InputStream is) throws IOException {
try {
ExternalLinkDocument doc = ExternalLinkDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);

+ 13
- 4
src/ooxml/java/org/apache/poi/xssf/model/MapInfo.java View File

@@ -61,10 +61,19 @@ public class MapInfo extends POIXMLDocumentPart {

}

public MapInfo(PackagePart part, PackageRelationship rel)
throws IOException {
super(part, rel);
readFrom(part.getInputStream());
/**
* @since POI 3.14-Beta1
*/
public MapInfo(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}
/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
public MapInfo(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}

public void readFrom(InputStream is) throws IOException {

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java View File

@@ -103,9 +103,19 @@ public class SharedStringsTable extends POIXMLDocumentPart {
_sstDoc.addNewSst();
}

public SharedStringsTable(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public SharedStringsTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}
/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
public SharedStringsTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}

/**

+ 13
- 3
src/ooxml/java/org/apache/poi/xssf/model/SingleXmlCells.java View File

@@ -55,12 +55,22 @@ public class SingleXmlCells extends POIXMLDocumentPart {

}

public SingleXmlCells(PackagePart part, PackageRelationship rel)
throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public SingleXmlCells(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public SingleXmlCells(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}

public void readFrom(InputStream is) throws IOException {
try {
SingleXmlCellsDocument doc = SingleXmlCellsDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);

+ 13
- 2
src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java View File

@@ -138,10 +138,21 @@ public class StylesTable extends POIXMLDocumentPart {
initialize();
}

public StylesTable(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public StylesTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public StylesTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
public void setWorkbook(XSSFWorkbook wb) {
this.workbook = wb;

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/model/ThemesTable.java View File

@@ -76,9 +76,11 @@ public class ThemesTable extends POIXMLDocumentPart {
* Construct a ThemesTable.
* @param part A PackagePart.
* @param rel A PackageRelationship.
*
* @since POI 3.14-Beta1
*/
public ThemesTable(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
public ThemesTable(PackagePart part) throws IOException {
super(part);
try {
theme = ThemeDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS);
@@ -87,6 +89,14 @@ public class ThemesTable extends POIXMLDocumentPart {
}
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public ThemesTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
/**
* Construct a ThemesTable from an existing ThemeDocument.
* @param theme A ThemeDocument.

+ 13
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java View File

@@ -95,14 +95,25 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
* @param rel the package relationship holding this chart,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
*
* @since POI 3.14-Beta1
*/
protected XSSFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
protected XSSFChart(PackagePart part) throws IOException, XmlException {
super(part);

chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace();
chart = chartSpace.getChart();
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}

/**
* Construct a new CTChartSpace bean.
* By default, it's just an empty placeholder for chart objects.

+ 13
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChartSheet.java View File

@@ -51,10 +51,21 @@ public class XSSFChartSheet extends XSSFSheet {

protected CTChartsheet chartsheet;

protected XSSFChartSheet(PackagePart part, PackageRelationship rel) {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
protected XSSFChartSheet(PackagePart part) {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFChartSheet(PackagePart part, PackageRelationship rel) {
this(part);
}
protected void read(InputStream is) throws IOException {
//initialize the supeclass with a blank worksheet
super.read(new ByteArrayInputStream(BLANK_WORKSHEET));

+ 3
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDialogsheet.java View File

@@ -17,6 +17,7 @@

package org.apache.poi.xssf.usermodel;

import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.ss.usermodel.Sheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter;
@@ -33,8 +34,8 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
public class XSSFDialogsheet extends XSSFSheet implements Sheet{
protected CTDialogsheet dialogsheet;

protected XSSFDialogsheet(XSSFSheet sheet) {
super(sheet.getPackagePart(), sheet.getPackageRelationship());
protected XSSFDialogsheet(XSSFSheet sheet, PackageRelationship rel) {
super(sheet.getPackagePart(), rel);
this.dialogsheet = CTDialogsheet.Factory.newInstance();
this.worksheet = CTWorksheet.Factory.newInstance();
}

+ 20
- 11
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java View File

@@ -28,9 +28,7 @@ import javax.xml.namespace.QName;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.util.CellAddress;
@@ -84,15 +82,25 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
* @param rel the package relationship holding this drawing,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
*
* @since POI 3.14-Beta1
*/
public XSSFDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
public XSSFDrawing(PackagePart part) throws IOException, XmlException {
super(part);
XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS);
//Removing root element
options.setLoadReplaceDocumentElement(null);
drawing = CTDrawing.Factory.parse(part.getInputStream(),options);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSSFDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}
/**
* Construct a new CTDrawing bean. By default, it's just an empty placeholder for drawing objects
*
@@ -199,9 +207,10 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
int chartNumber = getPackagePart().getPackage().
getPartsByContentType(XSSFRelation.CHART.getContentType()).size() + 1;

XSSFChart chart = (XSSFChart) createRelationship(
XSSFRelation.CHART, XSSFFactory.getInstance(), chartNumber);
String chartRelId = chart.getPackageRelationship().getId();
RelationPart rp = createRelationship(
XSSFRelation.CHART, XSSFFactory.getInstance(), chartNumber, false);
XSSFChart chart = rp.getDocumentPart();
String chartRelId = rp.getRelationship().getId();

XSSFGraphicFrame frame = createGraphicFrame(anchor);
frame.setChart(chart, chartRelId);
@@ -220,13 +229,13 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
* @param pictureIndex the index of the picture in the workbook collection of pictures,
* {@link org.apache.poi.xssf.usermodel.XSSFWorkbook#getAllPictures()} .
*/
@SuppressWarnings("resource")
protected PackageRelationship addPictureReference(int pictureIndex){
XSSFWorkbook wb = (XSSFWorkbook)getParent().getParent();
XSSFPictureData data = wb.getAllPictures().get(pictureIndex);
PackagePartName ppName = data.getPackagePart().getPartName();
PackageRelationship rel = getPackagePart().addRelationship(ppName, TargetMode.INTERNAL, XSSFRelation.IMAGES.getRelation());
addRelation(rel.getId(),new XSSFPictureData(data.getPackagePart(), rel));
return rel;
XSSFPictureData pic = new XSSFPictureData(data.getPackagePart(), null);
RelationPart rp = addRelation(null, XSSFRelation.IMAGES, pic);
return rp.getRelationship();
}

/**

+ 15
- 34
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java View File

@@ -18,26 +18,17 @@
package org.apache.poi.xssf.usermodel;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLFactory;
import org.apache.poi.POIXMLRelation;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

/**
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
*
* @author Yegor Kozlov
*/
public final class XSSFFactory extends POIXMLFactory {
private static final POILogger logger = POILogFactory.getLogger(XSSFFactory.class);

private XSSFFactory(){

private XSSFFactory() {
}

private static final XSSFFactory inst = new XSSFFactory();
@@ -46,32 +37,22 @@ public final class XSSFFactory extends POIXMLFactory {
return inst;
}

/**
* @since POI 3.14-Beta1
*/
@Override
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part){
POIXMLRelation descriptor = XSSFRelation.getInstance(rel.getRelationshipType());
if(descriptor == null || descriptor.getRelationClass() == null){
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
return new POIXMLDocumentPart(part, rel);
}

try {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(PackagePart.class, PackageRelationship.class);
return constructor.newInstance(part, rel);
} catch (Exception e){
throw new POIXMLException(e);
}
protected POIXMLRelation getDescriptor(String relationshipType) {
return XSSFRelation.getInstance(relationshipType);
}

/**
* @since POI 3.14-Beta1
*/
@Override
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
try {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();
return constructor.newInstance();
} catch (Exception e){
throw new POIXMLException(e);
}
protected POIXMLDocumentPart createDocumentPart
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(classes);
return constructor.newInstance(values);
}

}

+ 6
- 8
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFMap.java View File

@@ -21,6 +21,8 @@ import java.util.ArrayList;
import java.util.List;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLDocumentPart.RelationPart;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.util.Internal;
import org.apache.poi.xssf.model.MapInfo;
import org.apache.poi.xssf.model.SingleXmlCells;
@@ -97,15 +99,11 @@ public class XSSFMap {
* @return the list of all Tables that provide a map rule to this mapping
*/
public List<XSSFTable> getRelatedTables() {

List<XSSFTable> tables = new ArrayList<XSSFTable>();
int sheetNumber = mapInfo.getWorkbook().getNumberOfSheets();

for (int i = 0; i < sheetNumber; i++) {
XSSFSheet sheet = mapInfo.getWorkbook().getSheetAt(i);
for (POIXMLDocumentPart p : sheet.getRelations()) {
if (p.getPackageRelationship().getRelationshipType().equals(XSSFRelation.TABLE.getRelation())) {
XSSFTable table = (XSSFTable) p;
for (Sheet sheet : mapInfo.getWorkbook()) {
for (RelationPart rp : ((XSSFSheet)sheet).getRelationParts()) {
if (rp.getRelationship().getRelationshipType().equals(XSSFRelation.TABLE.getRelation())) {
XSSFTable table = rp.getDocumentPart();
if (table.mapsTo(ctMap.getID())) {
tables.add(table);
}

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java View File

@@ -68,11 +68,21 @@ public class XSSFPictureData extends POIXMLDocumentPart implements PictureData {
* @param part the package part holding the drawing data,
* @param rel the package relationship holding this drawing,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
*
* @since POI 3.14-Beta1
*/
protected XSSFPictureData(PackagePart part, PackageRelationship rel) {
super(part, rel);
protected XSSFPictureData(PackagePart part) {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFPictureData(PackagePart part, PackageRelationship rel) {
this(part);
}
/**
* Gets the picture data as a byte array.
* <p>

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCache.java View File

@@ -51,13 +51,23 @@ public class XSSFPivotCache extends POIXMLDocumentPart {
*
* @param part - The package part that holds xml data representing this pivot cache definition.
* @param rel - the relationship of the given package part in the underlying OPC package
*
* @since POI 3.14-Beta1
*/
@Beta
protected XSSFPivotCache(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
protected XSSFPivotCache(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFPivotCache(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
@Beta
protected void readFrom(InputStream is) throws IOException {
try {

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java View File

@@ -58,13 +58,23 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
*
* @param part - The package part that holds xml data representing this pivot cache definition.
* @param rel - the relationship of the given package part in the underlying OPC package
*
* @since POI 3.14-Beta1
*/
@Beta
protected XSSFPivotCacheDefinition(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
protected XSSFPivotCacheDefinition(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFPivotCacheDefinition(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
@Beta
public void readFrom(InputStream is) throws IOException {
try {

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheRecords.java View File

@@ -48,13 +48,23 @@ public class XSSFPivotCacheRecords extends POIXMLDocumentPart {
*
* @param part - The package part that holds xml data representing this pivot cache records.
* @param rel - the relationship of the given package part in the underlying OPC package
*
* @since POI 3.14-Beta1
*/
@Beta
protected XSSFPivotCacheRecords(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
protected XSSFPivotCacheRecords(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFPivotCacheRecords(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
@Beta
protected void readFrom(InputStream is) throws IOException {
try {

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java View File

@@ -88,13 +88,23 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
*
* @param part - The package part that holds xml data representing this pivot table.
* @param rel - the relationship of the given package part in the underlying OPC package
*
* @since POI 3.14-Beta1
*/
@Beta
protected XSSFPivotTable(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
protected XSSFPivotTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFPivotTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
@Beta
public void readFrom(InputStream is) throws IOException {
try {

+ 1
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java View File

@@ -347,8 +347,7 @@ public final class XSSFRelation extends POIXMLRelation {

private XSSFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
super(type, rel, defaultName, cls);

if(cls != null && !_table.containsKey(rel)) _table.put(rel, this);
_table.put(rel, this);
}

/**

+ 34
- 16
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java View File

@@ -162,16 +162,26 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {

/**
* Creates an XSSFSheet representing the given package part and relationship.
* Should only be called by XSSFWorkbook when reading in an exisiting file.
* Should only be called by XSSFWorkbook when reading in an existing file.
*
* @param part - The package part that holds xml data represenring this sheet.
* @param part - The package part that holds xml data representing this sheet.
* @param rel - the relationship of the given package part in the underlying OPC package
*
* @since POI 3.14-Beta1
*/
protected XSSFSheet(PackagePart part, PackageRelationship rel) {
super(part, rel);
protected XSSFSheet(PackagePart part) {
super(part);
dataValidationHelper = new XSSFDataValidationHelper(this);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFSheet(PackagePart part, PackageRelationship rel) {
this(part);
}
/**
* Returns the parent XSSFWorkbook
*
@@ -204,12 +214,13 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
initRows(worksheet);
columnHelper = new ColumnHelper(worksheet);
// Look for bits we're interested in
for(POIXMLDocumentPart p : getRelations()){
for(RelationPart rp : getRelationParts()){
POIXMLDocumentPart p = rp.getDocumentPart();
if(p instanceof CommentsTable) {
sheetComments = (CommentsTable)p;
}
if(p instanceof XSSFTable) {
tables.put( p.getPackageRelationship().getId(), (XSSFTable)p );
tables.put( rp.getRelationship().getId(), (XSSFTable)p );
}
if(p instanceof XSSFPivotTable) {
getWorkbook().getPivotTables().add((XSSFPivotTable) p);
@@ -449,10 +460,11 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
CTDrawing ctDrawing = getCTDrawing();
if (ctDrawing != null) {
// Search the referenced drawing in the list of the sheet's relations
for (POIXMLDocumentPart p : getRelations()){
for (RelationPart rp : getRelationParts()){
POIXMLDocumentPart p = rp.getDocumentPart();
if (p instanceof XSSFDrawing) {
XSSFDrawing dr = (XSSFDrawing)p;
String drId = dr.getPackageRelationship().getId();
String drId = rp.getRelationship().getId();
if (drId.equals(ctDrawing.getId())){
return dr;
}
@@ -478,8 +490,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
//drawingNumber = #drawings.size() + 1
int drawingNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.DRAWINGS.getContentType()).size() + 1;
XSSFDrawing drawing = (XSSFDrawing)createRelationship(XSSFRelation.DRAWINGS, XSSFFactory.getInstance(), drawingNumber);
String relId = drawing.getPackageRelationship().getId();
RelationPart rp = createRelationship(XSSFRelation.DRAWINGS, XSSFFactory.getInstance(), drawingNumber, false);
XSSFDrawing drawing = rp.getDocumentPart();
String relId = rp.getRelationship().getId();

//add CT_Drawing element which indicates that this sheet contains drawing components built on the drawingML platform.
//The relationship Id references the part containing the drawingML definitions.
@@ -504,8 +517,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
if(autoCreate) {
//drawingNumber = #drawings.size() + 1
int drawingNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.VML_DRAWINGS.getContentType()).size() + 1;
drawing = (XSSFVMLDrawing)createRelationship(XSSFRelation.VML_DRAWINGS, XSSFFactory.getInstance(), drawingNumber);
String relId = drawing.getPackageRelationship().getId();
RelationPart rp = createRelationship(XSSFRelation.VML_DRAWINGS, XSSFFactory.getInstance(), drawingNumber, false);
drawing = rp.getDocumentPart();
String relId = rp.getRelationship().getId();

//add CTLegacyDrawing element which indicates that this sheet contains drawing components built on the drawingML platform.
//The relationship Id references the part containing the drawing definitions.
@@ -514,10 +528,11 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
}
} else {
//search the referenced drawing in the list of the sheet's relations
for(POIXMLDocumentPart p : getRelations()){
for (RelationPart rp : getRelationParts()){
POIXMLDocumentPart p = rp.getDocumentPart();
if(p instanceof XSSFVMLDrawing) {
XSSFVMLDrawing dr = (XSSFVMLDrawing)p;
String drId = dr.getPackageRelationship().getId();
String drId = rp.getRelationship().getId();
if(drId.equals(ctDrawing.getId())){
drawing = dr;
break;
@@ -3695,6 +3710,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {

}

@SuppressWarnings("resource")
@Override
public XSSFAutoFilter setAutoFilter(CellRangeAddress range) {
CTAutoFilter af = worksheet.getAutoFilter();
@@ -3735,8 +3751,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
// Table numbers need to be unique in the file, not just
// unique within the sheet. Find the next one
int tableNumber = getPackagePart().getPackage().getPartsByContentType(XSSFRelation.TABLE.getContentType()).size() + 1;
XSSFTable table = (XSSFTable)createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber);
tbl.setId(table.getPackageRelationship().getId());
RelationPart rp = createRelationship(XSSFRelation.TABLE, XSSFFactory.getInstance(), tableNumber, false);
XSSFTable table = rp.getDocumentPart();
tbl.setId(rp.getRelationship().getId());

tables.put(tbl.getId(), table);

@@ -3933,6 +3950,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
* including: pivotCacheDefinition, pivotCacheRecords
* @return returns a pivotTable
*/
@SuppressWarnings("resource")
@Beta
private XSSFPivotTable createPivotTable() {
XSSFWorkbook wb = getWorkbook();

+ 13
- 3
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFTable.java View File

@@ -62,12 +62,22 @@ public class XSSFTable extends POIXMLDocumentPart {
ctTable = CTTable.Factory.newInstance();
}

public XSSFTable(PackagePart part, PackageRelationship rel)
throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public XSSFTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XSSFTable(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
public void readFrom(InputStream is) throws IOException {
try {
TableDocument doc = TableDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);

+ 12
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFVBAPart.java View File

@@ -35,11 +35,21 @@ public class XSSFVBAPart extends POIXMLDocumentPart {
*
* @param part the package part holding the VBA data,
* @param rel the package relationship holding this part
*
* @since POI 3.14-Beta1
*/
protected XSSFVBAPart(PackagePart part, PackageRelationship rel) {
super(part, rel);
protected XSSFVBAPart(PackagePart part) {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFVBAPart(PackagePart part, PackageRelationship rel) {
this(part);
}
/**
* Like *PictureData, VBA objects store the actual content in the part
* directly without keeping a copy like all others therefore we need to

+ 11
- 2
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFVMLDrawing.java View File

@@ -110,12 +110,21 @@ public final class XSSFVMLDrawing extends POIXMLDocumentPart {
* the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
* @param rel the package relationship holding this drawing,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
*
* @since POI 3.14-Beta1
*/
protected XSSFVMLDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
super(part, rel);
protected XSSFVMLDrawing(PackagePart part) throws IOException, XmlException {
super(part);
read(getPackagePart().getInputStream());
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
protected XSSFVMLDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
this(part);
}

protected void read(InputStream is) throws IOException, XmlException {
XmlObject root = XmlObject.Factory.parse(

+ 62
- 36
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java View File

@@ -338,17 +338,18 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
ThemesTable theme = null;
Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
Map<String, ExternalLinksTable> elIdMap = new HashMap<String, ExternalLinksTable>();
for(POIXMLDocumentPart p : getRelations()){
for(RelationPart rp : getRelationParts()){
POIXMLDocumentPart p = rp.getDocumentPart();
if(p instanceof SharedStringsTable) sharedStringSource = (SharedStringsTable)p;
else if(p instanceof StylesTable) stylesSource = (StylesTable)p;
else if(p instanceof ThemesTable) theme = (ThemesTable)p;
else if(p instanceof CalculationChain) calcChain = (CalculationChain)p;
else if(p instanceof MapInfo) mapInfo = (MapInfo)p;
else if (p instanceof XSSFSheet) {
shIdMap.put(p.getPackageRelationship().getId(), (XSSFSheet)p);
shIdMap.put(rp.getRelationship().getId(), (XSSFSheet)p);
}
else if (p instanceof ExternalLinksTable) {
elIdMap.put(p.getPackageRelationship().getId(), (ExternalLinksTable)p);
elIdMap.put(rp.getRelationship().getId(), (ExternalLinksTable)p);
}
}
boolean packageReadOnly = (getPackage().getPackageAccess() == PackageAccess.READ);
@@ -492,7 +493,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
@Override
public int addPicture(byte[] pictureData, int format) {
int imageNumber = getAllPictures().size() + 1;
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true);
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
try {
OutputStream out = img.getPackagePart().getOutputStream();
out.write(pictureData);
@@ -521,7 +522,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
*/
public int addPicture(InputStream is, int format) throws IOException {
int imageNumber = getAllPictures().size() + 1;
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true);
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
OutputStream out = img.getPackagePart().getOutputStream();
IOUtils.copy(is, out);
out.close();
@@ -546,6 +547,34 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
String clonedName = getUniqueSheetName(srcName);

XSSFSheet clonedSheet = createSheet(clonedName);

// copy sheet's relations
List<RelationPart> rels = srcSheet.getRelationParts();
// if the sheet being cloned has a drawing then rememebr it and re-create it too
XSSFDrawing dg = null;
for(RelationPart rp : rels) {
POIXMLDocumentPart r = rp.getDocumentPart();
// do not copy the drawing relationship, it will be re-created
if(r instanceof XSSFDrawing) {
dg = (XSSFDrawing)r;
continue;
}

addRelation(rp, clonedSheet);
}

try {
for(PackageRelationship pr : srcSheet.getPackagePart().getRelationships()) {
if (pr.getTargetMode() == TargetMode.EXTERNAL) {
clonedSheet.getPackagePart().addExternalRelationship
(pr.getTargetURI().toASCIIString(), pr.getRelationshipType(), pr.getId());
}
}
} catch (InvalidFormatException e) {
throw new POIXMLException("Failed to clone sheet", e);
}
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
srcSheet.write(out);
@@ -565,23 +594,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {

clonedSheet.setSelected(false);

// copy sheet's relations
List<POIXMLDocumentPart> rels = srcSheet.getRelations();
// if the sheet being cloned has a drawing then rememebr it and re-create tpoo
XSSFDrawing dg = null;
for(POIXMLDocumentPart r : rels) {
// do not copy the drawing relationship, it will be re-created
if(r instanceof XSSFDrawing) {
dg = (XSSFDrawing)r;
continue;
}

PackageRelationship rel = r.getPackageRelationship();
clonedSheet.getPackagePart().addRelationship(
rel.getTargetURI(), rel.getTargetMode(),rel.getRelationshipType());
clonedSheet.addRelation(rel.getId(), r);
}

// clone the sheet drawing alongs with its relationships
if (dg != null) {
if(ct.isSetDrawing()) {
@@ -596,20 +608,31 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
clonedDg = clonedSheet.createDrawingPatriarch();
// Clone drawing relations
List<POIXMLDocumentPart> srcRels = srcSheet.createDrawingPatriarch().getRelations();
for (POIXMLDocumentPart rel : srcRels) {
PackageRelationship relation = rel.getPackageRelationship();

clonedDg.addRelation(relation.getId(), rel);
clonedDg
.getPackagePart()
.addRelationship(relation.getTargetURI(), relation.getTargetMode(),
relation.getRelationshipType(), relation.getId());
List<RelationPart> srcRels = srcSheet.createDrawingPatriarch().getRelationParts();
for (RelationPart rp : srcRels) {
addRelation(rp, clonedDg);
}
}
return clonedSheet;
}
/**
* @since 3.14-Beta1
*/
private static void addRelation(RelationPart rp, POIXMLDocumentPart target) {
PackageRelationship rel = rp.getRelationship();
if (rel.getTargetMode() == TargetMode.EXTERNAL) {
target.getPackagePart().addRelationship(
rel.getTargetURI(), rel.getTargetMode(), rel.getRelationshipType(), rel.getId());
} else {
XSSFRelation xssfRel = XSSFRelation.getInstance(rel.getRelationshipType());
if (xssfRel == null) {
// Don't copy all relations blindly, but only the ones we know about
throw new POIXMLException("Can't clone sheet - unknown relation type found: "+rel.getRelationshipType());
}
target.addRelation(rel.getId(), xssfRel, rp.getDocumentPart());
}
}

/**
* Generate a valid sheet name based on the existing one. Used when cloning sheets.
@@ -794,18 +817,21 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
break;
}

XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber);
RelationPart rp = createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber, false);
XSSFSheet wrapper = rp.getDocumentPart();
wrapper.sheet = sheet;
sheet.setId(wrapper.getPackageRelationship().getId());
sheet.setId(rp.getRelationship().getId());
sheet.setSheetId(sheetNumber);
if(sheets.size() == 0) wrapper.setSelected(true);
if (sheets.isEmpty()) wrapper.setSelected(true);
sheets.add(wrapper);
return wrapper;
}

protected XSSFDialogsheet createDialogsheet(String sheetname, CTDialogsheet dialogsheet) {
XSSFSheet sheet = createSheet(sheetname);
return new XSSFDialogsheet(sheet);
String sheetRelId = getRelationId(sheet);
PackageRelationship pr = getPackagePart().getRelationship(sheetRelId);
return new XSSFDialogsheet(sheet, pr);
}

private CTSheet addSheet(String sheetname) {

+ 6
- 10
src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java View File

@@ -20,10 +20,9 @@ import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLDocumentPart.RelationPart;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
@@ -221,11 +220,9 @@ public class XWPFHeaderFooterPolicy {
}

private int getRelationIndex(XWPFRelation relation) {
List<POIXMLDocumentPart> relations = doc.getRelations();
int i = 1;
for (Iterator<POIXMLDocumentPart> it = relations.iterator(); it.hasNext(); ) {
POIXMLDocumentPart item = it.next();
if (item.getPackageRelationship().getRelationshipType().equals(relation.getRelation())) {
for (RelationPart rp : doc.getRelationParts()) {
if (rp.getRelationship().getRelationshipType().equals(relation.getRelation())) {
i++;
}
}
@@ -287,17 +284,16 @@ public class XWPFHeaderFooterPolicy {
private void setFooterReference(Enum type, XWPFHeaderFooter wrapper) {
CTHdrFtrRef ref = doc.getDocument().getBody().getSectPr().addNewFooterReference();
ref.setType(type);
ref.setId(wrapper.getPackageRelationship().getId());
ref.setId(doc.getRelationId(wrapper));
}


private void setHeaderReference(Enum type, XWPFHeaderFooter wrapper) {
CTHdrFtrRef ref = doc.getDocument().getBody().getSectPr().addNewHeaderReference();
ref.setType(type);
ref.setId(wrapper.getPackageRelationship().getId());
ref.setId(doc.getRelationId(wrapper));
}


public XWPFHeader getFirstPageHeader() {
return firstPageHeader;
}

+ 10
- 17
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java View File

@@ -193,8 +193,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
headerFooterPolicy = new XWPFHeaderFooterPolicy(this);

// Create for each XML-part in the Package a PartClass
for (POIXMLDocumentPart p : getRelations()) {
String relation = p.getPackageRelationship().getRelationshipType();
for (RelationPart rp : getRelationParts()) {
POIXMLDocumentPart p = rp.getDocumentPart();
String relation = rp.getRelationship().getRelationshipType();
if (relation.equals(XWPFRelation.STYLES.getRelation())) {
this.styles = (XWPFStyles) p;
this.styles.onDocumentRead();
@@ -257,8 +258,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
}

private void initFootnotes() throws XmlException, IOException {
for (POIXMLDocumentPart p : getRelations()) {
String relation = p.getPackageRelationship().getRelationshipType();
for (RelationPart rp : getRelationParts()) {
POIXMLDocumentPart p = rp.getDocumentPart();
String relation = rp.getRelationship().getRelationshipType();
if (relation.equals(XWPFRelation.FOOTNOTE.getRelation())) {
this.footnotes = (XWPFFootnotes) p;
this.footnotes.onDocumentRead();
@@ -723,11 +725,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
* @return i
*/
private int getRelationIndex(XWPFRelation relation) {
List<POIXMLDocumentPart> relations = getRelations();
int i = 1;
for (Iterator<POIXMLDocumentPart> it = relations.iterator(); it.hasNext(); ) {
POIXMLDocumentPart item = it.next();
if (item.getPackageRelationship().getRelationshipType().equals(relation.getRelation())) {
for (RelationPart rp : getRelationParts()) {
if (rp.getRelationship().getRelationshipType().equals(relation.getRelation())) {
i++;
}
}
@@ -1313,16 +1313,9 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
* relationship to the already existing part and update
* POIXMLDocumentPart data.
*/
PackagePart picDataPart = xwpfPicData.getPackagePart();
// TODO add support for TargetMode.EXTERNAL relations.
TargetMode targetMode = TargetMode.INTERNAL;
PackagePartName partName = picDataPart.getPartName();
String relation = relDesc.getRelation();
PackageRelationship relShip = getPackagePart().addRelationship(partName, targetMode, relation);
String id = relShip.getId();
addRelation(id, xwpfPicData);
pictures.add(xwpfPicData);
return id;
RelationPart rp = addRelation(null, XWPFRelation.IMAGES, xwpfPicData);
return rp.getRelationship().getId();
} else {
/* Part already existed, get relation id and return it */
return getRelationId(xwpfPicData);

+ 34
- 55
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFactory.java View File

@@ -18,63 +18,42 @@
package org.apache.poi.xwpf.usermodel;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLFactory;
import org.apache.poi.POIXMLRelation;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

/**
* @author Yegor Kozlov
*/
public final class XWPFFactory extends POIXMLFactory {
private static final POILogger logger = POILogFactory.getLogger(XWPFFactory.class);
private static final XWPFFactory inst = new XWPFFactory();
private XWPFFactory() {
}
public static XWPFFactory getInstance() {
return inst;
}
@Override
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part) {
POIXMLRelation descriptor = XWPFRelation.getInstance(rel.getRelationshipType());
if (descriptor == null || descriptor.getRelationClass() == null) {
logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());
return new POIXMLDocumentPart(part, rel);
}

try {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
try {
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(POIXMLDocumentPart.class, PackagePart.class, PackageRelationship.class);
return constructor.newInstance(parent, part, rel);
} catch (NoSuchMethodException e) {
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(PackagePart.class, PackageRelationship.class);
return constructor.newInstance(part, rel);
}
} catch (Exception e) {
throw new POIXMLException(e);
}
}
@Override
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {
try {
Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();
return constructor.newInstance();
} catch (Exception e) {
throw new POIXMLException(e);
}
}

}
/**
* Instantiates sub-classes of POIXMLDocumentPart depending on their relationship type
*/
public final class XWPFFactory extends POIXMLFactory {
private XWPFFactory() {

}

private static final XWPFFactory inst = new XWPFFactory();

public static XWPFFactory getInstance() {
return inst;
}

/**
* @since POI 3.14-Beta1
*/
@Override
protected POIXMLRelation getDescriptor(String relationshipType) {
return XWPFRelation.getInstance(relationshipType);
}

/**
* @since POI 3.14-Beta1
*/
@Override
protected POIXMLDocumentPart createDocumentPart
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor(classes);
return constructor.newInstance(values);
}
}

+ 17
- 2
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFooter.java View File

@@ -67,8 +67,19 @@ public class XWPFFooter extends XWPFHeaderFooter {
cursor.dispose();
}

/**
* @since POI 3.14-Beta1
*/
public XWPFFooter(POIXMLDocumentPart parent, PackagePart part) throws IOException {
super(parent, part);
}
/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
super(parent, part, rel);
this(parent, part);
}

/**
@@ -88,7 +99,7 @@ public class XWPFFooter extends XWPFHeaderFooter {
protected void onDocumentRead() throws IOException {
super.onDocumentRead();
FtrDocument ftrDocument = null;
InputStream is;
InputStream is = null;
try {
is = getPackagePart().getInputStream();
ftrDocument = FtrDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
@@ -117,6 +128,10 @@ public class XWPFFooter extends XWPFHeaderFooter {
cursor.dispose();
} catch (Exception e) {
throw new POIXMLException(e);
} finally {
if (is != null) {
is.close();
}
}
}


+ 25
- 10
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFootnotes.java View File

@@ -48,14 +48,24 @@ public class XWPFFootnotes extends POIXMLDocumentPart {
/**
* Construct XWPFFootnotes from a package part
*
* @param part the package part holding the data of the footnotes,
* @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"
*/
public XWPFFootnotes(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
super(part, rel);
}
*
* @param part the package part holding the data of the footnotes,
* @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"
*
* @since POI 3.14-Beta1
*/
public XWPFFootnotes(PackagePart part) throws IOException, OpenXML4JException {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFFootnotes(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
this(part);
}
/**
* Construct XWPFFootnotes from scratch for a new document.
*/
@@ -67,13 +77,18 @@ public class XWPFFootnotes extends POIXMLDocumentPart {
*/
@Override
protected void onDocumentRead() throws IOException {
FootnotesDocument notesDoc;
FootnotesDocument notesDoc;
InputStream is = null;
try {
InputStream is = getPackagePart().getInputStream();
is = getPackagePart().getInputStream();
notesDoc = FootnotesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
ctFootnotes = notesDoc.getFootnotes();
} catch (XmlException e) {
throw new POIXMLException();
} finally {
if (is != null) {
is.close();
}
}
// Find our footnotes

+ 17
- 2
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeader.java View File

@@ -47,8 +47,19 @@ public class XWPFHeader extends XWPFHeaderFooter {
super();
}

/**
* @since POI 3.14-Beta1
*/
public XWPFHeader(POIXMLDocumentPart parent, PackagePart part) throws IOException {
super(parent, part);
}
/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFHeader(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
super(parent, part, rel);
this(parent, part);
}

public XWPFHeader(XWPFDocument doc, CTHdrFtr hdrFtr) {
@@ -91,7 +102,7 @@ public class XWPFHeader extends XWPFHeaderFooter {
protected void onDocumentRead() throws IOException {
super.onDocumentRead();
HdrDocument hdrDocument = null;
InputStream is;
InputStream is = null;
try {
is = getPackagePart().getInputStream();
hdrDocument = HdrDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
@@ -120,6 +131,10 @@ public class XWPFHeader extends XWPFHeaderFooter {
cursor.dispose();
} catch (XmlException e) {
throw new POIXMLException(e);
} finally {
if (is != null) {
is.close();
}
}
}


+ 15
- 12
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java View File

@@ -28,9 +28,7 @@ import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLRelation;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.Internal;
import org.apache.xmlbeans.XmlCursor;
@@ -68,14 +66,25 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo
readHdrFtr();
}

public XWPFHeaderFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
super(parent, part, rel);
/**
* @since by POI 3.14-Beta1
*/
public XWPFHeaderFooter(POIXMLDocumentPart parent, PackagePart part) throws IOException {
super(parent, part);
this.document = (XWPFDocument) getParent();

if (this.document == null) {
throw new NullPointerException();
}
}
/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFHeaderFooter(POIXMLDocumentPart parent, PackagePart part, PackageRelationship rel) throws IOException {
this(parent, part);
}

@Override
protected void onDocumentRead() throws IOException {
@@ -271,16 +280,10 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo
* relationship to the already existing part and update
* POIXMLDocumentPart data.
*/
PackagePart picDataPart = xwpfPicData.getPackagePart();
// TODO add support for TargetMode.EXTERNAL relations.
TargetMode targetMode = TargetMode.INTERNAL;
PackagePartName partName = picDataPart.getPartName();
String relation = relDesc.getRelation();
PackageRelationship relShip = getPackagePart().addRelationship(partName, targetMode, relation);
String id = relShip.getId();
addRelation(id, xwpfPicData);
RelationPart rp = addRelation(null, XWPFRelation.IMAGES, xwpfPicData);
pictures.add(xwpfPicData);
return id;
return rp.getRelationship().getId();
} else {
/* Part already existed, get relation id and return it */
return getRelationId(xwpfPicData);

+ 31
- 19
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java View File

@@ -47,19 +47,29 @@ public class XWPFNumbering extends POIXMLDocumentPart {
protected List<XWPFNum> nums = new ArrayList<XWPFNum>();
boolean isNew;
private CTNumbering ctNumbering;
/**
* create a new styles object with an existing document
*/
public XWPFNumbering(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
super(part, rel);
isNew = true;
}
/**
* create a new XWPFNumbering object for use in a new document
*/
public XWPFNumbering() {

/**
* create a new styles object with an existing document
*
* @since POI 3.14-Beta1
*/
public XWPFNumbering(PackagePart part) throws IOException, OpenXML4JException {
super(part);
isNew = true;
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFNumbering(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
this(part);
}
/**
* create a new XWPFNumbering object for use in a new document
*/
public XWPFNumbering() {
abstractNums = new ArrayList<XWPFAbstractNum>();
nums = new ArrayList<XWPFNum>();
isNew = true;
@@ -83,12 +93,14 @@ public class XWPFNumbering extends POIXMLDocumentPart {
for (CTAbstractNum ctAbstractNum : ctNumbering.getAbstractNumArray()) {
abstractNums.add(new XWPFAbstractNum(ctAbstractNum, this));
}
isNew = false;
} catch (XmlException e) {
throw new POIXMLException();
}
}
isNew = false;
} catch (XmlException e) {
throw new POIXMLException();
} finally {
is.close();
}
}

/**
* save and commit numbering
*/

+ 15
- 7
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java View File

@@ -70,15 +70,23 @@ public class XWPFPictureData extends POIXMLDocumentPart {

/**
* Construct XWPFPictureData from a package part
*
* @param part the package part holding the drawing data,
* @param rel the package relationship holding this drawing,
* the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
*/
public XWPFPictureData(PackagePart part, PackageRelationship rel) {
super(part, rel);
*
* @param part the package part holding the drawing data,
*
* @since POI 3.14-Beta1
*/
public XWPFPictureData(PackagePart part) {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFPictureData(PackagePart part, PackageRelationship rel) {
this(part);
}
@Override
protected void onDocumentRead() throws IOException {
super.onDocumentRead();

+ 2
- 3
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java View File

@@ -208,13 +208,12 @@ public final class XWPFRelation extends POIXMLRelation {
null,
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
null,
null
XWPFPictureData.class
);

private XWPFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) {
super(type, rel, defaultName, cls);

if (cls != null && !_table.containsKey(rel)) _table.put(rel, this);
_table.put(rel, this);
}

/**

+ 7
- 7
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java View File

@@ -994,13 +994,13 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun {

CTNonVisualPictureProperties cNvPicPr = nvPicPr.addNewCNvPicPr();
cNvPicPr.addNewPicLocks().setNoChangeAspect(true);
CTBlipFillProperties blipFill = pic.addNewBlipFill();
CTBlip blip = blipFill.addNewBlip();
blip.setEmbed(picData.getPackageRelationship().getId());
blipFill.addNewStretch().addNewFillRect();
CTShapeProperties spPr = pic.addNewSpPr();
CTBlipFillProperties blipFill = pic.addNewBlipFill();
CTBlip blip = blipFill.addNewBlip();
blip.setEmbed(parent.getDocument().getRelationId(picData));
blipFill.addNewStretch().addNewFillRect();
CTShapeProperties spPr = pic.addNewSpPr();
CTTransform2D xfrm = spPr.addNewXfrm();

CTPoint2D off = xfrm.addNewOff();

+ 13
- 2
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSettings.java View File

@@ -49,10 +49,21 @@ public class XWPFSettings extends POIXMLDocumentPart {

private CTSettings ctSettings;

public XWPFSettings(PackagePart part, PackageRelationship rel) throws IOException {
super(part, rel);
/**
* @since POI 3.14-Beta1
*/
public XWPFSettings(PackagePart part) throws IOException {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFSettings(PackagePart part, PackageRelationship rel) throws IOException {
this(part);
}
public XWPFSettings() {
super();
ctSettings = CTSettings.Factory.newInstance();

+ 23
- 12
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFStyles.java View File

@@ -61,13 +61,22 @@ public class XWPFStyles extends POIXMLDocumentPart {
/**
* Construct XWPFStyles from a package part
*
* @param part the package part holding the data of the styles,
* @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"
*/
public XWPFStyles(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
super(part, rel);
}
* @param part the package part holding the data of the styles,
*
* @since POI 3.14-Beta1
*/
public XWPFStyles(PackagePart part) throws IOException, OpenXML4JException {
super(part);
}

/**
* @deprecated in POI 3.14, scheduled for removal in POI 3.16
*/
@Deprecated
public XWPFStyles(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {
this(part);
}
/**
* Construct XWPFStyles from scratch for a new document.
*/
@@ -77,16 +86,18 @@ public class XWPFStyles extends POIXMLDocumentPart {
/**
* Read document
*/
@Override
protected void onDocumentRead() throws IOException {
StylesDocument stylesDoc;
try {
InputStream is = getPackagePart().getInputStream();
@Override
protected void onDocumentRead() throws IOException {
StylesDocument stylesDoc;
InputStream is = getPackagePart().getInputStream();
try {
stylesDoc = StylesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
setStyles(stylesDoc.getStyles());
latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this);
} catch (XmlException e) {
throw new POIXMLException("Unable to read styles", e);
} finally {
is.close();
}
}


+ 10
- 6
src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java View File

@@ -26,6 +26,7 @@ import static org.junit.Assert.assertSame;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -34,7 +35,6 @@ import java.util.List;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
import org.apache.poi.util.PackageHelper;
import org.apache.poi.util.TempFile;
@@ -71,14 +71,18 @@ public final class TestPOIXMLDocument {
//
}

@Override
public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part){
return new POIXMLDocumentPart(part, rel);
protected POIXMLRelation getDescriptor(String relationshipType) {
return null;
}

/**
* @since POI 3.14-Beta1
*/
@Override
public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor){
throw new RuntimeException("not supported");
protected POIXMLDocumentPart createDocumentPart
(Class<? extends POIXMLDocumentPart> cls, Class<?>[] classes, Object[] values)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
return null;
}
}


+ 8
- 14
src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java View File

@@ -25,25 +25,20 @@ import static org.junit.Assert.fail;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.poi.POIDataSamples;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLDocumentPart.RelationPart;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.DrawingParagraph;
import org.apache.poi.xslf.usermodel.DrawingTextBody;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
@@ -109,7 +104,7 @@ public class TestXSLFBugs {
XSLFSlide slide = ss.getSlides().get(0);
// Check the relations from this
List<POIXMLDocumentPart> rels = slide.getRelations();
Collection<RelationPart> rels = slide.getRelationParts();
// Should have 6 relations:
// 1 external hyperlink (skipped from list)
@@ -118,10 +113,10 @@ public class TestXSLFBugs {
assertEquals(5, rels.size());
int layouts = 0;
int hyperlinks = 0;
for(POIXMLDocumentPart p : rels) {
if(p.getPackageRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
for(RelationPart p : rels) {
if(p.getRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
hyperlinks++;
} else if(p instanceof XSLFSlideLayout) {
} else if(p.getDocumentPart() instanceof XSLFSlideLayout) {
layouts++;
}
}
@@ -129,9 +124,9 @@ public class TestXSLFBugs {
assertEquals(4, hyperlinks);
// Hyperlinks should all be to #_ftn1 or #ftnref1
for(POIXMLDocumentPart p : rels) {
if(p.getPackageRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
URI target = p.getPackageRelationship().getTargetURI();
for(RelationPart p : rels) {
if(p.getRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) {
URI target = p.getRelationship().getTargetURI();
if(target.getFragment().equals("_ftn1") ||
target.getFragment().equals("_ftnref1")) {
@@ -150,7 +145,6 @@ public class TestXSLFBugs {
* rID2 -> slide3.xml
*/
@Test
@Ignore
public void bug54916() throws Exception {
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx");
XSLFSlide slide;

+ 17
- 7
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java View File

@@ -44,6 +44,7 @@ import java.util.TreeMap;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.POIDataSamples;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLDocumentPart.RelationPart;
import org.apache.poi.POIXMLException;
import org.apache.poi.POIXMLProperties;
import org.apache.poi.hssf.HSSFTestDataSamples;
@@ -55,6 +56,7 @@ import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
@@ -221,9 +223,9 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
assertEquals(1, wb1.getNumberOfSheets());
XSSFSheet sh = wb1.getSheetAt(0);
XSSFDrawing drawing = sh.createDrawingPatriarch();
List<POIXMLDocumentPart> rels = drawing.getRelations();
List<RelationPart> rels = drawing.getRelationParts();
assertEquals(1, rels.size());
assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
assertEquals("Sheet1!A1", rels.get(0).getRelationship().getTargetURI().getFragment());

// And again, just to be sure
XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1);
@@ -231,9 +233,9 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
assertEquals(1, wb2.getNumberOfSheets());
sh = wb2.getSheetAt(0);
drawing = sh.createDrawingPatriarch();
rels = drawing.getRelations();
rels = drawing.getRelationParts();
assertEquals(1, rels.size());
assertEquals("Sheet1!A1", rels.get(0).getPackageRelationship().getTargetURI().getFragment());
assertEquals("Sheet1!A1", rels.get(0).getRelationship().getTargetURI().getFragment());
wb2.close();
}

@@ -1262,12 +1264,20 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("51470.xlsx");
XSSFSheet sh0 = wb.getSheetAt(0);
XSSFSheet sh1 = wb.cloneSheet(0);
List<POIXMLDocumentPart> rels0 = sh0.getRelations();
List<POIXMLDocumentPart> rels1 = sh1.getRelations();
List<RelationPart> rels0 = sh0.getRelationParts();
List<RelationPart> rels1 = sh1.getRelationParts();
assertEquals(1, rels0.size());
assertEquals(1, rels1.size());

assertEquals(rels0.get(0).getPackageRelationship(), rels1.get(0).getPackageRelationship());
PackageRelationship pr0 = rels0.get(0).getRelationship();
PackageRelationship pr1 = rels1.get(0).getRelationship();
assertEquals(pr0.getTargetMode(), pr1.getTargetMode());
assertEquals(pr0.getTargetURI(), pr1.getTargetURI());
POIXMLDocumentPart doc0 = rels0.get(0).getDocumentPart();
POIXMLDocumentPart doc1 = rels1.get(0).getDocumentPart();
assertEquals(doc0, doc1);
wb.close();
}


+ 21
- 16
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java View File

@@ -28,6 +28,7 @@ import java.io.IOException;
import java.util.List;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.POIXMLDocumentPart.RelationPart;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.FontUnderline;
@@ -44,14 +45,15 @@ public class TestXSSFDrawing {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
XSSFSheet sheet = wb.getSheetAt(0);
//the sheet has one relationship and it is XSSFDrawing
List<POIXMLDocumentPart> rels = sheet.getRelations();
List<RelationPart> rels = sheet.getRelationParts();
assertEquals(1, rels.size());
assertTrue(rels.get(0) instanceof XSSFDrawing);
RelationPart rp = rels.get(0);
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);

XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
XSSFDrawing drawing = (XSSFDrawing)rp.getDocumentPart();
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
assertSame(drawing, sheet.createDrawingPatriarch());
String drawingId = drawing.getPackageRelationship().getId();
String drawingId = rp.getRelationship().getId();

//there should be a relation to this drawing in the worksheet
assertTrue(sheet.getCTWorksheet().isSetDrawing());
@@ -82,12 +84,13 @@ public class TestXSSFDrawing {
XSSFDrawing dr2 = sheet.createDrawingPatriarch();
assertSame(dr1, dr2);

List<POIXMLDocumentPart> rels = sheet.getRelations();
List<RelationPart> rels = sheet.getRelationParts();
assertEquals(1, rels.size());
assertTrue(rels.get(0) instanceof XSSFDrawing);
RelationPart rp = rels.get(0);
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);

XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
String drawingId = drawing.getPackageRelationship().getId();
XSSFDrawing drawing = rp.getDocumentPart();
String drawingId = rp.getRelationship().getId();

//there should be a relation to this drawing in the worksheet
assertTrue(sheet.getCTWorksheet().isSetDrawing());
@@ -509,14 +512,15 @@ public class TestXSSFDrawing {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
XSSFSheet sheet = wb.getSheetAt(0);
//the sheet has one relationship and it is XSSFDrawing
List<POIXMLDocumentPart> rels = sheet.getRelations();
List<RelationPart> rels = sheet.getRelationParts();
assertEquals(1, rels.size());
assertTrue(rels.get(0) instanceof XSSFDrawing);
RelationPart rp = rels.get(0);
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);

XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
XSSFDrawing drawing = rp.getDocumentPart();
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
assertSame(drawing, sheet.createDrawingPatriarch());
String drawingId = drawing.getPackageRelationship().getId();
String drawingId = rp.getRelationship().getId();

//there should be a relation to this drawing in the worksheet
assertTrue(sheet.getCTWorksheet().isSetDrawing());
@@ -543,16 +547,17 @@ public class TestXSSFDrawing {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTextBox.xlsx");
XSSFSheet sheet = wb.getSheetAt(0);
//the sheet has one relationship and it is XSSFDrawing
List<POIXMLDocumentPart> rels = sheet.getRelations();
List<RelationPart> rels = sheet.getRelationParts();
assertEquals(1, rels.size());
RelationPart rp = rels.get(0);
assertTrue(rels.get(0) instanceof XSSFDrawing);
assertTrue(rp.getDocumentPart() instanceof XSSFDrawing);

XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
XSSFDrawing drawing = rp.getDocumentPart();
//sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
assertSame(drawing, sheet.createDrawingPatriarch());
String drawingId = drawing.getPackageRelationship().getId();
String drawingId = rp.getRelationship().getId();

//there should be a relation to this drawing in the worksheet
assertTrue(sheet.getCTWorksheet().isSetDrawing());

Loading…
Cancel
Save