| /* |
| * ProGuard -- shrinking, optimization, obfuscation, and preverification |
| * of Java bytecode. |
| * |
| * Copyright (c) 2002-2014 Eric Lafortune ([email protected]) |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| package proguard; |
| |
| import proguard.util.ListUtil; |
| |
| import java.io.*; |
| import java.util.List; |
| |
| |
| /** |
| * This class represents an entry from a class path: an apk, a jar, an aar, a |
| * war, a zip, an ear, or a directory, with a name and a flag to indicates |
| * whether the entry is an input entry or an output entry. Optional filters can |
| * be specified for the names of the contained resource/classes, apks, jars, |
| * aars, wars, ears, and zips. |
| * |
| * @author Eric Lafortune |
| */ |
| public class ClassPathEntry |
| { |
| private File file; |
| private boolean output; |
| private List filter; |
| private List apkFilter; |
| private List jarFilter; |
| private List aarFilter; |
| private List warFilter; |
| private List earFilter; |
| private List zipFilter; |
| |
| private String cachedName; |
| |
| |
| /** |
| * Creates a new ClassPathEntry with the given file and output flag. |
| */ |
| public ClassPathEntry(File file, boolean isOutput) |
| { |
| this.file = file; |
| this.output = isOutput; |
| } |
| |
| |
| /** |
| * Returns the path name of the entry. |
| */ |
| public String getName() |
| { |
| if (cachedName == null) |
| { |
| cachedName = getUncachedName(); |
| } |
| |
| return cachedName; |
| } |
| |
| |
| /** |
| * Returns the uncached path name of the entry. |
| */ |
| private String getUncachedName() |
| { |
| try |
| { |
| return file.getCanonicalPath(); |
| } |
| catch (IOException ex) |
| { |
| return file.getPath(); |
| } |
| } |
| |
| |
| /** |
| * Returns the file. |
| */ |
| public File getFile() |
| { |
| return file; |
| } |
| |
| |
| /** |
| * Sets the file. |
| */ |
| public void setFile(File file) |
| { |
| this.file = file; |
| this.cachedName = null; |
| } |
| |
| |
| /** |
| * Returns whether this data entry is an output entry. |
| */ |
| public boolean isOutput() |
| { |
| return output; |
| } |
| |
| |
| /** |
| * Specifies whether this data entry is an output entry. |
| */ |
| public void setOutput(boolean output) |
| { |
| this.output = output; |
| } |
| |
| |
| /** |
| * Returns whether this data entry is a dex file. |
| */ |
| public boolean isDex() |
| { |
| return hasExtension(".dex"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry is an apk file. |
| */ |
| public boolean isApk() |
| { |
| return hasExtension(".apk") || |
| hasExtension(".ap_"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry is a jar file. |
| */ |
| public boolean isJar() |
| { |
| return hasExtension(".jar"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry is an aar file. |
| */ |
| public boolean isAar() |
| { |
| return hasExtension(".aar"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry is a war file. |
| */ |
| public boolean isWar() |
| { |
| return hasExtension(".war"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry is a ear file. |
| */ |
| public boolean isEar() |
| { |
| return hasExtension(".ear"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry is a zip file. |
| */ |
| public boolean isZip() |
| { |
| return hasExtension(".zip"); |
| } |
| |
| |
| /** |
| * Returns whether this data entry has the given extension. |
| */ |
| private boolean hasExtension(String extension) |
| { |
| return endsWithIgnoreCase(file.getPath(), extension); |
| } |
| |
| |
| /** |
| * Returns whether the given string ends with the given suffix, ignoring |
| * its case. |
| */ |
| private static boolean endsWithIgnoreCase(String string, String suffix) |
| { |
| int stringLength = string.length(); |
| int suffixLength = suffix.length(); |
| |
| return string.regionMatches(true, stringLength - |
| suffixLength, suffix, 0, suffixLength); |
| } |
| |
| |
| /** |
| * Returns whether this data entry has any kind of filter. |
| */ |
| public boolean isFiltered() |
| { |
| return filter != null || |
| apkFilter != null || |
| jarFilter != null || |
| aarFilter != null || |
| warFilter != null || |
| earFilter != null || |
| zipFilter != null; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to bottom-level files in this entry. |
| */ |
| public List getFilter() |
| { |
| return filter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to bottom-level files in this entry. |
| */ |
| public void setFilter(List filter) |
| { |
| this.filter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to apk files in this entry, if any. |
| */ |
| public List getApkFilter() |
| { |
| return apkFilter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to apk files in this entry, if any. |
| */ |
| public void setApkFilter(List filter) |
| { |
| this.apkFilter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to jar files in this entry, if any. |
| */ |
| public List getJarFilter() |
| { |
| return jarFilter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to jar files in this entry, if any. |
| */ |
| public void setJarFilter(List filter) |
| { |
| this.jarFilter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to aar files in this entry, if any. |
| */ |
| public List getAarFilter() |
| { |
| return aarFilter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to aar files in this entry, if any. |
| */ |
| public void setAarFilter(List filter) |
| { |
| this.aarFilter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to war files in this entry, if any. |
| */ |
| public List getWarFilter() |
| { |
| return warFilter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to war files in this entry, if any. |
| */ |
| public void setWarFilter(List filter) |
| { |
| this.warFilter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to ear files in this entry, if any. |
| */ |
| public List getEarFilter() |
| { |
| return earFilter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to ear files in this entry, if any. |
| */ |
| public void setEarFilter(List filter) |
| { |
| this.earFilter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| /** |
| * Returns the name filter that is applied to zip files in this entry, if any. |
| */ |
| public List getZipFilter() |
| { |
| return zipFilter; |
| } |
| |
| /** |
| * Sets the name filter that is applied to zip files in this entry, if any. |
| */ |
| public void setZipFilter(List filter) |
| { |
| this.zipFilter = filter == null || filter.size() == 0 ? null : filter; |
| } |
| |
| |
| // Implementations for Object. |
| |
| public String toString() |
| { |
| String string = getName(); |
| |
| if (filter != null || |
| jarFilter != null || |
| aarFilter != null || |
| warFilter != null || |
| earFilter != null || |
| zipFilter != null) |
| { |
| string += |
| ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + |
| (aarFilter != null ? ListUtil.commaSeparatedString(aarFilter, true) : "") + |
| ConfigurationConstants.SEPARATOR_KEYWORD + |
| (apkFilter != null ? ListUtil.commaSeparatedString(apkFilter, true) : "") + |
| ConfigurationConstants.SEPARATOR_KEYWORD + |
| (zipFilter != null ? ListUtil.commaSeparatedString(zipFilter, true) : "") + |
| ConfigurationConstants.SEPARATOR_KEYWORD + |
| (earFilter != null ? ListUtil.commaSeparatedString(earFilter, true) : "") + |
| ConfigurationConstants.SEPARATOR_KEYWORD + |
| (warFilter != null ? ListUtil.commaSeparatedString(warFilter, true) : "") + |
| ConfigurationConstants.SEPARATOR_KEYWORD + |
| (jarFilter != null ? ListUtil.commaSeparatedString(jarFilter, true) : "") + |
| ConfigurationConstants.SEPARATOR_KEYWORD + |
| (filter != null ? ListUtil.commaSeparatedString(filter, true) : "") + |
| ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD; |
| } |
| |
| return string; |
| } |
| } |