aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java
diff options
context:
space:
mode:
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.java203
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);
+ }
+}