src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataHandler.java
author egahlin
Mon, 08 Jul 2019 18:11:26 +0200
branchJEP-349-branch
changeset 57459 df39f8d8f4d6
parent 53013 c8b2a408628b
permissions -rw-r--r--
Make stream more responsive
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.internal;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.BufferedInputStream;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.io.InputStream;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.lang.annotation.Annotation;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import java.util.Collections;
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.LinkedHashMap;
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.Objects;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import jdk.internal.org.xml.sax.Attributes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
import jdk.internal.org.xml.sax.EntityResolver;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
import jdk.internal.org.xml.sax.SAXException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import jdk.internal.org.xml.sax.helpers.DefaultHandler;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import jdk.internal.util.xml.SAXParser;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import jdk.internal.util.xml.impl.SAXParserImpl;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import jdk.jfr.AnnotationElement;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import jdk.jfr.Category;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
import jdk.jfr.Description;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
import jdk.jfr.Enabled;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
import jdk.jfr.Experimental;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
import jdk.jfr.Label;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
import jdk.jfr.Period;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
import jdk.jfr.Relational;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
import jdk.jfr.StackTrace;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
import jdk.jfr.Threshold;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
import jdk.jfr.TransitionFrom;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
import jdk.jfr.TransitionTo;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
import jdk.jfr.Unsigned;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
final class MetadataHandler extends DefaultHandler implements EntityResolver {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
    static class TypeElement {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
        List<FieldElement> fields = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
        String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
        String label;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
        String description;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
        String category;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
        String superType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
        String period;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
        boolean thread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
        boolean startTime;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
        boolean stackTrace;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
        boolean cutoff;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
        boolean isEvent;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
        boolean experimental;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
        boolean valueType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
    static class FieldElement {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
        TypeElement referenceType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        String label;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
        String description;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
        String contentType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
        String typeName;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
        String transition;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        String relation;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
        boolean struct;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
        boolean array;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
        boolean experimental;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
        boolean unsigned;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
    static class XmlType {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
        String javaType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
        String contentType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
        boolean unsigned;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
    final Map<String, TypeElement> types = new LinkedHashMap<>(200);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
    final Map<String, XmlType> xmlTypes = new HashMap<>(20);
53013
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   103
    final Map<String, List<AnnotationElement>> xmlContentTypes = new HashMap<>(20);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
    final List<String> relations = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
    long eventTypeId = 255;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
    long structTypeId = 33;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
    FieldElement currentField;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
    TypeElement currentType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
        switch (qName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
        case "XmlType":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
            XmlType xmlType = new XmlType();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
            xmlType.name = attributes.getValue("name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
            xmlType.javaType = attributes.getValue("javaType");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
            xmlType.contentType = attributes.getValue("contentType");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
            xmlType.unsigned = Boolean.valueOf(attributes.getValue("unsigned"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
            xmlTypes.put(xmlType.name, xmlType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
        case "Type":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
        case "Event":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
            currentType = new TypeElement();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
            currentType.name = attributes.getValue("name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
            currentType.label = attributes.getValue("label");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
            currentType.description = attributes.getValue("description");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
            currentType.category = attributes.getValue("category");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
            currentType.thread = getBoolean(attributes, "thread", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
            currentType.stackTrace = getBoolean(attributes, "stackTrace", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
            currentType.startTime = getBoolean(attributes, "startTime", true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
            currentType.period = attributes.getValue("period");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
            currentType.cutoff = getBoolean(attributes, "cutoff", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
            currentType.experimental = getBoolean(attributes, "experimental", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
            currentType.isEvent = qName.equals("Event");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
        case "Field":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
            currentField = new FieldElement();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
            currentField.struct = getBoolean(attributes, "struct", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
            currentField.array = getBoolean(attributes, "array", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
            currentField.name = attributes.getValue("name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
            currentField.label = attributes.getValue("label");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
            currentField.typeName = attributes.getValue("type");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
            currentField.description = attributes.getValue("description");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
            currentField.experimental = getBoolean(attributes, "experimental", false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
            currentField.contentType = attributes.getValue("contentType");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
            currentField.relation = attributes.getValue("relation");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
            currentField.transition = attributes.getValue("transition");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
        case "XmlContentType":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
            String name = attributes.getValue("name");
53013
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   151
            String annotation = attributes.getValue("annotation");
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   152
            xmlContentTypes.put(name, createAnnotationElements(annotation));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
        case "Relation":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
            String n = attributes.getValue("name");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
            relations.add(n);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
53013
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   161
    private List<AnnotationElement> createAnnotationElements(String annotation) throws InternalError {
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   162
        String[] annotations = annotation.split(",");
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   163
        List<AnnotationElement> annotationElements = new ArrayList<>();
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   164
        for (String a : annotations) {
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   165
            a = a.trim();
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   166
            int leftParenthesis = a.indexOf("(");
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   167
            if (leftParenthesis == -1) {
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   168
                annotationElements.add(new AnnotationElement(createAnnotationClass(a)));
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   169
            } else {
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   170
                int rightParenthesis = a.lastIndexOf(")");
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   171
                if (rightParenthesis == -1) {
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   172
                    throw new InternalError("Expected closing parenthesis for 'XMLContentType'");
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   173
                }
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   174
                String value = a.substring(leftParenthesis + 1, rightParenthesis);
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   175
                String type = a.substring(0, leftParenthesis);
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   176
                annotationElements.add(new AnnotationElement(createAnnotationClass(type), value));
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   177
            }
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   178
        }
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   179
        return annotationElements;
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   180
    }
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   181
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
    @SuppressWarnings("unchecked")
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
    private Class<? extends Annotation> createAnnotationClass(String type) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
            if (!type.startsWith("jdk.jfr.")) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
                throw new IllegalStateException("Incorrect type " + type + ". Annotation class must be located in jdk.jfr package.");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
            Class<?> c = Class.forName(type, true, null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
            return (Class<? extends Annotation>) c;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
        } catch (ClassNotFoundException cne) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
            throw new IllegalStateException(cne);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
    private boolean getBoolean(Attributes attributes, String name, boolean defaultValue) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
        String value = attributes.getValue(name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
        return value == null ? defaultValue : Boolean.valueOf(value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    public void endElement(String uri, String localName, String qName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
        switch (qName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
        case "Type":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
        case "Event":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
            types.put(currentType.name, currentType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
            currentType = null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
        case "Field":
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
            currentType.fields.add(currentField);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
            currentField = null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
            break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
    public static List<Type> createTypes() throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
        SAXParser parser = new SAXParserImpl();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
        MetadataHandler t = new MetadataHandler();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
        try (InputStream is = new BufferedInputStream(SecuritySupport.getResourceAsStream("/jdk/jfr/internal/types/metadata.xml"))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
            Logger.log(LogTag.JFR_SYSTEM, LogLevel.DEBUG, () -> "Parsing metadata.xml");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
            try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
                parser.parse(is, t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
                return t.buildTypes();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
            } catch (Exception e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
                e.printStackTrace();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
                throw new IOException(e);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
    private List<Type> buildTypes() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
        removeXMLConvenience();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        Map<String, Type> typeMap = buildTypeMap();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
        Map<String, AnnotationElement> relationMap = buildRelationMap(typeMap);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
        addFields(typeMap, relationMap);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
        return trimTypes(typeMap);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
    private Map<String, AnnotationElement> buildRelationMap(Map<String, Type> typeMap) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
        Map<String, AnnotationElement> relationMap = new HashMap<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
        for (String relation : relations) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
            Type relationType = new Type(Type.TYPES_PREFIX + relation, Type.SUPER_TYPE_ANNOTATION, eventTypeId++);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
            relationType.setAnnotations(Collections.singletonList(new AnnotationElement(Relational.class)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
            AnnotationElement ae = PrivateAccess.getInstance().newAnnotation(relationType, Collections.emptyList(), true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
            relationMap.put(relation, ae);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
            typeMap.put(relationType.getName(), relationType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
        return relationMap;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
    private List<Type> trimTypes(Map<String, Type> lookup) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
        List<Type> trimmedTypes = new ArrayList<>(lookup.size());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
        for (Type t : lookup.values()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
            t.trimFields();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
            trimmedTypes.add(t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
        return trimmedTypes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
    private void addFields(Map<String, Type> lookup, Map<String, AnnotationElement> relationMap) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
        for (TypeElement te : types.values()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
            Type type = lookup.get(te.name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
            if (te.isEvent) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
                boolean periodic = te.period!= null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
                TypeLibrary.addImplicitFields(type, periodic, te.startTime && !periodic, te.thread, te.stackTrace && !periodic, te.cutoff);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
            for (FieldElement f : te.fields) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
                Type fieldType = Type.getKnownType(f.typeName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
                if (fieldType == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
                    fieldType = Objects.requireNonNull(lookup.get(f.referenceType.name));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
                List<AnnotationElement> aes = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
                if (f.unsigned) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
                    aes.add(new AnnotationElement(Unsigned.class));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
                if (f.contentType != null) {
53013
c8b2a408628b 8215175: Inconsistencies in JFR event metadata
egahlin
parents: 50113
diff changeset
   276
                    aes.addAll(Objects.requireNonNull(xmlContentTypes.get(f.contentType)));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
                if (f.relation != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
                    aes.add(Objects.requireNonNull(relationMap.get(f.relation)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
                if (f.label != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
                    aes.add(new AnnotationElement(Label.class, f.label));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
                if (f.experimental) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
                    aes.add(new AnnotationElement(Experimental.class));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
                if (f.description != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
                    aes.add(new AnnotationElement(Description.class, f.description));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
                if ("from".equals(f.transition)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
                    aes.add(new AnnotationElement(TransitionFrom.class));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
                if ("to".equals(f.transition)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
                    aes.add(new AnnotationElement(TransitionTo.class));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
                boolean constantPool = !f.struct && f.referenceType != null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
                type.add(PrivateAccess.getInstance().newValueDescriptor(f.name, fieldType, aes, f.array ? 1 : 0, constantPool, null));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
    private Map<String, Type> buildTypeMap() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
        Map<String, Type> typeMap = new HashMap<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
        for (Type type : Type.getKnownTypes()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
            typeMap.put(type.getName(), type);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
        for (TypeElement t : types.values()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
            List<AnnotationElement> aes = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
            if (t.category != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
                aes.add(new AnnotationElement(Category.class, buildCategoryArray(t.category)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
            if (t.label != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
                aes.add(new AnnotationElement(Label.class, t.label));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
            if (t.description != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
                aes.add(new AnnotationElement(Description.class, t.description));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
            if (t.isEvent) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
                if (t.period != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
                    aes.add(new AnnotationElement(Period.class, t.period));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
                } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
                    if (t.startTime) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
                        aes.add(new AnnotationElement(Threshold.class, "0 ns"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
                    if (t.stackTrace) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
                        aes.add(new AnnotationElement(StackTrace.class, true));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
                if (t.cutoff) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
                    aes.add(new AnnotationElement(Cutoff.class, Cutoff.INIFITY));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
            if (t.experimental) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
                aes.add(new AnnotationElement(Experimental.class));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
            Type type;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
            if (t.isEvent) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
                aes.add(new AnnotationElement(Enabled.class, false));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
                type = new PlatformEventType(t.name,  eventTypeId++, false, true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
            } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
                // Struct types had their own XML-element in the past. To have id assigned in the
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
                // same order as generated .hpp file do some tweaks here.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
                boolean valueType = t.name.endsWith("StackFrame") || t.valueType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
                type = new Type(t.name, null, valueType ?  eventTypeId++ : nextTypeId(t.name), false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
            type.setAnnotations(aes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
            typeMap.put(t.name, type);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
        return typeMap;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
    private long nextTypeId(String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
        if (Type.THREAD.getName().equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
            return Type.THREAD.getId();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
        if (Type.STRING.getName().equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
            return Type.STRING.getId();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
        if (Type.CLASS.getName().equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
            return Type.CLASS.getId();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
        for (Type type : Type.getKnownTypes()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
            if (type.getName().equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
                return type.getId();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
        return structTypeId++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
    private String[] buildCategoryArray(String category) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
        List<String> categories = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
        StringBuilder sb = new StringBuilder();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
        for (char c : category.toCharArray()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
            if (c == ',') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
                categories.add(sb.toString().trim());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
                sb.setLength(0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
            } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
                sb.append(c);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
        categories.add(sb.toString().trim());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
        return categories.toArray(new String[0]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
    private void removeXMLConvenience() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
        for (TypeElement t : types.values()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
            XmlType xmlType = xmlTypes.get(t.name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
            if (xmlType != null && xmlType.javaType != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
                t.name = xmlType.javaType; // known type, i.e primitive
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
            } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
                if (t.isEvent) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
                    t.name = Type.EVENT_NAME_PREFIX + t.name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
                } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
                    t.name = Type.TYPES_PREFIX + t.name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
        for (TypeElement t : types.values()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
            for (FieldElement f : t.fields) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
                f.referenceType = types.get(f.typeName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
                XmlType xmlType = xmlTypes.get(f.typeName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
                if (xmlType != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
                    if (xmlType.javaType != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
                        f.typeName = xmlType.javaType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
                    if (xmlType.contentType != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
                        f.contentType = xmlType.contentType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
                    if (xmlType.unsigned) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
                        f.unsigned = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
                    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
                if (f.struct && f.referenceType != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
                    f.referenceType.valueType = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
}