| 1 35 package org.codehaus.groovy.runtime; 36 37 import groovy.lang.*; 38 import groovy.util.CharsetToolkit; 39 import groovy.util.ClosureComparator; 40 import groovy.util.OrderBy; 41 42 import java.io.*; 43 import java.lang.reflect.Array ; 44 import java.lang.reflect.Field ; 45 import java.lang.reflect.Modifier ; 46 import java.net.MalformedURLException ; 47 import java.net.ServerSocket ; 48 import java.net.Socket ; 49 import java.net.URL ; 50 import java.security.AccessController ; 51 import java.security.PrivilegedAction ; 52 import java.util.*; 53 import java.util.logging.Logger ; 54 import java.util.regex.Matcher ; 55 import java.util.regex.Pattern ; 56 57 70 public class DefaultGroovyMethods { 71 72 private static Logger log = Logger.getLogger(DefaultGroovyMethods.class.getName()); 73 74 private static final Integer ONE = new Integer (1); 75 private static final char ZERO_CHAR = '\u0000'; 76 77 86 public static Object getAt(Object self, String property) { 87 return InvokerHelper.getProperty(self, property); 88 } 89 90 98 public static void putAt(Object self, String property, Object newValue) { 99 InvokerHelper.setProperty(self, property, newValue); 100 } 101 102 106 public static String dump(Object self) { 107 if (self == null) { 108 return "null"; 109 } 110 StringBuffer buffer = new StringBuffer ("<"); 111 Class klass = self.getClass(); 112 buffer.append(klass.getName()); 113 buffer.append("@"); 114 buffer.append(Integer.toHexString(self.hashCode())); 115 boolean groovyObject = self instanceof GroovyObject; 116 117 121 while (klass != null) { 122 Field [] fields = klass.getDeclaredFields(); 123 for (int i = 0; i < fields.length; i++) { 124 final Field field = fields[i]; 125 if ((field.getModifiers() & Modifier.STATIC) == 0) { 126 if (groovyObject && field.getName().equals("metaClass")) { 127 continue; 128 } 129 AccessController.doPrivileged(new PrivilegedAction () { 130 public Object run() { 131 field.setAccessible(true); 132 return null; 133 } 134 }); 135 buffer.append(" "); 136 buffer.append(field.getName()); 137 buffer.append("="); 138 try { 139 buffer.append(InvokerHelper.toString(field.get(self))); 140 } catch (Exception e) { 141 buffer.append(e); 142 } 143 } 144 } 145 146 klass = klass.getSuperclass(); 147 } 148 149 154 174 175 buffer.append(">"); 176 return buffer.toString(); 177 } 178 179 public static void eachPropertyName(Object self, Closure closure) { 180 List props = allProperties(self); 181 for (Iterator itr = props.iterator(); itr.hasNext();) { 182 PropertyValue pv = (PropertyValue) itr.next(); 183 closure.call(pv.getName()); 184 } 185 } 186 187 public static void eachProperty(Object self, Closure closure) { 188 List props = allProperties(self); 189 for (Iterator itr = props.iterator(); itr.hasNext();) { 190 PropertyValue pv = (PropertyValue) itr.next(); 191 closure.call(pv); 192 } 193 } 194 195 public static List allProperties(Object self) { 196 List props = new ArrayList(); 197 MetaClass metaClass = InvokerHelper.getMetaClass(self); 198 199 List mps; 200 201 if (self instanceof groovy.util.Expando) { 202 mps = ((groovy.util.Expando) self).getProperties(); 203 } else { 204 mps = metaClass.getProperties(); 206 } 207 208 for (Iterator itr = mps.iterator(); itr.hasNext();) { 209 MetaProperty mp = (MetaProperty) itr.next(); 210 PropertyValue pv = new PropertyValue(self, mp); 211 props.add(pv); 212 } 213 214 return props; 215 } 216 217 220 public static void use(Object self, Class categoryClass, Closure closure) { 221 GroovyCategorySupport.use(categoryClass, closure); 222 } 223 224 227 public static void use(Object self, List categoryClassList, Closure closure) { 228 GroovyCategorySupport.use(categoryClassList, closure); 229 } 230 231 232 235 public static void print(Object self, Object value) { 236 System.out.print(InvokerHelper.toString(value)); 237 } 238 239 242 public static void println(Object self) { 243 System.out.println(); 244 } 245 246 249 public static void println(Object self, Object value) { 250 System.out.println(InvokerHelper.toString(value)); 251 } 252 253 257 public static String inspect(Object self) { 258 return InvokerHelper.inspect(self); 259 } 260 261 264 public static void print(Object self, PrintWriter out) { 265 if (out == null) { 266 out = new PrintWriter(System.out); 267 } 268 out.print(InvokerHelper.toString(self)); 269 } 270 271 276 public static void println(Object self, PrintWriter out) { 277 if (out == null) { 278 out = new PrintWriter(System.out); 279 } 280 InvokerHelper.invokeMethod(self, "print", out); 281 out.println(); 282 } 283 284 288 public static Object invokeMethod(Object object, String method, Object arguments) { 289 return InvokerHelper.invokeMethod(object, method, arguments); 290 } 291 292 public static boolean isCase(Object caseValue, Object switchValue) { 295 return caseValue.equals(switchValue); 296 } 297 298 public static boolean isCase(String caseValue, Object switchValue) { 299 if (switchValue == null) { 300 return caseValue == null; 301 } 302 return caseValue.equals(switchValue.toString()); 303 } 304 305 public static boolean isCase(Class caseValue, Object switchValue) { 306 return caseValue.isInstance(switchValue); 307 } 308 309 public static boolean isCase(Collection caseValue, Object switchValue) { 310 return caseValue.contains(switchValue); 311 } 312 313 public static boolean isCase(Pattern caseValue, Object switchValue) { 314 Matcher matcher = caseValue.matcher(switchValue.toString()); 315 if (matcher.matches()) { 316 RegexSupport.setLastMatcher(matcher); 317 return true; 318 } else { 319 return false; 320 } 321 } 322 323 326 332 public static void each(Object self, Closure closure) { 333 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 334 closure.call(iter.next()); 335 } 336 } 337 338 344 public static void eachWithIndex(Object self, Closure closure) { 345 int counter = 0; 346 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 347 closure.call(new Object []{iter.next(), new Integer (counter++)}); 348 } 349 } 350 351 357 public static void each(Collection self, Closure closure) { 358 for (Iterator iter = self.iterator(); iter.hasNext();) { 359 closure.call(iter.next()); 360 } 361 } 362 363 372 public static void each(Map self, Closure closure) { 373 if (closure.getParameterTypes().length == 2) { 374 for (Iterator iter = self.entrySet().iterator(); iter.hasNext();) { 375 Map.Entry entry = (Map.Entry) iter.next(); 376 closure.call(new Object []{entry.getKey(), entry.getValue()}); 377 } 378 } else { 379 for (Iterator iter = self.entrySet().iterator(); iter.hasNext();) { 380 closure.call(iter.next()); 381 } 382 } 383 } 384 385 393 public static boolean every(Object self, Closure closure) { 394 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 395 if (!InvokerHelper.asBool(closure.call(iter.next()))) { 396 return false; 397 } 398 } 399 return true; 400 } 401 402 409 public static boolean any(Object self, Closure closure) { 410 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 411 if (InvokerHelper.asBool(closure.call(iter.next()))) { 412 return true; 413 } 414 } 415 return false; 416 } 417 418 427 public static List grep(Object self, Object filter) { 428 List answer = new ArrayList(); 429 MetaClass metaClass = InvokerHelper.getMetaClass(filter); 430 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 431 Object object = iter.next(); 432 if (InvokerHelper.asBool(metaClass.invokeMethod(filter, "isCase", object))) { 433 answer.add(object); 434 } 435 } 436 return answer; 437 } 438 439 446 public static int count(Collection self, Object value) { 447 int answer = 0; 448 for (Iterator iter = self.iterator(); iter.hasNext();) { 449 if (InvokerHelper.compareEqual(iter.next(), value)) { 450 ++answer; 451 } 452 } 453 return answer; 454 } 455 456 462 public static List toList(Collection self) { 463 List answer = new ArrayList(self.size()); 464 answer.addAll(self); 465 return answer; 466 } 467 468 476 public static List collect(Object self, Closure closure) { 477 return (List) collect(self, new ArrayList(), closure); 478 } 479 480 489 public static Collection collect(Object self, Collection collection, Closure closure) { 490 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 491 collection.add(closure.call(iter.next())); 492 } 493 return collection; 494 } 495 496 504 public static List collect(Collection self, Closure closure) { 505 return (List) collect(self, new ArrayList(self.size()), closure); 506 } 507 508 517 public static Collection collect(Collection self, Collection collection, Closure closure) { 518 for (Iterator iter = self.iterator(); iter.hasNext();) { 519 collection.add(closure.call(iter.next())); 520 if (closure.getDirective() == Closure.DONE) { 521 break; 522 } 523 } 524 return collection; 525 } 526 527 535 public static Collection collect(Map self, Collection collection, Closure closure) { 536 for (Iterator iter = self.entrySet().iterator(); iter.hasNext();) { 537 collection.add(closure.call(iter.next())); 538 } 539 return collection; 540 } 541 542 551 public static List collect(Map self, Closure closure) { 552 return (List) collect(self, new ArrayList(self.size()), closure); 553 } 554 555 562 public static Object find(Object self, Closure closure) { 563 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 564 Object value = iter.next(); 565 if (InvokerHelper.asBool(closure.call(value))) { 566 return value; 567 } 568 } 569 return null; 570 } 571 572 579 public static Object find(Collection self, Closure closure) { 580 for (Iterator iter = self.iterator(); iter.hasNext();) { 581 Object value = iter.next(); 582 if (InvokerHelper.asBool(closure.call(value))) { 583 return value; 584 } 585 } 586 return null; 587 } 588 589 596 public static Object find(Map self, Closure closure) { 597 for (Iterator iter = self.entrySet().iterator(); iter.hasNext();) { 598 Object value = iter.next(); 599 if (InvokerHelper.asBool(closure.call(value))) { 600 return value; 601 } 602 } 603 return null; 604 } 605 606 613 public static List findAll(Object self, Closure closure) { 614 List answer = new ArrayList(); 615 for (Iterator iter = InvokerHelper.asIterator(self); iter.hasNext();) { 616 Object value = iter.next(); 617 if (InvokerHelper.asBool(closure.call(value))) { 618 answer.add(value); 619 } 620 } 621 return answer; 622 } 623 624 631 public static List findAll(Collection self, Closure closure) { 632 List answer = new ArrayList(self.size()); 633 for (Iterator iter = self.iterator(); iter.hasNext();) { 634 Object value = iter.next(); 635 if (InvokerHelper.asBool(closure.call(value))) { 636 answer.add(value); 637 } 638 } 639 return answer; 640 } 641 642 649 public static List findAll(Map self, Closure closure) { 650 List answer = new ArrayList(self.size()); 651 for (Iterator iter = self.entrySet().iterator(); iter.hasNext();) { 652 Object value = iter.next(); 653 if (InvokerHelper.asBool(closure.call(value))) { 654 answer.add(value); 655 } 656 } 657 return answer; 658 } 659 660 670 public static Object inject(Collection self, Object value, Closure closure) { 671 Object [] params = new Object [2]; 672 for (Iterator iter = self.iterator(); iter.hasNext();) { 673 Object item = iter.next(); 674 params[0] = value; 675 params[1] = item; 676 value = closure.call(params); 677 } 678 return value; 679 } 680 681 688 public static String join(Collection self, String separator) { 689 StringBuffer buffer = new StringBuffer (); 690 boolean first = true; 691 for (Iterator iter = self.iterator(); iter.hasNext();) { 692 Object value = iter.next(); 693 if (first) { 694 first = false; 695 } else { 696 buffer.append(separator); 697 } 698 buffer.append(InvokerHelper.toString(value)); 699 } 700 return buffer.toString(); 701 } 702 703 710 public static String join(Object [] self, String separator) { 711 StringBuffer buffer = new StringBuffer (); 712 boolean first = true; 713 for (int i = 0; i < self.length; i++) { 714 String value = InvokerHelper.toString(self[i]); 715 if (first) { 716 first = false; 717 } else { 718 buffer.append(separator); 719 } 720 buffer.append(value); 721 } 722 return buffer.toString(); 723 } 724 725 731 public static Object max(Collection self) { 732 Object answer = null; 733 for (Iterator iter = self.iterator(); iter.hasNext();) { 734 Object value = iter.next(); 735 if (value != null) { 736 if (answer == null || InvokerHelper.compareGreaterThan(value, answer)) { 737 answer = value; 738 } 739 } 740 } 741 return answer; 742 } 743 744 751 public static Object max(Collection self, Comparator comparator) { 752 Object answer = null; 753 for (Iterator iter = self.iterator(); iter.hasNext();) { 754 Object value = iter.next(); 755 if (answer == null || comparator.compare(value, answer) > 0) { 756 answer = value; 757 } 758 } 759 return answer; 760 } 761 762 768 public static Object min(Collection self) { 769 Object answer = null; 770 for (Iterator iter = self.iterator(); iter.hasNext();) { 771 Object value = iter.next(); 772 if (value != null) { 773 if (answer == null || InvokerHelper.compareLessThan(value, answer)) { 774 answer = value; 775 } 776 } 777 } 778 return answer; 779 } 780 781 788 public static Object min(Collection self, Comparator comparator) { 789 Object answer = null; 790 for (Iterator iter = self.iterator(); iter.hasNext();) { 791 Object value = iter.next(); 792 if (answer == null || comparator.compare(value, answer) < 0) { 793 answer = value; 794 795 } 796 } 797 return answer; 798 } 799 800 807 public static Object min(Collection self, Closure closure) { 808 return min(self, new ClosureComparator(closure)); 809 } 810 811 818 public static Object max(Collection self, Closure closure) { 819 return max(self, new ClosureComparator(closure)); 820 } 821 822 828 public static int size(String text) { 829 return text.length(); 830 } 831 832 838 public static int size(Object [] self) { 839 return self.length; 840 } 841 842 849 public static CharSequence getAt(CharSequence text, int index) { 850 index = normaliseIndex(index, text.length()); 851 return text.subSequence(index, index + 1); 852 } 853 854 860 public static String getAt(String text, int index) { 861 index = normaliseIndex(index, text.length()); 862 return text.substring(index, index + 1); 863 } 864 865 872 public static Char
|