1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.ClassConstants; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.ClassUtil; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.util.ListUtil; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.io.*; 28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport java.util.*; 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This class writes ProGuard configurations to a file. 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ConfigurationWriter 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String[] KEEP_OPTIONS = new String[] 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.KEEP_OPTION, 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.KEEP_CLASS_MEMBERS_OPTION, 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.KEEP_CLASSES_WITH_MEMBERS_OPTION 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final PrintWriter writer; 47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private File baseDir; 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new ConfigurationWriter for the given file name. 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public ConfigurationWriter(File configurationFile) throws IOException 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this(new PrintWriter(new FileWriter(configurationFile))); 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato baseDir = configurationFile.getParentFile(); 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new ConfigurationWriter for the given OutputStream. 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public ConfigurationWriter(OutputStream outputStream) throws IOException 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this(new PrintWriter(outputStream)); 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new ConfigurationWriter for the given PrintWriter. 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public ConfigurationWriter(PrintWriter writer) throws IOException 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.writer = writer; 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Closes this ConfigurationWriter. 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void close() throws IOException 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.close(); 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes the given configuration. 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param configuration the configuration that is to be written out. 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @throws IOException if an IO error occurs while writing the configuration. 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void write(Configuration configuration) throws IOException 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the program class path (input and output entries). 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeJarOptions(ConfigurationConstants.INJARS_OPTION, 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.OUTJARS_OPTION, 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.programJars); 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(); 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the library class path (output entries only). 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeJarOptions(ConfigurationConstants.LIBRARYJARS_OPTION, 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.LIBRARYJARS_OPTION, 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.libraryJars); 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(); 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 10745e52b5ab37a26149ce031caa44bb167da217667Paul Duffin // Android-added: Write value of -systemjars option to configuration file. 10845e52b5ab37a26149ce031caa44bb167da217667Paul Duffin // Write the system class path (output entries only). 10945e52b5ab37a26149ce031caa44bb167da217667Paul Duffin writeJarOptions(ConfigurationConstants.SYSTEMJARS_OPTION, 11045e52b5ab37a26149ce031caa44bb167da217667Paul Duffin ConfigurationConstants.SYSTEMJARS_OPTION, 11145e52b5ab37a26149ce031caa44bb167da217667Paul Duffin configuration.systemJars); 11245e52b5ab37a26149ce031caa44bb167da217667Paul Duffin writer.println(); 11345e52b5ab37a26149ce031caa44bb167da217667Paul Duffin 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the other options. 115b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang writeOption(ConfigurationConstants.SKIP_NON_PUBLIC_LIBRARY_CLASSES_OPTION, configuration.skipNonPublicLibraryClasses); 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS_OPTION, !configuration.skipNonPublicLibraryClassMembers); 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.KEEP_DIRECTORIES_OPTION, configuration.keepDirectories); 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.TARGET_OPTION, ClassUtil.externalClassVersion(configuration.targetClassVersion)); 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.FORCE_PROCESSING_OPTION, configuration.lastModified == Long.MAX_VALUE); 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_SHRINK_OPTION, !configuration.shrink); 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.PRINT_USAGE_OPTION, configuration.printUsage); 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_OPTIMIZE_OPTION, !configuration.optimize); 125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang writeOption(ConfigurationConstants.OPTIMIZATIONS, configuration.optimizations); 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.OPTIMIZATION_PASSES, configuration.optimizationPasses); 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.ALLOW_ACCESS_MODIFICATION_OPTION, configuration.allowAccessModification); 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.MERGE_INTERFACES_AGGRESSIVELY_OPTION, configuration.mergeInterfacesAggressively); 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_OBFUSCATE_OPTION, !configuration.obfuscate); 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.PRINT_MAPPING_OPTION, configuration.printMapping); 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.APPLY_MAPPING_OPTION, configuration.applyMapping); 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.OBFUSCATION_DICTIONARY_OPTION, configuration.obfuscationDictionary); 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.CLASS_OBFUSCATION_DICTIONARY_OPTION, configuration.classObfuscationDictionary); 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.PACKAGE_OBFUSCATION_DICTIONARY_OPTION, configuration.packageObfuscationDictionary); 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.OVERLOAD_AGGRESSIVELY_OPTION, configuration.overloadAggressively); 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.USE_UNIQUE_CLASS_MEMBER_NAMES_OPTION, configuration.useUniqueClassMemberNames); 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_USE_MIXED_CASE_CLASS_NAMES_OPTION, !configuration.useMixedCaseClassNames); 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.KEEP_PACKAGE_NAMES_OPTION, configuration.keepPackageNames, true); 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.FLATTEN_PACKAGE_HIERARCHY_OPTION, configuration.flattenPackageHierarchy, true); 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.REPACKAGE_CLASSES_OPTION, configuration.repackageClasses, true); 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.KEEP_ATTRIBUTES_OPTION, configuration.keepAttributes); 143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang writeOption(ConfigurationConstants.KEEP_PARAMETER_NAMES_OPTION, configuration.keepParameterNames); 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.RENAME_SOURCE_FILE_ATTRIBUTE_OPTION, configuration.newSourceFileAttribute); 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.ADAPT_CLASS_STRINGS_OPTION, configuration.adaptClassStrings, true); 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.ADAPT_RESOURCE_FILE_NAMES_OPTION, configuration.adaptResourceFileNames); 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.ADAPT_RESOURCE_FILE_CONTENTS_OPTION, configuration.adaptResourceFileContents); 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_PREVERIFY_OPTION, !configuration.preverify); 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.MICRO_EDITION_OPTION, configuration.microEdition); 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.VERBOSE_OPTION, configuration.verbose); 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_NOTE_OPTION, configuration.note, true); 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DONT_WARN_OPTION, configuration.warn, true); 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.IGNORE_WARNINGS_OPTION, configuration.ignoreWarnings); 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.PRINT_CONFIGURATION_OPTION, configuration.printConfiguration); 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.DUMP_OPTION, configuration.dump); 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(ConfigurationConstants.PRINT_SEEDS_OPTION, configuration.printSeeds); 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(); 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the "why are you keeping" options. 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOptions(ConfigurationConstants.WHY_ARE_YOU_KEEPING_OPTION, configuration.whyAreYouKeeping); 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the keep options. 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOptions(KEEP_OPTIONS, configuration.keep); 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the "no side effect methods" options. 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOptions(ConfigurationConstants.ASSUME_NO_SIDE_EFFECTS_OPTION, configuration.assumeNoSideEffects); 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (writer.checkError()) 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IOException("Can't write configuration"); 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeJarOptions(String inputEntryOptionName, 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String outputEntryOptionName, 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassPath classPath) 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classPath != null) 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < classPath.size(); index++) 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassPathEntry entry = classPath.get(index); 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String optionName = entry.isOutput() ? 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato outputEntryOptionName : 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato inputEntryOptionName; 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(optionName); 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(relativeFileName(entry.getFile())); 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Append the filters, if any. 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean filtered = false; 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // For backward compatibility, the aar and apk filters come 1992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // first. 2002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom filtered = writeFilter(filtered, entry.getAarFilter()); 2012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom filtered = writeFilter(filtered, entry.getApkFilter()); 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filtered = writeFilter(filtered, entry.getZipFilter()); 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filtered = writeFilter(filtered, entry.getEarFilter()); 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filtered = writeFilter(filtered, entry.getWarFilter()); 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filtered = writeFilter(filtered, entry.getJarFilter()); 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filtered = writeFilter(filtered, entry.getFilter()); 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (filtered) 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD); 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(); 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean writeFilter(boolean filtered, List filter) 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (filtered) 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.SEPARATOR_KEYWORD); 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (filter != null) 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!filtered) 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD); 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 233b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang writer.print(ListUtil.commaSeparatedString(filter, true)); 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filtered = true; 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return filtered; 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, boolean flag) 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (flag) 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(optionName); 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, int argument) 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (argument != 1) 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(optionName); 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(argument); 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, List arguments) 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(optionName, arguments, false); 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List arguments, 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean replaceInternalClassNames) 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (arguments != null) 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (arguments.isEmpty()) 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(optionName); 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (replaceInternalClassNames) 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 282b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang arguments = externalClassNames(arguments); 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(optionName); 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 287b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang writer.println(ListUtil.commaSeparatedString(arguments, true)); 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, String arguments) 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(optionName, arguments, false); 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String arguments, 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean replaceInternalClassNames) 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (arguments != null) 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (replaceInternalClassNames) 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato arguments = ClassUtil.externalClassName(arguments); 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(optionName); 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(quotedString(arguments)); 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, File file) 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (file != null) 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (file.getPath().length() > 0) 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(optionName); 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(relativeFileName(file)); 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(optionName); 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOptions(String[] optionNames, 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List keepClassSpecifications) 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecifications != null) 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < keepClassSpecifications.size(); index++) 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(optionNames, (KeepClassSpecification)keepClassSpecifications.get(index)); 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String[] optionNames, 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato KeepClassSpecification keepClassSpecification) 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Compose the option name. 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String optionName = optionNames[keepClassSpecification.markConditionally ? 2 : 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepClassSpecification.markClasses ? 0 : 3542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1]; 3552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 3562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (keepClassSpecification.markDescriptorClasses) 3572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 3582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + 3592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION; 3602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecification.allowShrinking) 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION; 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecification.allowOptimization) 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION; 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecification.allowObfuscation) 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD + 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION; 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the option with the proper class specification. 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(optionName, keepClassSpecification); 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOptions(String optionName, 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List classSpecifications) 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecifications != null) 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < classSpecifications.size(); index++) 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeOption(optionName, (ClassSpecification)classSpecifications.get(index)); 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeOption(String optionName, 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassSpecification classSpecification) 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(); 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the comments for this option. 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeComments(classSpecification.comments); 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(optionName); 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the required annotation, if any. 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecification.annotationType != null) 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalType(classSpecification.annotationType)); 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the class access flags. 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalClassAccessFlags(classSpecification.requiredUnsetAccessFlags, 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.NEGATOR_KEYWORD)); 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalClassAccessFlags(classSpecification.requiredSetAccessFlags)); 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the class keyword, if we didn't write the interface 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // keyword earlier. 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (((classSpecification.requiredSetAccessFlags | 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecification.requiredUnsetAccessFlags) & 4272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom (ClassConstants.ACC_INTERFACE | 4282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.ACC_ENUM)) == 0) 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.CLASS_KEYWORD); 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the class name. 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(classSpecification.className != null ? 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalClassName(classSpecification.className) : 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ANY_CLASS_KEYWORD); 439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the extends template, if any. 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecification.extendsAnnotationType != null || 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecification.extendsClassName != null) 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.EXTENDS_KEYWORD); 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the required extends annotation, if any. 449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecification.extendsAnnotationType != null) 450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); 452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalType(classSpecification.extendsAnnotationType)); 453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the extended class name. 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(classSpecification.extendsClassName != null ? 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalClassName(classSpecification.extendsClassName) : 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ANY_CLASS_KEYWORD); 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the keep field and keep method options, if any. 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecification.fieldSpecifications != null || 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecification.methodSpecifications != null) 465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(ConfigurationConstants.OPEN_KEYWORD); 468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeFieldSpecification( classSpecification.fieldSpecifications); 470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeMethodSpecification(classSpecification.methodSpecifications); 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(ConfigurationConstants.CLOSE_KEYWORD); 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(); 477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeComments(String comments) 483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (comments != null) 485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int index = 0; 487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato while (index < comments.length()) 488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int breakIndex = comments.indexOf('\n', index); 490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (breakIndex < 0) 491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato breakIndex = comments.length(); 493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print('#'); 496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (comments.charAt(index) != ' ') 498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(' '); 500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(comments.substring(index, breakIndex)); 503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato index = breakIndex + 1; 505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeFieldSpecification(List memberSpecifications) 511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (memberSpecifications != null) 513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < memberSpecifications.size(); index++) 515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MemberSpecification memberSpecification = 517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (MemberSpecification)memberSpecifications.get(index); 518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(" "); 520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the required annotation, if any. 522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (memberSpecification.annotationType != null) 523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); 525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(ClassUtil.externalType(memberSpecification.annotationType)); 526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(" "); 527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the field access flags. 530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalFieldAccessFlags(memberSpecification.requiredUnsetAccessFlags, 531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.NEGATOR_KEYWORD)); 532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalFieldAccessFlags(memberSpecification.requiredSetAccessFlags)); 534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the field name and descriptor. 536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String name = memberSpecification.name; 537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String descriptor = memberSpecification.descriptor; 538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(descriptor == null ? name == null ? 540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ANY_FIELD_KEYWORD : 541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ANY_TYPE_KEYWORD + ' ' + name : 542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.externalFullFieldDescription(0, 543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato name == null ? ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD : name, 544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato descriptor)); 545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(ConfigurationConstants.SEPARATOR_KEYWORD); 547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void writeMethodSpecification(List memberSpecifications) 553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (memberSpecifications != null) 555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < memberSpecifications.size(); index++) 557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MemberSpecification memberSpecification = 559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (MemberSpecification)memberSpecifications.get(index); 560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(" "); 562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the required annotation, if any. 564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (memberSpecification.annotationType != null) 565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ConfigurationConstants.ANNOTATION_KEYWORD); 567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(ClassUtil.externalType(memberSpecification.annotationType)); 568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(" "); 569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the method access flags. 572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalMethodAccessFlags(memberSpecification.requiredUnsetAccessFlags, 573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.NEGATOR_KEYWORD)); 574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(ClassUtil.externalMethodAccessFlags(memberSpecification.requiredSetAccessFlags)); 576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write out the method name and descriptor. 578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String name = memberSpecification.name; 579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String descriptor = memberSpecification.descriptor; 580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.print(descriptor == null ? name == null ? 582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ANY_METHOD_KEYWORD : 583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationConstants.ANY_TYPE_KEYWORD + ' ' + name + ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + ConfigurationConstants.ANY_ARGUMENTS_KEYWORD + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD : 5842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassUtil.externalFullMethodDescription(ClassConstants.METHOD_NAME_INIT, 585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato name == null ? ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD : name, 587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato descriptor)); 588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.println(ConfigurationConstants.SEPARATOR_KEYWORD); 590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 596b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns a list with external versions of the given list of internal 597b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * class names. 598b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 599b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private List externalClassNames(List internalClassNames) 600b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 601b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang List externalClassNames = new ArrayList(internalClassNames.size()); 602b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 603b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < internalClassNames.size(); index++) 604b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 605b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang externalClassNames.add(ClassUtil.externalClassName((String)internalClassNames.get(index))); 606b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 607b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 608b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return externalClassNames; 609b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 610b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 611b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 612b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns a relative file name of the given file, if possible. 614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * The file name is also quoted, if necessary. 615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private String relativeFileName(File file) 617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String fileName = file.getAbsolutePath(); 619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // See if we can convert the file name into a relative file name. 621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (baseDir != null) 622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String baseDirName = baseDir.getAbsolutePath() + File.separator; 624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (fileName.startsWith(baseDirName)) 625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fileName = fileName.substring(baseDirName.length()); 627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return quotedString(fileName); 631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns a quoted version of the given string, if necessary. 636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private String quotedString(String string) 638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return string.length() == 0 || 640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf(' ') >= 0 || 641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf('@') >= 0 || 642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf('{') >= 0 || 643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf('}') >= 0 || 644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf('(') >= 0 || 645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf(')') >= 0 || 646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf(':') >= 0 || 647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf(';') >= 0 || 648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato string.indexOf(',') >= 0 ? ("'" + string + "'") : 649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ( string ); 650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * A main method for testing configuration writing. 655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static void main(String[] args) { 657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationWriter writer = new ConfigurationWriter(new File(args[0])); 660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.write(new Configuration()); 662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (Exception ex) 664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ex.printStackTrace(); 666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 669