Main.java revision de75089fb7216d19e9c22cce4dc62a49513477d3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.command.annotool; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.direct.ClassPathOpener; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.direct.DirectClassFile; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.direct.StdAttributeFactory; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.AttributeList; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.Attribute; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttRuntimeInvisibleAnnotations; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.BaseAnnotations; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttRuntimeVisibleAnnotations; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ByteArray; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotation; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.annotation.ElementType; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.EnumSet; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Main { 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static class InvalidArgumentException extends Exception { 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InvalidArgumentException() { 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(); 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 42de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InvalidArgumentException(String s) { 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(s); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enum PrintType { 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CLASS, 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project INNERCLASS, 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project METHOD, 52de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro PACKAGE 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static class Arguments { 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * from --annotation, dot-seperated classname 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of annotation to look for 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String aclass; 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** from --eTypes */ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EnumSet<ElementType> eTypes = EnumSet.noneOf(ElementType.class); 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** from --print */ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EnumSet<PrintType> printTypes = EnumSet.noneOf(PrintType.class); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** remaining positional arguments */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String[] files; 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Arguments() { 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void parse (String[] argArray) throws InvalidArgumentException { 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < argArray.length; i++) { 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String arg = argArray[i]; 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (arg.startsWith("--annotation=")) { 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String argParam = arg.substring(arg.indexOf('=') + 1); 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (aclass != null) { 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException( 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "--annotation can only be specified once."); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project aclass = argParam.replace('.','/'); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (arg.startsWith("--element=")) { 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String argParam = arg.substring(arg.indexOf('=') + 1); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 9041aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (String p : argParam.split(",")) { 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eTypes.add(ElementType.valueOf(p.toUpperCase())); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalArgumentException ex) { 9441aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein throw new InvalidArgumentException( 9541aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein "invalid --element"); 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (arg.startsWith("--print=")) { 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String argParam = arg.substring(arg.indexOf('=') + 1); 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 10141aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (String p : argParam.split(",")) { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printTypes.add(PrintType.valueOf(p.toUpperCase())); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalArgumentException ex) { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException("invalid --print"); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project files = new String[argArray.length - i]; 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(argArray, i, files, 0, files.length); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (aclass == null) { 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException( 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "--annotation must be specified"); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printTypes.isEmpty()) { 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printTypes.add(PrintType.CLASS); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (eTypes.isEmpty()) { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eTypes.add(ElementType.TYPE); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EnumSet<ElementType> set = eTypes.clone(); 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set.remove(ElementType.TYPE); 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set.remove(ElementType.PACKAGE); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!set.isEmpty()) { 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException( 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "only --element parameters 'type' and 'package' " 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + "supported"); 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is uninstantiable. 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private Main() { 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // This space intentionally left blank. 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void main(String[] argArray) { 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project final Arguments args = new Arguments(); 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args.parse(argArray); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InvalidArgumentException ex) { 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println(ex.getMessage()); 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("usage"); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new AnnotationLister(args).process(); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 161