1 30 package org.objectweb.asm.util; 31 32 import org.objectweb.asm.AnnotationVisitor; 33 import org.objectweb.asm.Type; 34 35 40 public class CheckAnnotationAdapter implements AnnotationVisitor { 41 42 private AnnotationVisitor av; 43 44 private boolean named; 45 46 private boolean end; 47 48 public CheckAnnotationAdapter(final AnnotationVisitor av) { 49 this(av, true); 50 } 51 52 CheckAnnotationAdapter(final AnnotationVisitor av, final boolean named) { 53 this.av = av; 54 this.named = named; 55 } 56 57 public void visit(final String name, final Object value) { 58 checkEnd(); 59 checkName(name); 60 if (!(value instanceof Byte || value instanceof Boolean 61 || value instanceof Character || value instanceof Short 62 || value instanceof Integer || value instanceof Long 63 || value instanceof Float || value instanceof Double 64 || value instanceof String || value instanceof Type 65 || value instanceof byte[] || value instanceof boolean[] 66 || value instanceof char[] || value instanceof short[] 67 || value instanceof int[] || value instanceof long[] 68 || value instanceof float[] || value instanceof double[])) 69 { 70 throw new IllegalArgumentException ("Invalid annotation value"); 71 } 72 if (av != null) { 73 av.visit(name, value); 74 } 75 } 76 77 public void visitEnum( 78 final String name, 79 final String desc, 80 final String value) 81 { 82 checkEnd(); 83 checkName(name); 84 CheckMethodAdapter.checkDesc(desc, false); 85 if (value == null) { 86 throw new IllegalArgumentException ("Invalid enum value"); 87 } 88 if (av != null) { 89 av.visitEnum(name, desc, value); 90 } 91 } 92 93 public AnnotationVisitor visitAnnotation( 94 final String name, 95 final String desc) 96 { 97 checkEnd(); 98 checkName(name); 99 CheckMethodAdapter.checkDesc(desc, false); 100 return new CheckAnnotationAdapter(av == null 101 ? null 102 : av.visitAnnotation(name, desc)); 103 } 104 105 public AnnotationVisitor visitArray(final String name) { 106 checkEnd(); 107 checkName(name); 108 return new CheckAnnotationAdapter(av == null 109 ? null 110 : av.visitArray(name), false); 111 } 112 113 public void visitEnd() { 114 checkEnd(); 115 end = true; 116 if (av != null) { 117 av.visitEnd(); 118 } 119 } 120 121 private void checkEnd() { 122 if (end) { 123 throw new IllegalStateException ("Cannot call a visit method after visitEnd has been called"); 124 } 125 } 126 127 private void checkName(final String name) { 128 if (named && name == null) { 129 throw new IllegalArgumentException ("Annotation value name must not be null"); 130 } 131 } 132 } 133 | Popular Tags |