in gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslator.java [116:185]
private Object translateObject(final Object object) {
if (object instanceof Bytecode.Binding)
return translateObject(((Bytecode.Binding) object).value());
else if (object instanceof Bytecode) {
// source based bytecode at this stage of translation could have special meaning, but generally this is
// going to spawn a new anonymous traversal.
final Bytecode bc = (Bytecode) object;
if (!bc.getSourceInstructions().isEmpty()) {
// currently, valid source instructions will be singly defined. would be odd to get this error. could
// be just bad construction from a language variant if it appears. maybe better as an assertion but
// third-party variants might benefit from this error
if (bc.getSourceInstructions().size() != 1) {
throw new IllegalStateException("More than one source instruction defined in bytecode");
}
final Bytecode.Instruction inst = bc.getSourceInstructions().get(0);
if (inst.getOperator().equals(CardinalityValueTraversal.class.getSimpleName())) {
return CardinalityValueTraversal.from(inst);
} else {
throw new IllegalStateException(String.format("Unknown source instruction for %s", inst.getOperator()));
}
} else {
try {
final Traversal.Admin<?, ?> traversal = (Traversal.Admin) this.anonymousTraversalStart.invoke(null);
for (final Bytecode.Instruction instruction : bc.getStepInstructions()) {
invokeMethod(traversal, Traversal.class, instruction.getOperator(), instruction.getArguments());
}
return traversal;
} catch (final Throwable e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
} else if (object instanceof TraversalStrategyProxy) {
final Map<String, Object> map = new HashMap<>();
final Configuration configuration = ((TraversalStrategyProxy) object).getConfiguration();
configuration.getKeys().forEachRemaining(key -> map.put(key, translateObject(configuration.getProperty(key))));
return invokeStrategyCreationMethod(object, map);
} else if (object instanceof Map) {
final Map<Object, Object> map = object instanceof Tree ?
new Tree() :
object instanceof LinkedHashMap ?
new LinkedHashMap<>(((Map) object).size()) :
new HashMap<>(((Map) object).size());
for (final Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {
map.put(translateObject(entry.getKey()), translateObject(entry.getValue()));
}
return map;
} else if (object instanceof List) {
final List<Object> list = new ArrayList<>(((List) object).size());
for (final Object o : (List) object) {
list.add(translateObject(o));
}
return list;
} else if (object instanceof BulkSet) {
final BulkSet<Object> bulkSet = new BulkSet<>();
for (final Map.Entry<?, Long> entry : ((BulkSet<?>) object).asBulk().entrySet()) {
bulkSet.add(translateObject(entry.getKey()), entry.getValue());
}
return bulkSet;
} else if (object instanceof Set) {
final Set<Object> set = object instanceof LinkedHashSet ?
new LinkedHashSet<>(((Set) object).size()) :
new HashSet<>(((Set) object).size());
for (final Object o : (Set) object) {
set.add(translateObject(o));
}
return set;
} else
return object;
}