package copyto.target.http.core.internal.html.form;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Form extends HtmlElement {
private static XPathExpression elementsPath;
private Collection<HtmlElement> items;
public Form(Node node) {
super(node);
if (elementsPath == null) {
try {
elementsPath = XPathFactory.newInstance().newXPath().compile(
".//input | .//select | .//textarea");
} catch (XPathExpressionException e) {
}
}
}
public Collection<HtmlElement> getElements() {
if (items == null) {
try {
NodeList elements = (NodeList) elementsPath.evaluate(getNode(),
XPathConstants.NODESET);
items = new ArrayList<HtmlElement>(elements.getLength());
for (int e = 0; e < elements.getLength(); ++e) {
Node element = elements.item(e);
String name = element.getNodeName();
if ("select".equals(name)) {
SelectElement selectFormElement = new SelectElement(
element);
items.add(selectFormElement);
} else if ("input".equals(name)) {
String type = HtmlElement.getAttribute(element, "type",
null);
if ("hidden".equals(type)) {
items.add(new HiddenInputElement(element));
} else if ("text".equals(type)) {
items.add(new TextInputElement(element));
} else if ("checkbox".equals(type)) {
items.add(new CheckboxInputElement(element));
}
} else if ("textarea".equals(name)) {
items.add(new TextAreaElement(element));
}
}
} catch (XPathExpressionException e) {
}
}
return Collections.unmodifiableCollection(items);
}
public String getAction() {
return getAttribute("action", "");
}
public TextAreaElement findTextArea() {
for (HtmlElement element : getElements()) {
if (element instanceof TextAreaElement) {
return (TextAreaElement) element;
}
}
return null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString());
sb.append(" action=");
sb.append(getAction());
sb.append('\n');
for (HtmlElement element : getElements()) {
sb.append(" " + element.toString());
sb.append('\n');
}
return sb.toString();
}
}