/* * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.jfr.api.metadata.eventtype; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import jdk.jfr.AnnotationElement; import jdk.jfr.BooleanFlag; import jdk.jfr.Category; import jdk.jfr.ContentType; import jdk.jfr.Description; import jdk.jfr.Enabled; import jdk.jfr.Event; import jdk.jfr.EventFactory; import jdk.jfr.EventType; import jdk.jfr.Experimental; import jdk.jfr.Frequency; import jdk.jfr.Label; import jdk.jfr.MemoryAddress; import jdk.jfr.DataAmount; import jdk.jfr.MetadataDefinition; import jdk.jfr.Name; import jdk.jfr.Percentage; import jdk.jfr.Period; import jdk.jfr.Registered; import jdk.jfr.Relational; import jdk.jfr.StackTrace; import jdk.jfr.Threshold; import jdk.jfr.Timespan; import jdk.jfr.Timestamp; import jdk.jfr.TransitionFrom; import jdk.jfr.TransitionTo; import jdk.jfr.Unsigned; import jdk.jfr.ValueDescriptor; import jdk.test.lib.Asserts; /* * @test * @summary Test for AnnotationElement.getAnnotationElements() * @key jfr * @library /test/lib * @run main/othervm jdk.jfr.api.metadata.eventtype.TestGetAnnotationElements */ public class TestGetAnnotationElements { @SuppressWarnings("unchecked") public static void main(String[] args) throws Throwable { Class[] jfrAnnotations = { Category.class, Description.class, Enabled.class, Experimental.class, BooleanFlag.class, Frequency.class, Label.class, MemoryAddress.class, DataAmount.class, Name.class, Registered.class, Percentage.class, Period.class, Relational.class, StackTrace.class, Threshold.class, Timespan.class, Timestamp.class, TransitionFrom.class, TransitionTo.class, Unsigned.class }; for (Class clz : jfrAnnotations) { Class annptationClass = (Class) clz; System.out.println("AnnotationElement: " + annptationClass); Map values = createValueMapForAnnotation(annptationClass); List persistableAnnotation = createPersistableAnnotationList(annptationClass); AnnotationElement ae = new AnnotationElement(annptationClass, values); List aes = ae.getAnnotationElements(); Asserts.assertEquals(persistableAnnotation.size(), aes.size()); } List fields = new ArrayList<>(); List eventAnnotations = new ArrayList<>(); eventAnnotations.add(new AnnotationElement(Label.class, "MyEvent")); EventFactory f = EventFactory.create(eventAnnotations, fields); EventType type = f.getEventType(); List aes = type.getAnnotationElements().get(0).getAnnotationElements(); Asserts.assertEquals(0, aes.size()); EventType et = EventType.getEventType(MyEvent.class); ValueDescriptor field = et.getField("transactionRate"); aes = field.getAnnotationElements().get(0).getAnnotationElements(); Asserts.assertEquals(3, aes.size()); assertContainsAnnotation(aes, Description.class); assertContainsAnnotation(aes, Label.class); assertContainsAnnotation(aes, ContentType.class); } private static List createPersistableAnnotationList( Class annptationClass) { List as = new ArrayList<>(); for (Annotation a : annptationClass.getAnnotations()) { MetadataDefinition m = a.annotationType().getAnnotation(MetadataDefinition.class); if (m != null) { as.add(a); } } return as; } private static void assertContainsAnnotation(List aez, Class clz) { for (AnnotationElement ae : aez) { if (ae.getTypeName().equals(clz.getName())) { return; } } Asserts.fail("Class " + clz + " not found in the annotation elements"); } private static Map createValueMapForAnnotation(Class clz) { Map map = new HashMap<>(); for (Method method : clz.getDeclaredMethods()) { int modifiers = method.getModifiers(); if (Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) { map.put(method.getName(), "value"); } } return map; } private static class MyEvent extends Event { @Frequency long transactionRate; } }