📄 nodeimpl.java
字号:
* It does not duplicate it's context, that is, the node's parent or sibling.
* Initially a clone node has no parents or siblings. However, the node does
* belong to the same document, since all nodes must belong to some document.
* The cloned node is never read-only.
*
* @param into A node into which to duplicate this one
* @param deep True if deep cloning is required
*/
public synchronized void cloneInto( NodeProxy into, boolean deep ) {
NodeProxy child;
// falko: this expression cannot be true in ozone so I commented this
// out
// Make sure no function messed up with the class types.
// if (this.getClass() != into.getClass()) {
// throw new IllegalArgumentException( "Argument 'into' not same type as this node." );
// }
// Duplicate node name and value.
into.setNodeName( _nodeName );
String nodeValue = getNodeValue();
if (nodeValue != null) {
into.setNodeValue( nodeValue );
}
into.setOwnerDocument( _ownerDocument );
if (deep) {
child = (NodeProxy)getFirstChild();
while (child != null) {
into.appendChild( child.cloneNode( true ) );
child = (NodeProxy)child.getNextSibling();
}
}
}
public synchronized void setOwnerDocument( Document owner ) {
Node node;
if (owner == null) {
_ownerDocument = null;
} else {
if (!(owner instanceof DocumentProxy)) {
throw new IllegalArgumentException( "Argument 'owner' not of compatible DOM class." );
}
_ownerDocument = (DocumentProxy)owner;
}
node = getFirstChild();
while (node != null) {
((NodeProxy)node).setOwnerDocument( owner );
node = node.getNextSibling();
}
}
/**
* Renders this node read only, preventing it's contents from being modified.
* Attempts to modify the node's contents will throw an exception. The node's
* children are also made read-only.
*/
public synchronized final void setReadOnly() {
NodeProxy child;
_readOnly = true;
// Make all children read-only as well: this allows us to lock a branch
// but, for example, move it to a different tree.
child = (NodeProxy)getFirstChild();
while (child != null) {
child.setReadOnly();
child = (NodeProxy)child.getNextSibling();
}
}
/**
* Returns true if node is read-only and cannot be modified, or if node
* belongs to a read-only document.
*
* @return True if node is read-only and cannot be modified
* @see #setReadOnly
*/
public final boolean isReadOnly() {
return _readOnly;
}
/**
* Returns true if this node supports children. Other methods query this to
* determine whether to properly support childern, return null or throw an
* exception in response. The default method returns false.
*
* @return True if childern supported by this node type
*/
boolean supportsChildern() {
return false;
}
/**
* Returns the <TT>index</TT>-th child of this node. This method is used
* exclusively by {@link NodeListImpl}.
*
* @param index Index of child to retrieve
* @return The child node or null
* @see NodeListImpl#item(int)
*/
public synchronized final Node getChild( int index ) {
NodeProxy node;
if (index < 0 || index > _childsCount) {
return null;
}
node = (NodeProxy)getFirstChild();
while (node != null && index > 0) {
node = (NodeProxy)node.getNextSibling();
--index;
}
return node;
}
/**
* Returns the number of children in this node. This method is used
* exclusively by {@link NodeListImpl}.
*
* @return Number of childern in this node
* @see NodeListImpl#getLength
*/
public final int getChildCount() {
return _childsCount;
}
/**
* Hidden constructor creates a new node. Only one constructor is supported,
* although cloning is also supported. Owner document must be supplied except
* for {@link DocumentImpl} in which case the document itself becomes its
* owner. Name must be supplied, either dynamic or static (e.g. "#document#").
* <P>
* If <TT>checkName</TT> is true, the supplied named is assumed to be a valid
* XML name token, one that can contain any Unicode letter and digit, must
* start with a letter, and may also contain hyphen, underscore, digit or colon.
*
* @param owner Document owner of this node, or null
* @param name Name of node
* @param value Initial value of node or null
* @param checkName True if name is an XML name token
* @throws org.w3c.dom.DOMException <TT>INVALID_CHARACTER_ERR</TT>
* Node name cannot contain whitespaces or non-printable characters
*/
protected NodeImpl( DocumentImpl owner, String name, String value, boolean checkName ) throws DOMException{
init( owner, name, value, checkName );
}
protected NodeImpl() {
}
public final void init( DocumentProxy owner, String name, String value, boolean checkName ) throws DOMException {
char ch;
int i;
if (name == null) {
throw new NullPointerException( "Argument 'name' is null." );
}
_nodeName = name;
_ownerDocument = owner;
// Check the node name one character at a time to assure that no
// illegal characters are used. Node name must conform to Name token
// as defined in XML spec, including use of all Unicode letters and
// digits.
if (checkName && name.length() > 0) {
ch = name.charAt( 0 );
if (!Character.isLetter( ch ) && ch != '_' && ch != ':') {
throw new DOMExceptionImpl( DOMException.INVALID_CHARACTER_ERR );
}
for (i = 1; i < name.length(); ++i) {
ch = name.charAt( 1 );
if (!Character.isLetterOrDigit( ch ) && ch != '_' && ch != ':' && ch != '-' && ch != '.') {
throw new DOMExceptionImpl( DOMException.INVALID_CHARACTER_ERR );
}
}
}
if (value != null) {
setNodeValue( value );
}
}
/**
* Element declaration node. Not part of the DOM, identifies an element
* declaration node appearing in the DTD.
*/
public final static short ELEMENT_DECL_NODE = 13;
/**
* Attributes list declaration node. Not part of the DOM, identifies an
* attributes list declaration node appearing in the DTD..
*/
public final static short ATTLIST_DECL_NODE = 14;
/**
* Parameter entity declaration node. Not part of the DOM, identifies an
* internal or external parameter entity declaration node appearing in the
* DTD (see {@link ParamEntity}).
*/
public final static short PARAM_ENTITY_NODE = 15;
/**
* This node ia part of a double-linked list that belongs to its parent.
* This reference identifies the next child in the list. Class access
* required by derived classes.
*/
NodeProxy _nextNode;
/**
* This node ia part of a double-linked list that belongs to its parent.
* This reference identifies the previous child in the list. Class access
* required by derived classes.
*/
NodeProxy _prevNode;
/**
* The parent of this node or null if the node has no parent. Class access
* required by derived classes.
*/
NodeProxy _parent;
/**
* The document owner of this node, or the document itself. If the node belongs
* to any document, this will point to that document. For a document this will
* point at the document itself ({@link #getOwnerDocument} will return null,
* though). Class access required by derived classes.
*/
DocumentProxy _ownerDocument;
/**
* The name of this node. All nodes have names, some are dynamic (e.g. the
* tag name of an element), others are static (e.g. "#document").
*/
private String _nodeName;
/**
* The value of this node. Not all nodes support values and this might be
* null for some nodes.
*/
private String _nodeValue;
/**
* The children of this node are arranged in a doubly linked lists.
* This reference identifies the first child in the list.
*/
private NodeProxy _firstChild;
/**
* The children of this node are arranged in a doubly linked lists.
* This reference identifies the last child in the list.
*/
private NodeProxy _lastChild;
/**
* Counts how many children nodes belong to this parent. Used to speed up
* some checks.
*/
private int _childsCount;
/**
* True if this node is read-only and its contents cannot be modified.
*/
private boolean _readOnly;
/**
* Holdes a list of iterators that are observing this node of its
* childern.
*/
private NodeIteratorListener[] _iterators;
/**
*/
public void writeExternal( ObjectOutput out ) throws IOException {
out.writeObject( _nextNode );
out.writeObject( _prevNode );
out.writeObject( _parent );
out.writeObject( _ownerDocument );
//out.writeObject (_nodeName);
if (_nodeName != null) {
out.writeByte( 1 );
out.writeUTF( _nodeName );
} else {
out.writeByte( -1 );
}
// out.writeObject (_nodeValue);
if (_nodeValue != null) {
out.writeByte( 1 );
out.writeUTF( _nodeValue );
} else {
out.writeByte( -1 );
}
out.writeObject( _firstChild );
out.writeObject( _lastChild );
out.writeInt( _childsCount );
out.writeBoolean( _readOnly );
if (_iterators != null) {
int len = _iterators.length;
out.writeInt( len );
for (int i = 0; i < len; i++) {
out.writeObject( _iterators[i] );
}
} else {
out.writeInt( -1 );
}
}
/**
*/
public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException {
_nextNode = (NodeProxy)in.readObject();
_prevNode = (NodeProxy)in.readObject();
_parent = (NodeProxy)in.readObject();
_ownerDocument = (DocumentProxy)in.readObject();
int n = in.readByte();
if (n > 0) {
_nodeName = in.readUTF();
} else {
_nodeName = null;
}
//_nodeValue = (String)in.readObject();
n = in.readByte();
if (n > 0) {
_nodeValue = in.readUTF();
} else {
_nodeValue = null;
}
_firstChild = (NodeProxy)in.readObject();
_lastChild = (NodeProxy)in.readObject();
_childsCount = in.readInt();
_readOnly = in.readBoolean();
int len = in.readInt();
if (len > -1) {
_iterators = new NodeIteratorListener[len];
for (int i = 0; i < len; i++) {
_iterators[i] = (NodeIteratorListener)in.readObject();
}
} else {
_iterators = null;
}
}
public boolean isSupported(String s, String s1) {
throw new DOMExceptionImpl( DOMException.NOT_SUPPORTED_ERR,
"Node.getLocalName(): ozone's persistent DOM doesn't support DOM level 2 yet." );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -