Skip to content

Commit cf311fe

Browse files
committed
testing class loaders
1 parent 013f036 commit cf311fe

File tree

3 files changed

+116
-3
lines changed

3 files changed

+116
-3
lines changed

src/processing/mode/android/AndroidEditor.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323
package processing.mode.android;
2424

2525
import processing.app.Base;
26+
import processing.app.Messages;
2627
import processing.app.Mode;
2728
import processing.app.Platform;
2829
import processing.app.Preferences;
2930
import processing.app.Settings;
3031
import processing.app.SketchException;
32+
import processing.app.Util;
33+
import processing.app.ui.Editor;
3134
import processing.app.ui.EditorException;
3235
import processing.app.ui.EditorState;
3336
import processing.app.ui.EditorToolbar;
@@ -43,6 +46,11 @@
4346
import java.awt.event.ActionListener;
4447
import java.io.File;
4548
import java.io.IOException;
49+
import java.lang.reflect.Constructor;
50+
import java.lang.reflect.InvocationTargetException;
51+
import java.net.MalformedURLException;
52+
import java.net.URL;
53+
import java.net.URLClassLoader;
4654
import java.util.TimerTask;
4755

4856

@@ -342,6 +350,46 @@ public void actionPerformed(ActionEvent e) {
342350
item = new JMenuItem("Update SDK");
343351
item.addActionListener(new ActionListener() {
344352
public void actionPerformed(ActionEvent e) {
353+
354+
/*
355+
AndroidSDK sdk = androidMode.getSDK();
356+
File lib = new File(sdk.getToolsFolder(), "lib");
357+
File[] archives = Util.listJarFiles(lib);
358+
URL[] urlList = new URL[archives.length];
359+
for (int k = 0; k < archives.length; k++) {
360+
try {
361+
urlList[k] = archives[k].toURI().toURL();
362+
System.out.println(urlList[k]);
363+
} catch (MalformedURLException ex) {}
364+
}
365+
366+
367+
ClassLoader parent = androidMode.getClassLoader();
368+
System.out.println("Android mode CLASS loader " + AndroidMode.class.getClassLoader());
369+
System.out.println("Android mode class loader " + parent);
370+
ClassLoader loader = new URLClassLoader(urlList, parent);
371+
372+
373+
try {
374+
Class<?> updaterClass = loader.loadClass(SDKUpdater.class.getName());
375+
Constructor con = updaterClass.getConstructor(Editor.class, AndroidMode.class, ClassLoader.class);
376+
SDKUpdater updater = (SDKUpdater) con.newInstance(AndroidEditor.this, androidMode, loader);
377+
378+
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {
379+
// TODO Auto-generated catch block
380+
e1.printStackTrace();
381+
}
382+
383+
try {
384+
// This cast should be safe, since the only case when loader is not a
385+
// URLClassLoader is when no archives were found in the first place.
386+
((URLClassLoader) loader).close();
387+
} catch (IOException e2) {
388+
e2.printStackTrace();
389+
}
390+
*/
391+
392+
345393
new SDKUpdater(AndroidEditor.this, androidMode);
346394
}
347395
});

src/processing/mode/android/AndroidSDK.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import processing.app.Messages;
2525
import processing.app.Platform;
2626
import processing.app.Preferences;
27+
import processing.app.Util;
2728
import processing.app.exec.ProcessHelper;
2829
import processing.app.exec.ProcessResult;
2930
import processing.core.PApplet;
@@ -179,10 +180,24 @@ public AndroidSDK(File folder) throws BadSDKException, IOException {
179180
String javaHomeProp = System.getProperty("java.home");
180181
File javaHome = new File(javaHomeProp).getCanonicalFile();
181182
Platform.setenv("JAVA_HOME", javaHome.getCanonicalPath());
182-
183-
path = new File(javaHome, "bin").getCanonicalPath() + File.pathSeparator + path;
183+
184+
path = new File(javaHome, "bin").getCanonicalPath() + File.pathSeparator + path;
184185
Platform.setenv("PATH", path);
185186

187+
188+
189+
// Util.contentsToClassPath()
190+
// path = new File(tools, "lib").getCanonicalPath() + File.pathSeparator + path;
191+
192+
193+
// repository-
194+
// sdklib-
195+
// common-
196+
// commons-compress-
197+
// httpcore-
198+
// guava-
199+
200+
186201
checkDebugCertificate();
187202
}
188203

src/processing/mode/android/SDKUpdater.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
import java.beans.PropertyChangeEvent;
4545
import java.beans.PropertyChangeListener;
4646
import java.io.IOException;
47+
import java.lang.reflect.Constructor;
48+
import java.lang.reflect.InvocationTargetException;
4749
import java.util.ArrayList;
4850
import java.util.Arrays;
4951
import java.util.HashMap;
@@ -75,9 +77,13 @@ public class SDKUpdater extends JFrame implements PropertyChangeListener {
7577
private JButton actionButton;
7678
private JTable table;
7779

80+
public ClassLoader loader;
81+
7882
public SDKUpdater(Editor editor, AndroidMode androidMode) {
7983
super("SDK Updater");
8084

85+
this.loader = loader;
86+
8187
androidMode.checkSDK(editor);
8288
try {
8389
sdk = AndroidSDK.load();
@@ -99,6 +105,50 @@ public SDKUpdater(Editor editor, AndroidMode androidMode) {
99105
queryTask.execute();
100106
createLayout();
101107
}
108+
109+
public SDKUpdater(Editor editor, AndroidMode androidMode, ClassLoader loader) {
110+
super("SDK Updater");
111+
112+
this.loader = loader;
113+
114+
androidMode.checkSDK(editor);
115+
try {
116+
sdk = AndroidSDK.load();
117+
if (sdk == null) {
118+
sdk = AndroidSDK.locate(editor, androidMode);
119+
}
120+
} catch (IOException e) {
121+
e.printStackTrace();
122+
} catch (AndroidSDK.CancelException e) {
123+
e.printStackTrace();
124+
} catch (AndroidSDK.BadSDKException e) {
125+
e.printStackTrace();
126+
}
127+
128+
if (sdk == null) return;
129+
130+
// queryTask = new QueryTask();
131+
// queryTask.addPropertyChangeListener(this);
132+
// queryTask.execute();
133+
// createLayout();
134+
135+
136+
System.out.println("Android mode CLASS loader " + SDKUpdater.class.getClassLoader());
137+
System.out.println("Android mode class loader " + loader);
138+
139+
Object progress;
140+
Class<?> clazz;
141+
Constructor con;
142+
try {
143+
clazz = loader.loadClass("com.android.repository.api.ConsoleProgressIndicator");
144+
con = clazz.getConstructor();
145+
progress = con.newInstance();
146+
System.out.println("Success creating progress instance " + progress);
147+
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
148+
// TODO Auto-generated catch block
149+
e.printStackTrace();
150+
}
151+
}
102152

103153
@Override
104154
public void propertyChange(PropertyChangeEvent evt) {
@@ -137,7 +187,7 @@ protected Object doInBackground() throws Exception {
137187
with some changes
138188
*/
139189
AndroidSdkHandler mHandler = AndroidSdkHandler.getInstance(AndroidSDK.load().getSdkFolder());
140-
190+
141191
FileSystemFileOp fop = (FileSystemFileOp) FileOpUtils.create();
142192
RepoManager mRepoManager = mHandler.getSdkManager(progress);
143193
mRepoManager.loadSynchronously(0, progress, new LegacyDownloader(fop, new SettingsController() {

0 commit comments

Comments
 (0)