/**
* Copyright 2007-2011 非也
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation。
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses. *
*/
package org.fireflow.model.io;
import java.net.URL;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.commons.lang.StringUtils;
import org.fireflow.model.misc.Duration;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Dom4J XPDL Serializer utility class.
* @author 非也 nychen2000@163.com
* @version 2.0
*/
public class Util4Serializer{
/* ISO standard date format. */
private static final DateFormat STANDARD_DF = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
/**
* Noop constructor.
*
*/
private Util4Serializer(){
// no op
}
/**
* Add a child element with the specific name to the given parent
* element and return the child element. This method will use the
* namespace of the parent element for the child element's namespace.
*
* @param parent The parent element
* @param name The new child element name
* @return The child element
*/
public static Element addElement(Element parent, String name){
Document doc = parent.getOwnerDocument();
String qualifiedName = name;
if (!StringUtils.isEmpty(parent.getPrefix())){
qualifiedName = parent.getPrefix()+":"+name;
}
Element child = doc.createElementNS(parent.getNamespaceURI(), qualifiedName);
parent.appendChild(child);
return child;
}
public static Element addElement(Element parent,QName qname){
Document doc = parent.getOwnerDocument();
String qualifiedName = qname.getLocalPart();
if (!StringUtils.isEmpty(qname.getPrefix())){
qualifiedName = qname.getPrefix()+":"+qname.getLocalPart();
}
Element child = doc.createElementNS(parent.getNamespaceURI(), qualifiedName);
parent.appendChild(child);
return child;
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @return The child element
*/
public static Element addElement(Element parent, String name, Date value){
return addElement(parent, name, value, null);
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace. If the given value is null then the default value is used.
* If the value is null then this method will not add the child
* element and will return null.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @param defaultValue The default value (if the value is null)
* @return The child element
*/
public static Element addElement(Element parent, String name, Date value,
Date defaultValue){
Document doc = parent.getOwnerDocument();
Element child = null;
if(value == null){
value = defaultValue;
}
if(value != null){
child = addElement(parent, name);
child.appendChild(doc.createTextNode(STANDARD_DF.format(value)));
}
return child;
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @return The child element
*/
public static Element addElement(Element parent, String name, String value){
return addElement(parent, name, value, null);
}
/**
*
* @param parent
* @param name
* @param value
* @return
*/
// public static Element addElement(Element parent,String name,CDATA value){
//
// Element child = null;
//
// child = addElement(parent, name);
// child.add(value);
//
// return child;
//
// }
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace. If the given value is null then the default value is
* used. If the value is null then this method will not add the child
* element and will return null.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @param defaultValue The default value (if the value is null)
* @return The child element
*/
public static Element addElement(Element parent, String name, String value,
String defaultValue){
Document doc = parent.getOwnerDocument();
Element child = null;
if(value == null){
value = defaultValue;
}
if(value != null){
child = addElement(parent, name);
child.appendChild(doc.createTextNode(value));
}
return child;
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @return The child element
*/
public static Element addElement(Element parent, String name, URL value){
return addElement(parent, name, value, null);
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace. If the given value is null then the default value is
* used. If the value is null then this method will not add the child
* element and will return null.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @param defaultValue The default value (if the value is null)
* @return The child element
*/
public static Element addElement(Element parent, String name, URL value,
URL defaultValue){
Document doc = parent.getOwnerDocument();
Element child = null;
if(value == null){
value = defaultValue;
}
if(value != null){
child = addElement(parent, name);
child.appendChild(doc.createTextNode(value.toString()));
}
return child;
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @return The child element
*/
public static Element addElement(Element parent, String name, Duration value){
return addElement(parent, name, value, null);
}
/**
* Add a child element with the specific name and the given value to
* the given parent element and return the child element. This method
* will use the namespace of the parent element for the child element's
* namespace. If the given value is null then the default value is
* used. If the value is null then this method will not add the child
* element and will return null.
*
* @param parent The parent element
* @param name The new child element name
* @param value The value
* @param defaultValue The default value (if the value is null)
* @return The child element
*/
public static Element addElement(Element parent, String name, Duration value,
Duration defaultValue){
Element child = null;
Document doc = parent.getOwnerDocument();
if(value == null){
value = defaultValue;
}
if(value != null){
child = addElement(parent, name);
child.appendChild(doc.createTextNode(value.toString()));
}
return child;
}
/**
*
* @param element
* @param name
* @return
*/
// public static Element child(Element element, String name) {
// return element.element(new QName(name, element.getNamespace()));
// }
/**
* 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 children(Element element, String name) {
// return element.elements(new QName(name, element.getNamespace()));
// }
// 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) {
// String s = element.elementTextTrim(
// new QName(name, element.getNamespace()));
// return (s == null || s.length() == 0) ? null : s;
// }
/**
*
* @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);
// //return STANDARD_DF.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);
// }
}