private Object translateObject()

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;
    }