From 0525c4c0095215725bfe7660a86f9d95817c1619 Mon Sep 17 00:00:00 2001 From: olabini Date: Mon, 18 Aug 2008 11:04:58 +0000 Subject: [PATCH] Even more JavaField features fixed. git-svn-id: http://svn.codehaus.org/jruby/trunk/jruby@7492 961051c9-f516-0410-bf72-c9f7e237a7b7 --- spec/java_integration/reflection/field_spec.rb | 113 ++++++++++++++++--------- src/org/jruby/javasupport/JavaField.java | 22 ++--- 2 files changed, 84 insertions(+), 51 deletions(-) diff --git a/spec/java_integration/reflection/field_spec.rb b/spec/java_integration/reflection/field_spec.rb index 175b09d25..4a06efe28 100644 --- a/spec/java_integration/reflection/field_spec.rb +++ b/spec/java_integration/reflection/field_spec.rb @@ -32,10 +32,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error - lambda { @field.set_value @obj.java_object, nil }.should_not raise_error - end + lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error + lambda { @field.set_value @obj.java_object, nil }.should_not raise_error end it "should set Java values" do @@ -43,7 +41,13 @@ describe "A JavaField" do lambda { @field.set_value @obj.java_object, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj.java_object, "42" + @field.value(@obj.java_object).should == "42" + + @field.set_value @obj.java_object, nil + @field.value(@obj.java_object).should be_nil + end end describe "with a protected field" do @@ -54,10 +58,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error - lambda { @field.set_value @obj.java_object, nil }.should_not raise_error - end + lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error + lambda { @field.set_value @obj.java_object, nil }.should_not raise_error end it "should set Java values" do @@ -65,7 +67,13 @@ describe "A JavaField" do lambda { @field.set_value @obj.java_object, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj.java_object, "42" + @field.value(@obj.java_object).should == "42" + + @field.set_value @obj.java_object, nil + @field.value(@obj.java_object).should be_nil + end end describe "with a public field" do @@ -75,10 +83,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error - lambda { @field.set_value @obj.java_object, nil }.should_not raise_error - end + lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error + lambda { @field.set_value @obj.java_object, nil }.should_not raise_error end it "should set Java values" do @@ -86,7 +92,14 @@ describe "A JavaField" do lambda { @field.set_value @obj.java_object, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + + it "should get Ruby values" do + @field.set_value @obj.java_object, "42" + @field.value(@obj.java_object).should == "42" + + @field.set_value @obj.java_object, nil + @field.value(@obj.java_object).should be_nil + end end describe "with a package field" do @@ -97,10 +110,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error - lambda { @field.set_value @obj.java_object, nil }.should_not raise_error - end + lambda { @field.set_value @obj.java_object, "42" }.should_not raise_error + lambda { @field.set_value @obj.java_object, nil }.should_not raise_error end it "should set Java values" do @@ -108,7 +119,13 @@ describe "A JavaField" do lambda { @field.set_value @obj.java_object, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj.java_object, "42" + @field.value(@obj.java_object).should == "42" + + @field.set_value @obj.java_object, nil + @field.value(@obj.java_object).should be_nil + end end end @@ -121,10 +138,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj, "42" }.should_not raise_error - lambda { @field.set_value @obj, nil }.should_not raise_error - end + lambda { @field.set_value @obj, "42" }.should_not raise_error + lambda { @field.set_value @obj, nil }.should_not raise_error end it "should set Java values" do @@ -132,7 +147,13 @@ describe "A JavaField" do lambda { @field.set_value @obj, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj, "42" + @field.value(@obj).should == "42" + + @field.set_value @obj, nil + @field.value(@obj).should be_nil + end end describe "with a protected field" do @@ -143,10 +164,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj, "42" }.should_not raise_error - lambda { @field.set_value @obj, nil }.should_not raise_error - end + lambda { @field.set_value @obj, "42" }.should_not raise_error + lambda { @field.set_value @obj, nil }.should_not raise_error end it "should set Java values" do @@ -154,7 +173,13 @@ describe "A JavaField" do lambda { @field.set_value @obj, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj, "42" + @field.value(@obj).should == "42" + + @field.set_value @obj, nil + @field.value(@obj).should be_nil + end end describe "with a public field" do @@ -164,10 +189,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj, "42" }.should_not raise_error - lambda { @field.set_value @obj, nil }.should_not raise_error - end + lambda { @field.set_value @obj, "42" }.should_not raise_error + lambda { @field.set_value @obj, nil }.should_not raise_error end it "should set Java values" do @@ -175,7 +198,13 @@ describe "A JavaField" do lambda { @field.set_value @obj, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj, "42" + @field.value(@obj).should == "42" + + @field.set_value @obj, nil + @field.value(@obj).should be_nil + end end describe "with a package field" do @@ -186,10 +215,8 @@ describe "A JavaField" do end it "should set Ruby values" do - pending "JavaField does not automatically coerce" do - lambda { @field.set_value @obj, "42" }.should_not raise_error - lambda { @field.set_value @obj, nil }.should_not raise_error - end + lambda { @field.set_value @obj, "42" }.should_not raise_error + lambda { @field.set_value @obj, nil }.should_not raise_error end it "should set Java values" do @@ -197,7 +224,13 @@ describe "A JavaField" do lambda { @field.set_value @obj, Java.ruby_to_java(nil) }.should_not raise_error end - it "should get Ruby values" + it "should get Ruby values" do + @field.set_value @obj, "42" + @field.value(@obj).should == "42" + + @field.set_value @obj, nil + @field.value(@obj).should be_nil + end end end end diff --git a/src/org/jruby/javasupport/JavaField.java b/src/org/jruby/javasupport/JavaField.java index ef9594a77..372bfb65b 100644 --- a/src/org/jruby/javasupport/JavaField.java +++ b/src/org/jruby/javasupport/JavaField.java @@ -117,26 +117,26 @@ public class JavaField extends JavaAccessibleObject { } @JRubyMethod - public JavaObject value(IRubyObject object) { - if (! (object instanceof JavaObject)) { - throw getRuntime().newTypeError("not a java object"); - } - Object javaObject = ((JavaObject) object).getValue(); + public IRubyObject value(IRubyObject object) { + JavaObject obj = JavaUtil.unwrapJavaObject(getRuntime(), object, "not a java object"); + Object javaObject = obj.getValue(); try { - return JavaObject.wrap(getRuntime(), field.get(javaObject)); + return JavaUtil.convertJavaToRuby(getRuntime(), field.get(javaObject), field.getType()); } catch (IllegalAccessException iae) { throw getRuntime().newTypeError("illegal access"); } } @JRubyMethod - public JavaObject set_value(IRubyObject object, IRubyObject value) { + public IRubyObject set_value(IRubyObject object, IRubyObject value) { JavaObject obj = JavaUtil.unwrapJavaObject(getRuntime(), object, "not a java object: " + object); - JavaObject val = JavaUtil.unwrapJavaObject(getRuntime(), value, "not a java object: " + value); + IRubyObject val = value; + if(val.dataGetStruct() instanceof JavaObject) { + val = (IRubyObject)val.dataGetStruct(); + } Object javaObject = obj.getValue(); try { - Object convertedValue = JavaUtil.convertArgument(val.getRuntime(), val.getValue(), - field.getType()); + Object convertedValue = JavaUtil.convertArgumentToType(val.getRuntime().getCurrentContext(), val, field.getType()); field.set(javaObject, convertedValue); } catch (IllegalAccessException iae) { @@ -145,7 +145,7 @@ public class JavaField extends JavaAccessibleObject { } catch (IllegalArgumentException iae) { throw getRuntime().newTypeError( "wrong type for " + field.getType().getName() + ": " + - ((JavaObject) value).getValue().getClass().getName()); + val.getClass().getName()); } return val; } -- 2.11.4.GIT