blob: 060b9f041646e284939a2b91b21f3d16536b73df [file] [log] [blame]
/*
* 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.axis2.databinding.utils.writer;
import junit.framework.TestCase;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.databinding.utils.ConverterUtil;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
public class OMElementStreamWriterTest extends TestCase {
private int prefixNum;
public void testGetOMElement() {
OMElementStreamWriter omElementStreamWriter = new OMElementStreamWriter();
try {
writeStartElement(null, "test1", omElementStreamWriter);
writeStartElement("http://apach.temp.uri", "test2", omElementStreamWriter);
writeStartElement("http://apach.temp.uri1", "test3", omElementStreamWriter);
omElementStreamWriter.writeCharacters("test string3");
writeAttribute("http://apach.temp.uri", "attribute1", "attrubteValue1", omElementStreamWriter);
writeQNames(new QName[]{new QName("http://axis2.apach.org1", "testQName"),
new QName("http://axis2.apach.org2", "testQName2")}, omElementStreamWriter);
omElementStreamWriter.writeEndElement();
writeStartElement("http://apach.temp.uri1", "test4", omElementStreamWriter);
writeAttribute(null, "attribute1", "attrubteValue1", omElementStreamWriter);
writeAttribute("ns1", "http://apach.temp.uri", "attribute1", "attrubteValue1", omElementStreamWriter);
omElementStreamWriter.writeCharacters("test string4");
omElementStreamWriter.writeEndElement();
writeStartElement("http://temp.new.org", "testattributeElement", omElementStreamWriter);
writeQNameAttribute(null, "testQname", new QName("http://temp.new.org", "testQName"), omElementStreamWriter);
writeQName(new QName("http://axis2.apach.org", "testQName"), omElementStreamWriter);
omElementStreamWriter.writeEndElement();
omElementStreamWriter.writeEndElement();
omElementStreamWriter.writeEndElement();
OMElement omElement = omElementStreamWriter.getOMElement();
System.out.println("OM String ==> " + omElement.toString());
XMLStreamReader xmlReader = omElement.getXMLStreamReader();
StAXOMBuilder stAXOMBuilder = new StAXOMBuilder(xmlReader);
OMElement result = stAXOMBuilder.getDocumentElement();
System.out.println("OM result ==> " + result.toString());
} catch (XMLStreamException e) {
fail();
}
}
private String generatePrefix(String string) {
return "ns" + ++prefixNum;
}
private void writeStartElement(String namespace, String localName, XMLStreamWriter xmlWriter) throws XMLStreamException {
if ((namespace != null) && ! namespace.equals("")) {
java.lang.String prefix = xmlWriter.getPrefix(namespace);
if (prefix == null) {
prefix = "ns" + ++prefixNum;
xmlWriter.writeStartElement(prefix, localName, namespace);
xmlWriter.writeNamespace(prefix, namespace);
xmlWriter.setPrefix(prefix, namespace);
} else {
xmlWriter.writeStartElement(namespace, localName);
}
} else {
xmlWriter.writeStartElement(localName);
}
}
private void writeAttribute(String prefix, String namespace, String attName,
String attValue, XMLStreamWriter xmlWriter)
throws XMLStreamException {
if (xmlWriter.getPrefix(namespace) == null) {
xmlWriter.writeNamespace(prefix, namespace);
xmlWriter.setPrefix(prefix, namespace);
}
xmlWriter.writeAttribute(namespace, attName, attValue);
}
private void writeAttribute(String namespace, String attName,
String attValue, XMLStreamWriter xmlWriter) throws XMLStreamException {
if ((namespace == null) || namespace.equals("")) {
xmlWriter.writeAttribute(attName, attValue);
} else {
registerPrefix(xmlWriter, namespace);
xmlWriter.writeAttribute(namespace, attName, attValue);
}
}
private void writeQNameAttribute(String namespace, String attName,
QName qname, XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
String attributeNamespace = qname.getNamespaceURI();
String attributePrefix = xmlWriter.getPrefix(attributeNamespace);
if (attributePrefix == null) {
attributePrefix = registerPrefix(xmlWriter, attributeNamespace);
}
java.lang.String attributeValue;
if (attributePrefix.trim().length() > 0) {
attributeValue = attributePrefix + ":" + qname.getLocalPart();
} else {
attributeValue = qname.getLocalPart();
}
if ((namespace != null) && namespace.equals("")) {
xmlWriter.writeAttribute(attName, attributeValue);
} else {
if (namespace != null) {
registerPrefix(xmlWriter, namespace);
}
xmlWriter.writeAttribute(namespace, attName, attributeValue);
}
}
private void writeQName(QName qname,
XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
String namespaceURI = qname.getNamespaceURI();
if (namespaceURI != null) {
String prefix = xmlWriter.getPrefix(namespaceURI);
if (prefix == null) {
prefix = generatePrefix(namespaceURI);
xmlWriter.writeNamespace(prefix, namespaceURI);
xmlWriter.setPrefix(prefix, namespaceURI);
}
if (prefix.trim().length() > 0) {
xmlWriter.writeCharacters(prefix + ":" + ConverterUtil.convertToString(qname));
} else {
// i.e this is the default namespace
xmlWriter.writeCharacters(ConverterUtil.convertToString(qname));
}
} else {
xmlWriter.writeCharacters(ConverterUtil.convertToString(qname));
}
}
private void writeQNames(QName[] qnames,
XMLStreamWriter xmlWriter) throws XMLStreamException {
if (qnames != null) {
// we have to store this data until last moment since it is not possible to write any
// namespace data after writing the charactor data
StringBuffer stringToWrite = new StringBuffer();
String namespaceURI = null;
String prefix = null;
for (int i = 0; i < qnames.length; i++) {
if (i > 0) {
stringToWrite.append(" ");
}
namespaceURI = qnames[i].getNamespaceURI();
if (namespaceURI != null) {
prefix = xmlWriter.getPrefix(namespaceURI);
if ((prefix == null) || (prefix.length() == 0)) {
prefix = generatePrefix(namespaceURI);
xmlWriter.writeNamespace(prefix, namespaceURI);
xmlWriter.setPrefix(prefix, namespaceURI);
}
if (prefix.trim().length() > 0) {
stringToWrite.append(prefix).append(":").append(ConverterUtil.convertToString(qnames[i]));
} else {
stringToWrite.append(ConverterUtil.convertToString(qnames[i]));
}
} else {
stringToWrite.append(ConverterUtil.convertToString(qnames[i]));
}
}
xmlWriter.writeCharacters(stringToWrite.toString());
}
}
private String registerPrefix(XMLStreamWriter xmlWriter, String namespace) throws XMLStreamException {
String prefix = xmlWriter.getPrefix(namespace);
if (prefix == null) {
prefix = generatePrefix(namespace);
while (xmlWriter.getNamespaceContext().getNamespaceURI(prefix) != null) {
prefix = BeanUtil.getUniquePrefix();
}
xmlWriter.writeNamespace(prefix, namespace);
xmlWriter.setPrefix(prefix, namespace);
}
return prefix;
}
}