Changeset 1449
- Timestamp:
- 03/06/11 04:28:14 (15 months ago)
- Location:
- trunk/docx4j/src/main/java/org/docx4j
- Files:
-
- 6 edited
-
model/datastorage/BindingHandler.java (modified) (10 diffs)
-
model/datastorage/OpenDoPEHandler.java (modified) (2 diffs)
-
model/datastorage/bind.xslt (modified) (2 diffs)
-
openpackaging/io/Load.java (modified) (3 diffs)
-
openpackaging/parts/DocPropsCorePart.java (modified) (3 diffs)
-
openpackaging/parts/DocPropsExtendedPart.java (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/docx4j/src/main/java/org/docx4j/model/datastorage/BindingHandler.java
r1441 r1449 9 9 import javax.xml.bind.JAXBException; 10 10 import javax.xml.bind.Unmarshaller; 11 import javax.xml.parsers.DocumentBuilderFactory; 11 12 import javax.xml.transform.Source; 12 13 import javax.xml.transform.Templates; 13 14 import javax.xml.transform.TransformerConfigurationException; 14 15 import javax.xml.transform.stream.StreamSource; 16 import javax.xml.xpath.XPath; 17 import javax.xml.xpath.XPathFactory; 15 18 16 19 import org.apache.commons.codec.binary.Base64; … … 19 22 import org.docx4j.dml.wordprocessingDrawing.Inline; 20 23 import org.docx4j.jaxb.Context; 24 import org.docx4j.jaxb.NamespacePrefixMappings; 21 25 import org.docx4j.openpackaging.exceptions.Docx4JException; 22 26 import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 23 27 import org.docx4j.openpackaging.parts.CustomXmlDataStoragePart; 28 import org.docx4j.openpackaging.parts.DefaultXmlPart; 24 29 import org.docx4j.openpackaging.parts.JaxbXmlPart; 30 import org.docx4j.openpackaging.parts.XmlPart; 25 31 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; 26 32 import org.docx4j.wml.CTSimpleField; … … 36 42 37 43 static Templates xslt; 44 private static XPathFactory xPathFactory; 45 private static XPath xPath; 38 46 static { 39 47 try { … … 47 55 e.printStackTrace(); 48 56 } 57 58 xPathFactory = XPathFactory.newInstance(); 59 xPath = xPathFactory.newXPath(); 49 60 } 61 50 62 51 63 public static void log(String message ) { … … 101 113 102 114 } 115 116 // These Store Item ID's come from Building Blocks.dotx glossary document 117 // Of these, only CoverPageProps is documented as an "Office Well Defined Custom XML Part", 118 // but even then, that documentation does not allocate a store item ID. 119 public static final String CORE_PROPERTIES_STOREITEMID = "{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"; 120 public static final String EXTENDED_PROPERTIES_STOREITEMID = "{6668398D-A668-4E3E-A5EB-62B293D839F1}"; 121 public static final String COVERPAGE_PROPERTIES_STOREITEMID = "{55AF091B-3C7A-41E3-B477-F2FDAA23CFDA}"; 122 103 123 104 124 /** 105 * Used by OpenDoPE handler, but not by bind.xslt anymore.125 * Used by OpenDoPE handler, but not directly by bind.xslt anymore. 106 126 * Not multiLine aware. 107 127 * … … 112 132 * @return 113 133 */ 114 public static String xpathGetString(Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 134 public static String xpathGetString( 135 WordprocessingMLPackage pkg, Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 115 136 String storeItemId, String xpath, String prefixMappings) { 116 137 117 CustomXmlDataStoragePart part = customXmlDataStorageParts.get(storeItemId.toLowerCase());118 if (part==null) {119 log.error("Couldn't locate part by storeItemId " + storeItemId);120 return null;121 }122 138 try { 139 140 if (storeItemId.toUpperCase().equals(CORE_PROPERTIES_STOREITEMID) ) { 141 142 return pkg.getDocPropsCorePart().xpathGetString(xpath, prefixMappings); 143 144 } else if (storeItemId.toUpperCase().equals(EXTENDED_PROPERTIES_STOREITEMID) ) { 145 146 return pkg.getDocPropsExtendedPart().xpathGetString(xpath, prefixMappings); 147 } 148 149 CustomXmlDataStoragePart part = customXmlDataStorageParts.get(storeItemId.toLowerCase()); 150 // Also handles cover page properties (since we've allocated it a store item id) 151 // Note that Word does not create that part until the user provides one or more prop values 152 153 if (part==null) { 154 log.error("Couldn't locate part by storeItemId " + storeItemId); 155 return null; 156 } 157 123 158 if (log.isDebugEnabled() ) { 124 159 String r = part.getData().xpathGetString(xpath, prefixMappings); … … 135 170 136 171 172 137 173 /** 138 174 */ 139 public static DocumentFragment xpathGenerateRuns(Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 175 public static DocumentFragment xpathGenerateRuns( 176 WordprocessingMLPackage pkg, Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 140 177 String storeItemId, String xpath, String prefixMappings, 141 178 NodeIterator rPrNodeIt, boolean multiLine) { … … 150 187 */ 151 188 152 CustomXmlDataStoragePart part = customXmlDataStorageParts.get(storeItemId.toLowerCase()); 153 if (part==null) { 154 log.error("Couldn't locate part by storeItemId " + storeItemId); 155 return null; 156 } 189 String r = xpathGetString(pkg, customXmlDataStorageParts, storeItemId, xpath, prefixMappings); 190 if (r==null) return null; 157 191 158 192 DocumentFragment docfrag = null; // = document.createDocumentFragment(); … … 160 194 161 195 try { 162 String r = part.getData().xpathGetString(xpath, prefixMappings);163 196 log.debug(xpath + " yielded result " + r); 164 197 … … 349 382 } 350 383 351 352 353 384 } -
trunk/docx4j/src/main/java/org/docx4j/model/datastorage/OpenDoPEHandler.java
r1440 r1449 562 562 org.opendope.xpaths.Xpaths.Xpath xpath = getXPathFromCondition(c); 563 563 564 String val = BindingHandler.xpathGetString(customXmlDataStorageParts, 564 String val = BindingHandler.xpathGetString(wordMLPackage, 565 customXmlDataStorageParts, 565 566 xpath.getDataBinding().getStoreItemID(), 566 567 xpath.getDataBinding().getXpath(), … … 638 639 org.opendope.xpaths.Xpaths.Xpath xpathObj = XPathsPart.getXPathById(xPaths, xp); 639 640 String value = BindingHandler.xpathGetString( 641 wordMLPackage, 640 642 customXmlDataStorageParts, 641 643 xpathObj.getDataBinding().getStoreItemID(), -
trunk/docx4j/src/main/java/org/docx4j/model/datastorage/bind.xslt
r1441 r1449 61 61 <xsl:copy-of 62 62 select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 63 $wmlPackage, 63 64 $customXmlDataStorageParts, 64 65 string(w:sdtPr/w:dataBinding/@w:storeItemID), … … 73 74 <xsl:copy-of 74 75 select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 76 $wmlPackage, 75 77 $customXmlDataStorageParts, 76 78 string(w:sdtPr/w:dataBinding/@w:storeItemID), -
trunk/docx4j/src/main/java/org/docx4j/openpackaging/io/Load.java
r1421 r1449 31 31 import org.apache.log4j.Logger; 32 32 import org.docx4j.jaxb.Context; 33 import org.docx4j.model.datastorage.BindingHandler; 33 34 import org.docx4j.model.datastorage.CustomXmlDataStorage; 34 35 import org.docx4j.model.datastorage.CustomXmlDataStorageImpl; … … 38 39 import org.docx4j.openpackaging.exceptions.PartUnrecognisedException; 39 40 import org.docx4j.openpackaging.packages.OpcPackage; 41 import org.docx4j.openpackaging.parts.CustomXmlDataStoragePart; 40 42 import org.docx4j.openpackaging.parts.CustomXmlDataStoragePropertiesPart; 41 43 import org.docx4j.openpackaging.parts.Part; … … 276 278 if (entry instanceof org.docx4j.openpackaging.parts.CustomXmlDataStoragePart) { 277 279 log.debug("Found a CustomXmlDataStoragePart, named " + entry.getPartName().getName() ); 278 if (entry.getRelationshipsPart()==null) { continue; } 279 log.debug(".. it has a rels part"); 280 // Look in its rels for rel of @Type customXmlProps (eg @Target="itemProps1.xml") 281 Relationship r = entry.getRelationshipsPart().getRelationshipByType( 282 Namespaces.CUSTOM_XML_DATA_STORAGE_PROPERTIES); 283 if (r==null) { 284 log.debug(".. but that doesn't point to a customXmlProps part"); 285 continue; 280 String itemId = null; 281 if (entry.getRelationshipsPart()==null) { 282 continue; 283 } else { 284 log.debug(".. it has a rels part"); 285 // Look in its rels for rel of @Type customXmlProps (eg @Target="itemProps1.xml") 286 Relationship r = entry.getRelationshipsPart().getRelationshipByType( 287 Namespaces.CUSTOM_XML_DATA_STORAGE_PROPERTIES); 288 if (r==null) { 289 log.debug(".. but that doesn't point to a customXmlProps part"); 290 continue; 291 } 292 CustomXmlDataStoragePropertiesPart customXmlProps = 293 (CustomXmlDataStoragePropertiesPart)entry.getRelationshipsPart().getPart(r); 294 if (customXmlProps==null) { 295 log.error(".. but the target seems to be missing?"); 296 297 try { 298 org.w3c.dom.Document document = ((CustomXmlDataStoragePart)entry).getData().getDocument(); 299 String localName = document.getDocumentElement().getLocalName(); 300 log.debug(localName); 301 if (document.getDocumentElement().isDefaultNamespace("http://schemas.microsoft.com/?office/?2006/?coverPageProps") 302 || localName.equals("CoverPageProperties" ) ) { 303 // Special case: CoverPageProperties 304 // See "Office Well Defined Custom XML Parts"; see documentinteropinitiative.org/additionalinfo/IS29500/sect5.aspx 305 // Has a rels part, but sometimes no target? Sometimes it definitely does ... 306 // Give it the store item id, Word 2007 seems to consistently allocate 307 itemId = BindingHandler.COVERPAGE_PROPERTIES_STOREITEMID.toLowerCase(); 308 } else { 309 continue; 310 } 311 } catch (Docx4JException e) { 312 e.printStackTrace(); 313 continue; 314 } 315 } else { 316 itemId = customXmlProps.getItemId().toLowerCase(); 317 } 286 318 } 287 CustomXmlDataStoragePropertiesPart customXmlProps =288 (CustomXmlDataStoragePropertiesPart)entry.getRelationshipsPart().getPart(r);289 if (customXmlProps==null) {290 log.error(".. but the target seems to be missing?");291 continue;292 }293 String itemId = customXmlProps.getItemId().toLowerCase();294 319 log.info("Identified/registered ds:itemId " + itemId); 295 320 if (pkg.getCustomXmlDataStorageParts().get(itemId.toLowerCase())!=null) { -
trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/DocPropsCorePart.java
r1378 r1449 20 20 package org.docx4j.openpackaging.parts; 21 21 22 import java.io.IOException; 23 22 24 import javax.xml.bind.JAXBException; 23 25 import javax.xml.bind.Unmarshaller; 26 import javax.xml.transform.Source; 27 import javax.xml.transform.TransformerConfigurationException; 28 import javax.xml.transform.stream.StreamSource; 29 import javax.xml.xpath.XPath; 30 import javax.xml.xpath.XPathFactory; 24 31 25 32 import org.apache.log4j.Logger; 33 import org.docx4j.XmlUtils; 26 34 import org.docx4j.docProps.core.CoreProperties; 27 35 import org.docx4j.jaxb.Context; 36 import org.docx4j.jaxb.NamespacePrefixMappings; 37 import org.docx4j.openpackaging.exceptions.Docx4JException; 28 38 import org.docx4j.openpackaging.exceptions.InvalidFormatException; 29 39 import org.docx4j.openpackaging.parts.relationships.Namespaces; 40 import org.w3c.dom.Document; 30 41 import org.w3c.dom.Element; 31 42 … … 51 62 52 63 private static Logger log = Logger.getLogger(DocPropsCorePart.class); 64 65 private static XPathFactory xPathFactory; 66 private static XPath xPath; 67 static { 68 xPathFactory = XPathFactory.newInstance(); 69 xPath = xPathFactory.newXPath(); 70 } 53 71 54 72 /** … … 114 132 } 115 133 134 // Core Props and Extended Props can both be bound as if they 135 // were a custom xml part. Copied from XmlPart. 136 137 public String xpathGetString(String xpathString, String prefixMappings) throws Docx4JException { 138 139 Document doc = XmlUtils.marshaltoW3CDomDocument( 140 getJaxbElement(), Context.jcDocPropsCore ); 141 142 try { 143 getNamespaceContext().registerPrefixMappings(prefixMappings); 144 145 String result = xPath.evaluate(xpathString, doc ); 146 log.debug(xpathString + " ---> " + result); 147 return result; 148 } catch (Exception e) { 149 throw new Docx4JException("Problems evaluating xpath '" + xpathString + "'", e); 150 } 151 } 152 private NamespacePrefixMappings nsContext; 153 private NamespacePrefixMappings getNamespaceContext() { 154 if (nsContext==null) { 155 nsContext = new NamespacePrefixMappings(); 156 xPath.setNamespaceContext(nsContext); 157 } 158 return nsContext; 159 } 116 160 117 161 -
trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/DocPropsExtendedPart.java
r1378 r1449 24 24 import javax.xml.bind.JAXBException; 25 25 import javax.xml.bind.Unmarshaller; 26 import javax.xml.xpath.XPath; 27 import javax.xml.xpath.XPathFactory; 26 28 27 29 import org.apache.log4j.Logger; 30 import org.docx4j.XmlUtils; 28 31 import org.docx4j.docProps.extended.Properties; 29 32 import org.docx4j.jaxb.Context; 33 import org.docx4j.jaxb.NamespacePrefixMappings; 34 import org.docx4j.openpackaging.exceptions.Docx4JException; 30 35 import org.docx4j.openpackaging.exceptions.InvalidFormatException; 31 36 import org.docx4j.openpackaging.parts.relationships.Namespaces; 37 import org.w3c.dom.Document; 32 38 33 39 … … 57 63 58 64 private static Logger log = Logger.getLogger(DocPropsExtendedPart.class); 65 66 private static XPathFactory xPathFactory; 67 private static XPath xPath; 68 static { 69 xPathFactory = XPathFactory.newInstance(); 70 xPath = xPathFactory.newXPath(); 71 } 59 72 60 73 /** … … 123 136 124 137 } 138 139 // Core Props and Extended Props can both be bound as if they 140 // were a custom xml part. Copied from XmlPart. 141 142 public String xpathGetString(String xpathString, String prefixMappings) throws Docx4JException { 143 144 Document doc = XmlUtils.marshaltoW3CDomDocument( 145 getJaxbElement(), Context.jcDocPropsExtended ); 146 147 try { 148 getNamespaceContext().registerPrefixMappings(prefixMappings); 149 150 String result = xPath.evaluate(xpathString, doc ); 151 log.debug(xpathString + " ---> " + result); 152 return result; 153 } catch (Exception e) { 154 throw new Docx4JException("Problems evaluating xpath '" + xpathString + "'", e); 155 } 156 } 157 private NamespacePrefixMappings nsContext; 158 private NamespacePrefixMappings getNamespaceContext() { 159 if (nsContext==null) { 160 nsContext = new NamespacePrefixMappings(); 161 xPath.setNamespaceContext(nsContext); 162 } 163 return nsContext; 164 } 125 165 126 166 }
Note: See TracChangeset
for help on using the changeset viewer.
