12270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/*
22270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * ProGuard -- shrinking, optimization, obfuscation, and preverification
32270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *             of Java bytecode.
42270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
62270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
72270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This program is free software; you can redistribute it and/or modify it
82270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * under the terms of the GNU General Public License as published by the Free
92270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Software Foundation; either version 2 of the License, or (at your option)
102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * any later version.
112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This program is distributed in the hope that it will be useful, but WITHOUT
132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * more details.
162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * You should have received a copy of the GNU General Public License along
182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * with this program; if not, write to the Free Software Foundation, Inc.,
192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */
212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompackage proguard;
222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.util.WarningPrinter;
242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport java.io.IOException;
262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/**
282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This class performs sanity checks on a given configurations.
292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @author Eric Lafortune
312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */
322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompublic class ConfigurationChecker
332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom{
342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    private final Configuration configuration;
352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    /**
382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * Creates a new ConfigurationChecker with the given configuration.
392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     */
402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public ConfigurationChecker(Configuration configuration)
412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        this.configuration = configuration;
432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    /**
472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * Checks the given configuration for potential problems.
482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     */
492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public void check() throws IOException
502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        ClassPath programJars = configuration.programJars;
522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        ClassPath libraryJars = configuration.libraryJars;
532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        // Check that the input isn't empty.
552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (programJars == null)
562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            throw new IOException("The input is empty. You have to specify one or more '-injars' options.");
582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        // Check that the first jar is an input jar.
612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        ClassPathEntry firstEntry = programJars.get(0);
622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (firstEntry.isOutput())
632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            throw new IOException("The output jar [" + firstEntry.getName() +
652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  "] must be specified after an input jar, or it will be empty.");
662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        // Check that the first of two subsequent the output jars has a filter.
692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        for (int index = 0; index < programJars.size() - 1; index++)
702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            ClassPathEntry entry = programJars.get(index);
722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if (entry.isOutput()    &&
732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                !entry.isFiltered() &&
742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                programJars.get(index + 1).isOutput())
752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                throw new IOException("The output jar [" + entry.getName() +
772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                      "] must have a filter, or all subsequent output jars will be empty.");
782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        // Check for conflicts between input/output entries of the class paths.
822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        checkConflicts(programJars, programJars);
832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        checkConflicts(programJars, libraryJars);
842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        checkConflicts(libraryJars, libraryJars);
852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        // Print out some general notes if necessary.
872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if ((configuration.note == null ||
882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom             !configuration.note.isEmpty()))
892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // Check for potential problems with mixed-case class names on
912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // case-insensitive file systems.
922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if (configuration.obfuscate &&
932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                configuration.useMixedCaseClassNames &&
942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                configuration.classObfuscationDictionary == null)
952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                String os = System.getProperty("os.name").toLowerCase();
972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                if (os.startsWith("windows") ||
982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    os.startsWith("mac os"))
992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    // Go over all program class path entries.
1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    for (int index = 0; index < programJars.size(); index++)
1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    {
1032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        // Is it an output directory?
1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        ClassPathEntry entry = programJars.get(index);
1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        if (entry.isOutput() &&
1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            !entry.isApk() &&
1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            !entry.isJar() &&
1082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            !entry.isAar() &&
1092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            !entry.isWar() &&
1102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            !entry.isEar() &&
1112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            !entry.isZip())
1122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        {
1132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            System.out.println("Note: you're writing the processed class files to a directory [" + entry.getName() + "].");
1142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            System.out.println("      This will likely cause problems with obfuscated mixed-case class names.");
1152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            System.out.println("      You should consider writing the output to a jar file, or otherwise");
1162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            System.out.println("      specify '-dontusemixedcaseclassnames'.");
1172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            break;
1192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        }
1202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    }
1212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // Check if -adaptresourcefilecontents has a proper filter.
1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if (configuration.adaptResourceFileContents != null &&
1262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                (configuration.adaptResourceFileContents.isEmpty() ||
1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                 configuration.adaptResourceFileContents.get(0).equals(ConfigurationConstants.ANY_FILE_KEYWORD)))
1282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("Note: you're specifying '-adaptresourcefilecontents' for all resource files.");
1302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      This will most likely cause problems with binary files.");
1312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
1322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // Check if all -keepclassmembers options indeed have class members.
1342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            WarningPrinter keepClassMemberNotePrinter = new WarningPrinter(System.out, configuration.note);
1352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            new KeepClassMemberChecker(keepClassMemberNotePrinter).checkClassSpecifications(configuration.keep);
1372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // Check if -assumenosideffects options don't specify all methods.
1392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            WarningPrinter assumeNoSideEffectsNotePrinter = new WarningPrinter(System.out, configuration.note);
1402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            new AssumeNoSideEffectsChecker(assumeNoSideEffectsNotePrinter).checkClassSpecifications(configuration.assumeNoSideEffects);
1422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // Print out a summary of the notes, if necessary.
1442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            int keepClassMemberNoteCount = keepClassMemberNotePrinter.getWarningCount();
1452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if (keepClassMemberNoteCount > 0)
1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("Note: there were " + keepClassMemberNoteCount +
1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                   " '-keepclassmembers' options that didn't specify class");
1492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      members. You should specify at least some class members or consider");
1502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      if you just need '-keep'.");
1512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#classmembers)");
1522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
1532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            int assumeNoSideEffectsNoteCount = assumeNoSideEffectsNotePrinter.getWarningCount();
1552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if (assumeNoSideEffectsNoteCount > 0)
1562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("Note: there were " + assumeNoSideEffectsNoteCount +
1582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                   " '-assumenosideeffects' options that try to match all");
1592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      methods with wildcards. This will likely cause problems with methods like");
1602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      'wait()' and 'notify()'. You should specify the methods more precisely.");
1612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#nosideeffects)");
1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
1642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
1652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    /**
1682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * Performs some sanity checks on the class paths.
1692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     */
1702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    private void checkConflicts(ClassPath classPath1,
1712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                ClassPath classPath2)
1722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    throws IOException
1732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
1742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (classPath1 == null ||
1752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            classPath2 == null)
1762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
1772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            return;
1782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
1792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        for (int index1 = 0; index1 < classPath1.size(); index1++)
1812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
1822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            ClassPathEntry entry1 = classPath1.get(index1);
1832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            for (int index2 = 0; index2 < classPath2.size(); index2++)
1852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                if (classPath1 != classPath2 || index1 != index2)
1872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                {
1882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    ClassPathEntry entry2 = classPath2.get(index2);
1892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
1902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    if (entry2.getName().equals(entry1.getName()))
1912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    {
1922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        if (entry1.isOutput())
1932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        {
1942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            if (entry2.isOutput())
1952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            {
1962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                // Output / output.
1972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                throw new IOException("The same output jar ["+entry1.getName()+"] is specified twice.");
1982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            }
1992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            else
2002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            {
2012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                // Output / input.
2022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"].");
2032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            }
2042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        }
2052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        else
2062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        {
2072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            if (entry2.isOutput())
2082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            {
2092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                // Input / output.
2102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"].");
2112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            }
2122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            else if (!entry1.isFiltered() ||
2132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                     !entry2.isFiltered())
2142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            {
2152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                // Input / input.
2162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                throw new IOException("The same input jar ["+entry1.getName()+"] is specified twice.");
2172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                            }
2182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                        }
2192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    }
2202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                }
2212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
2222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
2232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
2242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom}
225