package org.jboss.webservice.deployment;
import org.jboss.axis.utils.LinkedHashMap;
import org.jboss.webservice.util.DOMUtils;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.namespace.QName;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class BeanXMLMetaData
{
private Map elementDescMap = new LinkedHashMap();
private List elementOrderList = new ArrayList();
private BeanXMLMetaData()
{
}
public static BeanXMLMetaData parse(Element metaData)
{
BeanXMLMetaData beanMetaData = new BeanXMLMetaData();
if (metaData != null)
{
ArrayList qnames = new ArrayList();
NodeList nlistElementDesc = metaData.getElementsByTagName("elementDesc");
for (int i = 0; i < nlistElementDesc.getLength(); i++)
{
Element elDesc = (Element)nlistElementDesc.item(i);
String fieldName = DOMUtils.getAttributeValue(elDesc, "fieldName");
QName xmlName = DOMUtils.getAttributeValueAsQName(elDesc, "xmlName");
if (xmlName == null)
xmlName = new QName("", fieldName);
QName xmlType = DOMUtils.getAttributeValueAsQName(elDesc, "xmlType");
if (xmlType != null)
{
if (qnames.contains(xmlType))
throw new IllegalStateException("Duplicate type mapping definition: " + xmlType);
qnames.add(xmlType);
}
boolean asAttribute = DOMUtils.getAttributeValueAsBoolean(elDesc, "asAttr");
boolean asContent = DOMUtils.getAttributeValueAsBoolean(elDesc, "asContent");
QName itemXmlType = DOMUtils.getAttributeValueAsQName(elDesc, "itemXmlType");
ElementMetaData elMetaData = new ElementMetaData(fieldName, xmlName, xmlType, itemXmlType, asAttribute, asContent);
beanMetaData.elementDescMap.put(fieldName, elMetaData);
}
Element orderEl = DOMUtils.getFirstChildElement(metaData, "elementOrder");
if (orderEl != null)
{
NodeList nlistElementOrder = orderEl.getElementsByTagName("element");
for (int i = 0; i < nlistElementOrder.getLength(); i++)
{
Element el = (Element)nlistElementOrder.item(i);
String fieldName = el.getAttribute("name");
beanMetaData.elementOrderList.add(fieldName);
}
}
}
return beanMetaData;
}
public Iterator getElementMetaData()
{
return elementDescMap.values().iterator();
}
public Iterator getElementOrder()
{
return elementOrderList.iterator();
}
public void serializeAsXML(PrintWriter out)
{
String pad = " ";
out.println(pad + "<typeDesc>");
Iterator itElDesc = elementDescMap.values().iterator();
while (itElDesc.hasNext())
{
ElementMetaData elMetaData = (ElementMetaData)itElDesc.next();
String prefixedXmlName = elMetaData.getPrefixedXmlName();
out.print(pad + pad + "<elementDesc fieldName='" + elMetaData.getFieldName() + "' xmlName='" + prefixedXmlName + "'");
if (elMetaData.getXmlType() != null)
{
String prefixedXmlType = elMetaData.getPrefixedXmlType();
out.print(" xmlType='" + prefixedXmlType + "'");
}
if (elMetaData.isAsAttribute())
out.print(" asAttr='true'");
if (elMetaData.isAsContent())
out.print(" asContent='true'");
out.println("/>");
}
if (elementOrderList.size() > 0)
{
out.println(pad + pad + "<elementOrder>");
Iterator itElOrder = elementOrderList.iterator();
while (itElOrder.hasNext())
{
String fieldName = (String)itElOrder.next();
out.println(pad + pad + pad + "<element name='" + fieldName + "'/>");
}
out.println(pad + pad + "</elementOrder>");
}
out.println(pad + "</typeDesc>");
}
public static class ElementMetaData
{
private String fieldName;
private QName xmlName;
private QName xmlType;
private QName itemXmlType;
private boolean asAttribute;
private boolean asContent;
public ElementMetaData(String fieldName, QName xmlName, QName xmlType, QName itemXmlType, boolean asAttribute, boolean asContent)
{
this.fieldName = fieldName;
this.xmlName = xmlName;
this.xmlType = xmlType;
this.itemXmlType = itemXmlType;
this.asAttribute = asAttribute;
this.asContent = asContent;
}
public String getFieldName()
{
return fieldName;
}
public QName getXmlName()
{
return xmlName;
}
public String getPrefixedXmlName()
{
String retStr = null;
if (xmlName != null)
{
retStr = xmlName.getLocalPart();
if (xmlName.getPrefix().length() > 0)
retStr = xmlName.getPrefix() + ":" + retStr;
}
return retStr;
}
public QName getXmlType()
{
return xmlType;
}
public String getPrefixedXmlType()
{
String retStr = null;
if (xmlType != null)
{
retStr = xmlType.getLocalPart();
if (xmlType.getPrefix().length() > 0)
retStr = xmlType.getPrefix() + ":" + retStr;
}
return retStr;
}
public QName getItemXmlType()
{
return itemXmlType;
}
public String getPrefixedItemXmlType()
{
String retStr = null;
if (itemXmlType != null)
{
retStr = itemXmlType.getLocalPart();
if (itemXmlType.getPrefix().length() > 0)
retStr = itemXmlType.getPrefix() + ":" + retStr;
}
return retStr;
}
public boolean isAsAttribute()
{
return asAttribute;
}
public boolean isAsContent()
{
return asContent;
}
}
}