/**
*
*/
package org.openntf.domino.utils.xml;
import java.util.AbstractList;
import java.util.concurrent.Callable;
import java.util.logging.Logger;
import org.openntf.domino.utils.DominoUtils;
/**
* @author jgallagher
*
*/
public class ModifiableStringNodeList extends AbstractList<String> {
@SuppressWarnings("unused")
private static final Logger log_ = Logger.getLogger(ModifiableStringNodeList.class.getName());
private final XMLNode xml_;
private final String parentNodePath_;
private final String nodeName_;
private Callable<?> postAdd_;
public ModifiableStringNodeList(final XMLNode xml, final String parentNodePath, final String nodeName) {
xml_ = xml;
parentNodePath_ = parentNodePath;
nodeName_ = nodeName;
}
/* (non-Javadoc)
* @see java.util.AbstractList#get(int)
*/
@Override
public String get(final int index) {
return xml_.selectNodes(parentNodePath_ + "/" + nodeName_).get(index).getText();
}
/* (non-Javadoc)
* @see java.util.AbstractCollection#size()
*/
@Override
public int size() {
return xml_.selectNodes(parentNodePath_ + "/" + nodeName_).size();
}
/* (non-Javadoc)
* @see java.util.AbstractList#add(java.lang.Object)
*/
@Override
public boolean add(final String e) {
XMLNode parent = xml_.selectSingleNode(parentNodePath_);
if (parent == null) {
String[] parts = parentNodePath_.split("/");
parent = xml_;
for (String part : parts) {
if (!part.isEmpty()) {
XMLNode childNode = parent.selectSingleNode(part);
if (childNode == null) {
childNode = parent.addChildElement(part);
}
parent = childNode;
}
}
}
XMLNode node = parent.addChildElement(nodeName_);
node.setText(e);
if (postAdd_ != null) {
try {
postAdd_.call();
} catch (Exception e1) {
DominoUtils.handleException(e1);
}
}
return true;
}
/* (non-Javadoc)
* @see java.util.AbstractList#set(int, java.lang.Object)
*/
@Override
public String set(final int index, final String element) {
String current = get(index);
xml_.selectNodes(parentNodePath_ + "/" + nodeName_).get(index).setText(element);
return current;
}
/* (non-Javadoc)
* @see java.util.AbstractList#remove(int)
*/
@Override
public String remove(final int index) {
String current = get(index);
xml_.selectNodes(parentNodePath_ + "/" + nodeName_).remove(index);
return current;
}
public void setPostAdd(final Callable<?> proc) {
postAdd_ = proc;
}
}