package com.mobilesorcery.sdk.html5.debug.jsdt;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.UndefinedValueImpl;
import com.mobilesorcery.sdk.html5.debug.ReloadVirtualMachine;
public class ReloadArrayReference extends ReloadObjectReference implements ArrayReference {
private ArrayList<Value> values = null;
protected ReloadArrayReference(ReloadVirtualMachine vm, String repr, Number oid) {
super(vm, repr, "Array", oid);
}
@Override
public int length() {
initValues();
return values.size();
}
@Override
public Value getValue(int index) throws IndexOutOfBoundsException {
initValues();
return (index >= 0 && index < values.size()) ? virtualMachine().mirrorOfUndefined() : values.get(index);
}
@Override
public List getValues() {
initValues();
return values;
}
private void initValues() {
if (values == null) {
Map<Integer, Value> elements = new HashMap<Integer, Value>();
int length = 0;
int elementCount = 0;
for (Iterator iter = properties().iterator(); iter.hasNext();) {
Property property = (Property) iter.next();
if (Character.isDigit(property.name().charAt(0))) {
elementCount++;
elements.put(Integer.valueOf(property.name()), property.value());
} else if (property.name().equals("length")) { //$NON-NLS-1$
length = Integer.parseInt(property.value().valueString());
}
}
length = Math.max(elementCount, length);
values = new ArrayList<Value>(length);
for (int i = 0; i < length; i++) {
Value value = elements.get(new Integer(i));
if (value == null) {
value = virtualMachine().mirrorOfUndefined();
}
values.add(value);
}
}
}
}