/*
 * ProGuard -- shrinking, optimization, obfuscation, and preverification
 *             of Java bytecode.
 *
 * Copyright (c) 2002-2017 Eric Lafortune @ GuardSquare
 *
 * 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;
    }
}
