Index: src/java/org/apache/poi/ddf/EscherSplitMenuColorsRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherSplitMenuColorsRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherSplitMenuColorsRecord.java (revision ) @@ -99,6 +99,18 @@ ""; } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_1_color1)).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_2_color2)).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_3_color3)).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_4_color4)).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + public int getColor1() { return field_1_color1; Index: src/java/org/apache/poi/ddf/EscherMetafileBlip.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherMetafileBlip.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherMetafileBlip.java (revision ) @@ -262,6 +262,25 @@ " Remaining Data: " + HexDump.toHex(remainingData, 32))); } + @Override + public String toXml(String tab) { + String extraData = ""; + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_1_UID ) + '\n' + + (field_2_UID == null ? "" : (" UID2: 0x" + HexDump.toHex( field_2_UID ) + '\n'))).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_2_cb )).append("\n") + .append(tab).append("\t").append("").append(getBounds()).append("\n") + .append(tab).append("\t").append("").append(getSizeEMU()).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_5_cbSave )).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_6_fCompression )).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_7_fFilter )).append("\n") + .append(tab).append("\t").append("").append(extraData).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex(remainingData, 32)).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Return the blip signature * Index: src/java/org/apache/poi/ddf/EscherBlipRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherBlipRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherBlipRecord.java (revision ) @@ -81,4 +81,14 @@ " Instance: 0x" + HexDump.toHex( getInstance() ) + '\n' + " Extra Data:" + '\n' + extraData; } + + @Override + public String toXml(String tab) { + String extraData = HexDump.toHex(field_pictureData, 32); + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(extraData).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java (revision ) @@ -97,6 +97,18 @@ } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(field_1_dx1).append("\n") + .append(tab).append("\t").append("").append(field_2_dy1).append("\n") + .append(tab).append("\t").append("").append(field_3_dx2).append("\n") + .append(tab).append("\t").append("").append(field_4_dy2).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Retrieves offset within the parent coordinate space for the top left point. */ Index: src/java/org/apache/poi/ddf/EscherSpRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherSpRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherSpRecord.java (revision ) @@ -115,6 +115,17 @@ } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(HexDump.toHex(getShapeType())).append("\n") + .append(tab).append("\t").append("").append(field_1_shapeId).append("\n") + .append(tab).append("\t").append("").append(decodeFlags(field_2_flags) + " (0x" + HexDump.toHex(field_2_flags) + ")").append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Converts the shape flags into a more descriptive name. */ Index: src/java/org/apache/poi/ddf/UnknownEscherRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/UnknownEscherRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/UnknownEscherRecord.java (revision ) @@ -18,6 +18,7 @@ package org.apache.poi.ddf; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.apache.poi.util.HexDump; @@ -141,6 +142,24 @@ " numchildren: " + getChildRecords().size() + '\n' + theDumpHex + children.toString(); + } + + @Override + public String toXml(String tab) { + String theDumpHex = HexDump.toHex(thedata, 32); + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(isContainerRecord()).append("\n") + .append(tab).append("\t").append("").append(HexDump.toHex(_childRecords.size())).append("\n"); + for ( Iterator iterator = _childRecords.iterator(); iterator + .hasNext(); ) + { + EscherRecord record = iterator.next(); + builder.append(record.toXml(tab+"\t")); + } + builder.append(theDumpHex).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); } public void addChildRecord(EscherRecord childRecord) { Index: src/java/org/apache/poi/ddf/EscherDgRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherDgRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherDgRecord.java (revision ) @@ -92,7 +92,16 @@ " Instance: 0x" + HexDump.toHex(getInstance()) + '\n' + " NumShapes: " + field_1_numShapes + '\n' + " LastMSOSPID: " + field_2_lastMSOSPID + '\n'; + } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(field_1_numShapes).append("\n") + .append(tab).append("\t").append("").append(field_2_lastMSOSPID).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); } /** Index: src/java/org/apache/poi/hssf/record/EscherAggregate.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/hssf/record/EscherAggregate.java (revision 1326537) +++ src/java/org/apache/poi/hssf/record/EscherAggregate.java (revision ) @@ -329,7 +329,19 @@ return result.toString(); } - + + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getRecordName()).append(">\n"); + for ( Iterator iterator = getEscherRecords().iterator(); iterator.hasNext(); ) + { + EscherRecord escherRecord = (EscherRecord) iterator.next(); + builder.append( escherRecord.toXml(tab+"\t") ); + } + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Collapses the drawing records into an aggregate. */ Index: src/java/org/apache/poi/ddf/EscherOptRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherOptRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherOptRecord.java (revision ) @@ -16,6 +16,7 @@ ==================================================================== */ package org.apache.poi.ddf; +import org.apache.poi.util.HexDump; import org.apache.poi.util.Internal; /** @@ -70,5 +71,16 @@ + " can have only '0x3' version" ); super.setVersion( value ); + } + + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))); + for (EscherProperty property: getEscherProperties()){ + builder.append(property.toXml(tab+"\t")); + } + builder.append(tab).append("\n"); + return builder.toString(); } } Index: src/java/org/apache/poi/ddf/EscherClientDataRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherClientDataRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherClientDataRecord.java (revision ) @@ -99,6 +99,30 @@ } + @Override + public String toXml(String tab) { + String extraData; + ByteArrayOutputStream b = new ByteArrayOutputStream(); + try + { + HexDump.dump(this.remainingData, 0, b, 0); + extraData = b.toString(); + } + catch ( Exception e ) + { + extraData = "error"; + } + if (extraData.contains("No Data")){ + extraData = "No Data"; + } + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), + HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(extraData).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Any data recording this record. */ Index: src/java/org/apache/poi/ddf/EscherBSERecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherBSERecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherBSERecord.java (revision ) @@ -330,6 +330,25 @@ " Extra Data:" + '\n' + extraData; } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(field_1_blipTypeWin32).append("\n") + .append(tab).append("\t").append("").append(field_2_blipTypeMacOS).append("\n") + .append(tab).append("\t").append("").append(field_3_uid == null ? "" : HexDump.toHex(field_3_uid)).append("\n") + .append(tab).append("\t").append("").append(field_4_tag).append("\n") + .append(tab).append("\t").append("").append(field_5_size).append("\n") + .append(tab).append("\t").append("").append(field_6_ref).append("\n") + .append(tab).append("\t").append("").append(field_7_offset).append("\n") + .append(tab).append("\t").append("").append(field_8_usage).append("\n") + .append(tab).append("\t").append("").append(field_9_name).append("\n") + .append(tab).append("\t").append("").append(field_10_unused2).append("\n") + .append(tab).append("\t").append("").append(field_11_unused3).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Retrieve the string representation given a blip id. */ Index: src/java/org/apache/poi/ddf/EscherComplexProperty.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherComplexProperty.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherComplexProperty.java (revision ) @@ -134,4 +134,14 @@ + ", data: " + System.getProperty("line.separator") + dataStr; } + public String toXml(String tab){ + String dataStr = HexDump.toHex( _complexData, 32); + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId())) + .append("\" name=\"").append(getName()).append("\" blipId=\"") + .append(isBlipId()).append("\">\n"); + builder.append("\t").append(tab).append(dataStr); + builder.append(tab).append("<").append(getClass().getSimpleName()).append("/>\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherRecord.java (revision ) @@ -22,10 +22,7 @@ import java.util.Collections; import java.util.List; -import org.apache.poi.util.BitField; -import org.apache.poi.util.BitFieldFactory; -import org.apache.poi.util.Internal; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.*; /** * The base abstract record from which all escher records are defined. Subclasses will need @@ -296,5 +293,29 @@ public void setVersion( short value ) { _options = fVersion.setShortValue( _options, value ); + } + + /** + * @param tab - each children must be a right of his parent + * @return + */ + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(">\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex(_recordId)).append("\n") + .append(tab).append("\t").append("").append(_options).append("\n") + .append(tab).append("\n"); + return builder.toString(); + } + + protected String formatXmlRecordHeader(String className, String recordId, String version, String instance){ + StringBuilder builder = new StringBuilder(); + builder.append("<").append(className).append(" recordId=\"0x").append(recordId).append("\" version=\"0x") + .append(version).append("\" instance=\"0x").append(instance).append("\">\n"); + return builder.toString(); + } + + public String toXml(){ + return toXml(""); } } Index: src/java/org/apache/poi/ddf/EscherPictBlip.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherPictBlip.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherPictBlip.java (revision ) @@ -213,4 +213,21 @@ " Filter: " + HexDump.toHex( field_7_fFilter ) + '\n' + " Extra Data:" + '\n' + extraData; } + + @Override + public String toXml(String tab) { + String extraData = ""; + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_1_UID )).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_2_cb )).append("\n") + .append(tab).append("\t").append("").append(getBounds()).append("\n") + .append(tab).append("\t").append("").append(getSizeEMU()).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_5_cbSave )).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_6_fCompression )).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex( field_7_fFilter )).append("\n") + .append(tab).append("\t").append("").append(extraData).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java (revision ) @@ -160,6 +160,38 @@ } + @Override + public String toXml(String tab) { + String extraData; + ByteArrayOutputStream b = new ByteArrayOutputStream(); + try + { + HexDump.dump(this.remainingData, 0, b, 0); + extraData = b.toString(); + } + catch ( Exception e ) + { + extraData = "error\n"; + } + if (extraData.contains("No Data")){ + extraData = "No Data"; + } + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(field_1_flag).append("\n") + .append(tab).append("\t").append("").append(field_2_col1).append("\n") + .append(tab).append("\t").append("").append(field_3_dx1).append("\n") + .append(tab).append("\t").append("").append(field_4_row1).append("\n") + .append(tab).append("\t").append("").append(field_5_dy1).append("\n") + .append(tab).append("\t").append("").append(field_6_col2).append("\n") + .append(tab).append("\t").append("").append(field_7_dx2).append("\n") + .append(tab).append("\t").append("").append(field_8_row2).append("\n") + .append(tab).append("\t").append("").append(field_9_dy2).append("\n") + .append(tab).append("\t").append("").append(extraData).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells. */ Index: src/java/org/apache/poi/ddf/EscherBoolProperty.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherBoolProperty.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherBoolProperty.java (revision ) @@ -18,6 +18,8 @@ package org.apache.poi.ddf; +import org.apache.poi.util.HexDump; + /** * Represents a boolean property. The actual utility of this property is in doubt because many * of the properties marked as boolean seem to actually contain special values. In other words @@ -65,4 +67,11 @@ // + ", value: " + (getValue() != 0); // } + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId())) + .append("\" name=\"").append(getName()).append("\" blipId=\"") + .append(isBlipId()).append("\" value=\"").append(isTrue()).append("\"").append("/>\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherProperty.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherProperty.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherProperty.java (revision ) @@ -72,7 +72,14 @@ public int getPropertySize() { return 6; } - + + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"").append(getId()).append("\" name=\"").append(getName()).append("\" blipId=\"") + .append(isBlipId()).append("\"/>\n"); + return builder.toString(); + } + /** * Escher properties consist of a simple fixed length part and a complex variable length part. * The fixed length part is serialized first. Index: src/java/org/apache/poi/ddf/EscherArrayProperty.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherArrayProperty.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherArrayProperty.java (revision ) @@ -135,6 +135,18 @@ + ", data: " + '\n' + results.toString(); } + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId())) + .append("\" name=\"").append(getName()).append("\" blipId=\"") + .append(isBlipId()).append("\">\n"); + for (int i = 0; i < getNumberOfElementsInArray(); i++) { + builder.append("\t").append(tab).append("").append(HexDump.toHex(getElement(i))).append("\n"); + } + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * We have this method because the way in which arrays in escher works * is screwed for seemly arbitary reasons. While most properties are Index: src/java/org/apache/poi/ddf/EscherBitmapBlip.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherBitmapBlip.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherBitmapBlip.java (revision ) @@ -114,4 +114,26 @@ " Marker: 0x" + HexDump.toHex( field_2_marker ) + nl + " Extra Data:" + nl + extraData; } + + @Override + public String toXml(String tab) { + String extraData; + ByteArrayOutputStream b = new ByteArrayOutputStream(); + try + { + HexDump.dump( this.field_pictureData, 0, b, 0 ); + extraData = b.toString(); + } + catch ( Exception e ) + { + extraData = e.toString(); + } + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_1_UID)).append("\n") + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_2_marker)).append("\n") + .append(tab).append("\t").append("").append(extraData).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherDggRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherDggRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherDggRecord.java (revision ) @@ -142,6 +142,18 @@ } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(field_1_shapeIdMax).append("\n") + .append(tab).append("\t").append("").append(getNumIdClusters()).append("\n") + .append(tab).append("\t").append("").append(field_3_numShapesSaved).append("\n") + .append(tab).append("\t").append("").append(field_4_drawingsSaved).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + public int getShapeIdMax() { return field_1_shapeIdMax; } Index: src/java/org/apache/poi/ddf/EscherSpgrRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherSpgrRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherSpgrRecord.java (revision ) @@ -97,6 +97,18 @@ " RectHeight: " + field_4_rectY2 + '\n'; } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(field_1_rectX1).append("\n") + .append(tab).append("\t").append("").append(field_2_rectY1).append("\n") + .append(tab).append("\t").append("").append(field_3_rectX2).append("\n") + .append(tab).append("\t").append("").append(field_4_rectY2).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * The starting top-left coordinate of child records. */ Index: src/java/org/apache/poi/ddf/EscherRGBProperty.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherRGBProperty.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherRGBProperty.java (revision ) @@ -17,6 +17,8 @@ package org.apache.poi.ddf; +import org.apache.poi.util.HexDump; + /** * A color property. * @@ -51,4 +53,11 @@ return (byte) ( (propertyValue >> 16) & 0xFF ); } + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId())) + .append("\" name=\"").append(getName()).append("\" blipId=\"") + .append(isBlipId()).append("\" value=\"0x").append(HexDump.toHex(propertyValue)).append("\"/>\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherBlipWMFRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherBlipWMFRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherBlipWMFRecord.java (revision ) @@ -350,6 +350,37 @@ " Data:" + nl + extraData; } + @Override + public String toXml(String tab) { + String extraData; + ByteArrayOutputStream b = new ByteArrayOutputStream(); + try + { + HexDump.dump( this.field_12_data, 0, b, 0 ); + extraData = b.toString(); + } + catch ( Exception e ) + { + extraData = e.toString(); + } + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("0x").append(HexDump.toHex(field_1_secondaryUID)).append("\n") + .append(tab).append("\t").append("").append(field_2_cacheOfSize).append("\n") + .append(tab).append("\t").append("").append(field_3_boundaryTop).append("\n") + .append(tab).append("\t").append("").append(field_4_boundaryLeft).append("\n") + .append(tab).append("\t").append("").append(field_5_boundaryWidth).append("\n") + .append(tab).append("\t").append("").append(field_6_boundaryHeight).append("\n") + .append(tab).append("\t").append("").append(field_7_width).append("\n") + .append(tab).append("\t").append("").append(field_8_height).append("\n") + .append(tab).append("\t").append("").append(field_9_cacheOfSavedSize).append("\n") + .append(tab).append("\t").append("").append(field_10_compressionFlag).append("\n") + .append(tab).append("\t").append("").append(field_11_filter).append("\n") + .append(tab).append("\t").append("").append(extraData).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } + /** * Compress the contents of the provided array * Index: src/java/org/apache/poi/ddf/EscherSimpleProperty.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherSimpleProperty.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherSimpleProperty.java (revision ) @@ -118,4 +118,12 @@ + ", value: " + propertyValue + " (0x" + HexDump.toHex(propertyValue) + ")"; } + public String toXml(String tab){ + StringBuilder builder = new StringBuilder(); + builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId())) + .append("\" name=\"").append(getName()).append("\" blipId=\"") + .append(isBlipId()).append("\" complex=\"").append(isComplex()).append("\" value=\"").append("0x") + .append(HexDump.toHex(propertyValue)).append("\"/>\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java (revision ) @@ -176,4 +176,16 @@ return stringBuilder.toString(); } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(getChildRecords().size()).append("\n") + .append(tab).append("\t").append("").append(isContainerRecord()).append("\n"); + for (EscherProperty property: getEscherProperties()){ + builder.append(property.toXml(tab+"\t")); + } + builder.append(tab).append("\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/ddf/EscherContainerRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherContainerRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherContainerRecord.java (revision ) @@ -255,6 +255,23 @@ + children.toString(); } + @Override + public String toXml(String tab) { + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(getRecordName()).append("\n") + .append(tab).append("\t").append("").append(isContainerRecord()).append("\n") + .append(tab).append("\t").append("").append(HexDump.toHex(_childRecords.size())).append("\n"); + for ( Iterator iterator = _childRecords.iterator(); iterator + .hasNext(); ) + { + EscherRecord record = iterator.next(); + builder.append(record.toXml(tab+"\t")); + } + builder.append(tab).append("\n"); + return builder.toString(); + } + public T getChildById( short recordId ) { for ( EscherRecord childRecord : _childRecords ) Index: src/java/org/apache/poi/ddf/EscherTextboxRecord.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/ddf/EscherTextboxRecord.java (revision 1326537) +++ src/java/org/apache/poi/ddf/EscherTextboxRecord.java (revision ) @@ -139,6 +139,28 @@ theDumpHex; } + @Override + public String toXml(String tab) { + String theDumpHex = ""; + try + { + if (thedata.length != 0) + { + theDumpHex += HexDump.dump(thedata, 0, 0); + } + } + catch ( Exception e ) + { + theDumpHex = "Error!!"; + } + StringBuilder builder = new StringBuilder(); + builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance()))) + .append(tab).append("\t").append("").append(isContainerRecord()).append("\n") + .append(tab).append("\t").append("").append(getChildRecords().size()).append("\n") + .append(tab).append("\t").append("").append(theDumpHex).append("\n"); + builder.append(tab).append("\n"); + return builder.toString(); + } } Index: src/java/org/apache/poi/hssf/dev/BiffDrawingToXml.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/hssf/dev/BiffDrawingToXml.java (revision ) +++ src/java/org/apache/poi/hssf/dev/BiffDrawingToXml.java (revision ) @@ -0,0 +1,163 @@ +package org.apache.poi.hssf.dev; + +import org.apache.poi.ddf.EscherRecord; +import org.apache.poi.hssf.model.InternalWorkbook; +import org.apache.poi.hssf.record.*; +import org.apache.poi.hssf.usermodel.HSSFPatriarch; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + +import java.io.*; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * Utility for representing drawings contained in a binary Excel file as a XML tree + * + * @author Evgeniy Berlog + * date: 10.04.12 + */ +public class BiffDrawingToXml { + + private static final String SHEET_NAME_PARAM = "-sheet-name"; + private static final String SHEET_INDEXES_PARAM = "-sheet-indexes"; + private static final String EXCLUDE_WORKBOOK_RECORDS = "-exclude-workbook"; + + private static int getAttributeIndex(String attribute, String[] params) { + for (int i = 0; i < params.length; i++) { + String param = params[i]; + if (attribute.equals(param)) { + return i; + } + } + return -1; + } + + private static boolean isExcludeWorkbookRecords(String[] params) { + return -1 != getAttributeIndex(EXCLUDE_WORKBOOK_RECORDS, params); + } + + private static List getIndexesByName(String[] params, HSSFWorkbook workbook) { + List list = new ArrayList(); + int pos = getAttributeIndex(SHEET_NAME_PARAM, params); + if (-1 != pos) { + if (pos >= params.length) { + throw new IllegalArgumentException("sheet name param value was not specified"); + } + String sheetName = params[pos + 1]; + int sheetPos = workbook.getSheetIndex(sheetName); + if (-1 == sheetPos){ + throw new IllegalArgumentException("specified sheet name has not been found in xls file"); + } + list.add(sheetPos); + } + return list; + } + + private static List getIndexesByIdArray(String[] params) { + List list = new ArrayList(); + int pos = getAttributeIndex(SHEET_INDEXES_PARAM, params); + if (-1 != pos) { + if (pos >= params.length) { + throw new IllegalArgumentException("sheet list value was not specified"); + } + String sheetParam = params[pos + 1]; + String[] sheets = sheetParam.split(","); + for (String sheet : sheets) { + list.add(Integer.parseInt(sheet)); + } + } + return list; + } + + private static List getSheetsIndexes(String[] params, HSSFWorkbook workbook) { + List list = new ArrayList(); + list.addAll(getIndexesByIdArray(params)); + list.addAll(getIndexesByName(params, workbook)); + if (0 == list.size()) { + int size = workbook.getNumberOfSheets(); + for (int i = 0; i < size; i++) { + list.add(i); + } + } + return list; + } + + private static String getInputFileName(String[] params) { + return params[params.length - 1]; + } + + private static String getOutputFileName(String input) { + if (input.contains("xls")) { + return input.replace(".xls", ".xml"); + } + return input + ".xml"; + } + + public static void main(String[] params) throws IOException { + if (0 == params.length) { + throw new IllegalArgumentException("source file must be specified"); + } + String input = getInputFileName(params); + FileInputStream inp = new FileInputStream(input); + String output = getOutputFileName(input); + FileOutputStream outputStream = new FileOutputStream(output); + writeToFile(outputStream, inp, isExcludeWorkbookRecords(params), params); + } + + public static void writeToFile(FileOutputStream fos, InputStream xlsWorkbook, boolean excludeWorkbookRecords, String[] params) throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(xlsWorkbook); + HSSFWorkbook workbook = new HSSFWorkbook(fs); + InternalWorkbook internalWorkbook = getInternalWorkbook(workbook); + DrawingGroupRecord r = (DrawingGroupRecord) internalWorkbook.findFirstRecordBySid(DrawingGroupRecord.sid); + r.decode(); + + StringBuilder builder = new StringBuilder(); + builder.append("\n"); + String tab = "\t"; + if (!excludeWorkbookRecords) { + List escherRecords = r.getEscherRecords(); + for (EscherRecord record : escherRecords) { + builder.append(record.toXml(tab)); + } + } + List sheets = getSheetsIndexes(params, workbook); + for (Integer i : sheets) { + builder.append(tab).append("\n"); + builder.append(getHSSFPatriarchBoundAggregate(workbook.getSheetAt(i).getDrawingPatriarch()).toXml(tab + "\t")); + builder.append(tab).append("\n"); + } + builder.append("\n"); + fos.write(builder.toString().getBytes()); + fos.close(); + } + + private static EscherAggregate getHSSFPatriarchBoundAggregate(HSSFPatriarch patriarch) { + Field boundAggregateField = null; + try { + boundAggregateField = patriarch.getClass().getDeclaredField("_boundAggregate"); + boundAggregateField.setAccessible(true); + return (EscherAggregate) boundAggregateField.get(patriarch); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + private static InternalWorkbook getInternalWorkbook(HSSFWorkbook workbook) { + Field internalSheetField = null; + try { + internalSheetField = workbook.getClass().getDeclaredField("workbook"); + internalSheetField.setAccessible(true); + return (InternalWorkbook) internalSheetField.get(workbook); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } +}