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