private static Event eventStreamToEvent()

in ion-java-cli/src/com/amazon/tools/cli/IonJavaCli.java [1026:1127]


    private static Event eventStreamToEvent(IonReader ionReader) {
        if (ionReader.getType() != IonType.STRUCT) throw new IonException("cant convert null");
        String textValue = null;
        byte[] binaryValue = null;
        IonValue eventValue = null;
        EventType eventType = null;
        IonType ionType = null;
        SymbolToken fieldName = null;
        SymbolToken[] annotations = null;
        ImportDescriptor[] imports = null;
        int depth = -1;

        ionReader.stepIn();
        while (ionReader.next() != null) {
            switch (ionReader.getFieldName()) {
                case "event_type":
                    if (eventType != null) throw new IonException("invalid Event: repeat event_type");
                    eventType = EventType.valueOf(ionReader.stringValue().toUpperCase());
                    break;
                case "ion_type":
                    if (ionType != null) throw new IonException("invalid Event: repeat ion_type");
                    ionType = IonType.valueOf(ionReader.stringValue().toUpperCase());
                    break;
                case "field_name":
                    if (fieldName != null) throw new IonException("invalid Event: repeat field_name");
                    ionReader.stepIn();
                    String fieldText = null;
                    int fieldSid = 0;
                    while (ionReader.next() != null) {
                        switch (ionReader.getFieldName()) {
                            case "text":
                                fieldText = ionReader.stringValue();
                                break;
                            case "sid":
                                fieldSid = ionReader.intValue();
                                break;
                        }
                    }
                    fieldName = _Private_Utils.newSymbolToken(fieldText, fieldSid);
                    ionReader.stepOut();
                    break;
                case "annotations":
                    if (annotations != null) throw new IonException("invalid Event: repeat annotations");
                    ArrayList<SymbolToken> annotationsList = new ArrayList<>();
                    ionReader.stepIn();
                    while (ionReader.next() != null) {
                        ionReader.stepIn();
                        String text = null;
                        int sid = 0;
                        while (ionReader.next() != null) {
                            switch (ionReader.getFieldName()) {
                                case "text":
                                    text = ionReader.isNullValue() ? null : ionReader.stringValue();
                                    break;
                                case "sid":
                                    sid = ionReader.intValue();
                                    break;
                            }
                        }
                        SymbolToken annotation = _Private_Utils.newSymbolToken(text, sid);
                        annotationsList.add(annotation);
                        ionReader.stepOut();
                    }
                    annotations = annotationsList.toArray(SymbolToken.EMPTY_ARRAY);
                    ionReader.stepOut();
                    break;
                case "value_text":
                    if (textValue != null) throw new IonException("invalid Event: repeat value_text");
                    textValue = ionReader.stringValue();
                    break;
                case "value_binary":
                    if (binaryValue != null) throw new IonException("invalid Event: repeat binary_value");
                    ArrayList<Integer> intArray = new ArrayList<>();
                    ionReader.stepIn();
                    while (ionReader.next() != null) {
                        intArray.add(ionReader.intValue());
                    }
                    byte[] binary = new byte[intArray.size()];
                    for (int i = 0; i < intArray.size(); i++) {
                        int val = intArray.get(i);
                        binary[i] = (byte) (val & 0xff);
                    }
                    binaryValue = binary;
                    ionReader.stepOut();
                    break;
                case "imports":
                    if (imports != null) throw new IonException("invalid Event: repeat imports");
                    imports = ionStreamToImportDescriptors(ionReader);
                    break;
                case "depth":
                    if (depth != -1) throw new IonException("invalid Event: repeat depth");
                    depth = ionReader.intValue();
                    break;
            }
        }
        ionReader.stepOut();
        //validate event
        validateEvent(textValue, binaryValue, eventType, fieldName, ionType, imports, depth);
        if (textValue != null) eventValue = ION_SYSTEM.singleValue(textValue);

        return new Event(eventType, ionType, fieldName, annotations, eventValue, imports, depth);
    }