diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java new file mode 100644 index 000000000..eaa309668 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java @@ -0,0 +1,203 @@ +/* + * 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); + } +} |