test/jdk/jdk/jfr/cmd/TestPrintXML.java
author goetz
Fri, 20 Jul 2018 09:46:57 +0200
changeset 51214 67736b4846a0
parent 50113 caf115bb98ad
permissions -rw-r--r--
8207830: [aix] disable jfr in build and tests Reviewed-by: kvn, erikj
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
package jdk.jfr.cmd;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.StringReader;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.nio.file.Path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.time.Duration;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.time.Instant;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.util.AbstractMap.SimpleEntry;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import java.util.HashMap;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import java.util.Iterator;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
import java.util.Map;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
import java.util.Stack;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import javax.xml.parsers.SAXParser;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
import javax.xml.parsers.SAXParserFactory;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import jdk.jfr.ValueDescriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import jdk.jfr.consumer.RecordedEvent;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import jdk.jfr.consumer.RecordedObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import jdk.jfr.consumer.RecordingFile;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import jdk.test.lib.process.OutputAnalyzer;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
import org.xml.sax.Attributes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
import org.xml.sax.InputSource;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
import org.xml.sax.SAXException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
import org.xml.sax.XMLReader;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
import org.xml.sax.helpers.DefaultHandler;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
51214
67736b4846a0 8207830: [aix] disable jfr in build and tests
goetz
parents: 50113
diff changeset
    55
/**
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
 * @test
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
 * @key jfr
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
 * @summary Tests print --xml
51214
67736b4846a0 8207830: [aix] disable jfr in build and tests
goetz
parents: 50113
diff changeset
    59
 * @requires vm.hasJFR
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
 * @library /test/lib /test/jdk
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
 * @modules java.scripting
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
 *          java.xml
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
 *          jdk.jfr
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
 * @run main/othervm jdk.jfr.cmd.TestPrintXML
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
public class TestPrintXML {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
    public static void main(String... args) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
        Path recordingFile = ExecuteHelper.createProfilingRecording().toAbsolutePath();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
        OutputAnalyzer output = ExecuteHelper.run("print", "--xml", recordingFile.toString());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
        String xml = output.getStdout();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
        System.out.println(xml);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
        // Parse XML string
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
        SAXParserFactory factory = SAXParserFactory.newInstance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
        SAXParser sp = factory.newSAXParser();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
        XMLReader xr = sp.getXMLReader();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        RecordingHandler handler = new RecordingHandler();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        xr.setContentHandler(handler);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
        xr.parse(new InputSource(new StringReader(xml)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
        // Verify that all data was written correctly
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
        Iterator<RecordedEvent> it = RecordingFile.readAllEvents(recordingFile).iterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        for (XMLEvent xmlEvent : handler.events) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
            RecordedEvent re = it.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
            if (!compare(re, xmlEvent.values)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
                System.out.println(re);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
                System.out.println(xmlEvent.values.toString());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
                throw new Exception("Event doesn't match");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
    @SuppressWarnings("unchecked")
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
    static boolean compare(Object eventObject, Object xmlObject) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        if (eventObject == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
            return xmlObject == null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        if (eventObject instanceof RecordedObject) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
            RecordedObject re = (RecordedObject) eventObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
            Map<String, Object> xmlMap = (Map<String, Object>) xmlObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
            List<ValueDescriptor> fields = re.getFields();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
            if (fields.size() != xmlMap.size()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
                return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
            for (ValueDescriptor v : fields) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
                String name = v.getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
                if (!compare(re.getValue(name), xmlMap.get(name))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
                    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
            return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
        if (eventObject.getClass().isArray()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
            Object[] array = (Object[]) eventObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
            Object[] xmlArray = (Object[]) xmlObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
            if (array.length != xmlArray.length) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
                return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
            for (int i = 0; i < array.length; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
                if (!compare(array[i], xmlArray[i])) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
                    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
            return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
        String s1 = String.valueOf(eventObject);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
        String s2 = (String) xmlObject;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
        return s1.equals(s2);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
    static class XMLEvent {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
        String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
        Instant startTime;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
        Duration duration;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
        Map<String, Object> values = new HashMap<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
        XMLEvent(String name, Instant startTime, Duration duration) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
            this.name = name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
            this.startTime = startTime;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
            this.duration = duration;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
    public static final class RecordingHandler extends DefaultHandler {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
        private Stack<Object> objects = new Stack<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
        private Stack<SimpleEntry<String, String>> elements = new Stack<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
        private List<XMLEvent> events = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
            elements.push(new SimpleEntry<>(attrs.getValue("name"), attrs.getValue("index")));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
            switch (qName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
            case "null":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
                objects.pop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
                objects.push(null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
            case "event":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
                Instant startTime = Instant.parse(attrs.getValue("startTime"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
                Duration duration = Duration.parse(attrs.getValue("duration"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
                objects.push(new XMLEvent(attrs.getValue("name"), startTime, duration));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
            case "struct":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
                objects.push(new HashMap<String, Object>());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
            case "array":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
                objects.push(new Object[Integer.parseInt(attrs.getValue("size"))]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
            case "value":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
                objects.push(new StringBuilder());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
                break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
        public void characters(char[] ch, int start, int length) throws SAXException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
            if (!objects.isEmpty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
                Object o = objects.peek();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
                if (o instanceof StringBuilder) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
                    ((StringBuilder) o).append(ch, start, length);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
        @SuppressWarnings("unchecked")
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
        public void endElement(String uri, String localName, String qName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
            SimpleEntry<String, String> element = elements.pop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
            switch (qName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
            case "event":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
            case "struct":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
            case "array":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
            case "value":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
                String name = element.getKey();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
                Object value = objects.pop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
                if (objects.isEmpty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
                    events.add((XMLEvent) value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
                    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
                if (value instanceof StringBuilder) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
                    value = ((StringBuilder) value).toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
                Object parent = objects.peek();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
                if (parent instanceof XMLEvent) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
                    ((XMLEvent) parent).values.put(name, value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
                if (parent instanceof Map) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
                    ((Map<String, Object>) parent).put(name, value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
                if (parent != null && parent.getClass().isArray()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
                    int index = Integer.parseInt(element.getValue());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
                    ((Object[]) parent)[index] = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
}