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