|
23 | 23 |
|
24 | 24 | import org.w3c.dom.Document;
|
25 | 25 | import org.w3c.dom.Element;
|
26 |
| -import org.w3c.dom.Node; |
27 | 26 | import org.w3c.dom.NodeList;
|
28 | 27 | import org.xml.sax.SAXException;
|
29 | 28 |
|
|
37 | 36 | import javax.xml.parsers.DocumentBuilder;
|
38 | 37 | import javax.xml.parsers.DocumentBuilderFactory;
|
39 | 38 | import javax.xml.parsers.ParserConfigurationException;
|
| 39 | +import javax.xml.xpath.*; |
40 | 40 |
|
41 | 41 | import java.awt.*;
|
42 | 42 | import java.awt.event.ActionEvent;
|
|
51 | 51 | @SuppressWarnings("serial")
|
52 | 52 | public class SysImageDownloader extends JDialog implements PropertyChangeListener {
|
53 | 53 | private static final String SYS_IMAGES_URL = "https://dl.google.com/android/repository/sys-img/google_apis/";
|
54 |
| - private static final String SYS_IMAGES_LIST = "sys-img.xml"; |
| 54 | + private static final String SYS_IMAGES_LIST = "sys-img2-1.xml"; |
55 | 55 |
|
56 | 56 | private static final String SYS_IMAGES_WEAR_URL = "https://dl.google.com/android/repository/sys-img/android-wear/";
|
57 |
| - private static final String SYS_IMAGES_WEAR_LIST = "sys-img.xml"; |
| 57 | + private static final String SYS_IMAGES_WEAR_LIST = "sys-img2-1.xml"; |
58 | 58 |
|
59 | 59 | public static final String SYSTEM_IMAGE_TAG = "google_apis";
|
60 |
| - private static final String SYSTEM_IMAGE_MACOSX = "Google APIs Intel x86 Atom System Image"; |
61 |
| - private static final String SYSTEM_IMAGE_WINDOWS = "Google APIs Intel x86 Atom System Image"; |
62 |
| - private static final String SYSTEM_IMAGE_LINUX = "Google APIs Intel x86 Atom System Image"; |
63 |
| - |
| 60 | + |
64 | 61 | public static final String SYSTEM_IMAGE_WEAR_TAG = "android-wear";
|
65 |
| - private static final String SYSTEM_IMAGE_WEAR_MACOSX = "Android Wear Intel x86 Atom System Image"; |
66 |
| - private static final String SYSTEM_IMAGE_WEAR_WINDOWS = "Android Wear Intel x86 Atom System Image"; |
67 |
| - private static final String SYSTEM_IMAGE_WEAR_LINUX = "Android Wear Intel x86 Atom System Image"; |
68 |
| - |
| 62 | + |
69 | 63 | private static final String PROPERTY_CHANGE_EVENT_TOTAL = "total";
|
70 | 64 | private static final String PROPERTY_CHANGE_EVENT_DOWNLOADED = "downloaded";
|
71 | 65 |
|
@@ -223,74 +217,58 @@ private void fixSourceProperties(File imageFolder) {
|
223 | 217 |
|
224 | 218 | private void getDownloadUrls(UrlHolder urlHolder,
|
225 | 219 | String repositoryUrl, String requiredHostOs)
|
226 |
| - throws ParserConfigurationException, IOException, SAXException { |
| 220 | + throws ParserConfigurationException, IOException, SAXException, XPathException { |
227 | 221 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
228 | 222 | DocumentBuilder db = dbf.newDocumentBuilder();
|
| 223 | + XPathFactory xPathfactory = XPathFactory.newInstance(); |
| 224 | + XPath xpath = xPathfactory.newXPath(); |
| 225 | + XPathExpression expr; |
| 226 | + NodeList remotePackages; |
| 227 | + |
| 228 | + expr = xpath.compile("//remotePackage[contains(@path, '" + AndroidBuild.TARGET_SDK + "')" + |
| 229 | + "and contains(@path, \"x86\")]"); |
229 | 230 |
|
230 | 231 | if (wear) {
|
231 |
| - // wear system image |
232 |
| - String systemImage = ""; |
233 |
| - if (Platform.isMacOS()) { |
234 |
| - systemImage = SYSTEM_IMAGE_WEAR_MACOSX; |
235 |
| - } else if (Platform.isWindows()) { |
236 |
| - systemImage = SYSTEM_IMAGE_WEAR_WINDOWS; |
237 |
| - } else if (Platform.isLinux()) { |
238 |
| - systemImage = SYSTEM_IMAGE_WEAR_LINUX; |
239 |
| - } |
240 | 232 | Document docSysImgWear = db.parse(new URL(repositoryUrl).openStream());
|
241 |
| - NodeList sysImgWearList = docSysImgWear.getElementsByTagName("sdk:system-image"); |
242 |
| - for (int i = 0; i < sysImgWearList.getLength(); i++) { |
243 |
| - Node img = sysImgWearList.item(i); |
244 |
| - NodeList level = ((Element) img).getElementsByTagName("sdk:api-level"); |
245 |
| - NodeList desc = ((Element) img).getElementsByTagName("sdk:description"); |
246 |
| - NodeList codename = ((Element) img).getElementsByTagName("sdk:codename"); |
247 |
| - // Only considering nodes without a codename, which correspond to the platform |
248 |
| - // pre-releases. |
249 |
| - if (level.item(0).getTextContent().equals(AndroidBuild.TARGET_SDK) && |
250 |
| - desc.item(0).getTextContent().equals(systemImage) && |
251 |
| - codename.item(0) == null) { |
252 |
| - NodeList tag = ((Element) img).getElementsByTagName("sdk:tag-id"); |
253 |
| - urlHolder.sysImgWearTag = tag.item(0).getTextContent(); |
254 |
| - Node archiveListItem = ((Element) img).getElementsByTagName("sdk:archives").item(0); |
255 |
| - Node archiveItem = ((Element) archiveListItem).getElementsByTagName("sdk:archive").item(0); |
256 |
| - urlHolder.sysImgWearFilename = ((Element) archiveItem).getElementsByTagName("sdk:url").item(0).getTextContent(); |
257 |
| - urlHolder.sysImgWearUrl = SYS_IMAGES_WEAR_URL + urlHolder.sysImgWearFilename; |
258 |
| - urlHolder.totalSize += Integer.parseInt(((Element) archiveItem).getElementsByTagName("sdk:size").item(0).getTextContent()); |
259 |
| - break; |
260 |
| - } |
261 |
| - } |
| 233 | + remotePackages = (NodeList) expr.evaluate(docSysImgWear, XPathConstants.NODESET); |
| 234 | + NodeList childNodes = remotePackages.item(0).getChildNodes(); |
| 235 | + |
| 236 | + NodeList typeDetails = ((Element) childNodes).getElementsByTagName("type-details"); |
| 237 | + NodeList tag = ((Element) typeDetails.item(0)).getElementsByTagName("tag"); |
| 238 | + NodeList id = ((Element) tag.item(0)).getElementsByTagName("id"); |
| 239 | + urlHolder.sysImgWearTag = id.item(0).getTextContent(); |
| 240 | + |
| 241 | + NodeList archives = ((Element) childNodes).getElementsByTagName("archive"); |
| 242 | + NodeList archive = archives.item(0).getChildNodes(); |
| 243 | + NodeList complete = ((Element) archive).getElementsByTagName("complete"); |
| 244 | + |
| 245 | + NodeList url = ((Element) complete.item(0)).getElementsByTagName("url"); |
| 246 | + NodeList size = ((Element) complete.item(0)).getElementsByTagName("size"); |
| 247 | + |
| 248 | + urlHolder.sysImgWearFilename = url.item(0).getTextContent(); |
| 249 | + urlHolder.sysImgWearUrl = SYS_IMAGES_WEAR_URL + urlHolder.sysImgWearFilename; |
| 250 | + urlHolder.totalSize += Integer.parseInt(size.item(0).getTextContent()); |
262 | 251 | } else {
|
263 |
| - // default system image |
264 |
| - String systemImage = ""; |
265 |
| - if (Platform.isMacOS()) { |
266 |
| - systemImage = SYSTEM_IMAGE_MACOSX; |
267 |
| - } else if (Platform.isWindows()) { |
268 |
| - systemImage = SYSTEM_IMAGE_WINDOWS; |
269 |
| - } else if (Platform.isLinux()) { |
270 |
| - systemImage = SYSTEM_IMAGE_LINUX; |
271 |
| - } |
272 | 252 | Document docSysImg = db.parse(new URL(repositoryUrl).openStream());
|
273 |
| - NodeList sysImgList = docSysImg.getElementsByTagName("sdk:system-image"); |
274 |
| - for (int i = 0; i < sysImgList.getLength(); i++) { |
275 |
| - Node img = sysImgList.item(i); |
276 |
| - NodeList level = ((Element) img).getElementsByTagName("sdk:api-level"); |
277 |
| - NodeList desc = ((Element) img).getElementsByTagName("sdk:description"); |
278 |
| - NodeList codename = ((Element) img).getElementsByTagName("sdk:codename"); |
279 |
| - // Only considering nodes without a codename, which correspond to the platform |
280 |
| - // pre-releases. |
281 |
| - if (level.item(0).getTextContent().equals(AndroidBuild.TARGET_SDK) && |
282 |
| - desc.item(0).getTextContent().equals(systemImage) && |
283 |
| - codename.item(0) == null) { |
284 |
| - NodeList tag = ((Element) img).getElementsByTagName("sdk:tag-id"); |
285 |
| - urlHolder.sysImgTag = tag.item(0).getTextContent(); |
286 |
| - Node archiveListItem = ((Element) img).getElementsByTagName("sdk:archives").item(0); |
287 |
| - Node archiveItem = ((Element) archiveListItem).getElementsByTagName("sdk:archive").item(0); |
288 |
| - urlHolder.sysImgFilename = ((Element) archiveItem).getElementsByTagName("sdk:url").item(0).getTextContent(); |
289 |
| - urlHolder.sysImgUrl = SYS_IMAGES_URL + urlHolder.sysImgFilename; |
290 |
| - urlHolder.totalSize += Integer.parseInt(((Element) archiveItem).getElementsByTagName("sdk:size").item(0).getTextContent()); |
291 |
| - break; |
292 |
| - } |
293 |
| - } |
| 253 | + remotePackages = (NodeList) expr.evaluate(docSysImg, XPathConstants.NODESET); |
| 254 | + NodeList childNodes = remotePackages.item(0).getChildNodes(); // Index 1 contains x86_64 |
| 255 | + |
| 256 | + NodeList typeDetails = ((Element) childNodes).getElementsByTagName("type-details"); |
| 257 | + //NodeList abi = ((Element) typeDetails.item(0)).getElementsByTagName("abi"); |
| 258 | + NodeList tag = ((Element) typeDetails.item(0)).getElementsByTagName("tag"); |
| 259 | + NodeList id = ((Element) tag.item(0)).getElementsByTagName("id"); |
| 260 | + urlHolder.sysImgTag = id.item(0).getTextContent(); |
| 261 | + |
| 262 | + NodeList archives = ((Element) childNodes).getElementsByTagName("archive"); |
| 263 | + NodeList archive = archives.item(0).getChildNodes(); |
| 264 | + NodeList complete = ((Element) archive).getElementsByTagName("complete"); |
| 265 | + |
| 266 | + NodeList url = ((Element) complete.item(0)).getElementsByTagName("url"); |
| 267 | + NodeList size = ((Element) complete.item(0)).getElementsByTagName("size"); |
| 268 | + |
| 269 | + urlHolder.sysImgFilename = url.item(0).getTextContent(); |
| 270 | + urlHolder.sysImgUrl = SYS_IMAGES_URL + urlHolder.sysImgFilename; |
| 271 | + urlHolder.totalSize += Integer.parseInt(size.item(0).getTextContent()); |
294 | 272 | }
|
295 | 273 | }
|
296 | 274 | }
|
|
0 commit comments