Index: src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java (revision ) @@ -19,16 +19,20 @@ import java.io.OutputStream; -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; -import org.dom4j.Namespace; -import org.dom4j.QName; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; import org.apache.poi.openxml4j.opc.internal.PartMarshaller; +import org.apache.poi.openxml4j.util.Nullable; +import org.apache.poi.util.DocumentHelper; +import org.apache.poi.util.XMLHelper; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import javax.xml.XMLConstants; +import javax.xml.stream.XMLEventFactory; +import javax.xml.stream.events.Namespace; + /** * Package properties marshaller. * @@ -36,17 +40,17 @@ */ public class PackagePropertiesMarshaller implements PartMarshaller { - private final static Namespace namespaceDC = new Namespace("dc", + private final static Namespace namespaceDC = XMLEventFactory.newFactory().createNamespace("dc", PackagePropertiesPart.NAMESPACE_DC_URI); - private final static Namespace namespaceCoreProperties = new Namespace("", + private final static Namespace namespaceCoreProperties = XMLEventFactory.newFactory().createNamespace("", PackagePropertiesPart.NAMESPACE_CP_URI); - private final static Namespace namespaceDcTerms = new Namespace("dcterms", + private final static Namespace namespaceDcTerms = XMLEventFactory.newFactory().createNamespace("dcterms", PackagePropertiesPart.NAMESPACE_DCTERMS_URI); - private final static Namespace namespaceXSI = new Namespace("xsi", - PackagePropertiesPart.NAMESPACE_XSI_URI); + private final static Namespace namespaceXSI = XMLEventFactory.newFactory().createNamespace("xsi", + XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); protected static final String KEYWORD_CATEGORY = "category"; @@ -98,13 +102,12 @@ // Configure the document xmlDoc = DocumentHelper.createDocument(); - Element rootElem = xmlDoc.addElement(new QName("coreProperties", - namespaceCoreProperties)); - rootElem.addNamespace("cp", PackagePropertiesPart.NAMESPACE_CP_URI); - rootElem.addNamespace("dc", PackagePropertiesPart.NAMESPACE_DC_URI); - rootElem.addNamespace("dcterms", - PackagePropertiesPart.NAMESPACE_DCTERMS_URI); - rootElem.addNamespace("xsi", PackagePropertiesPart.NAMESPACE_XSI_URI); + Element rootElem = xmlDoc.createElementNS(namespaceCoreProperties.getNamespaceURI(), "coreProperties"); + XMLHelper.addNamespaceDeclaration(rootElem, "cp", PackagePropertiesPart.NAMESPACE_CP_URI); + XMLHelper.addNamespaceDeclaration(rootElem, "dc", PackagePropertiesPart.NAMESPACE_DC_URI); + XMLHelper.addNamespaceDeclaration(rootElem, "dcterms", PackagePropertiesPart.NAMESPACE_DCTERMS_URI); + XMLHelper.addNamespaceDeclaration(rootElem, "xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); + xmlDoc.appendChild(rootElem); addCategory(); addContentStatus(); @@ -125,309 +128,147 @@ return true; } - /** + /** - * Add category property element if needed. + * Sets the given element's text content, creating it if necessary. - */ + */ - private void addCategory() { - if (!propsPart.getCategoryProperty().hasValue()) - return; + private Element setElementTextContent(String localName, Namespace namespace, Nullable property) { + return setElementTextContent(localName, namespace, property, property.getValue()); + } - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_CATEGORY, namespaceCoreProperties)); + private Element setElementTextContent(String localName, Namespace namespace, Nullable property, String propertyValue) { + if (!property.hasValue()) + return null; + + Element root = xmlDoc.getDocumentElement(); + Element elem = (Element) root.getElementsByTagNameNS(namespace.getNamespaceURI(), localName).item(0); - if (elem == null) { + if (elem == null) { - // Missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_CATEGORY, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + // missing, we add it + String qualifiedName = namespace.getPrefix().isEmpty() ? localName : namespace.getPrefix() + ':' + localName; + elem = xmlDoc.createElementNS(namespace.getNamespaceURI(), qualifiedName); + root.appendChild(elem); - } + } - elem.addText(propsPart.getCategoryProperty().getValue()); + elem.setTextContent(propertyValue); + return elem; - } + } + private Element setElementTextContent(String localName, Namespace namespace, Nullable property, String propertyValue, String xsiType) { + Element element = setElementTextContent(localName, namespace, property, propertyValue); + if (element != null) { + element.setAttributeNS(namespaceXSI.getNamespaceURI(), namespaceXSI.getPrefix() + ':' + "type", xsiType); + } + return element; + } + + - /** + /** + * Add category property element if needed. + */ + private void addCategory() { + setElementTextContent(KEYWORD_CATEGORY, namespaceCoreProperties, propsPart.getCategoryProperty()); + } + + /** * Add content status property element if needed. */ private void addContentStatus() { - if (!propsPart.getContentStatusProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_CONTENT_STATUS, namespaceCoreProperties)); - if (elem == null) { - // Missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_CONTENT_STATUS, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_CONTENT_STATUS, namespaceCoreProperties, propsPart.getContentStatusProperty()); - } + } - elem.addText(propsPart.getContentStatusProperty().getValue()); - } /** * Add content type property element if needed. */ private void addContentType() { - if (!propsPart.getContentTypeProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_CONTENT_TYPE, namespaceCoreProperties)); - if (elem == null) { - // Missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_CONTENT_TYPE, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_CONTENT_TYPE, namespaceCoreProperties, propsPart.getContentTypeProperty()); - } + } - elem.addText(propsPart.getContentTypeProperty().getValue()); - } /** * Add created property element if needed. */ private void addCreated() { - if (!propsPart.getCreatedProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_CREATED, namespaceDcTerms)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_CREATED, namespaceDcTerms)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_CREATED, namespaceDcTerms, propsPart.getCreatedProperty(), + propsPart.getCreatedPropertyString(), "dcterms:W3CDTF"); - } + } - elem.addAttribute(new QName("type", namespaceXSI), "dcterms:W3CDTF"); - elem.addText(propsPart.getCreatedPropertyString()); - } /** * Add creator property element if needed. */ private void addCreator() { - if (!propsPart.getCreatorProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_CREATOR, namespaceDC)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_CREATOR, namespaceDC)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_CREATOR, namespaceDC, propsPart.getCreatorProperty()); - } + } - elem.addText(propsPart.getCreatorProperty().getValue()); - } /** * Add description property element if needed. */ private void addDescription() { - if (!propsPart.getDescriptionProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_DESCRIPTION, namespaceDC)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_DESCRIPTION, namespaceDC)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_DESCRIPTION, namespaceDC, propsPart.getDescriptionProperty()); - } + } - elem.addText(propsPart.getDescriptionProperty().getValue()); - } /** * Add identifier property element if needed. */ private void addIdentifier() { - if (!propsPart.getIdentifierProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_IDENTIFIER, namespaceDC)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_IDENTIFIER, namespaceDC)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_IDENTIFIER, namespaceDC, propsPart.getIdentifierProperty()); - } + } - elem.addText(propsPart.getIdentifierProperty().getValue()); - } - /** + /** * Add keywords property element if needed. */ private void addKeywords() { - if (!propsPart.getKeywordsProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_KEYWORDS, namespaceCoreProperties)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_KEYWORDS, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_KEYWORDS, namespaceCoreProperties, propsPart.getKeywordsProperty()); - } + } - elem.addText(propsPart.getKeywordsProperty().getValue()); - } /** * Add language property element if needed. */ private void addLanguage() { - if (!propsPart.getLanguageProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_LANGUAGE, namespaceDC)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_LANGUAGE, namespaceDC)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_LANGUAGE, namespaceDC, propsPart.getLanguageProperty()); - } + } - elem.addText(propsPart.getLanguageProperty().getValue()); - } /** * Add 'last modified by' property if needed. */ private void addLastModifiedBy() { - if (!propsPart.getLastModifiedByProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_LAST_MODIFIED_BY, namespaceCoreProperties)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement() - .addElement( - new QName(KEYWORD_LAST_MODIFIED_BY, - namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_LAST_MODIFIED_BY, namespaceCoreProperties, propsPart.getLastModifiedByProperty()); - } + } - elem.addText(propsPart.getLastModifiedByProperty().getValue()); - } /** * Add 'last printed' property if needed. * */ private void addLastPrinted() { - if (!propsPart.getLastPrintedProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_LAST_PRINTED, namespaceCoreProperties)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_LAST_PRINTED, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_LAST_PRINTED, namespaceCoreProperties, propsPart.getLastPrintedProperty(), propsPart.getLastPrintedPropertyString()); - } + } - elem.addText(propsPart.getLastPrintedPropertyString()); - } /** * Add modified property element if needed. */ private void addModified() { - if (!propsPart.getModifiedProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_MODIFIED, namespaceDcTerms)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_MODIFIED, namespaceDcTerms)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_MODIFIED, namespaceDcTerms, propsPart.getModifiedProperty(), + propsPart.getModifiedPropertyString(), "dcterms:W3CDTF"); - } + } - elem.addAttribute(new QName("type", namespaceXSI), "dcterms:W3CDTF"); - elem.addText(propsPart.getModifiedPropertyString()); - } /** * Add revision property if needed. */ private void addRevision() { - if (!propsPart.getRevisionProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_REVISION, namespaceCoreProperties)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_REVISION, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_REVISION, namespaceCoreProperties, propsPart.getRevisionProperty()); - } + } - elem.addText(propsPart.getRevisionProperty().getValue()); - } /** * Add subject property if needed. */ private void addSubject() { - if (!propsPart.getSubjectProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_SUBJECT, namespaceDC)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_SUBJECT, namespaceDC)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_SUBJECT, namespaceDC, propsPart.getSubjectProperty()); - } + } - elem.addText(propsPart.getSubjectProperty().getValue()); - } /** * Add title property if needed. */ private void addTitle() { - if (!propsPart.getTitleProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_TITLE, namespaceDC)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_TITLE, namespaceDC)); - } else { - elem.clearContent();// clear the old value + setElementTextContent(KEYWORD_TITLE, namespaceDC, propsPart.getTitleProperty()); - } + } - elem.addText(propsPart.getTitleProperty().getValue()); - } private void addVersion() { - if (!propsPart.getVersionProperty().hasValue()) - return; - - Element elem = xmlDoc.getRootElement().element( - new QName(KEYWORD_VERSION, namespaceCoreProperties)); - if (elem == null) { - // missing, we add it - elem = xmlDoc.getRootElement().addElement( - new QName(KEYWORD_VERSION, namespaceCoreProperties)); - } else { - elem.clearContent();// clear the old value - } - elem.addText(propsPart.getVersionProperty().getValue()); + setElementTextContent(KEYWORD_VERSION, namespaceCoreProperties, propsPart.getVersionProperty()); } } Index: sonar/ooxml/pom.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- sonar/ooxml/pom.xml (revision 1617029) +++ sonar/ooxml/pom.xml (revision ) @@ -116,12 +116,6 @@ 2.3.0 - - dom4j - dom4j - 1.6.1 - - junit Index: legal/NOTICE IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- legal/NOTICE (revision 1617029) +++ legal/NOTICE (revision ) @@ -4,9 +4,6 @@ This product includes software developed by The Apache Software Foundation (http://www.apache.org/). -This product contains the DOM4J library (http://www.dom4j.org). -Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. - This product contains parts that were originally based on software from BEA. Copyright (c) 2000-2003, BEA Systems, . Index: src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java (revision ) @@ -19,8 +19,6 @@ import java.io.IOException; import java.io.InputStream; -import java.util.Iterator; -import java.util.List; import java.util.zip.ZipEntry; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; @@ -32,13 +30,13 @@ import org.apache.poi.openxml4j.opc.internal.PartUnmarshaller; import org.apache.poi.openxml4j.opc.internal.ZipHelper; import org.apache.poi.util.SAXHelper; -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.Namespace; -import org.dom4j.QName; +import org.w3c.dom.*; +import org.xml.sax.SAXException; +import javax.xml.XMLConstants; +import javax.xml.stream.XMLEventFactory; +import javax.xml.stream.events.Namespace; + /** * Package properties unmarshaller. * @@ -46,21 +44,18 @@ */ public final class PackagePropertiesUnmarshaller implements PartUnmarshaller { - private final static Namespace namespaceDC = new Namespace("dc", + private final static Namespace namespaceDC = XMLEventFactory.newFactory().createNamespace("dc", PackageProperties.NAMESPACE_DC); - private final static Namespace namespaceCP = new Namespace("cp", + private final static Namespace namespaceCP = XMLEventFactory.newFactory().createNamespace("cp", PackageNamespaces.CORE_PROPERTIES); - private final static Namespace namespaceDcTerms = new Namespace("dcterms", + private final static Namespace namespaceDcTerms = XMLEventFactory.newFactory().createNamespace("dcterms", PackageProperties.NAMESPACE_DCTERMS); - private final static Namespace namespaceXML = new Namespace("xml", - "http://www.w3.org/XML/1998/namespace"); + private final static Namespace namespaceXSI = XMLEventFactory.newFactory().createNamespace("xsi", + XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); - private final static Namespace namespaceXSI = new Namespace("xsi", - "http://www.w3.org/2001/XMLSchema-instance"); - protected static final String KEYWORD_CATEGORY = "category"; protected static final String KEYWORD_CONTENT_STATUS = "contentStatus"; @@ -125,15 +120,15 @@ /* Check OPC compliance */ // Rule M4.2, M4.3, M4.4 and M4.5/ - checkElementForOPCCompliance(xmlDoc.getRootElement()); + checkElementForOPCCompliance(xmlDoc.getDocumentElement()); /* End OPC compliance */ - } catch (DocumentException e) { + } catch (SAXException e) { - throw new IOException(e.getMessage()); - } + throw new IOException(e.getMessage()); + } - coreProps.setCategoryProperty(loadCategory(xmlDoc)); + coreProps.setCategoryProperty(loadCategory(xmlDoc)); coreProps.setContentStatusProperty(loadContentStatus(xmlDoc)); coreProps.setContentTypeProperty(loadContentType(xmlDoc)); coreProps.setCreatedProperty(loadCreated(xmlDoc)); @@ -153,149 +148,77 @@ return coreProps; } - private String loadCategory(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_CATEGORY, namespaceCP)); + private String readElement(Document xmlDoc, String localName, Namespace namespace) { + Element el = (Element)xmlDoc.getDocumentElement().getElementsByTagNameNS(namespace.getNamespaceURI(), localName).item(0); - if (el == null) { - return null; - } + if (el == null) { + return null; + } - return el.getStringValue(); + return el.getTextContent(); - } + } + private String loadCategory(Document xmlDoc) { + return readElement(xmlDoc, KEYWORD_CATEGORY, namespaceCP); + } + - private String loadContentStatus(Document xmlDoc) { + private String loadContentStatus(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_CONTENT_STATUS, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_CONTENT_STATUS, namespaceCP); - } + } - return el.getStringValue(); - } private String loadContentType(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_CONTENT_TYPE, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_CONTENT_TYPE, namespaceCP); - } + } - return el.getStringValue(); - } private String loadCreated(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_CREATED, namespaceDcTerms)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_CREATED, namespaceDcTerms); - } + } - return el.getStringValue(); - } private String loadCreator(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_CREATOR, namespaceDC)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_CREATOR, namespaceDC); - } + } - return el.getStringValue(); - } private String loadDescription(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_DESCRIPTION, namespaceDC)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_DESCRIPTION, namespaceDC); - } + } - return el.getStringValue(); - } private String loadIdentifier(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_IDENTIFIER, namespaceDC)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_IDENTIFIER, namespaceDC); - } + } - return el.getStringValue(); - } private String loadKeywords(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_KEYWORDS, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_KEYWORDS, namespaceCP); - } + } - return el.getStringValue(); - } private String loadLanguage(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_LANGUAGE, namespaceDC)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_LANGUAGE, namespaceDC); - } + } - return el.getStringValue(); - } private String loadLastModifiedBy(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_LAST_MODIFIED_BY, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_LAST_MODIFIED_BY, namespaceCP); - } + } - return el.getStringValue(); - } private String loadLastPrinted(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_LAST_PRINTED, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_LAST_PRINTED, namespaceCP); - } + } - return el.getStringValue(); - } private String loadModified(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_MODIFIED, namespaceDcTerms)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_MODIFIED, namespaceDcTerms); - } + } - return el.getStringValue(); - } private String loadRevision(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_REVISION, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_REVISION, namespaceCP); - } + } - return el.getStringValue(); - } private String loadSubject(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_SUBJECT, namespaceDC)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_SUBJECT, namespaceDC); - } + } - return el.getStringValue(); - } private String loadTitle(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_TITLE, namespaceDC)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_TITLE, namespaceDC); - } + } - return el.getStringValue(); - } private String loadVersion(Document xmlDoc) { - Element el = xmlDoc.getRootElement().element( - new QName(KEYWORD_VERSION, namespaceCP)); - if (el == null) { - return null; + return readElement(xmlDoc, KEYWORD_VERSION, namespaceCP); - } + } - return el.getStringValue(); - } /* OPC Compliance methods */ @@ -325,44 +248,42 @@ public void checkElementForOPCCompliance(Element el) throws InvalidFormatException { // Check the current element - @SuppressWarnings("unchecked") - List declaredNamespaces = el.declaredNamespaces(); - Iterator itNS = declaredNamespaces.iterator(); - while (itNS.hasNext()) { - Namespace ns = itNS.next(); + NamedNodeMap namedNodeMap = el.getAttributes(); + int namedNodeCount = namedNodeMap.getLength(); + for (int i = 0; i < namedNodeCount; i++) { + Attr attr = (Attr)namedNodeMap.item(0); + if (attr.getNamespaceURI().equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) { - // Rule M4.2 + // Rule M4.2 - if (ns.getURI().equals(PackageNamespaces.MARKUP_COMPATIBILITY)) + if (attr.getValue().equals(PackageNamespaces.MARKUP_COMPATIBILITY)) - throw new InvalidFormatException( - "OPC Compliance error [M4.2]: A format consumer shall consider the use of the Markup Compatibility namespace to be an error."); + throw new InvalidFormatException( + "OPC Compliance error [M4.2]: A format consumer shall consider the use of the Markup Compatibility namespace to be an error."); + - } + } + } // Rule M4.3 - if (el.getNamespace().getURI().equals( - PackageProperties.NAMESPACE_DCTERMS) - && !(el.getName().equals(KEYWORD_CREATED) || el.getName() - .equals(KEYWORD_MODIFIED))) + String elName = el.getLocalName(); + if (el.getNamespaceURI().equals(PackageProperties.NAMESPACE_DCTERMS)) + if (!(elName.equals(KEYWORD_CREATED) || elName.equals(KEYWORD_MODIFIED))) - throw new InvalidFormatException( - "OPC Compliance error [M4.3]: Producers shall not create a document element that contains refinements to the Dublin Core elements, except for the two specified in the schema: and Consumers shall consider a document element that violates this constraint to be an error."); + throw new InvalidFormatException( + "OPC Compliance error [M4.3]: Producers shall not create a document element that contains refinements to the Dublin Core elements, except for the two specified in the schema: and Consumers shall consider a document element that violates this constraint to be an error."); // Rule M4.4 - if (el.attribute(new QName("lang", namespaceXML)) != null) + if (el.getAttributeNodeNS(XMLConstants.XML_NS_URI, "lang") != null) throw new InvalidFormatException( "OPC Compliance error [M4.4]: Producers shall not create a document element that contains the xml:lang attribute. Consumers shall consider a document element that violates this constraint to be an error."); // Rule M4.5 - if (el.getNamespace().getURI().equals( - PackageProperties.NAMESPACE_DCTERMS)) { + if (el.getNamespaceURI().equals(PackageProperties.NAMESPACE_DCTERMS)) { // DCTerms namespace only use with 'created' and 'modified' elements - String elName = el.getName(); - if (!(elName.equals(KEYWORD_CREATED) || elName - .equals(KEYWORD_MODIFIED))) + if (!(elName.equals(KEYWORD_CREATED) || elName.equals(KEYWORD_MODIFIED))) throw new InvalidFormatException("Namespace error : " + elName + " shouldn't have the following naemspace -> " + PackageProperties.NAMESPACE_DCTERMS); // Check for the 'xsi:type' attribute - Attribute typeAtt = el.attribute(new QName("type", namespaceXSI)); + Attr typeAtt = el.getAttributeNodeNS(namespaceXSI.getNamespaceURI(), "type"); if (typeAtt == null) throw new InvalidFormatException("The element '" + elName + "' must have the '" + namespaceXSI.getPrefix() @@ -376,9 +297,9 @@ } // Check its children - @SuppressWarnings("unchecked") - Iterator itChildren = el.elementIterator(); - while (itChildren.hasNext()) - checkElementForOPCCompliance(itChildren.next()); + NodeList childElements = el.getElementsByTagName("*"); + int childElementCount = childElements.getLength(); + for (int i = 0; i < childElementCount; i++) + checkElementForOPCCompliance((Element)childElements.item(i)); } } Index: src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java (revision ) @@ -27,9 +27,7 @@ import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.util.SAXHelper; -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.Element; +import org.w3c.dom.*; /** * Represents a collection of PackageRelationship elements that are owned by a @@ -313,22 +311,19 @@ Document xmlRelationshipsDoc = SAXHelper.readSAXDocument(relPart.getInputStream()); // Browse default types - Element root = xmlRelationshipsDoc.getRootElement(); + Element root = xmlRelationshipsDoc.getDocumentElement(); // Check OPC compliance M4.1 rule boolean fCorePropertiesRelationship = false; - @SuppressWarnings("unchecked") - Iterator iter = (Iterator) - root.elementIterator(PackageRelationship.RELATIONSHIP_TAG_NAME); - while (iter.hasNext()) { - Element element = iter.next(); + NodeList nodeList = root.getElementsByTagName(PackageRelationship.RELATIONSHIP_TAG_NAME); + int nodeCount = nodeList.getLength(); + for (int i = 0; i < nodeCount; i++) { + Element element = (Element)nodeList.item(i); // Relationship ID - String id = element.attribute( - PackageRelationship.ID_ATTRIBUTE_NAME).getValue(); + String id = element.getAttribute(PackageRelationship.ID_ATTRIBUTE_NAME); // Relationship type - String type = element.attribute( - PackageRelationship.TYPE_ATTRIBUTE_NAME).getValue(); + String type = element.getAttribute(PackageRelationship.TYPE_ATTRIBUTE_NAME); /* Check OPC Compliance */ // Check Rule M4.1 @@ -342,8 +337,7 @@ /* End OPC Compliance */ // TargetMode (default value "Internal") - Attribute targetModeAttr = element - .attribute(PackageRelationship.TARGET_MODE_ATTRIBUTE_NAME); + Attr targetModeAttr = element.getAttributeNode(PackageRelationship.TARGET_MODE_ATTRIBUTE_NAME); TargetMode targetMode = TargetMode.INTERNAL; if (targetModeAttr != null) { targetMode = targetModeAttr.getValue().toLowerCase() @@ -353,9 +347,7 @@ // Target converted in URI URI target = PackagingURIHelper.toURI("http://invalid.uri"); // dummy url - String value = element.attribute( - PackageRelationship.TARGET_ATTRIBUTE_NAME) - .getValue(); + String value = element.getAttribute(PackageRelationship.TARGET_ATTRIBUTE_NAME); try { // when parsing of the given uri fails, we can either // ignore this relationship, which leads to IllegalStateException Index: src/java/org/apache/poi/util/XMLHelper.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/java/org/apache/poi/util/XMLHelper.java (revision 1617029) +++ src/java/org/apache/poi/util/XMLHelper.java (revision ) @@ -17,6 +17,8 @@ package org.apache.poi.util; +import org.w3c.dom.Element; + import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -45,4 +47,14 @@ throw new RuntimeException("Broken XML Setup", e); } } + + /** + * Adds a namespace declaration attribute to the given element. + */ + public static void addNamespaceDeclaration(Element element, String namespacePrefix, String namespaceURI) { + element.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, + XMLConstants.XMLNS_ATTRIBUTE + ':' + namespacePrefix, + namespaceURI); + } + } Index: src/excelant/java/org/apache/poi/ss/excelant/ExcelAntTask.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/excelant/java/org/apache/poi/ss/excelant/ExcelAntTask.java (revision 1617029) +++ src/excelant/java/org/apache/poi/ss/excelant/ExcelAntTask.java (revision ) @@ -179,7 +179,7 @@ throw new BuildException( "The for must include poi.jar and poi-ooxml.jar " + "if not in Ant's own classpath. Processing .xlsx spreadsheets requires " + - "additional poi-ooxml-schemas.jar, xmlbeans.jar and dom4j.jar" , + "additional poi-ooxml-schemas.jar, xmlbeans.jar" , e, getLocation()); } Index: src/documentation/content/xdocs/spreadsheet/excelant.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/documentation/content/xdocs/spreadsheet/excelant.xml (revision 1617029) +++ src/documentation/content/xdocs/spreadsheet/excelant.xml (revision ) @@ -50,7 +50,6 @@
  • poi-ooxml-schemas-$version-YYYYDDMM.jar
  • xmlbeans.jar
  • -
  • dom4j.jar

For example, if you have these jars in a lib/ dir in your project, your build.xml might look like this:

Index: src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/StreamHelper.java (revision ) @@ -17,13 +17,16 @@ package org.apache.poi.openxml4j.opc; +import org.w3c.dom.Document; + +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.InputStream; import java.io.OutputStream; -import org.dom4j.Document; -import org.dom4j.io.OutputFormat; -import org.dom4j.io.XMLWriter; - public final class StreamHelper { private StreamHelper() { @@ -31,7 +34,7 @@ } /** - * Turning the DOM4j object in the specified output stream. + * Save the document object in the specified output stream. * * @param xmlContent * The XML document. @@ -43,10 +46,16 @@ public static boolean saveXmlInStream(Document xmlContent, OutputStream outStream) { try { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Source xmlSource = new DOMSource(xmlContent); + Result outputTarget = new StreamResult(outStream); + transformerFactory.newTransformer().transform(xmlSource, outputTarget); +/* OutputFormat outformat = OutputFormat.createPrettyPrint(); outformat.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(outStream, outformat); writer.write(xmlContent); +*/ } catch (Exception e) { return false; } Index: src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java (revision ) @@ -17,12 +17,11 @@ package org.apache.poi.openxml4j.opc.internal; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; -import java.util.Iterator; -import java.util.List; import java.util.Map.Entry; import java.util.TreeMap; @@ -33,13 +32,12 @@ import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePartName; import org.apache.poi.openxml4j.opc.PackagingURIHelper; +import org.apache.poi.util.DocumentHelper; import org.apache.poi.util.SAXHelper; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; -import org.dom4j.Namespace; -import org.dom4j.QName; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; /** * Manage package content types ([Content_Types].xml part). @@ -376,38 +374,33 @@ Document xmlContentTypetDoc = SAXHelper.readSAXDocument(in); // Default content types - List defaultTypes = xmlContentTypetDoc.getRootElement().elements( - DEFAULT_TAG_NAME); - Iterator elementIteratorDefault = defaultTypes.iterator(); - while (elementIteratorDefault.hasNext()) { - Element element = (Element) elementIteratorDefault.next(); - String extension = element.attribute(EXTENSION_ATTRIBUTE_NAME) - .getValue(); - String contentType = element.attribute( - CONTENT_TYPE_ATTRIBUTE_NAME).getValue(); + NodeList defaultTypes = xmlContentTypetDoc.getDocumentElement().getElementsByTagName(DEFAULT_TAG_NAME); + int defaultTypeCount = defaultTypes.getLength(); + for (int i = 0; i < defaultTypeCount; i++) { + Element element = (Element) defaultTypes.item(i); + String extension = element.getAttribute(EXTENSION_ATTRIBUTE_NAME); + String contentType = element.getAttribute(CONTENT_TYPE_ATTRIBUTE_NAME); addDefaultContentType(extension, contentType); } // Overriden content types - List overrideTypes = xmlContentTypetDoc.getRootElement().elements( - OVERRIDE_TAG_NAME); - Iterator elementIteratorOverride = overrideTypes.iterator(); - while (elementIteratorOverride.hasNext()) { - Element element = (Element) elementIteratorOverride.next(); - URI uri = new URI(element.attribute(PART_NAME_ATTRIBUTE_NAME) - .getValue()); - PackagePartName partName = PackagingURIHelper - .createPartName(uri); - String contentType = element.attribute( - CONTENT_TYPE_ATTRIBUTE_NAME).getValue(); + NodeList overrideTypes = xmlContentTypetDoc.getDocumentElement().getElementsByTagName(OVERRIDE_TAG_NAME); + int overrideTypeCount = overrideTypes.getLength(); + for (int i = 0; i < overrideTypeCount; i++) { + Element element = (Element) overrideTypes.item(i); + URI uri = new URI(element.getAttribute(PART_NAME_ATTRIBUTE_NAME)); + PackagePartName partName = PackagingURIHelper.createPartName(uri); + String contentType = element.getAttribute(CONTENT_TYPE_ATTRIBUTE_NAME); addOverrideContentType(partName, contentType); } } catch (URISyntaxException urie) { throw new InvalidFormatException(urie.getMessage()); - } catch (DocumentException e) { + } catch (SAXException e) { - throw new InvalidFormatException(e.getMessage()); + throw new InvalidFormatException(e.getMessage()); + } catch (IOException e) { + throw new InvalidFormatException(e.getMessage()); - } - } + } + } /** * Save the contents type part. @@ -421,9 +414,8 @@ Document xmlOutDoc = DocumentHelper.createDocument(); // Building namespace - Namespace dfNs = Namespace.get("", TYPES_NAMESPACE_URI); - Element typesElem = xmlOutDoc - .addElement(new QName(TYPES_TAG_NAME, dfNs)); + Element typesElem = xmlOutDoc.createElementNS(TYPES_NAMESPACE_URI, TYPES_TAG_NAME); + xmlOutDoc.appendChild(typesElem); // Adding default types for (Entry entry : defaultContentType.entrySet()) { @@ -454,10 +446,10 @@ */ private void appendSpecificTypes(Element root, Entry entry) { - root.addElement(OVERRIDE_TAG_NAME).addAttribute( - PART_NAME_ATTRIBUTE_NAME, - entry.getKey().getName()).addAttribute( - CONTENT_TYPE_ATTRIBUTE_NAME, entry.getValue()); + Element specificType = root.getOwnerDocument().createElement(OVERRIDE_TAG_NAME); + specificType.setAttribute(PART_NAME_ATTRIBUTE_NAME, entry.getKey().getName()); + specificType.setAttribute(CONTENT_TYPE_ATTRIBUTE_NAME, entry.getValue()); + root.appendChild(specificType); } /** @@ -470,11 +462,10 @@ * @see #save(java.io.OutputStream) */ private void appendDefaultType(Element root, Entry entry) { - root.addElement(DEFAULT_TAG_NAME).addAttribute( - EXTENSION_ATTRIBUTE_NAME, entry.getKey()) - .addAttribute(CONTENT_TYPE_ATTRIBUTE_NAME, - entry.getValue()); - + Element defaultType = root.getOwnerDocument().createElement(DEFAULT_TAG_NAME); + defaultType.setAttribute(EXTENSION_ATTRIBUTE_NAME, entry.getKey()); + defaultType.setAttribute(CONTENT_TYPE_ATTRIBUTE_NAME, entry.getValue()); + root.appendChild(defaultType); } /** Index: src/documentation/content/xdocs/overview.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/documentation/content/xdocs/overview.xml (revision 1617029) +++ src/documentation/content/xdocs/overview.xml (revision ) @@ -270,7 +270,7 @@ poi-ooxml - poi, poi-ooxml-schemas, dom4j + poi, poi-ooxml-schemas poi-ooxml-version-yyyymmdd.jar Index: maven/poi-ooxml.pom IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- maven/poi-ooxml.pom (revision 1617029) +++ maven/poi-ooxml.pom (revision ) @@ -69,10 +69,5 @@ poi-ooxml-schemas @VERSION@
- - dom4j - dom4j - 1.6.1 - Index: src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/ZipPartMarshaller.java (revision ) @@ -24,11 +24,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; -import org.dom4j.Namespace; -import org.dom4j.QName; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.openxml4j.opc.PackageNamespaces; import org.apache.poi.openxml4j.opc.PackagePart; @@ -40,8 +35,11 @@ import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.openxml4j.opc.internal.PartMarshaller; import org.apache.poi.openxml4j.opc.internal.ZipHelper; +import org.apache.poi.util.DocumentHelper; import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; /** * Zip part marshaller. This marshaller is use to save any part in a zip stream. @@ -122,9 +120,8 @@ Document xmlOutDoc = DocumentHelper.createDocument(); // make something like - Namespace dfNs = Namespace.get("", PackageNamespaces.RELATIONSHIPS); - Element root = xmlOutDoc.addElement(new QName( - PackageRelationship.RELATIONSHIPS_TAG_NAME, dfNs)); + Element root = xmlOutDoc.createElementNS(PackageNamespaces.RELATIONSHIPS, PackageRelationship.RELATIONSHIPS_TAG_NAME); + xmlOutDoc.appendChild(root); // UTF-8 =================================================================== --- build.xml (revision 1617029) +++ build.xml (revision ) @@ -148,8 +148,6 @@ - - @@ -221,7 +219,6 @@ - @@ -251,7 +248,6 @@ - @@ -429,7 +425,6 @@ - @@ -441,10 +436,6 @@ - - - - @@ -1288,7 +1279,6 @@ - @@ -1316,7 +1306,6 @@ - @@ -1449,7 +1438,6 @@ - Index: src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java (revision 1617029) +++ src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java (revision ) @@ -27,7 +27,6 @@ import java.lang.reflect.Field; import java.net.URI; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.TreeMap; import java.util.regex.Pattern; @@ -40,15 +39,10 @@ import org.apache.poi.openxml4j.opc.internal.ContentTypeManager; import org.apache.poi.openxml4j.opc.internal.FileHelper; import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; -import org.apache.poi.util.SAXHelper; -import org.apache.poi.util.TempFile; -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; -import org.dom4j.Namespace; -import org.dom4j.QName; +import org.apache.poi.util.*; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; public final class TestPackage extends TestCase { private static final POILogger logger = POILogFactory.getLogger(TestPackage.class); @@ -127,18 +121,17 @@ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"); Document doc = DocumentHelper.createDocument(); - Namespace nsWordprocessinML = new Namespace("w", - "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); - Element elDocument = doc.addElement(new QName("document", - nsWordprocessinML)); - Element elBody = elDocument.addElement(new QName("body", - nsWordprocessinML)); - Element elParagraph = elBody.addElement(new QName("p", - nsWordprocessinML)); - Element elRun = elParagraph - .addElement(new QName("r", nsWordprocessinML)); - Element elText = elRun.addElement(new QName("t", nsWordprocessinML)); - elText.setText("Hello Open XML !"); + Element elDocument = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:document"); + doc.appendChild(elDocument); + Element elBody = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:body"); + elDocument.appendChild(elBody); + Element elParagraph = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:p"); + elBody.appendChild(elParagraph); + Element elRun = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:r"); + elParagraph.appendChild(elRun); + Element elText = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:t"); + elRun.appendChild(elText); + elText.setTextContent("Hello Open XML !"); StreamHelper.saveXmlInStream(doc, corePart.getOutputStream()); pkg.close(); @@ -223,15 +216,13 @@ Document xmlRelationshipsDoc = SAXHelper.readSAXDocument(relPart.getInputStream()); - Element root = xmlRelationshipsDoc.getRootElement(); - for (Iterator i = root - .elementIterator(PackageRelationship.RELATIONSHIP_TAG_NAME); i - .hasNext();) { - Element element = (Element) i.next(); - String value = element.attribute( - PackageRelationship.TARGET_ATTRIBUTE_NAME) - .getValue(); - assertTrue("Root target must not start with a leadng slash ('/'): " + value, value.charAt(0) != '/'); + Element root = xmlRelationshipsDoc.getDocumentElement(); + NodeList nodeList = root.getElementsByTagName(PackageRelationship.RELATIONSHIP_TAG_NAME); + int nodeCount = nodeList.getLength(); + for (int i = 0; i < nodeCount; i++) { + Element element = (Element) nodeList.item(i); + String value = element.getAttribute(PackageRelationship.TARGET_ATTRIBUTE_NAME); + assertTrue("Root target must not start with a leading slash ('/'): " + value, value.charAt(0) != '/'); } } @@ -268,18 +259,17 @@ // Create a content Document doc = DocumentHelper.createDocument(); - Namespace nsWordprocessinML = new Namespace("w", - "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); - Element elDocument = doc.addElement(new QName("document", - nsWordprocessinML)); - Element elBody = elDocument.addElement(new QName("body", - nsWordprocessinML)); - Element elParagraph = elBody.addElement(new QName("p", - nsWordprocessinML)); - Element elRun = elParagraph - .addElement(new QName("r", nsWordprocessinML)); - Element elText = elRun.addElement(new QName("t", nsWordprocessinML)); - elText.setText("Hello Open XML !"); + Element elDocument = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:document"); + doc.appendChild(elDocument); + Element elBody = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:body"); + elDocument.appendChild(elBody); + Element elParagraph = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:p"); + elBody.appendChild(elParagraph); + Element elRun = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:r"); + elParagraph.appendChild(elRun); + Element elText = doc.createElementNS("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w:t"); + elRun.appendChild(elText); + elText.setTextContent("Hello Open XML !"); StreamHelper.saveXmlInStream(doc, corePart.getOutputStream()); Index: src/ooxml/java/org/apache/poi/openxml4j/opc/Configuration.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/Configuration.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/Configuration.java (revision ) @@ -21,7 +21,7 @@ /** * Storage class for configuration storage parameters. - * TODO xml syntax checking is no longer done with DOM4j parser -> remove the schema or do it ? + * TODO xml syntax checking is not done with JAXP by default -> remove the schema or do it ? * * @author CDubettier, Julen Chable * @version 1.0 Index: src/ooxml/java/org/apache/poi/util/SAXHelper.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/util/SAXHelper.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/util/SAXHelper.java (revision ) @@ -23,10 +23,11 @@ import java.lang.reflect.Method; import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.io.SAXReader; +import org.w3c.dom.Document; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -37,31 +38,47 @@ */ public final class SAXHelper { private static POILogger logger = POILogFactory.getLogger(SAXHelper.class); - + - /** - * Creates a new SAX Reader, with sensible defaults - */ - public static SAXReader getSAXReader() { - SAXReader xmlReader = new SAXReader(); - xmlReader.setValidation(false); - xmlReader.setEntityResolver(new EntityResolver() { + private static final EntityResolver IGNORING_ENTITY_RESOLVER = new EntityResolver() { + @Override - public InputSource resolveEntity(String publicId, String systemId) - throws SAXException, IOException { - return new InputSource(new StringReader("")); - } + public InputSource resolveEntity(String publicId, String systemId) + throws SAXException, IOException { + return new InputSource(new StringReader("")); + } - }); - trySetSAXFeature(xmlReader, XMLConstants.FEATURE_SECURE_PROCESSING, true); - trySetXercesSecurityManager(xmlReader); - return xmlReader; + }; + + private static final ThreadLocal documentBuilder = new ThreadLocal() { + @Override + protected DocumentBuilder initialValue() { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setValidating(false); + trySetSAXFeature(factory, XMLConstants.FEATURE_SECURE_PROCESSING, true); + trySetXercesSecurityManager(factory); + try { + return factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("cannot create a DocumentBuilder", e); - } + } - private static void trySetSAXFeature(SAXReader xmlReader, String feature, boolean enabled) { + } + + @Override + public DocumentBuilder get() { + DocumentBuilder documentBuilder = super.get(); + documentBuilder.reset(); + documentBuilder.setEntityResolver(IGNORING_ENTITY_RESOLVER); + return documentBuilder; + } + }; + + private static void trySetSAXFeature(DocumentBuilderFactory documentBuilderFactory, String feature, boolean enabled) { try { - xmlReader.setFeature(feature, enabled); + documentBuilderFactory.setFeature(feature, enabled); } catch (Exception e) { logger.log(POILogger.INFO, "SAX Feature unsupported", feature, e); } } - private static void trySetXercesSecurityManager(SAXReader xmlReader) { + private static void trySetXercesSecurityManager(DocumentBuilderFactory documentBuilderFactory) { // Try built-in JVM one first, standalone if not for (String securityManagerClassName : new String[] { "com.sun.org.apache.xerces.internal.util.SecurityManager", @@ -71,7 +88,7 @@ Object mgr = Class.forName(securityManagerClassName).newInstance(); Method setLimit = mgr.getClass().getMethod("setEntityExpansionLimit", Integer.TYPE); setLimit.invoke(mgr, 4096); - xmlReader.setProperty("http://apache.org/xml/properties/security-manager", mgr); + documentBuilderFactory.setAttribute("http://apache.org/xml/properties/security-manager", mgr); // Stop once one can be setup without error return; } catch (Exception e) { @@ -86,7 +103,7 @@ * @param inp Stream to read the XML data from * @return the SAX processed Document */ - public static Document readSAXDocument(InputStream inp) throws DocumentException { - return getSAXReader().read(inp); + public static Document readSAXDocument(InputStream inp) throws IOException, SAXException { + return documentBuilder.get().parse(inp); } } Index: .classpath IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- .classpath (revision 1617029) +++ .classpath (revision ) @@ -19,7 +19,6 @@ - Index: src/ooxml/java/org/apache/poi/util/DocumentHelper.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/util/DocumentHelper.java (revision ) +++ src/ooxml/java/org/apache/poi/util/DocumentHelper.java (revision ) @@ -0,0 +1,44 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import org.w3c.dom.Document; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +public class DocumentHelper { + + private static final ThreadLocal documentBuilder = new ThreadLocal() { + @Override + protected DocumentBuilder initialValue() { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + return factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new IllegalStateException("cannot create a DocumentBuilder", e); + } + } + }; + + public static Document createDocument() { + return documentBuilder.get().newDocument(); + } + +} Index: src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/internal/ZipContentTypeManager.java (revision ) @@ -30,7 +30,7 @@ import org.apache.poi.openxml4j.opc.StreamHelper; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; -import org.dom4j.Document; +import org.w3c.dom.Document; /** * Zip implementation of the ContentTypeManager. Index: src/ooxml/java/org/apache/poi/openxml4j/opc/internal/PackagePropertiesPart.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- src/ooxml/java/org/apache/poi/openxml4j/opc/internal/PackagePropertiesPart.java (revision 1617029) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/internal/PackagePropertiesPart.java (revision ) @@ -48,8 +48,6 @@ public final static String NAMESPACE_DCTERMS_URI = "http://purl.org/dc/terms/"; - public final static String NAMESPACE_XSI_URI = "http://www.w3.org/2001/XMLSchema-instance"; - /** * Constructor. * Index: legal/LICENSE IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- legal/LICENSE (revision 1617029) +++ legal/LICENSE (revision ) @@ -229,50 +229,6 @@ [5] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/Patent%20statements%20ok/ECMA-376%20Adobe%20Patent%20Declaration.pdf -DOM4J library (dom4j-1.6.1.jar) - - Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. - - Redistribution and use of this software and associated documentation - ("Software"), with or without modification, are permitted provided - that the following conditions are met: - - 1. Redistributions of source code must retain copyright - statements and notices. Redistributions must also contain a - copy of this document. - - 2. Redistributions in binary form must reproduce the - above copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - - 3. The name "DOM4J" must not be used to endorse or promote - products derived from this Software without prior written - permission of MetaStuff, Ltd. For written permission, - please contact dom4j-info@metastuff.com. - - 4. Products derived from this Software may not be called "DOM4J" - nor may "DOM4J" appear in their names without prior written - permission of MetaStuff, Ltd. DOM4J is a registered - trademark of MetaStuff, Ltd. - - 5. Due credit should be given to the DOM4J Project - - http://www.dom4j.org - - THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS - ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT - NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. - - JUnit test library (junit-4.11.jar) Common Public License - v 1.0