/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.adt.internal.project;

import com.android.ide.common.xml.AndroidManifestParser;
import com.android.ide.common.xml.ManifestData;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler.XmlErrorListener;
import com.android.ide.eclipse.adt.io.IFileWrapper;
import com.android.io.FileWrapper;
import com.android.io.IAbstractFile;
import com.android.io.StreamException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaProject;
import org.xml.sax.SAXException;

import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

public class AndroidManifestHelper {

    /**
     * Parses the Android Manifest, and returns an object containing the result of the parsing.
     * <p/>
     * This method can also gather XML error during the parsing. This is done by using an
     * {@link XmlErrorHandler} to mark the files in case of error, as well as a given
     * {@link XmlErrorListener}. To use a different error handler, consider using
     * {@link AndroidManifestParser#parse(IAbstractFile, boolean, com.android.sdklib.xml.AndroidManifestParser.ManifestErrorHandler)}
     * directly.
     *
     * @param manifestFile the {@link IFile} representing the manifest file.
     * @param gatherData indicates whether the parsing will extract data from the manifest. If null,
     * the method will always return null.
     * @param errorListener an optional error listener. If non null, then the parser will also
     * look for XML errors.
     * @return an {@link ManifestData} or null if the parsing failed.
     * @throws ParserConfigurationException
     * @throws StreamException
     * @throws IOException
     * @throws SAXException
     */
    public static ManifestData parseUnchecked(
            IAbstractFile manifestFile,
            boolean gatherData,
            XmlErrorListener errorListener) throws SAXException, IOException,
            StreamException, ParserConfigurationException {
        if (manifestFile != null) {
            IFile eclipseFile = null;
            if (manifestFile instanceof IFileWrapper) {
                eclipseFile = ((IFileWrapper)manifestFile).getIFile();
            }
            XmlErrorHandler errorHandler = null;
            if (errorListener != null) {
                errorHandler = new XmlErrorHandler(eclipseFile, errorListener);
            }

            return AndroidManifestParser.parse(manifestFile, gatherData, errorHandler);
        }

        return null;
    }

    /**
     * Parses the Android Manifest, and returns an object containing the result of the parsing.
     * <p/>
     * This method can also gather XML error during the parsing. This is done by using an
     * {@link XmlErrorHandler} to mark the files in case of error, as well as a given
     * {@link XmlErrorListener}. To use a different error handler, consider using
     * {@link AndroidManifestParser#parse(IAbstractFile, boolean, com.android.sdklib.xml.AndroidManifestParser.ManifestErrorHandler)}
     * directly.
     *
     * @param manifestFile the {@link IFile} representing the manifest file.
     * @param gatherData indicates whether the parsing will extract data from the manifest. If null,
     * the method will always return null.
     * @param errorListener an optional error listener. If non null, then the parser will also
     * look for XML errors.
     * @return an {@link ManifestData} or null if the parsing failed.
     */
    public static ManifestData parse(
            IAbstractFile manifestFile,
            boolean gatherData,
            XmlErrorListener errorListener) {
        try {
            return parseUnchecked(manifestFile, gatherData, errorListener);
        } catch (ParserConfigurationException e) {
            AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
                    "Bad parser configuration for %s: %s",
                    manifestFile.getOsLocation(),
                    e.getMessage());
        } catch (SAXException e) {
            AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
                    "Parser exception for %s: %s",
                    manifestFile.getOsLocation(),
                    e.getMessage());
        } catch (IOException e) {
            // Don't log a console error when failing to read a non-existing file
            if (!(e instanceof FileNotFoundException)) {
                AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
                        "I/O error for %s: %s",
                        manifestFile.getOsLocation(),
                        e.getMessage());
            }
        } catch (StreamException e) {
            AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
                    "Unable to read %s: %s",
                    manifestFile.getOsLocation(),
                    e.getMessage());
        }

        return null;
    }

    /**
     * Parses the Android Manifest for a given project, and returns an object containing
     * the result of the parsing.
     * <p/>
     * This method can also gather XML error during the parsing. This is done by using an
     * {@link XmlErrorHandler} to mark the files in case of error, as well as a given
     * {@link XmlErrorListener}. To use a different error handler, consider using
     * {@link AndroidManifestParser#parse(IAbstractFile, boolean, com.android.sdklib.xml.AndroidManifestParser.ManifestErrorHandler)}
     * directly.
     *
     * @param javaProject the project containing the manifest to parse.
     * @param gatherData indicates whether the parsing will extract data from the manifest. If null,
     * the method will always return null.
     * @param errorListener an optional error listener. If non null, then the parser will also
     * look for XML errors.
     * @return an {@link ManifestData} or null if the parsing failed.
     */
    public static ManifestData parse(
            IJavaProject javaProject,
            boolean gatherData,
            XmlErrorListener errorListener) {

        IFile manifestFile = ProjectHelper.getManifest(javaProject.getProject());
        if (manifestFile != null) {
            return parse(new IFileWrapper(manifestFile), gatherData, errorListener);
        }

        return null;
    }

    /**
     * Parses the manifest file only for error check.
     * @param manifestFile The manifest file to parse.
     * @param errorListener the {@link XmlErrorListener} object being notified of the presence
     * of errors.
     */
    public static void parseForError(IFile manifestFile, XmlErrorListener errorListener) {
        parse(new IFileWrapper(manifestFile), false, errorListener);
    }

    /**
     * Parses the manifest file, and collects data.
     * @param manifestFile The manifest file to parse.
     * @return an {@link ManifestData} or null if the parsing failed.
     */
    public static ManifestData parseForData(IFile manifestFile) {
        return parse(new IFileWrapper(manifestFile), true, null);
    }

    /**
     * Parses the manifest file, and collects data.
     * @param project the project containing the manifest.
     * @return an {@link AndroidManifestHelper} or null if the parsing failed.
     */
    public static ManifestData parseForData(IProject project) {
        IFile manifestFile = ProjectHelper.getManifest(project);
        if (manifestFile != null) {
            return parse(new IFileWrapper(manifestFile), true, null);
        }

        return null;
    }

    /**
     * Parses the manifest file, and collects data.
     *
     * @param osManifestFilePath The OS path of the manifest file to parse.
     * @return an {@link AndroidManifestHelper} or null if the parsing failed.
     */
    public static ManifestData parseForData(String osManifestFilePath) {
        return parse(new FileWrapper(osManifestFilePath), true, null);
    }
}
