ruboto 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +64 -1
- data/assets/rakelib/ruboto.rake +23 -2
- data/assets/res/layout/get_ruboto_core.xml +0 -2
- data/assets/samples/sample_activity.rb +3 -6
- data/assets/samples/sample_broadcast_receiver.rb +9 -5
- data/assets/samples/sample_service.rb +0 -3
- data/assets/src/InheritingActivity.java +1 -1
- data/assets/src/InheritingClass.java +10 -4
- data/assets/src/RubotoActivity.java +90 -20
- data/assets/src/RubotoBroadcastReceiver.java +59 -23
- data/assets/src/RubotoService.java +103 -51
- data/assets/src/org/ruboto/EntryPointActivity.java +2 -1
- data/assets/src/org/ruboto/JRubyAdapter.java +158 -115
- data/assets/src/org/ruboto/Script.java +23 -1
- data/assets/src/org/ruboto/test/ActivityTest.java +2 -2
- data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +30 -16
- data/assets/src/ruboto.rb +1 -0
- data/assets/src/ruboto/activity.rb +2 -6
- data/assets/src/ruboto/base.rb +9 -7
- data/assets/src/ruboto/broadcast_receiver.rb +0 -8
- data/assets/src/ruboto/generate.rb +2 -2
- data/assets/src/ruboto/service.rb +0 -8
- data/assets/src/ruboto/widget.rb +17 -2
- data/lib/java_class_gen/android_api.xml +1 -1
- data/lib/ruboto/sdk_versions.rb +1 -1
- data/lib/ruboto/util/build.rb +11 -10
- data/lib/ruboto/util/code_formatting.rb +2 -2
- data/lib/ruboto/util/update.rb +20 -7
- data/lib/ruboto/util/xml_element.rb +42 -16
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/call_super_activity.rb +28 -0
- data/test/activity/call_super_activity_test.rb +15 -0
- data/test/activity/image_button_activity.rb +2 -3
- data/test/activity/image_button_and_button_activity.rb +1 -2
- data/test/activity/margins_activity.rb +17 -0
- data/test/activity/margins_activity_test.rb +25 -0
- data/test/activity/navigation_activity.rb +85 -0
- data/test/activity/navigation_activity_test.rb +98 -0
- data/test/activity/option_menu_activity.rb +0 -2
- data/test/activity/psych_activity.rb +2 -3
- data/test/activity/stack_activity.rb +3 -2
- data/test/activity/stack_activity_test.rb +9 -7
- data/test/block_def_activity/margins_activity.rb +17 -0
- data/test/block_def_activity/margins_activity_test.rb +25 -0
- data/test/block_def_activity/option_menu_activity_test.rb +1 -2
- data/test/block_def_activity/stack_activity_test.rb +8 -5
- data/test/broadcast_receiver_test.rb +2 -2
- data/test/gem_test.rb +12 -0
- data/test/handle_activity/margins_activity.rb +15 -0
- data/test/handle_activity/margins_activity_test.rb +25 -0
- data/test/handle_activity/option_menu_activity.rb +4 -0
- data/test/handle_activity/stack_activity.rb +3 -0
- data/test/handle_activity/stack_activity_test.rb +9 -6
- data/test/minimal_app_test.rb +1 -1
- data/test/rake_test.rb +6 -7
- data/test/ruboto_gen_test.rb +54 -4
- data/test/ruboto_update_test.rb +12 -8
- data/test/service_test.rb +1 -6
- data/test/test_helper.rb +34 -11
- data/test/update_test_methods.rb +22 -0
- data/test/view_constants_test.rb +104 -0
- metadata +17 -5
@@ -3,8 +3,10 @@ package THE_PACKAGE;
|
|
3
3
|
import java.io.IOException;
|
4
4
|
|
5
5
|
public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
|
6
|
-
private String
|
6
|
+
private String rubyClassName;
|
7
|
+
private String scriptName;
|
7
8
|
private Object rubyInstance;
|
9
|
+
private Object[] callbackProcs = new Object[CONSTANTS_COUNT];
|
8
10
|
|
9
11
|
public void setCallbackProc(int id, Object obj) {
|
10
12
|
// Error: no callbacks
|
@@ -32,48 +34,82 @@ public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
|
|
32
34
|
}
|
33
35
|
|
34
36
|
protected void loadScript() {
|
37
|
+
rubyInstance = this;
|
35
38
|
|
36
39
|
// TODO(uwe): Only needed for non-class-based definitions
|
37
40
|
// Can be removed if we stop supporting non-class-based definitions
|
38
41
|
JRubyAdapter.put("$broadcast_receiver", this);
|
39
42
|
// TODO end
|
40
43
|
|
41
|
-
|
42
|
-
|
44
|
+
try {
|
45
|
+
if (scriptName != null) {
|
43
46
|
String rubyClassName = Script.toCamelCase(scriptName);
|
44
47
|
System.out.println("Looking for Ruby class: " + rubyClassName);
|
45
|
-
Object rubyClass =
|
48
|
+
Object rubyClass = null;
|
49
|
+
String script = new Script(scriptName).getContents();
|
50
|
+
if (script.matches("(?s).*class " + rubyClassName + ".*")) {
|
51
|
+
if (!rubyClassName.equals(getClass().getSimpleName())) {
|
52
|
+
System.out.println("Script defines methods on meta class");
|
53
|
+
// FIXME(uwe): Simplify when we stop support for RubotoCore 0.4.7
|
54
|
+
if (JRubyAdapter.isJRubyPreOneSeven() || JRubyAdapter.isRubyOneEight()) {
|
55
|
+
JRubyAdapter.put("$java_instance", this);
|
56
|
+
JRubyAdapter.put(rubyClassName, JRubyAdapter.runScriptlet("class << $java_instance; self; end"));
|
57
|
+
} else if (JRubyAdapter.isJRubyOneSeven() && JRubyAdapter.isRubyOneNine()) {
|
58
|
+
JRubyAdapter.put(rubyClassName, JRubyAdapter.runRubyMethod(this, "singleton_class"));
|
59
|
+
} else {
|
60
|
+
throw new RuntimeException("Unknown JRuby/Ruby version: " + JRubyAdapter.get("JRUBY_VERSION") + "/" + JRubyAdapter.get("RUBY_VERSION"));
|
61
|
+
}
|
62
|
+
}
|
63
|
+
} else {
|
64
|
+
rubyClass = JRubyAdapter.get(rubyClassName);
|
65
|
+
}
|
46
66
|
if (rubyClass == null) {
|
47
67
|
System.out.println("Loading script: " + scriptName);
|
48
|
-
|
68
|
+
if (script.matches("(?s).*class " + rubyClassName + ".*")) {
|
69
|
+
System.out.println("Script contains class definition");
|
70
|
+
if (rubyClassName.equals(getClass().getSimpleName())) {
|
71
|
+
System.out.println("Script has separate Java class");
|
72
|
+
|
73
|
+
// TODO(uwe): Why doesnt this work?
|
74
|
+
// JRubyAdapter.put(rubyClassName, JRubyAdapter.runScriptlet("Java::" + getClass().getName()));
|
75
|
+
|
76
|
+
// TODO(uwe): Workaround...
|
77
|
+
JRubyAdapter.runScriptlet(rubyClassName + " = Java::" + getClass().getName());
|
78
|
+
}
|
79
|
+
// System.out.println("Set class: " + JRubyAdapter.get(rubyClassName));
|
80
|
+
}
|
81
|
+
JRubyAdapter.setScriptFilename(scriptName);
|
82
|
+
JRubyAdapter.runScriptlet(script);
|
49
83
|
rubyClass = JRubyAdapter.get(rubyClassName);
|
50
84
|
}
|
51
|
-
if (rubyClass != null) {
|
52
|
-
System.out.println("Instanciating Ruby class: " + rubyClassName);
|
53
|
-
rubyInstance = JRubyAdapter.callMethod(rubyClass, "new", this, Object.class);
|
54
|
-
}
|
55
|
-
} catch(IOException e) {
|
56
|
-
throw new RuntimeException("IOException loading broadcast receiver script", e);
|
57
85
|
}
|
86
|
+
} catch(IOException e) {
|
87
|
+
throw new RuntimeException("IOException loading broadcast receiver script", e);
|
58
88
|
}
|
59
89
|
}
|
60
90
|
|
61
91
|
public void onReceive(android.content.Context context, android.content.Intent intent) {
|
62
92
|
try {
|
63
|
-
|
64
|
-
|
65
|
-
|
93
|
+
Log.d("onReceive: " + this);
|
94
|
+
|
95
|
+
// FIXME(uwe): Only needed for older broadcast receiver using callbacks
|
96
|
+
// FIXME(uwe): Remove if we stop suppporting callbacks (to avoid global variables).
|
97
|
+
JRubyAdapter.put("$context", context);
|
98
|
+
JRubyAdapter.put("$intent", intent);
|
99
|
+
JRubyAdapter.put("$broadcast_receiver", this);
|
100
|
+
// FIXME end
|
101
|
+
|
102
|
+
// FIXME(uwe): Simplify when we stop supporting JRuby 1.6.x
|
103
|
+
if (JRubyAdapter.isJRubyPreOneSeven()) {
|
104
|
+
JRubyAdapter.runScriptlet("$broadcast_receiver.on_receive($context, $intent)");
|
105
|
+
} else if (JRubyAdapter.isJRubyOneSeven()) {
|
106
|
+
JRubyAdapter.runRubyMethod(this, "on_receive", new Object[]{context, intent});
|
66
107
|
} else {
|
67
|
-
|
68
|
-
|
69
|
-
JRubyAdapter.put("$context", context);
|
70
|
-
JRubyAdapter.put("$broadcast_receiver", this);
|
71
|
-
JRubyAdapter.put("$intent", intent);
|
72
|
-
JRubyAdapter.execute("$broadcast_receiver.on_receive($context, $intent)");
|
73
|
-
// TODO end
|
74
|
-
}
|
108
|
+
throw new RuntimeException("Unknown JRuby version: " + JRubyAdapter.get("JRUBY_VERSION"));
|
109
|
+
}
|
75
110
|
} catch(Exception e) {
|
76
111
|
e.printStackTrace();
|
77
112
|
}
|
78
113
|
}
|
79
|
-
|
114
|
+
|
115
|
+
}
|
@@ -4,67 +4,121 @@ import org.ruboto.Script;
|
|
4
4
|
import java.io.IOException;
|
5
5
|
|
6
6
|
public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
|
7
|
-
private String scriptName;
|
8
|
-
public Object[] args;
|
9
|
-
private Object rubyInstance;
|
10
|
-
|
11
7
|
THE_CONSTANTS
|
12
8
|
|
13
|
-
|
9
|
+
private String rubyClassName;
|
10
|
+
private String scriptName;
|
11
|
+
private Object rubyInstance;
|
12
|
+
private Object[] callbackProcs = new Object[CONSTANTS_COUNT];
|
13
|
+
public Object[] args;
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
public void setCallbackProc(int id, Object obj) {
|
16
|
+
callbackProcs[id] = obj;
|
17
|
+
}
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
public void setScriptName(String name){
|
20
|
+
scriptName = name;
|
21
|
+
}
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
/****************************************************************************************
|
24
|
+
*
|
25
|
+
* Service Lifecycle: onCreate
|
26
|
+
*/
|
27
|
+
|
28
|
+
@Override
|
29
|
+
public void onCreate() {
|
30
|
+
// Return if we are called from JRuby to avoid infinite recursion.
|
31
|
+
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
|
32
|
+
for(StackTraceElement e : stackTraceElements){
|
33
|
+
if (e.getClassName().equals("java.lang.reflect.Method") && e.getMethodName().equals("invokeNative")) {
|
34
|
+
return;
|
35
|
+
}
|
36
|
+
if (e.getClassName().equals("android.app.ActivityThread") && e.getMethodName().equals("handleCreateService")) {
|
37
|
+
break;
|
38
|
+
}
|
39
|
+
}
|
32
40
|
|
33
|
-
|
41
|
+
System.out.println("RubotoService.onCreate()");
|
42
|
+
args = new Object[0];
|
34
43
|
|
35
|
-
|
36
|
-
// TODO(uwe): Only needed for non-class-based definitions
|
37
|
-
// Can be removed if we stop supporting non-class-based definitions
|
38
|
-
JRubyAdapter.defineGlobalVariable("$context", this);
|
39
|
-
JRubyAdapter.defineGlobalVariable("$service", this);
|
40
|
-
// TODO end
|
44
|
+
super.onCreate();
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
if (
|
53
|
-
|
54
|
-
|
55
|
-
|
46
|
+
if (JRubyAdapter.setUpJRuby(this)) {
|
47
|
+
rubyInstance = this;
|
48
|
+
|
49
|
+
// TODO(uwe): Only needed for non-class-based definitions
|
50
|
+
// Can be removed if we stop supporting non-class-based definitions
|
51
|
+
JRubyAdapter.defineGlobalVariable("$context", this);
|
52
|
+
JRubyAdapter.defineGlobalVariable("$service", this);
|
53
|
+
// TODO end
|
54
|
+
|
55
|
+
try {
|
56
|
+
if (scriptName != null) {
|
57
|
+
String rubyClassName = Script.toCamelCase(scriptName);
|
58
|
+
System.out.println("Looking for Ruby class: " + rubyClassName);
|
59
|
+
Object rubyClass = null;
|
60
|
+
String script = new Script(scriptName).getContents();
|
61
|
+
if (script.matches("(?s).*class " + rubyClassName + ".*")) {
|
62
|
+
if (!rubyClassName.equals(getClass().getSimpleName())) {
|
63
|
+
System.out.println("Script defines methods on meta class");
|
64
|
+
// FIXME(uwe): Simplify when we stop support for RubotoCore 0.4.7
|
65
|
+
if (JRubyAdapter.isJRubyPreOneSeven() || JRubyAdapter.isRubyOneEight()) {
|
66
|
+
JRubyAdapter.put("$java_instance", this);
|
67
|
+
JRubyAdapter.put(rubyClassName, JRubyAdapter.runScriptlet("class << $java_instance; self; end"));
|
68
|
+
} else if (JRubyAdapter.isJRubyOneSeven() && JRubyAdapter.isRubyOneNine()) {
|
69
|
+
JRubyAdapter.put(rubyClassName, JRubyAdapter.runRubyMethod(this, "singleton_class"));
|
70
|
+
} else {
|
71
|
+
throw new RuntimeException("Unknown JRuby/Ruby version: " + JRubyAdapter.get("JRUBY_VERSION") + "/" + JRubyAdapter.get("RUBY_VERSION"));
|
72
|
+
}
|
73
|
+
}
|
74
|
+
} else {
|
75
|
+
rubyClass = JRubyAdapter.get(rubyClassName);
|
76
|
+
}
|
77
|
+
if (rubyClass == null) {
|
78
|
+
System.out.println("Loading script: " + scriptName);
|
79
|
+
if (script.matches("(?s).*class " + rubyClassName + ".*")) {
|
80
|
+
System.out.println("Script contains class definition");
|
81
|
+
if (rubyClassName.equals(getClass().getSimpleName())) {
|
82
|
+
System.out.println("Script has separate Java class");
|
83
|
+
JRubyAdapter.put(rubyClassName, JRubyAdapter.runScriptlet("Java::" + getClass().getName()));
|
84
|
+
}
|
85
|
+
// System.out.println("Set class: " + JRubyAdapter.get(rubyClassName));
|
86
|
+
}
|
87
|
+
JRubyAdapter.setScriptFilename(scriptName);
|
88
|
+
JRubyAdapter.runScriptlet(script);
|
89
|
+
rubyClass = JRubyAdapter.get(rubyClassName);
|
90
|
+
}
|
91
|
+
if (rubyClass != null) {
|
92
|
+
System.out.println("Call on_create on: " + this);
|
93
|
+
// FIXME(uwe): Simplify when we stop support for RubotoCore 0.4.7
|
94
|
+
if (JRubyAdapter.isJRubyPreOneSeven()) {
|
95
|
+
JRubyAdapter.put("$ruby_instance", this);
|
96
|
+
JRubyAdapter.runScriptlet("$ruby_instance.on_create");
|
97
|
+
} else if (JRubyAdapter.isJRubyOneSeven()) {
|
98
|
+
JRubyAdapter.runRubyMethod(this, "on_create");
|
99
|
+
} else {
|
100
|
+
throw new RuntimeException("Unknown JRuby version: " + JRubyAdapter.get("JRUBY_VERSION"));
|
101
|
+
}
|
102
|
+
}
|
103
|
+
} else {
|
104
|
+
// FIXME(uwe): Simplify when we stop support for RubotoCore 0.4.7
|
105
|
+
if (JRubyAdapter.isJRubyPreOneSeven()) {
|
106
|
+
JRubyAdapter.runScriptlet("$service.initialize_ruboto");
|
107
|
+
JRubyAdapter.runScriptlet("$service.on_create");
|
108
|
+
} else if (JRubyAdapter.isJRubyOneSeven()) {
|
109
|
+
JRubyAdapter.runRubyMethod(this, "initialize_ruboto");
|
110
|
+
JRubyAdapter.runRubyMethod(this, "on_create", args[0]);
|
111
|
+
} else {
|
112
|
+
throw new RuntimeException("Unknown JRuby version: " + JRubyAdapter.get("JRUBY_VERSION"));
|
113
|
+
}
|
56
114
|
}
|
57
|
-
}
|
58
|
-
|
59
|
-
JRubyAdapter.execute("$service.on_create");
|
115
|
+
} catch(IOException e) {
|
116
|
+
e.printStackTrace();
|
60
117
|
}
|
61
|
-
}
|
62
|
-
|
118
|
+
} else {
|
119
|
+
// FIXME(uwe): What to do if the Ruboto Core platform cannot be found?
|
63
120
|
}
|
64
|
-
} else {
|
65
|
-
// FIXME(uwe): What to do if the Ruboto Core plarform cannot be found?
|
66
121
|
}
|
67
|
-
}
|
68
122
|
|
69
123
|
/****************************************************************************************
|
70
124
|
*
|
@@ -74,5 +128,3 @@ THE_CONSTANTS
|
|
74
128
|
THE_METHODS
|
75
129
|
|
76
130
|
}
|
77
|
-
|
78
|
-
|
@@ -158,11 +158,12 @@ public class EntryPointActivity extends org.ruboto.RubotoActivity {
|
|
158
158
|
|
159
159
|
private void showProgress() {
|
160
160
|
if (loadingDialog == null) {
|
161
|
-
Log.i("Showing progress");
|
162
161
|
if (splash > 0) {
|
162
|
+
Log.i("Showing splash");
|
163
163
|
requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
|
164
164
|
setContentView(splash);
|
165
165
|
} else {
|
166
|
+
Log.i("Showing progress");
|
166
167
|
loadingDialog = ProgressDialog.show(this, null, "Starting...", true, true);
|
167
168
|
loadingDialog.setCanceledOnTouchOutside(false);
|
168
169
|
loadingDialog.setOnCancelListener(new OnCancelListener() {
|
@@ -19,97 +19,73 @@ public class JRubyAdapter {
|
|
19
19
|
private static boolean isDebugBuild = false;
|
20
20
|
private static PrintStream output = null;
|
21
21
|
private static boolean initialized = false;
|
22
|
-
private static String localContextScope = "SINGLETON";
|
22
|
+
private static String localContextScope = "SINGLETON"; // FIXME(uwe): Why not CONCURRENT ? Help needed!
|
23
23
|
private static String localVariableBehavior = "TRANSIENT";
|
24
24
|
private static String RUBOTO_CORE_VERSION_NAME;
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
throw new RuntimeException(nsme);
|
32
|
-
} catch (IllegalAccessException iae) {
|
33
|
-
throw new RuntimeException(iae);
|
34
|
-
} catch (java.lang.reflect.InvocationTargetException ite) {
|
35
|
-
printStackTrace(ite);
|
36
|
-
if (isDebugBuild) {
|
37
|
-
throw new RuntimeException(ite);
|
38
|
-
}
|
39
|
-
}
|
26
|
+
/**
|
27
|
+
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Object receiver, String methodName, Object... args)}
|
28
|
+
*/
|
29
|
+
@Deprecated public static void callMethod(Object receiver, String methodName, Object[] args) {
|
30
|
+
runRubyMethod(receiver, methodName, args);
|
40
31
|
}
|
41
32
|
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
/**
|
34
|
+
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Object receiver, String methodName, Object... args)}
|
35
|
+
*/
|
36
|
+
@Deprecated public static void callMethod(Object object, String methodName, Object arg) {
|
37
|
+
runRubyMethod(object, methodName, arg);
|
38
|
+
}
|
45
39
|
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
/**
|
41
|
+
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Object receiver, String methodName, Object... args)}
|
42
|
+
*/
|
43
|
+
@Deprecated public static void callMethod(Object object, String methodName) {
|
44
|
+
runRubyMethod(object, methodName, new Object[] {});
|
45
|
+
}
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
}
|
73
|
-
throw new RuntimeException(iae);
|
74
|
-
} catch (java.lang.reflect.InvocationTargetException ite) {
|
75
|
-
printStackTrace(ite);
|
76
|
-
}
|
77
|
-
return null;
|
78
|
-
}
|
79
|
-
|
80
|
-
@SuppressWarnings("unchecked")
|
81
|
-
public static <T> T callMethod(Object receiver, String methodName, Class<T> returnType) {
|
82
|
-
try {
|
83
|
-
Method callMethodMethod = ruby.getClass().getMethod("callMethod", Object.class, String.class, Class.class);
|
84
|
-
return (T) callMethodMethod.invoke(ruby, receiver, methodName, returnType);
|
85
|
-
} catch (NoSuchMethodException nsme) {
|
86
|
-
throw new RuntimeException(nsme);
|
87
|
-
} catch (IllegalAccessException iae) {
|
88
|
-
throw new RuntimeException(iae);
|
89
|
-
} catch (java.lang.reflect.InvocationTargetException ite) {
|
90
|
-
printStackTrace(ite);
|
91
|
-
}
|
92
|
-
return null;
|
93
|
-
}
|
47
|
+
/**
|
48
|
+
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args)}
|
49
|
+
*/
|
50
|
+
@SuppressWarnings("unchecked")
|
51
|
+
@Deprecated public static <T> T callMethod(Object receiver, String methodName, Object[] args, Class<T> returnType) {
|
52
|
+
return runRubyMethod(returnType, receiver, methodName, args);
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args)}
|
57
|
+
*/
|
58
|
+
@SuppressWarnings("unchecked")
|
59
|
+
@Deprecated public static <T> T callMethod(Object receiver, String methodName, Object arg, Class<T> returnType) {
|
60
|
+
return runRubyMethod(returnType, receiver, methodName, arg);
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* @deprecated As of Ruboto 0.7.1, replaced by {@link #runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args)}
|
65
|
+
*/
|
66
|
+
@SuppressWarnings("unchecked")
|
67
|
+
@Deprecated public static <T> T callMethod(Object receiver, String methodName, Class<T> returnType) {
|
68
|
+
return runRubyMethod(returnType, receiver, methodName);
|
69
|
+
}
|
94
70
|
|
95
71
|
/**
|
96
72
|
* @deprecated As of Ruboto 0.7.0, replaced by {@link #put(String name, Object object)}
|
97
73
|
*/
|
98
74
|
@Deprecated public static void defineGlobalConstant(String name, Object object) {
|
99
|
-
|
75
|
+
put(name, object);
|
100
76
|
}
|
101
77
|
|
102
78
|
/**
|
103
79
|
* @deprecated As of Ruboto 0.7.0, replaced by {@link #put(String name, Object object)}
|
104
80
|
*/
|
105
81
|
@Deprecated public static void defineGlobalVariable(String name, Object object) {
|
106
|
-
|
82
|
+
put(name, object);
|
107
83
|
}
|
108
84
|
|
109
85
|
/**
|
110
86
|
* @deprecated As of Ruboto 0.7.0, replaced by {@link #runScriptlet(String code)}
|
111
87
|
*/
|
112
|
-
|
88
|
+
@Deprecated public static Object exec(String code) {
|
113
89
|
try {
|
114
90
|
Method runScriptletMethod = ruby.getClass().getMethod("runScriptlet", String.class);
|
115
91
|
return runScriptletMethod.invoke(ruby, code);
|
@@ -124,16 +100,13 @@ public class JRubyAdapter {
|
|
124
100
|
return null;
|
125
101
|
}
|
126
102
|
}
|
127
|
-
|
103
|
+
}
|
128
104
|
|
129
105
|
/**
|
130
106
|
* @deprecated As of Ruboto 0.7.0, replaced by {@link #runScriptlet(String code)}
|
131
107
|
*/
|
132
108
|
@Deprecated public static String execute(String code) {
|
133
|
-
|
134
|
-
return result != null ? result.toString() : "nil";
|
135
|
-
// TODO: Why is callMethod returning "main"?
|
136
|
-
// return result != null ? callMethod(result, "inspect", String.class) : "null";
|
109
|
+
return runRubyMethod(String.class, exec(code), "inspect");
|
137
110
|
}
|
138
111
|
|
139
112
|
public static Object get(String name) {
|
@@ -149,21 +122,71 @@ public class JRubyAdapter {
|
|
149
122
|
}
|
150
123
|
}
|
151
124
|
|
152
|
-
|
153
|
-
|
154
|
-
|
125
|
+
public static String getPlatformVersionName() {
|
126
|
+
return RUBOTO_CORE_VERSION_NAME;
|
127
|
+
}
|
155
128
|
|
156
129
|
public static String getScriptFilename() {
|
157
130
|
return callScriptingContainerMethod(String.class, "getScriptFilename");
|
158
131
|
}
|
159
132
|
|
160
|
-
|
161
|
-
|
162
|
-
|
133
|
+
public static Object runRubyMethod(Object receiver, String methodName, Object... args) {
|
134
|
+
try {
|
135
|
+
// FIXME(uwe): Simplify when we stop supporting JRuby < 1.7.0
|
136
|
+
if (isJRubyPreOneSeven()) {
|
137
|
+
if (args.length == 0) {
|
138
|
+
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Class.class);
|
139
|
+
// System.out.println("Calling callMethod(" + receiver + ", " + methodName + ", " + Object.class + ")");
|
140
|
+
return m.invoke(ruby, receiver, methodName, Object.class);
|
141
|
+
} else {
|
142
|
+
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Object[].class, Class.class);
|
143
|
+
// System.out.println("Calling callMethod(" + receiver + ", " + methodName + ", " + args + ", " + Object.class + ")");
|
144
|
+
return m.invoke(ruby, receiver, methodName, args, Object.class);
|
145
|
+
}
|
146
|
+
} else {
|
147
|
+
Method m = ruby.getClass().getMethod("runRubyMethod", Class.class, Object.class, String.class, Object[].class);
|
148
|
+
return m.invoke(ruby, Object.class, receiver, methodName, args);
|
149
|
+
}
|
150
|
+
} catch (NoSuchMethodException nsme) {
|
151
|
+
throw new RuntimeException(nsme);
|
152
|
+
} catch (IllegalAccessException iae) {
|
153
|
+
throw new RuntimeException(iae);
|
154
|
+
} catch (java.lang.reflect.InvocationTargetException ite) {
|
155
|
+
printStackTrace(ite);
|
156
|
+
if (isDebugBuild) {
|
157
|
+
throw new RuntimeException(ite);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
return null;
|
161
|
+
}
|
163
162
|
|
164
|
-
|
165
|
-
|
166
|
-
|
163
|
+
@SuppressWarnings("unchecked")
|
164
|
+
public static <T> T runRubyMethod(Class<T> returnType, Object receiver, String methodName, Object... args) {
|
165
|
+
try {
|
166
|
+
if (isJRubyPreOneSeven()) {
|
167
|
+
Method m = ruby.getClass().getMethod("callMethod", Object.class, String.class, Object[].class, Class.class);
|
168
|
+
return (T) m.invoke(ruby, receiver, methodName, args, returnType);
|
169
|
+
} else {
|
170
|
+
Method m = ruby.getClass().getMethod("runRubyMethod", Class.class, Object.class, String.class, Object[].class);
|
171
|
+
return (T) m.invoke(ruby, returnType, receiver, methodName, args);
|
172
|
+
}
|
173
|
+
} catch (NoSuchMethodException nsme) {
|
174
|
+
throw new RuntimeException(nsme);
|
175
|
+
} catch (IllegalAccessException iae) {
|
176
|
+
throw new RuntimeException(iae);
|
177
|
+
} catch (java.lang.reflect.InvocationTargetException ite) {
|
178
|
+
printStackTrace(ite);
|
179
|
+
}
|
180
|
+
return null;
|
181
|
+
}
|
182
|
+
|
183
|
+
public static boolean isDebugBuild() {
|
184
|
+
return isDebugBuild;
|
185
|
+
}
|
186
|
+
|
187
|
+
public static boolean isInitialized() {
|
188
|
+
return initialized;
|
189
|
+
}
|
167
190
|
|
168
191
|
public static void put(String name, Object object) {
|
169
192
|
try {
|
@@ -178,7 +201,7 @@ public class JRubyAdapter {
|
|
178
201
|
}
|
179
202
|
}
|
180
203
|
|
181
|
-
|
204
|
+
public static Object runScriptlet(String code) {
|
182
205
|
try {
|
183
206
|
Method runScriptletMethod = ruby.getClass().getMethod("runScriptlet", String.class);
|
184
207
|
return runScriptletMethod.invoke(ruby, code);
|
@@ -193,7 +216,7 @@ public class JRubyAdapter {
|
|
193
216
|
return null;
|
194
217
|
}
|
195
218
|
}
|
196
|
-
|
219
|
+
}
|
197
220
|
|
198
221
|
public static synchronized boolean setUpJRuby(Context appContext) {
|
199
222
|
return setUpJRuby(appContext, output == null ? System.out : output);
|
@@ -204,7 +227,7 @@ public class JRubyAdapter {
|
|
204
227
|
if (!initialized) {
|
205
228
|
// BEGIN Ruboto HeapAlloc
|
206
229
|
@SuppressWarnings("unused")
|
207
|
-
|
230
|
+
byte[] arrayForHeapAllocation = new byte[13 * 1024 * 1024];
|
208
231
|
arrayForHeapAllocation = null;
|
209
232
|
// END Ruboto HeapAlloc
|
210
233
|
setDebugBuild(appContext);
|
@@ -236,9 +259,9 @@ public class JRubyAdapter {
|
|
236
259
|
} catch (ClassNotFoundException e1) {
|
237
260
|
String packageName = "org.ruboto.core";
|
238
261
|
try {
|
239
|
-
|
262
|
+
PackageInfo pkgInfo = appContext.getPackageManager().getPackageInfo(packageName, 0);
|
240
263
|
apkName = pkgInfo.applicationInfo.sourceDir;
|
241
|
-
|
264
|
+
RUBOTO_CORE_VERSION_NAME = pkgInfo.versionName;
|
242
265
|
} catch (PackageManager.NameNotFoundException e2) {
|
243
266
|
out.println("JRuby not found in local APK:");
|
244
267
|
e1.printStackTrace(out);
|
@@ -272,16 +295,16 @@ public class JRubyAdapter {
|
|
272
295
|
callScriptingContainerMethod(Void.class, "setCompileMode", Enum.valueOf(compileModeClass, "OFF"));
|
273
296
|
|
274
297
|
// Class traceTypeClass = Class.forName("org.jruby.runtime.backtrace.TraceType", true, classLoader);
|
275
|
-
|
276
|
-
|
298
|
+
// Method traceTypeForMethod = traceTypeClass.getMethod("traceTypeFor", String.class);
|
299
|
+
// Object traceTypeRaw = traceTypeForMethod.invoke(null, "raw");
|
277
300
|
// callScriptingContainerMethod(Void.class, "setTraceType", traceTypeRaw);
|
278
301
|
|
279
302
|
// FIXME(uwe): Write tutorial on profiling.
|
280
303
|
// container.getProvider().getRubyInstanceConfig().setProfilingMode(mode);
|
281
304
|
|
282
305
|
// callScriptingContainerMethod(Void.class, "setClassLoader", classLoader);
|
283
|
-
|
284
|
-
|
306
|
+
Method setClassLoaderMethod = ruby.getClass().getMethod("setClassLoader", ClassLoader.class);
|
307
|
+
setClassLoaderMethod.invoke(ruby, classLoader);
|
285
308
|
|
286
309
|
Thread.currentThread().setContextClassLoader(classLoader);
|
287
310
|
|
@@ -326,9 +349,9 @@ public class JRubyAdapter {
|
|
326
349
|
callScriptingContainerMethod(Void.class, "setScriptFilename", name);
|
327
350
|
}
|
328
351
|
|
329
|
-
|
330
|
-
|
331
|
-
|
352
|
+
public static boolean usesPlatformApk() {
|
353
|
+
return RUBOTO_CORE_VERSION_NAME != null;
|
354
|
+
}
|
332
355
|
|
333
356
|
// Private methods
|
334
357
|
|
@@ -353,8 +376,8 @@ public class JRubyAdapter {
|
|
353
376
|
argClasses[i] = args[i].getClass();
|
354
377
|
}
|
355
378
|
try {
|
356
|
-
|
357
|
-
|
379
|
+
Method method = ruby.getClass().getMethod(methodName, argClasses);
|
380
|
+
T result = (T) method.invoke(ruby, args);
|
358
381
|
return result;
|
359
382
|
} catch (RuntimeException re) {
|
360
383
|
re.printStackTrace();
|
@@ -375,38 +398,58 @@ public class JRubyAdapter {
|
|
375
398
|
ruby = null;
|
376
399
|
}
|
377
400
|
|
378
|
-
|
401
|
+
// FIXME(uwe): Remove when we stop supporting JRuby < 1.7.0
|
402
|
+
@Deprecated public static boolean isJRubyPreOneSeven() {
|
403
|
+
return ((String)get("JRUBY_VERSION")).equals("1.7.0.dev") || ((String)get("JRUBY_VERSION")).startsWith("1.6.");
|
404
|
+
}
|
405
|
+
|
406
|
+
// FIXME(uwe): Remove when we stop supporting JRuby < 1.7.0
|
407
|
+
@Deprecated public static boolean isJRubyOneSeven() {
|
408
|
+
return !isJRubyPreOneSeven() && ((String)get("JRUBY_VERSION")).startsWith("1.7.");
|
409
|
+
}
|
410
|
+
|
411
|
+
// FIXME(uwe): Remove when we stop supporting Ruby 1.8
|
412
|
+
@Deprecated public static boolean isRubyOneEight() {
|
413
|
+
return ((String)get("RUBY_VERSION")).startsWith("1.8.");
|
414
|
+
}
|
415
|
+
|
416
|
+
// FIXME(uwe): Remove when we stop supporting Ruby 1.8
|
417
|
+
@Deprecated public static boolean isRubyOneNine() {
|
418
|
+
return ((String)get("RUBY_VERSION")).startsWith("1.9.");
|
419
|
+
}
|
420
|
+
|
421
|
+
static void printStackTrace(Throwable t) {
|
379
422
|
// TODO(uwe): Simplify this when Issue #144 is resolved
|
380
423
|
try {
|
381
424
|
t.printStackTrace(output);
|
382
|
-
|
383
|
-
|
425
|
+
} catch (NullPointerException npe) {
|
426
|
+
// TODO(uwe): printStackTrace should not fail
|
384
427
|
for (java.lang.StackTraceElement ste : t.getStackTrace()) {
|
385
428
|
output.append(ste.toString() + "\n");
|
386
429
|
}
|
387
|
-
|
388
|
-
|
430
|
+
}
|
431
|
+
}
|
389
432
|
|
390
433
|
private static String scriptsDirName(Context context) {
|
391
434
|
File storageDir = null;
|
392
|
-
if (
|
435
|
+
if (isDebugBuild()) {
|
393
436
|
|
394
437
|
// FIXME(uwe): Simplify this as soon as we drop support for android-7
|
395
438
|
if (android.os.Build.VERSION.SDK_INT >= 8) {
|
396
439
|
try {
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
440
|
+
Method method = context.getClass().getMethod("getExternalFilesDir", String.class);
|
441
|
+
storageDir = (File) method.invoke(context, (Object) null);
|
442
|
+
} catch (SecurityException e) {
|
443
|
+
printStackTrace(e);
|
444
|
+
} catch (NoSuchMethodException e) {
|
445
|
+
printStackTrace(e);
|
446
|
+
} catch (IllegalArgumentException e) {
|
447
|
+
printStackTrace(e);
|
448
|
+
} catch (IllegalAccessException e) {
|
449
|
+
printStackTrace(e);
|
450
|
+
} catch (InvocationTargetException e) {
|
451
|
+
printStackTrace(e);
|
452
|
+
}
|
410
453
|
} else {
|
411
454
|
storageDir = new File(Environment.getExternalStorageDirectory(), "Android/data/" + context.getPackageName() + "/files");
|
412
455
|
Log.e("Calculated path to sdcard the old way: " + storageDir);
|