package org.gnue.forms;
import java.io.IOException;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
/**
* This utility class provides for the creation of a Form object by parsing
* the contents of a GFD document
*
* @see org.gnue.forms.Form
*/
public class FormManager
{
/**
* Parse the contents of the file located at the given URL and create
* a Form object
*
* @param url the url of the document to be parsed
* @return the new Form object
* @exception java.io.IOException if an I/O error occurs while parsing
* the url
*/
public static Form
parseURL(String url) throws IOException
{
DOMParser parser = new DOMParser();
try
{
parser.parse(url);
}
catch (SAXException sax)
{
System.err.println(sax);
return null;
}
return createForm(parser.getDocument().getDocumentElement());
}
/**
* Generate a Form
object from an XML element
*
* @param element the element
* @return the Form
object
* @exception org.xml.sax.SAXException if the element is not well-formed
*/
protected static Form
createForm(Element element)
{
Form retval = new Form();
retval.setAttribute("title", element.getAttribute("title"));
try
{
retval.setWidth(Integer.parseInt(element.getAttribute("width")));
retval.setHeight(Integer.parseInt(element.getAttribute("height")));
}
catch (NumberFormatException nfe)
{
System.err.println(nfe);
}
NodeList pages = element.getElementsByTagName("page");
for (int i = 0, maxCount = pages.getLength(); i < maxCount; i++)
{
try
{
retval.addPage(createPage((Element)pages.item(i)));
}
catch (ClassCastException cce)
{
System.err.println(cce);
}
}
return retval;
}
/**
* Generate a Page
object from an XML element
*
* @param element the element
* @return the Page
object
*/
protected static Page
createPage(Element element)
{
if (!(element.getNodeName().equals("page")))
throw new IllegalArgumentException();
Page retval = new Page();
NodeList blocks = element.getElementsByTagName("block");
for (int i = 0, maxCount = blocks.getLength(); i < maxCount; i++)
{
retval.addBlock(createBlock((Element)blocks.item(i)));
}
return retval;
}
/**
* Generate a Block
element from an XML element
*
* @param element the element
* @return the Block
object
*/
protected static Block
createBlock(Element element)
{
if (!(element.getNodeName().equals("block")))
throw new IllegalArgumentException();
Block retval = new Block();
retval.setTitle(element.getAttribute("title"));
NodeList widgets = element.getChildNodes();
for (int i = 0, maxCount = widgets.getLength(); i < maxCount; i++)
{
Node widget = widgets.item(i);
if (widget.getNodeType() == Node.ELEMENT_NODE)
{
if (widget.getNodeName().equals("label"))
{
retval.addWidget(createLabel((Element)widget));
}
else if (widget.getNodeName().equals("entry"))
{
retval.addWidget(createEntry((Element)widget));
}
}
}
return retval;
}
/**
* Generates a Label
object from a XML element
*
* @param element the element
* @return the Label
object
*/
protected static Label
createLabel(Element element)
{
if (!(element.getNodeName().equals("label")))
throw new IllegalArgumentException();
Label retval = new Label();
retval.setValue(element.getAttribute("text"));
try
{
retval.setX(Integer.parseInt(element.getAttribute("x")));
retval.setY(Integer.parseInt(element.getAttribute("y")));
}
catch (NumberFormatException nfe)
{
System.err.println(nfe);
}
return retval;
}
/**
* Generate an Entry
object from an XML element
*
* @param element the element
* @return the Entry
*/
protected static Entry
createEntry(Element element)
{
if (!(element.getNodeName().equals("entry")))
throw new IllegalArgumentException();
Entry retval = new Entry();
retval.setDefaultValue(element.getAttribute("default"));
try
{
retval.setX(Integer.parseInt(element.getAttribute("x")));
retval.setY(Integer.parseInt(element.getAttribute("y")));
retval.setWidth(Integer.parseInt(element.getAttribute("width")));
retval.setHeight(Integer.parseInt(element.getAttribute("height")));
}
catch (NumberFormatException nfe)
{
System.err.println(nfe);
}
return retval;
}
}