package org.develnext.jphp.ext.xml.classes;
import org.develnext.jphp.ext.xml.XmlExtension;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import php.runtime.Memory;
import php.runtime.annotation.Reflection.Abstract;
import php.runtime.annotation.Reflection.Arg;
import php.runtime.annotation.Reflection.Name;
import php.runtime.annotation.Reflection.Signature;
import php.runtime.env.Environment;
import php.runtime.lang.BaseWrapper;
import php.runtime.lang.ForeachIterator;
import php.runtime.lang.spl.ArrayAccess;
import php.runtime.lang.spl.Countable;
import php.runtime.lang.spl.iterator.Iterator;
import php.runtime.memory.LongMemory;
import php.runtime.memory.ObjectMemory;
import php.runtime.reflection.ClassEntity;
@Abstract
@Name(XmlExtension.NAMESPACE + "DomNodeList")
public class WrapDomNodeList extends BaseWrapper<NodeList> implements Iterator, Countable, ArrayAccess {
protected int index = 0;
public WrapDomNodeList(Environment env, NodeList wrappedObject) {
super(env, wrappedObject);
}
public WrapDomNodeList(Environment env, ClassEntity clazz) {
super(env, clazz);
}
@Override
@Signature(@Arg("offset"))
public Memory offsetExists(Environment environment, Memory... memories) {
return getWrappedObject().item(memories[0].toInteger()) == null ? Memory.FALSE : Memory.TRUE;
}
@Override
@Signature(@Arg("offset"))
public Memory offsetGet(Environment environment, Memory... memories) {
Node node = getWrappedObject().item(memories[0].toInteger());
if (node == null) {
return Memory.NULL;
}
if (node instanceof Element) {
return ObjectMemory.valueOf(new WrapDomElement(environment, (Element) node));
}
return ObjectMemory.valueOf(new WrapDomNode(environment, node));
}
@Override
@Signature({@Arg("offset"), @Arg("value")})
public Memory offsetSet(Environment environment, Memory... memories) {
throw new UnsupportedOperationException();
}
@Override
@Signature(@Arg("offset"))
public Memory offsetUnset(Environment environment, Memory... memories) {
throw new UnsupportedOperationException();
}
@Override
@Signature
public Memory count(Environment environment, Memory... memories) {
return LongMemory.valueOf(getWrappedObject().getLength());
}
@Override
@Signature
public Memory current(Environment environment, Memory... memories) {
Node node = getWrappedObject().item(index);
if (node == null) {
return Memory.NULL;
}
if (node instanceof Element) {
return ObjectMemory.valueOf(new WrapDomElement(environment, (Element) node));
}
return ObjectMemory.valueOf(new WrapDomNode(environment, node));
}
@Override
@Signature
public Memory key(Environment environment, Memory... memories) {
return LongMemory.valueOf(index);
}
@Override
@Signature
public Memory next(Environment environment, Memory... memories) {
index += 1;
return Memory.NULL;
}
@Override
@Signature
public Memory rewind(Environment environment, Memory... memories) {
index = 0;
return Memory.NULL;
}
@Override
@Signature
public Memory valid(Environment environment, Memory... memories) {
return index < getWrappedObject().getLength() ? Memory.TRUE : Memory.FALSE;
}
@Override
public ForeachIterator getNewIterator(Environment env, boolean getReferences, boolean getKeyReferences) {
return ObjectMemory.valueOf(this).getNewIterator(env, getReferences, getKeyReferences);
}
@Override
public ForeachIterator getNewIterator(Environment env) {
return ObjectMemory.valueOf(this).getNewIterator(env);
}
}