/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package groovy.json.internal;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author Rick Hightower
*/
public class ValueList extends AbstractList<Object> {
List<Object> list = new ArrayList<Object>(5);
private final boolean lazyChop;
boolean converted = false;
public ValueList(boolean lazyChop) {
this.lazyChop = lazyChop;
}
public Object get(int index) {
Object obj = list.get(index);
if (obj instanceof Value) {
obj = convert((Value) obj);
list.set(index, obj);
}
chopIfNeeded(obj);
return obj;
}
private static Object convert(Value value) {
return value.toValue();
}
public int size() {
return list.size();
}
public Iterator<Object> iterator() {
convertAllIfNeeded();
return list.iterator();
}
private void convertAllIfNeeded() {
if (!converted) {
converted = true;
for (int index = 0; index < list.size(); index++) {
this.get(index);
}
}
}
public void clear() {
list.clear();
}
public boolean add(Object obj) {
return list.add(obj);
}
public void chopList() {
for (Object obj : list) {
if (obj == null) continue;
if (obj instanceof Value) {
Value value = (Value) obj;
if (value.isContainer()) {
chopContainer(value);
} else {
value.chop();
}
}
}
}
private void chopIfNeeded(Object object) {
if (lazyChop) {
if (object instanceof LazyValueMap) {
LazyValueMap m = (LazyValueMap) object;
m.chopMap();
} else if (object instanceof ValueList) {
ValueList list = (ValueList) object;
list.chopList();
}
}
}
static void chopContainer(Value value) {
Object obj = value.toValue();
if (obj instanceof LazyValueMap) {
LazyValueMap map = (LazyValueMap) obj;
map.chopMap();
} else if (obj instanceof ValueList) {
ValueList list = (ValueList) obj;
list.chopList();
}
}
public List<Object> list() {
return this.list;
}
}