src/jdk.jfr/share/classes/jdk/jfr/ValueDescriptor.java
author egahlin
Tue, 15 May 2018 20:24:34 +0200
changeset 50113 caf115bb98ad
child 52850 f527b24990d7
permissions -rw-r--r--
8199712: Flight Recorder Reviewed-by: coleenp, ihse, erikj, dsamersoff, mseledtsov, egahlin, mgronlun Contributed-by: erik.gahlin@oracle.com, markus.gronlund@oracle.com
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;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.lang.annotation.Annotation;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.util.Collections;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.util.Objects;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import jdk.jfr.internal.AnnotationConstruct;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import jdk.jfr.internal.Type;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import jdk.jfr.internal.Utils;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
 * Describes the event fields and annotation elements.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
 * @since 9
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
public final class ValueDescriptor {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
    private final AnnotationConstruct annotationConstruct;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
    private final Type type;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
    private final String name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
    private final boolean isArray;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
    private final boolean constantPool;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
    private final String javaFieldName;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
    // package private, invoked by jdk.internal.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
    ValueDescriptor(Type type, String name, List<AnnotationElement> annotations, int dimension, boolean constantPool, String fieldName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
        Objects.requireNonNull(annotations);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
        if (dimension < 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
            throw new IllegalArgumentException("Dimension must be positive");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
        this.name = Objects.requireNonNull(name, "Name of value descriptor can't be null");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
        this.type = Objects.requireNonNull(type);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
        this.isArray = dimension > 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
        this.constantPool = constantPool;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
        this.annotationConstruct = new AnnotationConstruct(annotations);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
        this.javaFieldName = fieldName;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
     * Constructs a value descriptor, useful for dynamically creating event types and
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
     * annotations.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
     * <P>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
     * The following types are supported:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
     * <ul>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
     * <li>{@code byte.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
     * <li>{@code short.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
     * <li>{@code int.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
     * <li>{@code long.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
     * <li>{@code char.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
     * <li>{@code float.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
     * <li>{@code double.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
     * <li>{@code boolean.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
     * <li>{@code String.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
     * <li>{@code Class.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
     * <li>{@code Thread.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
     * </ul>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
     * The name must be a valid Java identifier (for example, {@code "maxThroughput"}). See 3.8
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
     * Java Language Specification for more information.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
     * @param type the type, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
     * @param name the name, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
     * @throws SecurityException if a security manager is present and the caller
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
     *         doesn't have {@code FlightRecorderPermission("registerEvent")}
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
    public ValueDescriptor(Class<?> type, String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
        this(type, name, Collections.<AnnotationElement> emptyList());
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
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
     * Constructs a value descriptor, useful for dynamically creating event types and
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
     * annotations.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
     * <P>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
     * The following types are supported:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
     * <ul>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
     * <li>{@code byte.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
     * <li>{@code short.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
     * <li>{@code int.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
     * <li>{@code long.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
     * <li>{@code char.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
     * <li>{@code float.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
     * <li>{@code double.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
     * <li>{@code boolean.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
     * <li>{@code String.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
     * <li>{@code Class.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
     * <li>{@code Thread.class}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
     * </ul>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
     * The name must be a valid Java identifier (for example, {@code "maxThroughput"}). See 3.8
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
     * Java Language Specification for more information.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
     * @param type the type, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
     * @param name the name, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
     * @param annotations the annotations on the value descriptors, not
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
     *        {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
     * @throws SecurityException if a security manager is present and the caller
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
     *         doesn't have {@code FlightRecorderPermission("registerEvent")}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
    public ValueDescriptor(Class<?> type, String name, List<AnnotationElement> annotations) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
        this(type, name, new ArrayList<>(annotations), false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
    ValueDescriptor(Class<?> type, String name, List<AnnotationElement> annotations, boolean allowArray) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
        Objects.requireNonNull(annotations);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
        Utils.checkRegisterPermission();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
        if (!allowArray) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
            if (type.isArray()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
                throw new IllegalArgumentException("Array types are not allowed");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
        this.name = Objects.requireNonNull(name, "Name of value descriptor can't be null");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
        this.type = Objects.requireNonNull(Utils.getValidType(Objects.requireNonNull(type), Objects.requireNonNull(name)));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
        this.annotationConstruct = new AnnotationConstruct(annotations);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
        this.javaFieldName = name; // Needed for dynamic events
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
        this.isArray = type.isArray();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
        // Assume we always want to store String and Thread in constant pool
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
        this.constantPool = type == Class.class || type == Thread.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
     * Returns a human-readable name that describes the value (for example,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
     * {@code "Maximum Throughput"}).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
     * @return a human-readable name, or {@code null} if doesn't exist
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
    public String getLabel() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
        return annotationConstruct.getLabel();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
     * Returns the name of the value (for example, {@code "maxThroughput"}).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
     * @return the name, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
    public String getName() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
        return name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
     * Returns a sentence describing the value (for example, {@code "Maximum
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
     * throughput in the transaction system. Value is reset after each new
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
     * batch."}).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
     * @return the description, or {@code null} if doesn't exist
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    public String getDescription() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
        return annotationConstruct.getDescription();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
     * Returns a textual identifier that specifies how a value represented by
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
     * this {@link ValueDescriptor} is interpreted or formatted.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
     * For example, if the value descriptor's type is {@code float} and the
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
     * event value is {@code 0.5f}, a content type of
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
     * {@code "jdk.jfr.Percentage"} hints to a client that the value is a
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
     * percentage and that it should be rendered as {@code "50%"}.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
     * The JDK provides the following predefined content types:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
     * <ul>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
     * <li>jdk.jfr.Percentage</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
     * <li>jdk.jfr.Timespan</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
     * <li>jdk.jfr.Timestamp</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
     * <li>jdk.jfr.Frequency</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
     * <li>jdk.jfr.Flag</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
     * <li>jdk.jfr.MemoryAddress</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
     * <li>jdk.jfr.DataAmount</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
     * <li>jdk.jfr.NetworkAddress</li>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
     * </ul>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
     * <p>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
     * User-defined content types can be created by using the {@link ContentType} class.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
     * @return the content type, or {@code null} if doesn't exist
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
     * @see ContentType
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    public String getContentType() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
        for (AnnotationElement anno : getAnnotationElements()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
            for (AnnotationElement meta : anno.getAnnotationElements()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
                if (meta.getTypeName().equals(ContentType.class.getName())) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
                    return anno.getTypeName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
                }
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
        return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
     * Returns the fully qualified class name of the type that is associated with
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
     * this value descriptor.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
     * @return the type name, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
     * @see ValueDescriptor#getTypeId()
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
    public String getTypeName() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
        if (type.isSimpleType()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
            return type.getFields().get(0).getTypeName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
        return type.getName();
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
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
     * Returns a unique ID for the type in the Java virtual Machine (JVM).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
     * The ID might not be the same between JVM instances.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
     * @return the type ID, not negative
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
    public long getTypeId() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
        return type.getId();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
    }
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
     * Returns if this value descriptor is an array type.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
     * @return {@code true} if it is an array type, {@code false} otherwise
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
    public boolean isArray() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        return isArray;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
    }
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
     * Returns the first annotation for the specified type if an annotation
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
     * element with the same name is directly present for this value descriptor,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
     * {@code null} otherwise.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
     * @param <A> the type of the annotation to query for and return if present
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
     * @param annotationType the Class object that corresponds to the annotation
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
     *        type, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
     * @return this element's annotation for the specified annotation type if
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
     *         directly present, else {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
    public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
        Objects.requireNonNull(annotationType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
        return annotationConstruct.getAnnotation(annotationType);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
     * Returns an immutable list of annotation elements for this value
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
     * descriptor.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
     * @return a list of annotations, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
    public List<AnnotationElement> getAnnotationElements() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
        return annotationConstruct.getUnmodifiableAnnotationElements();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
     * Returns an immutable list of value descriptors if the type is complex,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
     * else an empty list.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
     * @return a list of value descriptors, not {@code null}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
    public List<ValueDescriptor> getFields() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
        if (type.isSimpleType()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
            return Collections.emptyList();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
        return Collections.unmodifiableList(type.getFields());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
    // package private
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
    Type getType() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
        return type;
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
    // package private
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
    void setAnnotations(List<AnnotationElement> anno) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
        annotationConstruct.setAnnotationElements(anno);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
    // package private
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
    boolean isConstantPool() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
        return constantPool;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
    // package private
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
    String getJavaFieldName() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
        return javaFieldName;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
    // package private
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
    boolean isUnsigned() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
        return annotationConstruct.hasUnsigned();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
}