blob: eaa309668dbc52fc656925ba2bdc99eb115755ab [file] [log] [blame]
/*
* 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);
}
}