Skip to content

Commit 9c94656

Browse files
committed
Parse repository xml to get needed sdk download URLs
1 parent c51b18a commit 9c94656

File tree

1 file changed

+120
-1
lines changed

1 file changed

+120
-1
lines changed

src/processing/mode/android/SDKDownloader.java

Lines changed: 120 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,130 @@
11
package processing.mode.android;
22

3+
import org.w3c.dom.Document;
4+
import org.w3c.dom.Element;
5+
import org.w3c.dom.Node;
6+
import org.w3c.dom.NodeList;
7+
import org.xml.sax.SAXException;
8+
import processing.app.Base;
39
import processing.app.Preferences;
410

511
import javax.swing.*;
612
import javax.swing.border.EmptyBorder;
13+
import javax.xml.parsers.DocumentBuilder;
14+
import javax.xml.parsers.DocumentBuilderFactory;
15+
import javax.xml.parsers.ParserConfigurationException;
716
import java.awt.*;
817
import java.awt.event.ActionEvent;
918
import java.awt.event.ActionListener;
19+
import java.beans.PropertyChangeEvent;
20+
import java.beans.PropertyChangeListener;
21+
import java.io.IOException;
22+
import java.net.URL;
1023

11-
public class SDKDownloader extends JFrame {
24+
public class SDKDownloader extends JFrame implements PropertyChangeListener {
25+
26+
private static final String URL_SDK_TOOLS_WINDOWS = "http://dl.google.com/android/android-sdk_r23-windows.zip";
27+
private static final String URL_SDK_TOOLS_MACOS = "http://dl.google.com/android/android-sdk_r23-macosx.zip";
28+
private static final String URL_SDK_TOOLS_LINUX = "http://dl.google.com/android/android-sdk_r23-linux.tgz";
29+
30+
private static final String URL_REPOSITORY = "https://dl-ssl.google.com/android/repository/repository-10.xml";
31+
private static final String URL_REPOSITORY_FOLDER = "http://dl-ssl.google.com/android/repository/";
32+
33+
private static final String PLATFORM_API_LEVEL = "10";
34+
35+
class SDKUrlHolder {
36+
public String platformToolsUrl, buildToolsUrl, platformUrl;
37+
}
38+
39+
class SDKDownloadTask extends SwingWorker {
40+
41+
@Override
42+
protected Object doInBackground() throws Exception {
43+
String hostOs = getOsString();
44+
try {
45+
SDKUrlHolder downloadUrls = getDownloadUrls(URL_REPOSITORY, hostOs);
46+
} catch (ParserConfigurationException e) {
47+
// TODO Handle exceptions here somehow (ie show error message)
48+
e.printStackTrace();
49+
} catch (IOException e) {
50+
e.printStackTrace();
51+
} catch (SAXException e) {
52+
e.printStackTrace();
53+
}
54+
return null;
55+
}
56+
57+
@Override
58+
protected void done() {
59+
super.done();
60+
}
61+
62+
private String getOsString() {
63+
if(Base.isWindows()) {
64+
return "windows";
65+
} else if(Base.isLinux()) {
66+
return "linux";
67+
} else {
68+
return "macosx";
69+
}
70+
}
71+
72+
private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs) throws ParserConfigurationException, IOException, SAXException {
73+
SDKUrlHolder urlHolder = new SDKUrlHolder();
74+
75+
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
76+
DocumentBuilder db = dbf.newDocumentBuilder();
77+
Document doc = db.parse(new URL(repositoryUrl).openStream());
78+
79+
// platform
80+
NodeList platformList = doc.getElementsByTagName("sdk:platform");
81+
for(int i = 0; i < platformList.getLength(); i++) {
82+
Node platform = platformList.item(i);
83+
if(((Element) platform).getElementsByTagName("sdk:api-level").item(0).getTextContent().equals(PLATFORM_API_LEVEL)) {
84+
Node archiveListItem = ((Element) platform).getElementsByTagName("sdk:archives").item(0);
85+
Node archiveItem = ((Element) archiveListItem).getElementsByTagName("sdk:archive").item(0);
86+
urlHolder.platformUrl = ((Element) archiveItem).getElementsByTagName("sdk:url").item(0).getTextContent();
87+
}
88+
}
89+
90+
// platform-tools
91+
Node platformToolItem = doc.getElementsByTagName("sdk:platform-tool").item(0);
92+
Node archiveListItem = ((Element) platformToolItem).getElementsByTagName("sdk:archives").item(0);
93+
NodeList archiveList = ((Element) archiveListItem).getElementsByTagName("sdk:archive");
94+
for(int i = 0; i < archiveList.getLength(); i++) {
95+
Node archive = archiveList.item(i);
96+
String hostOs = ((Element) archive).getElementsByTagName("sdk:host-os").item(0).getTextContent();
97+
if(hostOs.equals(requiredHostOs)) {
98+
String platformToolsUrl = (((Element) archive).getElementsByTagName("sdk:url").item(0).getTextContent());
99+
if(!platformToolsUrl.startsWith("http")) platformToolsUrl = URL_REPOSITORY_FOLDER + platformToolsUrl;
100+
urlHolder.platformToolsUrl = platformToolsUrl;
101+
break;
102+
}
103+
}
104+
105+
// build-tools
106+
Node buildToolsItem = doc.getElementsByTagName("sdk:build-tool").item(doc.getElementsByTagName("sdk:build-tool").getLength()-1);
107+
archiveListItem = ((Element) buildToolsItem).getElementsByTagName("sdk:archives").item(0);
108+
archiveList = ((Element) archiveListItem).getElementsByTagName("sdk:archive");
109+
for(int i = 0; i < archiveList.getLength(); i++) {
110+
Node archive = archiveList.item(i);
111+
String hostOs = ((Element) archive).getElementsByTagName("sdk:host-os").item(0).getTextContent();
112+
if(hostOs.equals(requiredHostOs)) {
113+
String buildToolsUrl = (((Element) archive).getElementsByTagName("sdk:url").item(0).getTextContent());
114+
if(!buildToolsUrl.startsWith("http")) buildToolsUrl = URL_REPOSITORY_FOLDER + buildToolsUrl;
115+
urlHolder.buildToolsUrl = buildToolsUrl;
116+
break;
117+
}
118+
}
119+
120+
return urlHolder;
121+
}
122+
}
123+
124+
@Override
125+
public void propertyChange(PropertyChangeEvent evt) {
126+
127+
}
12128

13129
public SDKDownloader() {
14130
super("Android SDK downloading...");
@@ -17,6 +133,9 @@ public SDKDownloader() {
17133
}
18134

19135
public void startDownload() {
136+
SDKDownloadTask downloadTask = new SDKDownloadTask();
137+
downloadTask.addPropertyChangeListener(this);
138+
downloadTask.execute();
20139
}
21140

22141
private void createLayout() {

0 commit comments

Comments
 (0)