diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java new file mode 100644 index 000000000..141e7e000 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2009 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.tests.functests.sampleProjects; + +import com.android.SdkConstants; +import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper; +import com.android.xml.AndroidManifest; + +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +/** + * Helper class for modifying an AndroidManifest. + * <p/> + * TODO: consider merging this with AndroidManifestParser. + */ +class AndroidManifestWriter { + + private static final Logger sLogger = Logger.getLogger(AndroidManifestWriter.class.getName()); + + private final Document mDoc; + private final String mOsManifestFilePath; + + private AndroidManifestWriter(Document doc, String osManifestFilePath) { + mDoc = doc; + mOsManifestFilePath = osManifestFilePath; + } + + /** + * Sets the minimum SDK version for this manifest + * @param minSdkVersion - the minimim sdk version to use + * @returns <code>true</code> on success, false otherwise + */ + public boolean setMinSdkVersion(String minSdkVersion) { + Element usesSdkElement = null; + NodeList nodeList = mDoc.getElementsByTagName(AndroidManifest.NODE_USES_SDK); + if (nodeList.getLength() > 0) { + usesSdkElement = (Element) nodeList.item(0); + } else { + usesSdkElement = mDoc.createElement(AndroidManifest.NODE_USES_SDK); + mDoc.getDocumentElement().appendChild(usesSdkElement); + } + Attr minSdkAttr = mDoc.createAttributeNS(SdkConstants.NS_RESOURCES, + AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION); + String prefix = mDoc.lookupPrefix(SdkConstants.NS_RESOURCES); + minSdkAttr.setPrefix(prefix); + minSdkAttr.setValue(minSdkVersion); + usesSdkElement.setAttributeNodeNS(minSdkAttr); + return saveXmlToFile(); + } + + private boolean saveXmlToFile() { + try { + // Prepare the DOM document for writing + Source source = new DOMSource(mDoc); + + // Prepare the output file + File file = new File(mOsManifestFilePath); + Result result = new StreamResult(file); + + // Write the DOM document to the file + Transformer xformer = TransformerFactory.newInstance().newTransformer(); + xformer.transform(source, result); + } catch (TransformerConfigurationException e) { + sLogger.log(Level.SEVERE, "Failed to write xml file", e); + return false; + } catch (TransformerException e) { + sLogger.log(Level.SEVERE, "Failed to write xml file", e); + return false; + } + return true; + } + + /** + * 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 parsing failed + */ + public static AndroidManifestWriter parse(String osManifestFilePath) { + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + docFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.parse(osManifestFilePath); + return new AndroidManifestWriter(doc, osManifestFilePath); + } catch (ParserConfigurationException e) { + sLogger.log(Level.SEVERE, "Error parsing file", e); + return null; + } catch (SAXException e) { + sLogger.log(Level.SEVERE, "Error parsing file", e); + return null; + } catch (IOException e) { + sLogger.log(Level.SEVERE, "Error parsing file", e); + return null; + } + } +} |