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 java.lang.annotation.ElementType; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.EnumSet; 21ca3f9628c157d864e9c273db14bdb38835249838Elliott Hughesimport java.util.Locale; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Main { 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static class InvalidArgumentException extends Exception { 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InvalidArgumentException() { 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(); 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 29de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InvalidArgumentException(String s) { 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(s); 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enum PrintType { 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CLASS, 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project INNERCLASS, 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project METHOD, 39de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro PACKAGE 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static class Arguments { 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 45ca3f9628c157d864e9c273db14bdb38835249838Elliott Hughes * from --annotation, dot-separated classname 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of annotation to look for 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String aclass; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** from --eTypes */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EnumSet<ElementType> eTypes = EnumSet.noneOf(ElementType.class); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** from --print */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EnumSet<PrintType> printTypes = EnumSet.noneOf(PrintType.class); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** remaining positional arguments */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String[] files; 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Arguments() { 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void parse (String[] argArray) throws InvalidArgumentException { 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < argArray.length; i++) { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String arg = argArray[i]; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (arg.startsWith("--annotation=")) { 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String argParam = arg.substring(arg.indexOf('=') + 1); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (aclass != null) { 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException( 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "--annotation can only be specified once."); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project aclass = argParam.replace('.','/'); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (arg.startsWith("--element=")) { 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String argParam = arg.substring(arg.indexOf('=') + 1); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 7741aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (String p : argParam.split(",")) { 78ca3f9628c157d864e9c273db14bdb38835249838Elliott Hughes eTypes.add(ElementType.valueOf(p.toUpperCase(Locale.ROOT))); 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalArgumentException ex) { 8141aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein throw new InvalidArgumentException( 8241aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein "invalid --element"); 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (arg.startsWith("--print=")) { 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String argParam = arg.substring(arg.indexOf('=') + 1); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 8841aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (String p : argParam.split(",")) { 89ca3f9628c157d864e9c273db14bdb38835249838Elliott Hughes printTypes.add(PrintType.valueOf(p.toUpperCase(Locale.ROOT))); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (IllegalArgumentException ex) { 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException("invalid --print"); 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project files = new String[argArray.length - i]; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(argArray, i, files, 0, files.length); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (aclass == null) { 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException( 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "--annotation must be specified"); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (printTypes.isEmpty()) { 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project printTypes.add(PrintType.CLASS); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (eTypes.isEmpty()) { 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project eTypes.add(ElementType.TYPE); 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EnumSet<ElementType> set = eTypes.clone(); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set.remove(ElementType.TYPE); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project set.remove(ElementType.PACKAGE); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!set.isEmpty()) { 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidArgumentException( 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "only --element parameters 'type' and 'package' " 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project + "supported"); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is uninstantiable. 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private Main() { 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // This space intentionally left blank. 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void main(String[] argArray) { 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project final Arguments args = new Arguments(); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args.parse(argArray); 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (InvalidArgumentException ex) { 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.err.println(ex.getMessage()); 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("usage"); 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new AnnotationLister(args).process(); 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 148