// 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}")
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 {
assertNotNull(read);
readContent(read);
+
+ modifyContent(read);
+
+ read.close();
}
private ByteArrayOutputStream writeToArray(Workbook wb)
}
}
}
+
+ 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;
+ }
+ }
+ }
}
\ No newline at end of file
exportToXML(wb);
checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(bytes)));
+
+ wb.close();
}
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;
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
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);
}
/**
* @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 =
" but found " + cores.size() + " parts of the right type"
);
}
- packageRel = cores.getRelationship(0);
- packagePart = packagePart.getRelatedPart(packageRel);
+ packagePart = packagePart.getRelatedPart(cores.getRelationship(0));
}
/**
* 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;
}
/**
* @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);
}
/**
* {@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();
}
/**
* {@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.
* 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;
* 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;
}
/**
/**
* 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
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);
}
}
/**
- * 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() {
* 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();
}
/**
* 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();
}
/**
* 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;
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
* @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.
*
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!");
+ }
}
==================================================================== */
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
* @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
* @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.");
+ }
}
*/
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"));
}
/**
/* End XML markup */
/**
- * L'ID de la relation.
+ * Relation id.
*/
private String id;
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;
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;
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);
}
-
}
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() {
// 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;
}
// 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();
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 {
// 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;
"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);
}
/**
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);
+ }
}
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;
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){
}
}
- 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;
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);
* 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) {
}
}
- 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);
}
/**
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 {
*/
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.
*
* @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;
*
* @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;
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(){
}
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);
}
-
}
* 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);
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();
_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) {
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);
}
/**
null,
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
null,
- null
+ XSLFPictureData.class
);
public static final XSLFRelation TABLE_STYLES = new XSLFRelation(
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);
}
/**
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);
}
/**
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);
} 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();
}
/**
*
* @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);
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();
_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();
_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;
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();
}
}
+ /**
+ * @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;
}
_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();
/**
* 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.
*
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);
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);
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);
}
- 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 {
_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);
}
/**
}
- 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);
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;
* 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);
}
}
+ /**
+ * @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.
* 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.
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));
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;
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();
}
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;
* 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
*
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);
* @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();
}
/**
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();
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);
}
-
}
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;
* @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);
}
* @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>
*
* @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 {
*
* @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 {
*
* @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 {
*
* @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 {
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);
}
/**
/**
* 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
*
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);
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;
}
//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.
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.
}
} 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;
}
+ @SuppressWarnings("resource")
@Override
public XSSFAutoFilter setAutoFilter(CellRangeAddress range) {
CTAutoFilter af = worksheet.getAutoFilter();
// 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);
* including: pivotCacheDefinition, pivotCacheRecords
* @return returns a pivotTable
*/
+ @SuppressWarnings("resource")
@Beta
private XSSFPivotTable createPivotTable() {
XSSFWorkbook wb = getWorkbook();
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);
*
* @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
* 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(
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);
@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);
*/
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();
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);
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()) {
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.
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) {
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;
}
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++;
}
}
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;
}
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();
}
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();
* @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++;
}
}
* 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);
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;
-/**\r
- * @author Yegor Kozlov\r
- */\r
-public final class XWPFFactory extends POIXMLFactory {\r
-\r
- private static final POILogger logger = POILogFactory.getLogger(XWPFFactory.class);\r
- private static final XWPFFactory inst = new XWPFFactory();\r
-\r
- private XWPFFactory() {\r
-\r
- }\r
-\r
- public static XWPFFactory getInstance() {\r
- return inst;\r
- }\r
-\r
- @Override\r
- public POIXMLDocumentPart createDocumentPart(POIXMLDocumentPart parent, PackageRelationship rel, PackagePart part) {\r
- POIXMLRelation descriptor = XWPFRelation.getInstance(rel.getRelationshipType());\r
- if (descriptor == null || descriptor.getRelationClass() == null) {\r
- logger.log(POILogger.DEBUG, "using default POIXMLDocumentPart for " + rel.getRelationshipType());\r
- return new POIXMLDocumentPart(part, rel);\r
- }\r
-
- 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);\r
- return constructor.newInstance(part, rel);\r
- }\r
- } catch (Exception e) {\r
- throw new POIXMLException(e);\r
- }\r
- }\r
-\r
- @Override\r
- public POIXMLDocumentPart newDocumentPart(POIXMLRelation descriptor) {\r
- try {\r
- Class<? extends POIXMLDocumentPart> cls = descriptor.getRelationClass();\r
- Constructor<? extends POIXMLDocumentPart> constructor = cls.getDeclaredConstructor();\r
- return constructor.newInstance();\r
- } catch (Exception e) {\r
- throw new POIXMLException(e);\r
- }\r
- }\r
-
-}
+/**
+ * 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);
+ }
+}
\ No newline at end of file
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);
}
/**
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);
cursor.dispose();
} catch (Exception e) {
throw new POIXMLException(e);
+ } finally {
+ if (is != null) {
+ is.close();
+ }
}
}
\r
/**\r
* Construct XWPFFootnotes from a package part\r
- *\r
- * @param part the package part holding the data of the footnotes,\r
- * @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"\r
- */\r
- public XWPFFootnotes(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {\r
- super(part, rel);\r
- }\r
-\r
+ *
+ * @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.
*/
*/\r
@Override\r
protected void onDocumentRead() throws IOException {\r
- FootnotesDocument notesDoc;\r
+ FootnotesDocument notesDoc;
+ InputStream is = null;\r
try {\r
- InputStream is = getPackagePart().getInputStream();\r
+ is = getPackagePart().getInputStream();\r
notesDoc = FootnotesDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
ctFootnotes = notesDoc.getFootnotes();
} catch (XmlException e) {
throw new POIXMLException();
+ } finally {
+ if (is != null) {
+ is.close();
+ }
}\r
\r
// Find our footnotes\r
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) {
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);
cursor.dispose();
} catch (XmlException e) {
throw new POIXMLException(e);
+ } finally {
+ if (is != null) {
+ is.close();
+ }
}
}
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;
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 {
* 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);
protected List<XWPFNum> nums = new ArrayList<XWPFNum>();\r
boolean isNew;\r
private CTNumbering ctNumbering;\r
-\r
- /**\r
- * create a new styles object with an existing document\r
- */\r
- public XWPFNumbering(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {\r
- super(part, rel);\r
- isNew = true;\r
- }\r
-\r
- /**\r
- * create a new XWPFNumbering object for use in a new document\r
- */\r
- public XWPFNumbering() {\r
+
+ /**
+ * 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>();\r
nums = new ArrayList<XWPFNum>();\r
isNew = true;\r
for (CTAbstractNum ctAbstractNum : ctNumbering.getAbstractNumArray()) {\r
abstractNums.add(new XWPFAbstractNum(ctAbstractNum, this));\r
}\r
- isNew = false;\r
- } catch (XmlException e) {\r
- throw new POIXMLException();\r
- }\r
- }\r
-\r
+ isNew = false;
+ } catch (XmlException e) {
+ throw new POIXMLException();
+ } finally {
+ is.close();
+ }
+ }
+
/**\r
* save and commit numbering\r
*/\r
/**
* Construct XWPFPictureData from a package part
- *\r
- * @param part the package part holding the drawing data,\r
- * @param rel the package relationship holding this drawing,\r
- * the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\r
- */\r
- public XWPFPictureData(PackagePart part, PackageRelationship rel) {\r
- super(part, rel);\r
+ *
+ * @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();
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);
}
/**
CTNonVisualPictureProperties cNvPicPr = nvPicPr.addNewCNvPicPr();
cNvPicPr.addNewPicLocks().setNoChangeAspect(true);
-\r
- CTBlipFillProperties blipFill = pic.addNewBlipFill();\r
- CTBlip blip = blipFill.addNewBlip();\r
- blip.setEmbed(picData.getPackageRelationship().getId());\r
- blipFill.addNewStretch().addNewFillRect();\r
-\r
- CTShapeProperties spPr = pic.addNewSpPr();\r
+
+ 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();
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();
/**
* Construct XWPFStyles from a package part
*
- * @param part the package part holding the data of the styles,\r
- * @param rel the package relationship of type "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"\r
- */\r
- public XWPFStyles(PackagePart part, PackageRelationship rel) throws IOException, OpenXML4JException {\r
- super(part, rel);\r
- }\r
-\r
+ * @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.
*/
/**
* Read document\r
*/\r
- @Override\r
- protected void onDocumentRead() throws IOException {\r
- StylesDocument stylesDoc;\r
- try {\r
- InputStream is = getPackagePart().getInputStream();\r
+ @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();
}
}
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;
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;
//
}
- @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;
}
}
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;
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)
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++;
}
}
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")) {
* rID2 -> slide3.xml
*/
@Test
- @Ignore
public void bug54916() throws Exception {
XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx");
XSLFSlide slide;
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;
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;
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);
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();
}
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();
}
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;
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());
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());
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());
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());