package org.fireflow.model.io;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Util4Deserializer {
/**
* 私有构造方法
*/
private Util4Deserializer() {
// no op
}
/**
* Return the child element with the given name. The element must be in
* the same name space as the parent element.
* @param element The parent element
* @param name The child element name
* @return The child element
*/
public static Element child(Element element, String name) {
if (element==null)return null;
Element child = child(element,new QName(element.getNamespaceURI(),name));
return child;
}
public static Element child(Element element,QName qName){
if (element==null){
return null;
}
NodeList nodeList = element.getChildNodes();//element.getElementsByTagNameNS(qName.getNamespaceURI(), qName.getLocalPart());
if (nodeList!=null){
int length = nodeList.getLength();
for (int i = 0;i<length;i++){
Node node = nodeList.item(i);
if (node.getNodeType()==Node.ELEMENT_NODE
&& equalStrings(node.getNamespaceURI(),qName.getNamespaceURI())
&& (equalStrings(node.getLocalName(),qName.getLocalPart()) ||
equalStrings(node.getNodeName(),qName.getLocalPart())) ){
return (Element)node;
}
}
}
return null;
}
/**
* Return the child elements with the given name. The elements must be in
* the same name space as the parent element.
* @param element The parent element
* @param name The child element name
* @return The child elements
*/
@SuppressWarnings("unchecked")
public static List<Element> children(Element element, String name) {
if (element==null){
return null;
}
NodeList nodeList = element.getChildNodes();//element.getElementsByTagNameNS(element.getNamespaceURI(), name);
List<Element> result = new ArrayList<Element>();
QName qName = new QName(element.getNamespaceURI(),name);
if (nodeList!=null){
int length = nodeList.getLength();
for (int i=0;i<length;i++){
Node node = nodeList.item(i);
if (node.getNodeType()==Node.ELEMENT_NODE && equalStrings(node.getNamespaceURI(),qName.getNamespaceURI())
&& (equalStrings(node.getLocalName(),qName.getLocalPart()) ||
equalStrings(node.getNodeName(),qName.getLocalPart())) ){
result.add((Element)node);
}
}
}
return result;
}
// Conversion
/**
* Return the value of the child element with the given name. The element
* must be in the same name space as the parent element.
* @param element The parent element
* @param name The child element name
* @return The child element value
*/
public static String elementAsString(Element element, String name) {
Element child = child(element,name);
if (child!=null){
return child.getTextContent();
}
return null;
}
/**
* @param element
* @param name
* @return
* @throws DeserializerException
*/
public static Date elementAsDate(Element element, String name) throws
DeserializerException {
String text = elementAsString(element, name);
if (text == null) {
return null;
}
try {
return DateUtilities.getInstance().parse(text);
} catch (ParseException e) {
throw new DeserializerException("Error parsing date: " + text, e);
}
}
/**
* @param element
* @param name
* @return
*/
public static int elementAsInteger(Element element, String name) {
String text = elementAsString(element, name);
if (text == null) {
return 0;
}
return Integer.parseInt(text);
}
/**
* @param element
* @param name
* @return
*/
public static boolean elementAsBoolean(Element element, String name) {
String text = elementAsString(element, name);
if (text == null) {
return false;
}
return new Boolean(text).booleanValue();
}
/**
* @param element
* @param name
* @return
* @throws DeserializerException
*/
public static URL elementAsURL(Element element, String name) throws
DeserializerException {
String text = elementAsString(element, name);
if (text == null) {
return null;
}
try {
return new URL(text);
} catch (MalformedURLException e) {
throw new DeserializerException("Invalid URL: " + text, e);
}
}
private static boolean equalStrings(String s1, String s2) {
if (s1 == s2) {
return true;
}
s1 = s1 == null ? "" : s1.trim();
s2 = s2 == null ? "" : s2.trim();
return s1.equals(s2);
}
}