blob: a8e8abd9ef6ca431e90ac13699e8a05c3b3843c8 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// This program and the accompanying materials are made available
// under the terms of the Eclipse Public License v2.0 which accompanies
// this distribution, and is available at
// https://www.eclipse.org/legal/epl-2.0/
package org.eclipse.wst.jsdt.chromium.internal.v8native.value;
import static org.eclipse.wst.jsdt.chromium.util.BasicUtil.getSafe;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.wst.jsdt.chromium.JsValue.Type;
import org.eclipse.wst.jsdt.chromium.internal.v8native.InternalContext;
/**
* Test {@link ValueLoader} implementation that works over local data model.
*/
class FakeValueLoader extends ValueLoader {
private int cacheState = 1;
private final Map<Long, ValueData> valueDataMap = new HashMap<Long, ValueData>();
void addValueDataRecursive(ValueData data) {
Long ref = data.getRef();
if (ref < 0) {
return;
}
if (!valueDataMap.containsKey(ref)) {
valueDataMap.put(ref, data);
ObjectData asObject = data.asObjectData();
if (asObject != null) {
for (ValueData inner : asObject.getProperties().values()) {
addValueDataRecursive(inner);
}
}
}
}
@Override
public void clearCaches() {
cacheState++;
}
@Override
int getCurrentCacheState() {
return cacheState;
}
@Override
public SubpropertiesMirror getOrLoadSubproperties(Long ref) {
ValueData data = getSafe(valueDataMap, ref);
ObjectData asObject = data.asObjectData();
if (asObject == null) {
return SubpropertiesMirror.EMPTY;
} else {
return createSubpropertiesMirror(asObject);
}
}
@Override
public List<ValueMirror> getOrLoadValueFromRefs(List<? extends PropertyReference> propertyRefs) {
List<ValueMirror> result = new ArrayList<ValueMirror>();
for (PropertyReference reference : propertyRefs) {
Long ref = reference.getRef();
ValueData data = getSafe(valueDataMap, ref);
ValueMirror mirror = createMirrorFromData(data, false);
result.add(mirror);
}
return result;
}
@Override
public InternalContext getInternalContext() {
throw new UnsupportedOperationException();
}
static SubpropertiesMirror createSubpropertiesMirror(ObjectData objectData) {
List<PropertyReference> list = new ArrayList<PropertyReference>();
for (Map.Entry<String, ? extends ValueData> en : objectData.getProperties().entrySet()) {
list.add(new PropertyReference(en.getKey(), DataWithRef.fromLong(en.getValue().getRef())));
}
return new SubpropertiesMirror.ListBased(list);
}
static ValueMirror createMirrorFromData(ValueData data, boolean includeProperties) {
SubpropertiesMirror subpropertiesMirror;
if (includeProperties) {
ObjectData asObject = data.asObjectData();
if (asObject == null) {
subpropertiesMirror = SubpropertiesMirror.EMPTY;
} else {
subpropertiesMirror = FakeValueLoader.createSubpropertiesMirror(asObject);
}
} else {
subpropertiesMirror = null;
}
return ValueMirror.create(data.getRef(), data.getType(), data.getClassName(),
data.getString(), subpropertiesMirror);
}
interface ValueData {
Long getRef();
Type getType();
String getClassName();
LoadableString getString();
ObjectData asObjectData();
}
interface ObjectData {
Map<String, ? extends ValueData> getProperties();
}
}