// 
// Decompiled by Procyon v0.6.0
// 

package org.bson.types;

import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import org.bson.BSONObject;
import java.util.ArrayList;

public class BasicBSONList extends ArrayList<Object> implements BSONObject
{
    private static final long serialVersionUID = -4415279469780082174L;
    
    @Override
    public Object put(final String key, final Object v) {
        return this.put(this._getInt(key), v);
    }
    
    public Object put(final int key, final Object value) {
        while (key >= this.size()) {
            this.add(null);
        }
        this.set(key, value);
        return value;
    }
    
    @Override
    public void putAll(final Map m) {
        for (final Map.Entry entry : m.entrySet()) {
            this.put(entry.getKey().toString(), entry.getValue());
        }
    }
    
    @Override
    public void putAll(final BSONObject o) {
        for (final String k : o.keySet()) {
            this.put(k, o.get(k));
        }
    }
    
    @Override
    public Object get(final String key) {
        final int i = this._getInt(key);
        if (i < 0) {
            return null;
        }
        if (i >= this.size()) {
            return null;
        }
        return this.get(i);
    }
    
    @Override
    public Object removeField(final String key) {
        final int i = this._getInt(key);
        if (i < 0) {
            return null;
        }
        if (i >= this.size()) {
            return null;
        }
        return this.remove(i);
    }
    
    @Override
    public boolean containsField(final String key) {
        final int i = this._getInt(key, false);
        return i >= 0 && i >= 0 && i < this.size();
    }
    
    @Override
    public Set<String> keySet() {
        return new StringRangeSet(this.size());
    }
    
    @Override
    public Map toMap() {
        final Map m = new HashMap();
        for (final Object s : this.keySet()) {
            m.put(s, this.get(String.valueOf(s)));
        }
        return m;
    }
    
    int _getInt(final String s) {
        return this._getInt(s, true);
    }
    
    int _getInt(final String s, final boolean err) {
        try {
            return Integer.parseInt(s);
        }
        catch (final Exception e) {
            if (err) {
                throw new IllegalArgumentException("BasicBSONList can only work with numeric keys, not: [" + s + "]");
            }
            return -1;
        }
    }
}
