001: package com.meterware.httpunit;
002:
003: /********************************************************************************************************************
004: * $Id: BlockElement.java,v 1.3 2004/09/29 17:15:24 russgold Exp $
005: *
006: * Copyright (c) 2004, Russell Gold
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
009: * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
010: * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
011: * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be included in all copies or substantial portions
014: * of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
017: * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
019: * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
020: * DEALINGS IN THE SOFTWARE.
021: *
022: *******************************************************************************************************************/
023: import org.w3c.dom.Node;
024:
025: import java.net.URL;
026:
027: import com.meterware.httpunit.scripting.ScriptableDelegate;
028:
029: /**
030: * Represents a block-level element such as a paragraph or table cell, which can contain other elements.
031: *
032: * @author <a href="mailto:russgold@httpunit.org">Russell Gold</a>
033: *
034: * @since 1.6
035: **/
036: abstract public class BlockElement extends ParsedHTML implements
037: HTMLSegment, HTMLElement {
038:
039: private ScriptableDelegate _scriptable;
040: private Node _node;
041:
042: /**
043: * Returns the text value of this block.
044: **/
045: public String getText() {
046: if (_node.getNodeType() == Node.TEXT_NODE) {
047: return _node.getNodeValue().trim();
048: } else if (_node == null || !_node.hasChildNodes()) {
049: return "";
050: } else {
051: return NodeUtils.asText(_node.getChildNodes()).trim();
052: }
053: }
054:
055: /**
056: * Returns the tag for this block.
057: */
058: public String getTagName() {
059: return _node == null ? "p" : _node.getNodeName();
060: }
061:
062: /**
063: * Returns a copy of the domain object model associated with this HTML segment.
064: **/
065: public Node getDOM() {
066: return super .getDOM();
067: }
068:
069: //-------------------------------- HTMLElement methods ---------------------------------------
070:
071: /**
072: * Returns the ID associated with this element. IDs are unique throughout the HTML document.
073: **/
074: public String getID() {
075: return getAttribute("id");
076: }
077:
078: /**
079: * Returns the class attribute associated with this element.
080: */
081: public String getClassName() {
082: return getAttribute("class");
083: }
084:
085: /**
086: * Returns the name associated with this element.
087: **/
088: public String getName() {
089: return getAttribute("name");
090: }
091:
092: /**
093: * Returns the title associated with this element.
094: **/
095: public String getTitle() {
096: return getAttribute("title");
097: }
098:
099: /**
100: * Returns the delegate which supports scripting this element.
101: */
102: public ScriptableDelegate getScriptableDelegate() {
103: if (_scriptable == null) {
104: _scriptable = new HTMLElementScriptable(this );
105: _scriptable.setScriptEngine(getResponse()
106: .getScriptableObject().getDocument()
107: .getScriptEngine(_scriptable));
108: }
109: return _scriptable;
110: }
111:
112: public String getAttribute(final String name) {
113: return NodeUtils.getNodeAttribute(_node, name);
114: }
115:
116: /**
117: * Returns true if this element may have an attribute with the specified name.
118: */
119: public boolean isSupportedAttribute(String name) {
120: return false;
121: }
122:
123: //----------------------------------------------- Object methods -------------------------------------------------------
124:
125: public boolean equals(Object obj) {
126: return getClass().equals(obj.getClass())
127: && equals((BlockElement) obj);
128: }
129:
130: private boolean equals(BlockElement block) {
131: return _node.equals(block._node);
132: }
133:
134: public int hashCode() {
135: return _node.hashCode();
136: }
137:
138: //------------------------------------- protected members --------------------------------------------------------------
139:
140: protected BlockElement(WebResponse response, FrameSelector frame,
141: URL baseURL, String baseTarget, Node rootNode,
142: String characterSet) {
143: super (response, frame, baseURL, baseTarget, rootNode,
144: characterSet);
145: _node = rootNode;
146: }
147:
148: protected int getAttributeValue(Node node, String attributeName,
149: int defaultValue) {
150: return NodeUtils.getAttributeValue(node, attributeName,
151: defaultValue);
152: }
153: }
|