/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.seasar.mayaa.impl.engine.specification;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.seasar.mayaa.engine.specification.NodeTreeWalker;
import org.seasar.mayaa.engine.specification.serialize.NodeReferenceResolver;
import org.seasar.mayaa.impl.util.collection.NullIterator;
/**
* @author Taro Kato (Gluegent, Inc.)
*/
public class NodeTreeWalkerImpl implements NodeTreeWalker {
private static final long serialVersionUID = 2482332186727952663L;
private transient NodeTreeWalker _owner;
private transient NodeTreeWalker _parent;
private List/*<NodeTreeWalker>*/ _childNodes;
private String _systemID;
private int _lineNumber;
private boolean _onTemplate;
public void setOwner(NodeTreeWalker owner) {
_owner = owner;
}
// NodeTreeWalker implemetns ------------------------------------
public void setParentNode(NodeTreeWalker parentNode) {
if (parentNode == null) {
throw new IllegalArgumentException();
}
_parent = parentNode;
}
public NodeTreeWalker getParentNode() {
return _parent;
}
public void addChildNode(NodeTreeWalker childNode) {
int index;
if (_childNodes == null) {
index = 0;
} else {
index = _childNodes.size();
}
insertChildNode(index, childNode);
}
public void insertChildNode(int index, NodeTreeWalker childNode) {
if (childNode == null) {
throw new IllegalArgumentException();
}
synchronized (this) {
if (_childNodes == null) {
_childNodes = new ArrayList();
}
}
synchronized (_childNodes) {
if (index < 0 || index > _childNodes.size()) {
throw new IndexOutOfBoundsException();
}
_childNodes.add(index, childNode);
childNode.setParentNode(_owner);
}
}
public boolean removeChildNode(NodeTreeWalker childNode) {
if (childNode != null && _childNodes != null) {
synchronized (_childNodes) {
return _childNodes.remove(childNode);
}
}
return false;
}
public int getChildNodeSize() {
if (_childNodes == null) {
return 0;
}
return _childNodes.size();
}
public NodeTreeWalker getChildNode(int index) {
if (_childNodes == null || index < 0 || index >= _childNodes.size()) {
throw new IndexOutOfBoundsException();
}
return (NodeTreeWalker) _childNodes.get(index);
}
public Iterator iterateChildNode() {
if (_childNodes == null) {
return NullIterator.getInstance();
}
return _childNodes.iterator();
}
public void clearChildNodes() {
if (_childNodes != null) {
synchronized (_childNodes) {
_childNodes.clear();
_childNodes = null;
}
}
}
public void kill() {
// TODO deprecated のため削除
}
// PositionAware implements -------------------------------------
public void setSystemID(String systemID) {
if (systemID == null) {
throw new IllegalArgumentException();
}
_systemID = systemID;
}
public String getSystemID() {
return _systemID;
}
public void setLineNumber(int lineNumber) {
_lineNumber = lineNumber;
}
public int getLineNumber() {
return _lineNumber;
}
public void setOnTemplate(boolean onTemplate) {
_onTemplate = onTemplate;
}
public boolean isOnTemplate() {
return _onTemplate;
}
public NodeReferenceResolver findNodeResolver() {
return SpecificationImpl.nodeSerializer();
}
}