Guest User

Untitled

a guest
Jan 23rd, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.51 KB | None | 0 0
  1. diff --git a/src/org/jruby/java/proxies/MapJavaProxy.java b/src/org/jruby/java/proxies/MapJavaProxy.java
  2. index 17b69d4..2295ee0 100644
  3. --- a/src/org/jruby/java/proxies/MapJavaProxy.java
  4. +++ b/src/org/jruby/java/proxies/MapJavaProxy.java
  5. @@ -30,9 +30,15 @@ package org.jruby.java.proxies;
  6.  
  7. import java.lang.reflect.InvocationTargetException;
  8. import java.lang.reflect.Method;
  9. +import java.lang.reflect.Modifier;
  10. +import java.util.HashMap;
  11. +import java.util.Hashtable;
  12. import java.util.Map;
  13. import java.util.Map.Entry;
  14. import java.util.Set;
  15. +import java.util.TreeMap;
  16. +import java.util.logging.Level;
  17. +import java.util.logging.Logger;
  18. import org.jruby.CompatVersion;
  19. import org.jruby.Ruby;
  20. import org.jruby.RubyArray;
  21. @@ -104,81 +110,72 @@ public class MapJavaProxy extends ConcreteJavaProxy {
  22. private void setSize(int size) {
  23. this.size = size;
  24. }
  25. +
  26. + private Map getMap() {
  27. + return (Map) ((JavaProxy)receiver).getObject();
  28. + }
  29.  
  30. @Override
  31. public void internalPut(final IRubyObject key, final IRubyObject value, final boolean checkForExisting) {
  32. - if (checkForExisting) {
  33. - Set<Map.Entry> entries = ((Map) ((JavaProxy)receiver).getObject()).entrySet();
  34. - for (Map.Entry entry : entries) {
  35. - IRubyObject rubyfiedKey = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getKey());
  36. - if (key.eql(rubyfiedKey)) {
  37. - entry.setValue(value.toJava(Object.class));
  38. - return;
  39. - }
  40. - }
  41. - }
  42. - ((Map) ((JavaProxy)receiver).getObject()).put(key.toJava(Object.class), value.toJava(Object.class));
  43. - size = ((Map) ((JavaProxy)receiver).getObject()).size();
  44. + Map map = getMap();
  45. + map.put(key.toJava(Object.class), value.toJava(Object.class));
  46. + size = map.size();
  47. }
  48.  
  49. @Override
  50. public IRubyObject internalGet(IRubyObject key) {
  51. - Set<Map.Entry> entries = ((Map) ((JavaProxy)receiver).getObject()).entrySet();
  52. - for (Map.Entry entry : entries) {
  53. - IRubyObject rubyfiedKey = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getKey());
  54. - if (key.eql(rubyfiedKey)) {
  55. - return JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getValue());
  56. - }
  57. - }
  58. - return null;
  59. + Object result = getMap().get(key.toJava(Object.class));
  60. + if (result == null) return null;
  61. + return JavaUtil.convertJavaToUsableRubyObject(getRuntime(), result);
  62. }
  63.  
  64. @Override
  65. public RubyHashEntry internalGetEntry(IRubyObject key) {
  66. - Set<Map.Entry> entries = ((Map) ((JavaProxy)receiver).getObject()).entrySet();
  67. - for (Map.Entry entry : entries) {
  68. - IRubyObject rubyfiedKey = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getKey());
  69. - if (key.eql(rubyfiedKey)) {
  70. - IRubyObject value = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getValue());
  71. - return new RubyHashEntry(entry.hashCode(), key, value, null, null);
  72. - }
  73. + Map map = getMap();
  74. + Object convertedKey = key.toJava(Object.class);
  75. + Object value = map.get(convertedKey);
  76. +
  77. + if (value != null) {
  78. + RubyHashEntry rubyEntry = new RubyHashEntry(key.hashCode(), key, JavaUtil.convertJavaToUsableRubyObject(getRuntime(), value), null, null);
  79. + return rubyEntry;
  80. }
  81. +
  82. return NO_ENTRY;
  83. }
  84.  
  85. @Override
  86. public RubyHashEntry internalDelete(final IRubyObject key) {
  87. - Set<Map.Entry> entries = ((Map) ((JavaProxy)receiver).getObject()).entrySet();
  88. - for (Map.Entry entry : entries) {
  89. - IRubyObject rubyfiedKey = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getKey());
  90. - if (key.eql(rubyfiedKey)) {
  91. - IRubyObject value = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getValue());
  92. - RubyHashEntry rubyEntry = new RubyHashEntry(entry.hashCode(), key, value, null, null);
  93. - ((Map) ((JavaProxy)receiver).getObject()).remove(entry.getKey());
  94. - size = ((Map) ((JavaProxy)receiver).getObject()).size();
  95. - return rubyEntry;
  96. - }
  97. + Map map = getMap();
  98. + Object convertedKey = key.toJava(Object.class);
  99. + Object value = map.get(convertedKey);
  100. +
  101. + if (value != null) {
  102. + RubyHashEntry rubyEntry = new RubyHashEntry(key.hashCode(), key, JavaUtil.convertJavaToUsableRubyObject(getRuntime(), value), null, null);
  103. + map.remove(convertedKey);
  104. + size = map.size();
  105. + return rubyEntry;
  106. }
  107. +
  108. return NO_ENTRY;
  109. }
  110.  
  111. @Override
  112. public RubyHashEntry internalDeleteEntry(final RubyHashEntry entry) {
  113. - Set<Map.Entry> entries = ((Map) ((JavaProxy)receiver).getObject()).entrySet();
  114. - for (Map.Entry mapEntry : entries) {
  115. - IRubyObject rubyfiedKey = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), mapEntry.getKey());
  116. - if (((IRubyObject)entry.getKey()).eql(rubyfiedKey)) {
  117. - ((Map) ((JavaProxy)receiver).getObject()).remove(mapEntry.getKey());
  118. - size = ((Map) ((JavaProxy)receiver).getObject()).size();
  119. - return entry;
  120. - }
  121. + Map map = getMap();
  122. + Object convertedKey = ((IRubyObject)entry.getKey()).toJava(Object.class);
  123. +
  124. + if (map.containsKey(convertedKey)) {
  125. + map.remove(convertedKey);
  126. + size = map.size();
  127. + return entry;
  128. }
  129. +
  130. return NO_ENTRY;
  131. }
  132.  
  133. @Override
  134. public void visitAll(Visitor visitor) {
  135. - Map.Entry[] entries = (Entry[]) ((Map) ((JavaProxy)receiver).getObject()).entrySet().toArray(new Map.Entry[0]);
  136. + Map.Entry[] entries = (Entry[]) getMap().entrySet().toArray(new Map.Entry[0]);
  137. for (Map.Entry entry : entries) {
  138. IRubyObject key = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getKey());
  139. IRubyObject value = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getValue());
  140. @@ -188,48 +185,20 @@ public class MapJavaProxy extends ConcreteJavaProxy {
  141.  
  142. @Override
  143. public void op_asetForString(Ruby runtime, RubyString key, IRubyObject value) {
  144. - Set<Map.Entry> entries = ((Map) ((JavaProxy)receiver).getObject()).entrySet();
  145. - for (Map.Entry entry : entries) {
  146. - IRubyObject rubyfiedKey = JavaUtil.convertJavaToUsableRubyObject(getRuntime(), entry.getKey());
  147. - if (key.eql(rubyfiedKey)) {
  148. - entry.setValue(value.toJava(Object.class));
  149. - return;
  150. - }
  151. - }
  152. - ((Map) ((JavaProxy)receiver).getObject()).put(key.toJava(String.class), value.toJava(Object.class));
  153. - size = ((Map) ((JavaProxy)receiver).getObject()).size();
  154. + getMap().put(key.toJava(String.class), value.toJava(Object.class));
  155. + size = getMap().size();
  156. }
  157.  
  158. @Override
  159. public RubyHash rehash() {
  160. - Map oldMap = ((Map) ((JavaProxy)receiver).getObject());
  161. - Method[] methods = oldMap.getClass().getMethods();
  162. - try {
  163. - for (int i = 0; i < methods.length; i++) {
  164. - if ("clone".equals(methods[i].getName())) {
  165. - Map map = (Map) methods[i].invoke(oldMap);
  166. - dataWrapStruct(map);
  167. - break;
  168. - }
  169. - }
  170. - } catch (IllegalAccessException ex) {
  171. - throw getRuntime().newRuntimeError(ex.getMessage());
  172. - } catch (IllegalArgumentException ex) {
  173. - throw getRuntime().newRuntimeError(ex.getMessage());
  174. - } catch (InvocationTargetException ex) {
  175. - throw getRuntime().newRuntimeError(ex.getMessage());
  176. - }
  177. - return this;
  178. + throw getRuntime().newNotImplementedError("rehash method is not implemented in a Java Map backed object");
  179. }
  180.  
  181. @Override
  182. public RubyHash rb_clear() {
  183. - Map map = ((Map) ((JavaProxy)receiver).getObject());
  184. - if (map != null) {
  185. - map.clear();
  186. - ((JavaProxy)receiver).setObject(map);
  187. - size = 0;
  188. - }
  189. + getMap().clear();
  190. + size = 0;
  191. +
  192. return this;
  193. }
  194.  
  195. diff --git a/test/testMap.rb b/test/testMap.rb
  196. index a7495f9..c8546f0 100644
  197. --- a/test/testMap.rb
  198. +++ b/test/testMap.rb
  199. @@ -115,11 +115,12 @@ h = java.util.HashMap.new
  200. k1 = [1]
  201. h[k1] = 1
  202. k1[0] = 100
  203. -# this fails though should be passed. JavaProxy's op_aref is used?
  204. -#test_equal(nil, h[k1])
  205. -h.rehash
  206. -test_equal(1, h[k1])
  207. -test_equal(Java::JavaUtil::HashMap, h.class)
  208. +test_equal(nil, h[k1])
  209. +# CON: Removed these tests because Map does not support rehash
  210. +#h.rehash
  211. +#test_equal(1, h[k1])
  212. +#test_equal(Java::JavaUtil::HashMap, h.class)
  213. +test_exception(NotImplementedError) {h.rehash}
  214.  
  215. h.put(1, 2); h.put(3, 4);
  216. test_equal(1, h.index(2))
Add Comment
Please, Sign In to add comment