package railo.runtime.text.xml.struct; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import org.w3c.dom.Element; import org.w3c.dom.Node; import railo.runtime.PageContext; import railo.runtime.dump.DumpData; import railo.runtime.dump.DumpProperties; import railo.runtime.exp.PageException; import railo.runtime.exp.PageRuntimeException; import railo.runtime.op.Duplicator; import railo.runtime.text.xml.XMLCaster; import railo.runtime.type.Collection; import railo.runtime.type.dt.DateTime; import railo.runtime.type.it.EntryIterator; import railo.runtime.type.it.KeyIterator; import railo.runtime.type.it.StringIterator; import railo.runtime.type.util.ArraySupport; import railo.runtime.type.util.ArrayUtil; import railo.runtime.type.wrap.ArrayAsArrayList; public class XMLMultiElementArray extends ArraySupport { private static final long serialVersionUID = -2673749147723742450L; private XMLMultiElementStruct struct; public XMLMultiElementArray(XMLMultiElementStruct struct) { this.struct=struct; } @Override public Object append(Object o) throws PageException { return setE(size()+1,o); } @Override public Object appendEL(Object o) { return setEL(size()+1,o); } @Override public boolean containsKey(int key) { return get(key,null)!=null; } @Override public Object get(int key, Object defaultValue) { return struct.get(key,defaultValue); } @Override public Object getE(int key) throws PageException { return struct.get(key); } @Override public int getDimension() { return struct.getInnerArray().getDimension(); } @Override public boolean insert(int index, Object value) throws PageException { Element element=XMLCaster.toElement(struct.getOwnerDocument(),value); boolean rtn = struct.getInnerArray().insert(index, element); Object obj = struct.getInnerArray().get(index,null); if(obj instanceof Element) { Element el = ((Element)obj); el.getParentNode().insertBefore(XMLCaster.toRawNode(element), el); } else { struct.getParentNode().appendChild(XMLCaster.toRawNode(element)); } return rtn; } @Override public int[] intKeys() { return struct.getInnerArray().intKeys(); } @Override public Object prepend(Object value) throws PageException { Element element=XMLCaster.toElement(struct.getOwnerDocument(),value); Object obj = struct.getInnerArray().get(1,null); if(obj instanceof Element) { Element el = ((Element)obj); el.getParentNode().insertBefore(XMLCaster.toRawNode(element), el); } else { struct.getParentNode().appendChild(XMLCaster.toRawNode(element)); } return struct.getInnerArray().prepend(element); } @Override public Object removeE(int key) throws PageException { return struct.remove(key); } @Override public Object removeEL(int key) { return struct.removeEL(key); } @Override public void resize(int to) throws PageException { throw new PageRuntimeException("resizing of xml nodelist not allowed"); } @Override public Object setE(int key, Object value) throws PageException { return struct.set(key, value); } @Override public Object setEL(int key, Object value) { return struct.setEL(key, value); } @Override public void sort(String sortType, String sortOrder) throws PageException { if(size()<=1) return; struct.getInnerArray().sort(sortType, sortOrder); Object[] nodes = struct.getInnerArray().toArray(); Node last=(Node) nodes[nodes.length-1],current; Node parent=last.getParentNode(); for(int i=nodes.length-2;i>=0;i--) { current=(Node) nodes[i]; parent.insertBefore(current, last); last=current; }// MUST testen } public void sort(Comparator comp) throws PageException { if(size()<=1) return; struct.getInnerArray().sort(comp); Object[] nodes = struct.getInnerArray().toArray(); Node last=(Node) nodes[nodes.length-1],current; Node parent=last.getParentNode(); for(int i=nodes.length-2;i>=0;i--) { current=(Node) nodes[i]; parent.insertBefore(current, last); last=current; }// MUST testen } @Override public Object[] toArray() { return struct.getInnerArray().toArray(); } public ArrayList toArrayList() { return ArrayAsArrayList.toArrayList(this); } @Override public void clear() {//MUST } @Override public boolean containsKey(String key) { return struct.containsKey(key); } @Override public boolean containsKey(Key key) { return struct.containsKey(key); } @Override public Collection duplicate(boolean deepCopy) { return new XMLMultiElementArray((XMLMultiElementStruct)Duplicator.duplicate(struct,deepCopy)); } @Override public Object get(String key) throws PageException { return struct.get(key); } @Override public Object get(Key key) throws PageException { return struct.get(key); } @Override public Object get(String key, Object defaultValue) { return struct.get(key,defaultValue); } @Override public Object get(Key key, Object defaultValue) { return struct.get(key,defaultValue); } @Override public Key[] keys() { return struct.getInnerArray().keys(); } @Override public Object remove(Key key) throws PageException { return struct.remove(key); } @Override public Object removeEL(Key key) { return struct.removeEL(key); } @Override public Object set(String key, Object value) throws PageException { return struct.set(key, value); } @Override public Object set(Key key, Object value) throws PageException { return struct.set(key, value); } @Override public Object setEL(String key, Object value) { return struct.setEL(key, value); } @Override public Object setEL(Key key, Object value) { return struct.setEL(key, value); } @Override public int size() { return struct.getInnerArray().size(); } @Override public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) { return struct.toDumpData(pageContext, maxlevel,dp); } @Override public Iterator<Collection.Key> keyIterator() { return new KeyIterator(keys()); } @Override public Iterator<String> keysAsStringIterator() { return new StringIterator(keys()); } @Override public Iterator<Entry<Key, Object>> entryIterator() { return new EntryIterator(this,keys()); } @Override public boolean castToBooleanValue() throws PageException { return struct.castToBooleanValue(); } @Override public Boolean castToBoolean(Boolean defaultValue) { return struct.castToBoolean(defaultValue); } @Override public DateTime castToDateTime() throws PageException { return struct.castToDateTime(); } @Override public DateTime castToDateTime(DateTime defaultValue) { return struct.castToDateTime(defaultValue); } @Override public double castToDoubleValue() throws PageException { return struct.castToDoubleValue(); } @Override public double castToDoubleValue(double defaultValue) { return struct.castToDoubleValue(defaultValue); } @Override public String castToString() throws PageException { return struct.castToString(); } @Override public String castToString(String defaultValue) { return struct.castToString(defaultValue); } @Override public int compareTo(String str) throws PageException { return struct.compareTo(str); } @Override public int compareTo(boolean b) throws PageException { return struct.compareTo(b); } @Override public int compareTo(double d) throws PageException { return struct.compareTo(d); } @Override public int compareTo(DateTime dt) throws PageException { return struct.compareTo(dt); } @Override public Object clone() { return duplicate(true); } public boolean add(Object o) { // TODO Auto-generated method stub return false; } @Override public long sizeOf() { return ArrayUtil.sizeOf((List)this); } }