git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1563540 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_11_BETA1
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.TreeMap; | import java.util.TreeMap; | ||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | |||||
import org.apache.poi.openxml4j.exceptions.InvalidOperationException; | |||||
import org.apache.poi.util.POILogFactory; | |||||
import org.apache.poi.util.POILogger; | |||||
import org.dom4j.Attribute; | import org.dom4j.Attribute; | ||||
import org.dom4j.Document; | import org.dom4j.Document; | ||||
import org.dom4j.Element; | import org.dom4j.Element; | ||||
import org.dom4j.io.SAXReader; | import org.dom4j.io.SAXReader; | ||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | |||||
import org.apache.poi.openxml4j.exceptions.InvalidOperationException; | |||||
import org.apache.poi.util.POILogger; | |||||
import org.apache.poi.util.POILogFactory; | |||||
/** | /** | ||||
* Represents a collection of PackageRelationship elements that are owned by a | * Represents a collection of PackageRelationship elements that are owned by a | ||||
* @version 0.1 | * @version 0.1 | ||||
*/ | */ | ||||
public final class PackageRelationshipCollection implements | public final class PackageRelationshipCollection implements | ||||
Iterable<PackageRelationship> { | |||||
Iterable<PackageRelationship> { | |||||
private static POILogger logger = POILogFactory.getLogger(PackageRelationshipCollection.class); | private static POILogger logger = POILogFactory.getLogger(PackageRelationshipCollection.class); | ||||
/** | |||||
* Package relationships ordered by ID. | |||||
*/ | |||||
private TreeMap<String, PackageRelationship> relationshipsByID; | |||||
/** | |||||
* Package relationships ordered by type. | |||||
*/ | |||||
private TreeMap<String, PackageRelationship> relationshipsByType; | |||||
/** | |||||
* This relationshipPart. | |||||
*/ | |||||
private PackagePart relationshipPart; | |||||
/** | |||||
* Source part. | |||||
*/ | |||||
private PackagePart sourcePart; | |||||
/** | |||||
* This part name. | |||||
*/ | |||||
private PackagePartName partName; | |||||
/** | |||||
* Reference to the package. | |||||
*/ | |||||
private OPCPackage container; | |||||
/** | |||||
* The ID number of the next rID# to generate, or -1 | |||||
* if that is still to be determined. | |||||
*/ | |||||
private int nextRelationshipId = -1; | |||||
/** | |||||
* Constructor. | |||||
*/ | |||||
PackageRelationshipCollection() { | |||||
relationshipsByID = new TreeMap<String, PackageRelationship>(); | |||||
relationshipsByType = new TreeMap<String, PackageRelationship>(); | |||||
} | |||||
/** | |||||
* Copy constructor. | |||||
* | |||||
* This collection will contain only elements from the specified collection | |||||
* for which the type is compatible with the specified relationship type | |||||
* filter. | |||||
* | |||||
* @param coll | |||||
* Collection to import. | |||||
* @param filter | |||||
* Relationship type filter. | |||||
*/ | |||||
public PackageRelationshipCollection(PackageRelationshipCollection coll, | |||||
String filter) { | |||||
this(); | |||||
for (PackageRelationship rel : coll.relationshipsByID.values()) { | |||||
if (filter == null || rel.getRelationshipType().equals(filter)) | |||||
addRelationship(rel); | |||||
} | |||||
} | |||||
/** | |||||
* Constructor. | |||||
*/ | |||||
public PackageRelationshipCollection(OPCPackage container) | |||||
throws InvalidFormatException { | |||||
this(container, null); | |||||
} | |||||
/** | |||||
* Constructor. | |||||
* | |||||
* @throws InvalidFormatException | |||||
* Throws if the format of the content part is invalid. | |||||
* | |||||
* @throws InvalidOperationException | |||||
* Throws if the specified part is a relationship part. | |||||
*/ | |||||
public PackageRelationshipCollection(PackagePart part) | |||||
throws InvalidFormatException { | |||||
this(part._container, part); | |||||
} | |||||
/** | |||||
* Constructor. Parse the existing package relationship part if one exists. | |||||
* | |||||
* @param container | |||||
* The parent package. | |||||
* @param part | |||||
* The part that own this relationships collection. If <b>null</b> | |||||
* then this part is considered as the package root. | |||||
* @throws InvalidFormatException | |||||
* If an error occurs during the parsing of the relatinships | |||||
* part fo the specified part. | |||||
*/ | |||||
public PackageRelationshipCollection(OPCPackage container, PackagePart part) | |||||
throws InvalidFormatException { | |||||
this(); | |||||
if (container == null) | |||||
throw new IllegalArgumentException("container"); | |||||
// Check if the specified part is not a relationship part | |||||
if (part != null && part.isRelationshipPart()) | |||||
throw new IllegalArgumentException("part"); | |||||
this.container = container; | |||||
this.sourcePart = part; | |||||
this.partName = getRelationshipPartName(part); | |||||
if ((container.getPackageAccess() != PackageAccess.WRITE) | |||||
&& container.containPart(this.partName)) { | |||||
relationshipPart = container.getPart(this.partName); | |||||
parseRelationshipsPart(relationshipPart); | |||||
} | |||||
} | |||||
/** | |||||
* Get the relationship part name of the specified part. | |||||
* | |||||
* @param part | |||||
* The part . | |||||
* @return The relationship part name of the specified part. Be careful, | |||||
* only the correct name is returned, this method does not check if | |||||
* the part really exist in a package ! | |||||
* @throws InvalidOperationException | |||||
* Throws if the specified part is a relationship part. | |||||
*/ | |||||
private static PackagePartName getRelationshipPartName(PackagePart part) | |||||
throws InvalidOperationException { | |||||
PackagePartName partName; | |||||
if (part == null) { | |||||
partName = PackagingURIHelper.PACKAGE_ROOT_PART_NAME; | |||||
} else { | |||||
partName = part.getPartName(); | |||||
} | |||||
return PackagingURIHelper.getRelationshipPartName(partName); | |||||
} | |||||
/** | |||||
* Add the specified relationship to the collection. | |||||
* | |||||
* @param relPart | |||||
* The relationship to add. | |||||
*/ | |||||
public void addRelationship(PackageRelationship relPart) { | |||||
relationshipsByID.put(relPart.getId(), relPart); | |||||
relationshipsByType.put(relPart.getRelationshipType(), relPart); | |||||
} | |||||
/** | |||||
* Add a relationship to the collection. | |||||
* | |||||
* @param targetUri | |||||
* Target URI. | |||||
* @param targetMode | |||||
* The target mode : INTERNAL or EXTERNAL | |||||
* @param relationshipType | |||||
* Relationship type. | |||||
* @param id | |||||
* Relationship ID. | |||||
* @return The newly created relationship. | |||||
* @see PackageAccess | |||||
*/ | |||||
public PackageRelationship addRelationship(URI targetUri, | |||||
TargetMode targetMode, String relationshipType, String id) { | |||||
/** | |||||
* Package relationships ordered by ID. | |||||
*/ | |||||
private TreeMap<String, PackageRelationship> relationshipsByID; | |||||
/** | |||||
* Package relationships ordered by type. | |||||
*/ | |||||
private TreeMap<String, PackageRelationship> relationshipsByType; | |||||
/** | |||||
* This relationshipPart. | |||||
*/ | |||||
private PackagePart relationshipPart; | |||||
/** | |||||
* Source part. | |||||
*/ | |||||
private PackagePart sourcePart; | |||||
/** | |||||
* This part name. | |||||
*/ | |||||
private PackagePartName partName; | |||||
/** | |||||
* Reference to the package. | |||||
*/ | |||||
private OPCPackage container; | |||||
/** | |||||
* The ID number of the next rID# to generate, or -1 | |||||
* if that is still to be determined. | |||||
*/ | |||||
private int nextRelationshipId = -1; | |||||
/** | |||||
* Constructor. | |||||
*/ | |||||
PackageRelationshipCollection() { | |||||
relationshipsByID = new TreeMap<String, PackageRelationship>(); | |||||
relationshipsByType = new TreeMap<String, PackageRelationship>(); | |||||
} | |||||
/** | |||||
* Copy constructor. | |||||
* | |||||
* This collection will contain only elements from the specified collection | |||||
* for which the type is compatible with the specified relationship type | |||||
* filter. | |||||
* | |||||
* @param coll | |||||
* Collection to import. | |||||
* @param filter | |||||
* Relationship type filter. | |||||
*/ | |||||
public PackageRelationshipCollection(PackageRelationshipCollection coll, | |||||
String filter) { | |||||
this(); | |||||
for (PackageRelationship rel : coll.relationshipsByID.values()) { | |||||
if (filter == null || rel.getRelationshipType().equals(filter)) | |||||
addRelationship(rel); | |||||
} | |||||
} | |||||
/** | |||||
* Constructor. | |||||
*/ | |||||
public PackageRelationshipCollection(OPCPackage container) | |||||
throws InvalidFormatException { | |||||
this(container, null); | |||||
} | |||||
/** | |||||
* Constructor. | |||||
* | |||||
* @throws InvalidFormatException | |||||
* Throws if the format of the content part is invalid. | |||||
* | |||||
* @throws InvalidOperationException | |||||
* Throws if the specified part is a relationship part. | |||||
*/ | |||||
public PackageRelationshipCollection(PackagePart part) | |||||
throws InvalidFormatException { | |||||
this(part._container, part); | |||||
} | |||||
/** | |||||
* Constructor. Parse the existing package relationship part if one exists. | |||||
* | |||||
* @param container | |||||
* The parent package. | |||||
* @param part | |||||
* The part that own this relationships collection. If <b>null</b> | |||||
* then this part is considered as the package root. | |||||
* @throws InvalidFormatException | |||||
* If an error occurs during the parsing of the relatinships | |||||
* part fo the specified part. | |||||
*/ | |||||
public PackageRelationshipCollection(OPCPackage container, PackagePart part) | |||||
throws InvalidFormatException { | |||||
this(); | |||||
if (container == null) | |||||
throw new IllegalArgumentException("container"); | |||||
// Check if the specified part is not a relationship part | |||||
if (part != null && part.isRelationshipPart()) | |||||
throw new IllegalArgumentException("part"); | |||||
this.container = container; | |||||
this.sourcePart = part; | |||||
this.partName = getRelationshipPartName(part); | |||||
if ((container.getPackageAccess() != PackageAccess.WRITE) | |||||
&& container.containPart(this.partName)) { | |||||
relationshipPart = container.getPart(this.partName); | |||||
parseRelationshipsPart(relationshipPart); | |||||
} | |||||
} | |||||
/** | |||||
* Get the relationship part name of the specified part. | |||||
* | |||||
* @param part | |||||
* The part . | |||||
* @return The relationship part name of the specified part. Be careful, | |||||
* only the correct name is returned, this method does not check if | |||||
* the part really exist in a package ! | |||||
* @throws InvalidOperationException | |||||
* Throws if the specified part is a relationship part. | |||||
*/ | |||||
private static PackagePartName getRelationshipPartName(PackagePart part) | |||||
throws InvalidOperationException { | |||||
PackagePartName partName; | |||||
if (part == null) { | |||||
partName = PackagingURIHelper.PACKAGE_ROOT_PART_NAME; | |||||
} else { | |||||
partName = part.getPartName(); | |||||
} | |||||
return PackagingURIHelper.getRelationshipPartName(partName); | |||||
} | |||||
/** | |||||
* Add the specified relationship to the collection. | |||||
* | |||||
* @param relPart | |||||
* The relationship to add. | |||||
*/ | |||||
public void addRelationship(PackageRelationship relPart) { | |||||
relationshipsByID.put(relPart.getId(), relPart); | |||||
relationshipsByType.put(relPart.getRelationshipType(), relPart); | |||||
} | |||||
/** | |||||
* Add a relationship to the collection. | |||||
* | |||||
* @param targetUri | |||||
* Target URI. | |||||
* @param targetMode | |||||
* The target mode : INTERNAL or EXTERNAL | |||||
* @param relationshipType | |||||
* Relationship type. | |||||
* @param id | |||||
* Relationship ID. | |||||
* @return The newly created relationship. | |||||
* @see PackageAccess | |||||
*/ | |||||
public PackageRelationship addRelationship(URI targetUri, | |||||
TargetMode targetMode, String relationshipType, String id) { | |||||
if (id == null) { | if (id == null) { | ||||
// Generate a unique ID is id parameter is null. | // Generate a unique ID is id parameter is null. | ||||
if (nextRelationshipId == -1) { | if (nextRelationshipId == -1) { | ||||
} while (relationshipsByID.get(id) != null); | } while (relationshipsByID.get(id) != null); | ||||
} | } | ||||
PackageRelationship rel = new PackageRelationship(container, | |||||
sourcePart, targetUri, targetMode, relationshipType, id); | |||||
relationshipsByID.put(rel.getId(), rel); | |||||
relationshipsByType.put(rel.getRelationshipType(), rel); | |||||
return rel; | |||||
} | |||||
/** | |||||
* Remove a relationship by its ID. | |||||
* | |||||
* @param id | |||||
* The relationship ID to remove. | |||||
*/ | |||||
public void removeRelationship(String id) { | |||||
if (relationshipsByID != null && relationshipsByType != null) { | |||||
PackageRelationship rel = relationshipsByID.get(id); | |||||
if (rel != null) { | |||||
relationshipsByID.remove(rel.getId()); | |||||
relationshipsByType.values().remove(rel); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Remove a relationship by its reference. | |||||
* | |||||
* @param rel | |||||
* The relationship to delete. | |||||
*/ | |||||
public void removeRelationship(PackageRelationship rel) { | |||||
if (rel == null) | |||||
throw new IllegalArgumentException("rel"); | |||||
relationshipsByID.values().remove(rel); | |||||
relationshipsByType.values().remove(rel); | |||||
} | |||||
/** | |||||
* Retrieves a relationship by its index in the collection. | |||||
* | |||||
* @param index | |||||
* Must be a value between [0-relationships_count-1] | |||||
*/ | |||||
public PackageRelationship getRelationship(int index) { | |||||
if (index < 0 || index > relationshipsByID.values().size()) | |||||
throw new IllegalArgumentException("index"); | |||||
PackageRelationship retRel = null; | |||||
int i = 0; | |||||
for (PackageRelationship rel : relationshipsByID.values()) { | |||||
if (index == i++) | |||||
return rel; | |||||
} | |||||
return retRel; | |||||
} | |||||
/** | |||||
* Retrieves a package relationship based on its id. | |||||
* | |||||
* @param id | |||||
* ID of the package relationship to retrieve. | |||||
* @return The package relationship identified by the specified id. | |||||
*/ | |||||
public PackageRelationship getRelationshipByID(String id) { | |||||
return relationshipsByID.get(id); | |||||
} | |||||
/** | |||||
* Get the numbe rof relationships in the collection. | |||||
*/ | |||||
public int size() { | |||||
return relationshipsByID.values().size(); | |||||
} | |||||
/** | |||||
* Parse the relationship part and add all relationship in this collection. | |||||
* | |||||
* @param relPart | |||||
* The package part to parse. | |||||
* @throws InvalidFormatException | |||||
* Throws if the relationship part is invalid. | |||||
*/ | |||||
private void parseRelationshipsPart(PackagePart relPart) | |||||
throws InvalidFormatException { | |||||
try { | |||||
SAXReader reader = new SAXReader(); | |||||
logger.log(POILogger.DEBUG, "Parsing relationship: " + relPart.getPartName()); | |||||
Document xmlRelationshipsDoc = reader | |||||
.read(relPart.getInputStream()); | |||||
// Browse default types | |||||
Element root = xmlRelationshipsDoc.getRootElement(); | |||||
// Check OPC compliance M4.1 rule | |||||
boolean fCorePropertiesRelationship = false; | |||||
for (Iterator i = root | |||||
.elementIterator(PackageRelationship.RELATIONSHIP_TAG_NAME); i | |||||
.hasNext();) { | |||||
Element element = (Element) i.next(); | |||||
// Relationship ID | |||||
String id = element.attribute( | |||||
PackageRelationship.ID_ATTRIBUTE_NAME).getValue(); | |||||
// Relationship type | |||||
String type = element.attribute( | |||||
PackageRelationship.TYPE_ATTRIBUTE_NAME).getValue(); | |||||
/* Check OPC Compliance */ | |||||
// Check Rule M4.1 | |||||
if (type.equals(PackageRelationshipTypes.CORE_PROPERTIES)) | |||||
if (!fCorePropertiesRelationship) | |||||
fCorePropertiesRelationship = true; | |||||
else | |||||
throw new InvalidFormatException( | |||||
"OPC Compliance error [M4.1]: there is more than one core properties relationship in the package !"); | |||||
/* End OPC Compliance */ | |||||
// TargetMode (default value "Internal") | |||||
Attribute targetModeAttr = element | |||||
.attribute(PackageRelationship.TARGET_MODE_ATTRIBUTE_NAME); | |||||
TargetMode targetMode = TargetMode.INTERNAL; | |||||
if (targetModeAttr != null) { | |||||
targetMode = targetModeAttr.getValue().toLowerCase() | |||||
.equals("internal") ? TargetMode.INTERNAL | |||||
: TargetMode.EXTERNAL; | |||||
} | |||||
// Target converted in URI | |||||
URI target; | |||||
String value = ""; | |||||
try { | |||||
value = element.attribute( | |||||
PackageRelationship.TARGET_ATTRIBUTE_NAME) | |||||
.getValue(); | |||||
PackageRelationship rel = new PackageRelationship(container, | |||||
sourcePart, targetUri, targetMode, relationshipType, id); | |||||
relationshipsByID.put(rel.getId(), rel); | |||||
relationshipsByType.put(rel.getRelationshipType(), rel); | |||||
return rel; | |||||
} | |||||
/** | |||||
* Remove a relationship by its ID. | |||||
* | |||||
* @param id | |||||
* The relationship ID to remove. | |||||
*/ | |||||
public void removeRelationship(String id) { | |||||
if (relationshipsByID != null && relationshipsByType != null) { | |||||
PackageRelationship rel = relationshipsByID.get(id); | |||||
if (rel != null) { | |||||
relationshipsByID.remove(rel.getId()); | |||||
relationshipsByType.values().remove(rel); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Remove a relationship by its reference. | |||||
* | |||||
* @param rel | |||||
* The relationship to delete. | |||||
*/ | |||||
public void removeRelationship(PackageRelationship rel) { | |||||
if (rel == null) | |||||
throw new IllegalArgumentException("rel"); | |||||
relationshipsByID.values().remove(rel); | |||||
relationshipsByType.values().remove(rel); | |||||
} | |||||
/** | |||||
* Retrieves a relationship by its index in the collection. | |||||
* | |||||
* @param index | |||||
* Must be a value between [0-relationships_count-1] | |||||
*/ | |||||
public PackageRelationship getRelationship(int index) { | |||||
if (index < 0 || index > relationshipsByID.values().size()) | |||||
throw new IllegalArgumentException("index"); | |||||
PackageRelationship retRel = null; | |||||
int i = 0; | |||||
for (PackageRelationship rel : relationshipsByID.values()) { | |||||
if (index == i++) | |||||
return rel; | |||||
} | |||||
return retRel; | |||||
} | |||||
/** | |||||
* Retrieves a package relationship based on its id. | |||||
* | |||||
* @param id | |||||
* ID of the package relationship to retrieve. | |||||
* @return The package relationship identified by the specified id. | |||||
*/ | |||||
public PackageRelationship getRelationshipByID(String id) { | |||||
return relationshipsByID.get(id); | |||||
} | |||||
/** | |||||
* Get the numbe rof relationships in the collection. | |||||
*/ | |||||
public int size() { | |||||
return relationshipsByID.values().size(); | |||||
} | |||||
/** | |||||
* Parse the relationship part and add all relationship in this collection. | |||||
* | |||||
* @param relPart | |||||
* The package part to parse. | |||||
* @throws InvalidFormatException | |||||
* Throws if the relationship part is invalid. | |||||
*/ | |||||
private void parseRelationshipsPart(PackagePart relPart) | |||||
throws InvalidFormatException { | |||||
try { | |||||
SAXReader reader = new SAXReader(); | |||||
logger.log(POILogger.DEBUG, "Parsing relationship: " + relPart.getPartName()); | |||||
Document xmlRelationshipsDoc = reader | |||||
.read(relPart.getInputStream()); | |||||
// Browse default types | |||||
Element root = xmlRelationshipsDoc.getRootElement(); | |||||
// Check OPC compliance M4.1 rule | |||||
boolean fCorePropertiesRelationship = false; | |||||
@SuppressWarnings("unchecked") | |||||
Iterator<Element> iter = (Iterator<Element>) | |||||
root.elementIterator(PackageRelationship.RELATIONSHIP_TAG_NAME); | |||||
while (iter.hasNext()) { | |||||
Element element = iter.next(); | |||||
// Relationship ID | |||||
String id = element.attribute( | |||||
PackageRelationship.ID_ATTRIBUTE_NAME).getValue(); | |||||
// Relationship type | |||||
String type = element.attribute( | |||||
PackageRelationship.TYPE_ATTRIBUTE_NAME).getValue(); | |||||
/* Check OPC Compliance */ | |||||
// Check Rule M4.1 | |||||
if (type.equals(PackageRelationshipTypes.CORE_PROPERTIES)) | |||||
if (!fCorePropertiesRelationship) | |||||
fCorePropertiesRelationship = true; | |||||
else | |||||
throw new InvalidFormatException( | |||||
"OPC Compliance error [M4.1]: there is more than one core properties relationship in the package !"); | |||||
/* End OPC Compliance */ | |||||
// TargetMode (default value "Internal") | |||||
Attribute targetModeAttr = element | |||||
.attribute(PackageRelationship.TARGET_MODE_ATTRIBUTE_NAME); | |||||
TargetMode targetMode = TargetMode.INTERNAL; | |||||
if (targetModeAttr != null) { | |||||
targetMode = targetModeAttr.getValue().toLowerCase() | |||||
.equals("internal") ? TargetMode.INTERNAL | |||||
: TargetMode.EXTERNAL; | |||||
} | |||||
// Target converted in URI | |||||
URI target = PackagingURIHelper.toURI("http://invalid.uri"); // dummy url | |||||
String value = element.attribute( | |||||
PackageRelationship.TARGET_ATTRIBUTE_NAME) | |||||
.getValue(); | |||||
try { | |||||
// when parsing of the given uri fails, we can either | |||||
// ignore this relationship, which leads to IllegalStateException | |||||
// later on, or use a dummy value and thus enable processing of the | |||||
// package | |||||
target = PackagingURIHelper.toURI(value); | target = PackagingURIHelper.toURI(value); | ||||
} catch (URISyntaxException e) { | |||||
logger.log(POILogger.ERROR, "Cannot convert " + value | |||||
+ " in a valid relationship URI-> ignored", e); | |||||
continue; | |||||
} | |||||
addRelationship(target, targetMode, type, id); | |||||
} | |||||
} catch (Exception e) { | |||||
logger.log(POILogger.ERROR, e); | |||||
throw new InvalidFormatException(e.getMessage()); | |||||
} | |||||
} | |||||
/** | |||||
* Retrieves all relations with the specified type. | |||||
* | |||||
* @param typeFilter | |||||
* Relationship type filter. If <b>null</b> then all | |||||
* relationships are returned. | |||||
* @return All relationships of the type specified by the filter. | |||||
*/ | |||||
public PackageRelationshipCollection getRelationships(String typeFilter) { | |||||
PackageRelationshipCollection coll = new PackageRelationshipCollection( | |||||
this, typeFilter); | |||||
return coll; | |||||
} | |||||
/** | |||||
* Get this collection's iterator. | |||||
*/ | |||||
public Iterator<PackageRelationship> iterator() { | |||||
return relationshipsByID.values().iterator(); | |||||
} | |||||
/** | |||||
* Get an iterator of a collection with all relationship with the specified | |||||
* type. | |||||
* | |||||
* @param typeFilter | |||||
* Type filter. | |||||
* @return An iterator to a collection containing all relationships with the | |||||
* specified type contain in this collection. | |||||
*/ | |||||
public Iterator<PackageRelationship> iterator(String typeFilter) { | |||||
ArrayList<PackageRelationship> retArr = new ArrayList<PackageRelationship>(); | |||||
for (PackageRelationship rel : relationshipsByID.values()) { | |||||
if (rel.getRelationshipType().equals(typeFilter)) | |||||
retArr.add(rel); | |||||
} | |||||
return retArr.iterator(); | |||||
} | |||||
/** | |||||
* Clear all relationships. | |||||
*/ | |||||
public void clear() { | |||||
relationshipsByID.clear(); | |||||
relationshipsByType.clear(); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
String str; | |||||
if (relationshipsByID == null) { | |||||
str = "relationshipsByID=null"; | |||||
} else { | |||||
str = relationshipsByID.size() + " relationship(s) = ["; | |||||
} | |||||
if ((relationshipPart != null) && (relationshipPart._partName != null)) { | |||||
str = str + "," + relationshipPart._partName; | |||||
} else { | |||||
str = str + ",relationshipPart=null"; | |||||
} | |||||
// Source of this relationship | |||||
if ((sourcePart != null) && (sourcePart._partName != null)) { | |||||
str = str + "," + sourcePart._partName; | |||||
} else { | |||||
str = str + ",sourcePart=null"; | |||||
} | |||||
if (partName != null) { | |||||
str = str + "," + partName; | |||||
} else { | |||||
str = str + ",uri=null)"; | |||||
} | |||||
return str + "]"; | |||||
} | |||||
} catch (URISyntaxException e) { | |||||
logger.log(POILogger.ERROR, "Cannot convert " + value | |||||
+ " in a valid relationship URI-> dummy-URI used", e); | |||||
} | |||||
addRelationship(target, targetMode, type, id); | |||||
} | |||||
} catch (Exception e) { | |||||
logger.log(POILogger.ERROR, e); | |||||
throw new InvalidFormatException(e.getMessage()); | |||||
} | |||||
} | |||||
/** | |||||
* Retrieves all relations with the specified type. | |||||
* | |||||
* @param typeFilter | |||||
* Relationship type filter. If <b>null</b> then all | |||||
* relationships are returned. | |||||
* @return All relationships of the type specified by the filter. | |||||
*/ | |||||
public PackageRelationshipCollection getRelationships(String typeFilter) { | |||||
PackageRelationshipCollection coll = new PackageRelationshipCollection( | |||||
this, typeFilter); | |||||
return coll; | |||||
} | |||||
/** | |||||
* Get this collection's iterator. | |||||
*/ | |||||
public Iterator<PackageRelationship> iterator() { | |||||
return relationshipsByID.values().iterator(); | |||||
} | |||||
/** | |||||
* Get an iterator of a collection with all relationship with the specified | |||||
* type. | |||||
* | |||||
* @param typeFilter | |||||
* Type filter. | |||||
* @return An iterator to a collection containing all relationships with the | |||||
* specified type contain in this collection. | |||||
*/ | |||||
public Iterator<PackageRelationship> iterator(String typeFilter) { | |||||
ArrayList<PackageRelationship> retArr = new ArrayList<PackageRelationship>(); | |||||
for (PackageRelationship rel : relationshipsByID.values()) { | |||||
if (rel.getRelationshipType().equals(typeFilter)) | |||||
retArr.add(rel); | |||||
} | |||||
return retArr.iterator(); | |||||
} | |||||
/** | |||||
* Clear all relationships. | |||||
*/ | |||||
public void clear() { | |||||
relationshipsByID.clear(); | |||||
relationshipsByType.clear(); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
String str; | |||||
if (relationshipsByID == null) { | |||||
str = "relationshipsByID=null"; | |||||
} else { | |||||
str = relationshipsByID.size() + " relationship(s) = ["; | |||||
} | |||||
if ((relationshipPart != null) && (relationshipPart._partName != null)) { | |||||
str = str + "," + relationshipPart._partName; | |||||
} else { | |||||
str = str + ",relationshipPart=null"; | |||||
} | |||||
// Source of this relationship | |||||
if ((sourcePart != null) && (sourcePart._partName != null)) { | |||||
str = str + "," + sourcePart._partName; | |||||
} else { | |||||
str = str + ",sourcePart=null"; | |||||
} | |||||
if (partName != null) { | |||||
str = str + "," + partName; | |||||
} else { | |||||
str = str + ",uri=null)"; | |||||
} | |||||
return str + "]"; | |||||
} | |||||
} | } |
import org.apache.poi.openxml4j.opc.PackagePartName; | import org.apache.poi.openxml4j.opc.PackagePartName; | ||||
import org.apache.poi.openxml4j.opc.PackageRelationship; | import org.apache.poi.openxml4j.opc.PackageRelationship; | ||||
import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; | import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; | ||||
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; | |||||
import org.apache.poi.openxml4j.opc.PackagingURIHelper; | import org.apache.poi.openxml4j.opc.PackagingURIHelper; | ||||
import org.apache.poi.util.POILogFactory; | import org.apache.poi.util.POILogFactory; | ||||
import org.apache.poi.util.POILogger; | import org.apache.poi.util.POILogger; | ||||
protected static Map<String, XSSFRelation> _table = new HashMap<String, XSSFRelation>(); | protected static Map<String, XSSFRelation> _table = new HashMap<String, XSSFRelation>(); | ||||
public static final XSSFRelation WORKBOOK = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/workbook", | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation MACROS_WORKBOOK = new XSSFRelation( | |||||
"application/vnd.ms-excel.sheet.macroEnabled.main+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation WORKBOOK = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/workbook", | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation MACROS_WORKBOOK = new XSSFRelation( | |||||
"application/vnd.ms-excel.sheet.macroEnabled.main+xml", | |||||
PackageRelationshipTypes.CORE_DOCUMENT, | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation TEMPLATE_WORKBOOK = new XSSFRelation( | public static final XSSFRelation TEMPLATE_WORKBOOK = new XSSFRelation( | ||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", | |||||
"/xl/workbook.xml", | |||||
null | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml", | |||||
PackageRelationshipTypes.CORE_DOCUMENT, | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | ); | ||||
public static final XSSFRelation MACRO_TEMPLATE_WORKBOOK = new XSSFRelation( | public static final XSSFRelation MACRO_TEMPLATE_WORKBOOK = new XSSFRelation( | ||||
"application/vnd.ms-excel.template.macroEnabled.main+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", | |||||
"/xl/workbook.xml", | |||||
null | |||||
"application/vnd.ms-excel.template.macroEnabled.main+xml", | |||||
PackageRelationshipTypes.CORE_DOCUMENT, | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | ); | ||||
public static final XSSFRelation MACRO_ADDIN_WORKBOOK = new XSSFRelation( | public static final XSSFRelation MACRO_ADDIN_WORKBOOK = new XSSFRelation( | ||||
"application/vnd.ms-excel.addin.macroEnabled.main+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation WORKSHEET = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", | |||||
"/xl/worksheets/sheet#.xml", | |||||
XSSFSheet.class | |||||
); | |||||
public static final XSSFRelation CHARTSHEET = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet", | |||||
"/xl/chartsheets/sheet#.xml", | |||||
XSSFChartSheet.class | |||||
); | |||||
public static final XSSFRelation SHARED_STRINGS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", | |||||
"/xl/sharedStrings.xml", | |||||
SharedStringsTable.class | |||||
); | |||||
public static final XSSFRelation STYLES = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", | |||||
"/xl/styles.xml", | |||||
StylesTable.class | |||||
); | |||||
public static final XSSFRelation DRAWINGS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.drawing+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", | |||||
"/xl/drawings/drawing#.xml", | |||||
XSSFDrawing.class | |||||
); | |||||
public static final XSSFRelation VML_DRAWINGS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.vmlDrawing", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", | |||||
"/xl/drawings/vmlDrawing#.vml", | |||||
XSSFVMLDrawing.class | |||||
); | |||||
public static final XSSFRelation CHART = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart", | |||||
"/xl/charts/chart#.xml", | |||||
XSSFChart.class | |||||
); | |||||
public static final XSSFRelation CUSTOM_XML_MAPPINGS = new XSSFRelation( | |||||
"application/xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps", | |||||
"/xl/xmlMaps.xml", | |||||
MapInfo.class | |||||
); | |||||
public static final XSSFRelation SINGLE_XML_CELLS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableSingleCells", | |||||
"/xl/tables/tableSingleCells#.xml", | |||||
SingleXmlCells.class | |||||
); | |||||
public static final XSSFRelation TABLE = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table", | |||||
"/xl/tables/table#.xml", | |||||
XSSFTable.class | |||||
); | |||||
"application/vnd.ms-excel.addin.macroEnabled.main+xml", | |||||
PackageRelationshipTypes.CORE_DOCUMENT, | |||||
"/xl/workbook.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation WORKSHEET = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", | |||||
"/xl/worksheets/sheet#.xml", | |||||
XSSFSheet.class | |||||
); | |||||
public static final XSSFRelation CHARTSHEET = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet", | |||||
"/xl/chartsheets/sheet#.xml", | |||||
XSSFChartSheet.class | |||||
); | |||||
public static final XSSFRelation SHARED_STRINGS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", | |||||
"/xl/sharedStrings.xml", | |||||
SharedStringsTable.class | |||||
); | |||||
public static final XSSFRelation STYLES = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", | |||||
PackageRelationshipTypes.STYLE_PART, | |||||
"/xl/styles.xml", | |||||
StylesTable.class | |||||
); | |||||
public static final XSSFRelation DRAWINGS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.drawing+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", | |||||
"/xl/drawings/drawing#.xml", | |||||
XSSFDrawing.class | |||||
); | |||||
public static final XSSFRelation VML_DRAWINGS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.vmlDrawing", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", | |||||
"/xl/drawings/vmlDrawing#.vml", | |||||
XSSFVMLDrawing.class | |||||
); | |||||
public static final XSSFRelation CHART = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart", | |||||
"/xl/charts/chart#.xml", | |||||
XSSFChart.class | |||||
); | |||||
public static final XSSFRelation CUSTOM_XML_MAPPINGS = new XSSFRelation( | |||||
"application/xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps", | |||||
"/xl/xmlMaps.xml", | |||||
MapInfo.class | |||||
); | |||||
public static final XSSFRelation SINGLE_XML_CELLS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableSingleCells", | |||||
"/xl/tables/tableSingleCells#.xml", | |||||
SingleXmlCells.class | |||||
); | |||||
public static final XSSFRelation TABLE = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table", | |||||
"/xl/tables/table#.xml", | |||||
XSSFTable.class | |||||
); | |||||
public static final XSSFRelation IMAGES = new XSSFRelation( | public static final XSSFRelation IMAGES = new XSSFRelation( | ||||
null, | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
null, | |||||
XSSFPictureData.class | |||||
null, | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
null, | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_EMF = new XSSFRelation( | public static final XSSFRelation IMAGE_EMF = new XSSFRelation( | ||||
"image/x-emf", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.emf", | |||||
XSSFPictureData.class | |||||
"image/x-emf", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.emf", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_WMF = new XSSFRelation( | public static final XSSFRelation IMAGE_WMF = new XSSFRelation( | ||||
"image/x-wmf", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.wmf", | |||||
XSSFPictureData.class | |||||
"image/x-wmf", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.wmf", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_PICT = new XSSFRelation( | public static final XSSFRelation IMAGE_PICT = new XSSFRelation( | ||||
"image/pict", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.pict", | |||||
XSSFPictureData.class | |||||
"image/pict", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.pict", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_JPEG = new XSSFRelation( | public static final XSSFRelation IMAGE_JPEG = new XSSFRelation( | ||||
"image/jpeg", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.jpeg", | |||||
XSSFPictureData.class | |||||
"image/jpeg", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.jpeg", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_PNG = new XSSFRelation( | public static final XSSFRelation IMAGE_PNG = new XSSFRelation( | ||||
"image/png", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.png", | |||||
XSSFPictureData.class | |||||
"image/png", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.png", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_DIB = new XSSFRelation( | public static final XSSFRelation IMAGE_DIB = new XSSFRelation( | ||||
"image/dib", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.dib", | |||||
XSSFPictureData.class | |||||
"image/dib", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.dib", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_GIF = new XSSFRelation( | public static final XSSFRelation IMAGE_GIF = new XSSFRelation( | ||||
"image/gif", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.gif", | |||||
XSSFPictureData.class | |||||
"image/gif", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.gif", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_TIFF = new XSSFRelation( | public static final XSSFRelation IMAGE_TIFF = new XSSFRelation( | ||||
"image/tiff", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.tiff", | |||||
XSSFPictureData.class | |||||
"image/tiff", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.tiff", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_EPS = new XSSFRelation( | public static final XSSFRelation IMAGE_EPS = new XSSFRelation( | ||||
"image/x-eps", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.eps", | |||||
XSSFPictureData.class | |||||
"image/x-eps", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.eps", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_BMP = new XSSFRelation( | public static final XSSFRelation IMAGE_BMP = new XSSFRelation( | ||||
"image/x-ms-bmp", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.bmp", | |||||
XSSFPictureData.class | |||||
"image/x-ms-bmp", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.bmp", | |||||
XSSFPictureData.class | |||||
); | ); | ||||
public static final XSSFRelation IMAGE_WPG = new XSSFRelation( | public static final XSSFRelation IMAGE_WPG = new XSSFRelation( | ||||
"image/x-wpg", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", | |||||
"/xl/media/image#.wpg", | |||||
XSSFPictureData.class | |||||
); | |||||
public static final XSSFRelation SHEET_COMMENTS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", | |||||
"/xl/comments#.xml", | |||||
CommentsTable.class | |||||
); | |||||
public static final XSSFRelation SHEET_HYPERLINKS = new XSSFRelation( | |||||
null, | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", | |||||
null, | |||||
null | |||||
); | |||||
public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation( | |||||
null, | |||||
POIXMLDocument.OLE_OBJECT_REL_TYPE, | |||||
null, | |||||
null | |||||
); | |||||
public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation( | |||||
null, | |||||
POIXMLDocument.PACK_OBJECT_REL_TYPE, | |||||
null, | |||||
null | |||||
); | |||||
public static final XSSFRelation VBA_MACROS = new XSSFRelation( | |||||
"application/vnd.ms-office.vbaProject", | |||||
"http://schemas.microsoft.com/office/2006/relationships/vbaProject", | |||||
"/xl/vbaProject.bin", | |||||
null | |||||
); | |||||
public static final XSSFRelation ACTIVEX_CONTROLS = new XSSFRelation( | |||||
"application/vnd.ms-office.activeX+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/control", | |||||
"/xl/activeX/activeX#.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation ACTIVEX_BINS = new XSSFRelation( | |||||
"application/vnd.ms-office.activeX", | |||||
"http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary", | |||||
"/xl/activeX/activeX#.bin", | |||||
null | |||||
); | |||||
"image/x-wpg", | |||||
PackageRelationshipTypes.IMAGE_PART, | |||||
"/xl/media/image#.wpg", | |||||
XSSFPictureData.class | |||||
); | |||||
public static final XSSFRelation SHEET_COMMENTS = new XSSFRelation( | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", | |||||
"/xl/comments#.xml", | |||||
CommentsTable.class | |||||
); | |||||
public static final XSSFRelation SHEET_HYPERLINKS = new XSSFRelation( | |||||
null, | |||||
PackageRelationshipTypes.HYPERLINK_PART, | |||||
null, | |||||
null | |||||
); | |||||
public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation( | |||||
null, | |||||
POIXMLDocument.OLE_OBJECT_REL_TYPE, | |||||
null, | |||||
null | |||||
); | |||||
public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation( | |||||
null, | |||||
POIXMLDocument.PACK_OBJECT_REL_TYPE, | |||||
null, | |||||
null | |||||
); | |||||
public static final XSSFRelation VBA_MACROS = new XSSFRelation( | |||||
"application/vnd.ms-office.vbaProject", | |||||
"http://schemas.microsoft.com/office/2006/relationships/vbaProject", | |||||
"/xl/vbaProject.bin", | |||||
null | |||||
); | |||||
public static final XSSFRelation ACTIVEX_CONTROLS = new XSSFRelation( | |||||
"application/vnd.ms-office.activeX+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/control", | |||||
"/xl/activeX/activeX#.xml", | |||||
null | |||||
); | |||||
public static final XSSFRelation ACTIVEX_BINS = new XSSFRelation( | |||||
"application/vnd.ms-office.activeX", | |||||
"http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary", | |||||
"/xl/activeX/activeX#.bin", | |||||
null | |||||
); | |||||
public static final XSSFRelation THEME = new XSSFRelation( | public static final XSSFRelation THEME = new XSSFRelation( | ||||
"application/vnd.openxmlformats-officedocument.theme+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", | |||||
"/xl/theme/theme#.xml", | |||||
ThemesTable.class | |||||
"application/vnd.openxmlformats-officedocument.theme+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", | |||||
"/xl/theme/theme#.xml", | |||||
ThemesTable.class | |||||
); | ); | ||||
public static final XSSFRelation CALC_CHAIN = new XSSFRelation( | public static final XSSFRelation CALC_CHAIN = new XSSFRelation( | ||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain", | |||||
"/xl/calcChain.xml", | |||||
CalculationChain.class | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain", | |||||
"/xl/calcChain.xml", | |||||
CalculationChain.class | |||||
); | ); | ||||
public static final XSSFRelation PRINTER_SETTINGS = new XSSFRelation( | public static final XSSFRelation PRINTER_SETTINGS = new XSSFRelation( | ||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings", | |||||
"/xl/printerSettings/printerSettings#.bin", | |||||
null | |||||
); | |||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings", | |||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings", | |||||
"/xl/printerSettings/printerSettings#.bin", | |||||
null | |||||
); | |||||
private XSSFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) { | |||||
private XSSFRelation(String type, String rel, String defaultName, Class<? extends POIXMLDocumentPart> cls) { | |||||
super(type, rel, defaultName, cls); | super(type, rel, defaultName, cls); | ||||
if(cls != null && !_table.containsKey(rel)) _table.put(rel, this); | if(cls != null && !_table.containsKey(rel)) _table.put(rel, this); | ||||
} | } | ||||
/** | /** | ||||
* Fetches the InputStream to read the contents, based | |||||
* of the specified core part, for which we are defined | |||||
* as a suitable relationship | |||||
*/ | |||||
public InputStream getContents(PackagePart corePart) throws IOException, InvalidFormatException { | |||||
* Fetches the InputStream to read the contents, based | |||||
* of the specified core part, for which we are defined | |||||
* as a suitable relationship | |||||
*/ | |||||
public InputStream getContents(PackagePart corePart) throws IOException, InvalidFormatException { | |||||
PackageRelationshipCollection prc = | PackageRelationshipCollection prc = | ||||
corePart.getRelationshipsByType(_relation); | |||||
corePart.getRelationshipsByType(_relation); | |||||
Iterator<PackageRelationship> it = prc.iterator(); | Iterator<PackageRelationship> it = prc.iterator(); | ||||
if(it.hasNext()) { | if(it.hasNext()) { | ||||
PackageRelationship rel = it.next(); | PackageRelationship rel = it.next(); | ||||
} | } | ||||
log.log(POILogger.WARN, "No part " + _defaultName + " found"); | log.log(POILogger.WARN, "No part " + _defaultName + " found"); | ||||
return null; | return null; | ||||
} | |||||
} | |||||
/** | /** | ||||
* Get POIXMLRelation by relation type | * Get POIXMLRelation by relation type |
import java.io.ByteArrayInputStream; | import java.io.ByteArrayInputStream; | ||||
import java.io.ByteArrayOutputStream; | import java.io.ByteArrayOutputStream; | ||||
import java.io.InputStream; | |||||
import java.util.List; | import java.util.List; | ||||
import org.apache.poi.EncryptedDocumentException; | import org.apache.poi.EncryptedDocumentException; | ||||
* error message when called via WorkbookFactory. | * error message when called via WorkbookFactory. | ||||
* (You need to supply a password explicitly for them) | * (You need to supply a password explicitly for them) | ||||
*/ | */ | ||||
@Test(expected=EncryptedDocumentException.class) | |||||
public void bug55692_stream() throws Exception { | |||||
// Directly on a Stream | |||||
WorkbookFactory.create(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx")); | |||||
} | |||||
@Test(expected=EncryptedDocumentException.class) | |||||
public void bug55692_poifs() throws Exception { | |||||
// Via a POIFSFileSystem | |||||
POIFSFileSystem fsP = new POIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx")); | |||||
WorkbookFactory.create(fsP); | |||||
} | |||||
@Test(expected=EncryptedDocumentException.class) | |||||
public void bug55692_npoifs() throws Exception { | |||||
// Via a NPOIFSFileSystem | |||||
NPOIFSFileSystem fsNP = new NPOIFSFileSystem(POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx")); | |||||
WorkbookFactory.create(fsNP); | |||||
} | |||||
@Test | @Test | ||||
public void bug55692() throws Exception { | |||||
InputStream inpA = POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"); | |||||
InputStream inpB = POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"); | |||||
InputStream inpC = POIDataSamples.getPOIFSInstance().openResourceAsStream("protect.xlsx"); | |||||
// Directly on a Stream | |||||
try { | |||||
WorkbookFactory.create(inpA); | |||||
fail("Should've raised a EncryptedDocumentException error"); | |||||
} catch (EncryptedDocumentException e) {} | |||||
// Via a POIFSFileSystem | |||||
POIFSFileSystem fsP = new POIFSFileSystem(inpB); | |||||
try { | |||||
WorkbookFactory.create(fsP); | |||||
fail("Should've raised a EncryptedDocumentException error"); | |||||
} catch (EncryptedDocumentException e) {} | |||||
// Via a NPOIFSFileSystem | |||||
NPOIFSFileSystem fsNP = new NPOIFSFileSystem(inpC); | |||||
try { | |||||
WorkbookFactory.create(fsNP); | |||||
fail("Should've raised a EncryptedDocumentException error"); | |||||
} catch (EncryptedDocumentException e) {} | |||||
public void bug53282() { | |||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("53282b.xlsx"); | |||||
Cell c = wb.getSheetAt(0).getRow(1).getCell(0); | |||||
assertEquals("#@_#", c.getStringCellValue()); | |||||
assertEquals("http://invalid.uri", c.getHyperlink().getAddress()); | |||||
} | } | ||||
} | } |