Changeset 840
- Timestamp:
- 09/20/12 14:55:07 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/quest-plugin-jfc/src/main/java/de/ugoe/cs/quest/plugin/jfc/JFCTraceCorrector.java
r834 r840 11 11 import java.io.UnsupportedEncodingException; 12 12 import java.util.ArrayList; 13 import java.util.Collections; 13 14 import java.util.HashMap; 14 15 import java.util.List; … … 262 263 { 263 264 if (qName.equals("sessions")) { 264 currentSession = new Session(); 265 currentSession.type = "sessions"; 265 if (currentSession != null) { 266 throw new SAXException("nested sessions are not allowed"); 267 } 268 269 currentSession = new Session("sessions"); 266 270 } 267 271 else if (qName.equals("newsession")) { … … 270 274 } 271 275 272 currentSession = new Session(); 273 currentSession.type = "newsession"; 276 currentSession = new Session("newsession"); 274 277 } 275 278 else if (qName.equals("event")) { 276 currentEvent = new Event(); 277 currentEvent.id = atts.getValue("id"); 279 if (currentEvent != null) { 280 throw new SAXException("nested events are not allowed"); 281 } 282 283 currentEvent = new Event(atts.getValue("id")); 278 284 } 279 285 else if (qName.equals("source")) { 286 if (currentSource != null) { 287 throw new SAXException("nested sources are not allowed"); 288 } 289 280 290 currentSource = new Source(); 281 291 } 282 292 else if (qName.equals("component")) { 293 if (currentComponent != null) { 294 throw new SAXException("nested components are not allowed"); 295 } 296 283 297 currentComponent = new Component(); 284 298 } 285 299 else if (qName.equals("param")) { 286 300 if (currentComponent != null) { 287 currentComponent.params.add 288 (new String[] {atts.getValue("name"), atts.getValue("value") }); 301 currentComponent.addParameter(atts.getValue("name"), atts.getValue("value")); 289 302 } 290 303 else if (currentSource != null) { 291 currentSource.params.add 292 (new String[] {atts.getValue("name"), atts.getValue("value") }); 304 currentSource.addParameter(atts.getValue("name"), atts.getValue("value")); 293 305 } 294 306 else if (currentEvent != null) { 295 currentEvent.params.add 296 (new String[] {atts.getValue("name"), atts.getValue("value") }); 307 currentEvent.addParameter(atts.getValue("name"), atts.getValue("value")); 297 308 } 298 309 else { … … 313 324 @Override 314 325 public void endElement(String uri, String localName, String qName) throws SAXException { 326 // we do not have to check, if the current objects are null, as the Parser itself will 327 // throw an exception, if there is a closing tag for a non existent opening tag. But 328 // with a correct opening tag, the member variables will not be null (see startElement()) 315 329 if (qName.equals("sessions")) { 316 330 correctSources(currentSession); … … 328 342 } 329 343 else if (qName.equals("event")) { 330 currentSession. events.add(currentEvent);344 currentSession.addEvent(currentEvent); 331 345 currentEvent = null; 332 346 } 333 347 else if (qName.equals("source")) { 334 currentEvent.s ource = getUniqueSource(currentSource);348 currentEvent.setSource(getUniqueSource(currentSource)); 335 349 currentSource = null; 336 350 } 337 351 else if (qName.equals("component")) { 338 currentSource. components.add(currentComponent);352 currentSource.addComponent(currentComponent); 339 353 currentComponent = null; 340 354 } … … 347 361 /** 348 362 * <p> 349 * stores a parsed source for later correction or reuse 363 * returns a source object, that is equal to the provided one but that is unique throughout 364 * the parsing process. The method may return the provided source, if this is the first 365 * occurrence of this source. This method is needed to reduce the amount of source 366 * representations that are instantiated during parsing log files. 350 367 * </p> 351 368 * 352 * @param source the source to store 369 * @param source the source to search for a unique representation 370 * 371 * @return the unique representation of the source 353 372 */ 354 373 private Source getUniqueSource(Source source) { 355 String toStringValue = getToStringParam(source); 356 357 Source existingSource = findSource(toStringValue); 374 Source existingSource = null; 375 376 List<Source> candidates = allSources.get(source.getToStringValue()); 377 378 if (candidates != null) { 379 for (Source candidate : candidates) { 380 if (candidate.equals(source)) { 381 existingSource = candidate; 382 break; 383 } 384 } 385 } 358 386 359 387 if (existingSource == null) { 360 List<Source> sources = allSources.get(toStringValue); 361 362 if (sources == null) { 363 sources = new ArrayList<Source>(); 364 allSources.put(toStringValue, sources); 365 } 366 367 sources.add(source); 388 if (candidates == null) { 389 candidates = new ArrayList<Source>(); 390 allSources.put(source.getToStringValue(), candidates); 391 } 392 393 candidates.add(source); 368 394 existingSource = source; 369 395 } … … 376 402 * convenience method to find a source based on its <code>toString</code> parameter value. 377 403 * The method only returns sources, which match the provided <code>toString</code> 378 * representation and which have a valid list of components .404 * representation and which have a valid list of components (size greater 0). 379 405 * </p> 380 406 * … … 385 411 * none is found 386 412 */ 387 private Source find Source(String toStringValue) {413 private Source findValidSource(String toStringValue) { 388 414 Source existingSource = null; 389 415 … … 392 418 if (candidates != null) { 393 419 for (Source candidate : candidates) { 394 if (toStringValue.equals(getToStringParam(candidate)) && 395 (candidate.components != null) && (candidate.components.size() > 0)) 420 if ((candidate.getComponents() != null) && (candidate.getComponents().size() > 0)) 396 421 { 397 422 existingSource = candidate; … … 414 439 private void correctSources(Session session) { 415 440 Source previousSource = null; 416 for (Event event : session. events) {417 if ((event. source == null) || (event.source.components== null) ||418 (event. source.components.size() == 0))441 for (Event event : session.getEvents()) { 442 if ((event.getSource() == null) || (event.getSource().getComponents() == null) || 443 (event.getSource().getComponents().size() == 0)) 419 444 { 420 445 correctEventSource(event, previousSource); 421 446 } 422 447 423 previousSource = event. source;448 previousSource = event.getSource(); 424 449 } 425 450 } … … 439 464 */ 440 465 private void correctEventSource(Event event, Source previousSource) { 441 String toStringValue = null;442 443 if ((event.source != null) && (event.source.params != null)) {444 toStringValue = getToStringParam(event.source);445 }446 447 466 Source existingSource = null; 448 467 449 if ( toStringValue != null) {450 existingSource = find Source(toStringValue);468 if ((event.getSource() != null) && (event.getSource().getToStringValue() != null)) { 469 existingSource = findValidSource(event.getSource().getToStringValue()); 451 470 } 452 471 453 472 if (existingSource != null) { 454 event.s ource = existingSource;473 event.setSource(existingSource); 455 474 } 456 475 else { 457 476 if (previousSource != null) { 458 for ( String[] parameterOfPreviousSource : previousSource.params) {477 for (Parameter parameterOfPreviousSource : previousSource.getParameters()) { 459 478 boolean foundParameter = false; 460 for ( String[] parameter : event.source.params) {461 if (parameter [0].equals(parameterOfPreviousSource[0])) {479 for (Parameter parameter : event.getSource().getParameters()) { 480 if (parameter.getName().equals(parameterOfPreviousSource.getName())) { 462 481 foundParameter = true; 463 482 break; … … 466 485 467 486 if (!foundParameter) { 468 event. source.params.add(parameterOfPreviousSource);487 event.getSource().addParameter(parameterOfPreviousSource); 469 488 } 470 489 } 471 490 472 for (Component component : previousSource. components) {491 for (Component component : previousSource.getComponents()) { 473 492 if (!(component instanceof ComponentFromToString)) { 474 event. source.components.add(component);493 event.getSource().addComponent(component); 475 494 } 476 495 } 477 496 } 478 497 479 event.source.components.add(getComponentFromToString(toStringValue)); 480 } 481 } 482 483 /** 484 * <p> 485 * retrieves the value of the <code>toString</code> parameter of the provided source. 486 * </p> 487 * 488 * @param source the source to read the parameter of 489 * @return the value of the parameter 490 */ 491 private String getToStringParam(Source source) { 492 String value = null; 493 494 for (String[] param : source.params) { 495 if (("toString".equals(param[0])) && (param[1] != null) && (!"".equals(param[1]))) { 496 value = param[1]; 497 break; 498 } 499 } 500 501 return value; 498 event.getSource().addComponent 499 (getComponentFromToString(event.getSource().getToStringValue())); 500 } 502 501 } 503 502 … … 527 526 int end = toStringValue.indexOf(',', start); 528 527 529 component. x = Integer.parseInt(toStringValue.substring(start, end));528 component.setX(Integer.parseInt(toStringValue.substring(start, end))); 530 529 531 530 start = end + 1; 532 531 end = toStringValue.indexOf(',', start); 533 532 534 component. y = Integer.parseInt(toStringValue.substring(start, end));533 component.setY(Integer.parseInt(toStringValue.substring(start, end))); 535 534 536 535 start = end + 1; 537 536 end = toStringValue.indexOf('x', start); 538 537 539 component. width = Integer.parseInt(toStringValue.substring(start, end));538 component.setWidth(Integer.parseInt(toStringValue.substring(start, end))); 540 539 541 540 start = end + 1; 542 541 end = toStringValue.indexOf(',', start); 543 542 544 component. height = Integer.parseInt(toStringValue.substring(start, end));543 component.setHeight(Integer.parseInt(toStringValue.substring(start, end))); 545 544 546 545 // no start parsing the rest of the parameters and extract those having a key and a … … 619 618 "org.argouml.core.propertypanels.ui.LabelledComponent".equals(clazz)) 620 619 { 621 title += "position " + component. x + "/" + component.y+ ", ";620 title += "position " + component.getX() + "/" + component.getY() + ", "; 622 621 } 623 622 … … 629 628 } 630 629 631 component. params.add(new String[] { "title", title });632 component. params.add(new String[] { "class", clazz });633 component. params.add(new String[] { "icon", icon });634 component. params.add(new String[] { "index", "-1" });630 component.addParameter("title", title); 631 component.addParameter("class", clazz); 632 component.addParameter("icon", ((icon == null) ? "" : icon)); 633 component.addParameter("index", "-1"); 635 634 636 635 int hashCode = clazz.hashCode() + title.hashCode(); … … 640 639 } 641 640 642 component. params.add(new String[] { "hash", Integer.toString(hashCode, 16) });641 component.addParameter("hash", Integer.toString(hashCode, 16)); 643 642 644 643 return component; … … 650 649 * </p> 651 650 */ 652 private void dumpParams(PrintStream out, List< String[]> params, String indent) {653 for ( String[]param : params) {651 private void dumpParams(PrintStream out, List<Parameter> params, String indent) { 652 for (Parameter param : params) { 654 653 out.print(indent); 655 654 out.print("<param name=\""); 656 out.print(StringTools.xmlEntityReplacement(param [0]));655 out.print(StringTools.xmlEntityReplacement(param.getName())); 657 656 out.print("\" value=\""); 658 out.print(StringTools.xmlEntityReplacement(param [1]));657 out.print(StringTools.xmlEntityReplacement(param.getValue())); 659 658 out.println("\" />"); 660 659 } 661 660 662 661 } 662 663 /** 664 * <p> 665 * check if two parameter lists are equal. Thea are equal if the contain the same parameters 666 * ignoring their order. 667 * </p> 668 * 669 * @param params1 the first parameter list to be compared 670 * @param params2 the second parameter list to be compared 671 * 672 * @return true if both lists contain the same parameters, false else. 673 */ 674 private boolean parametersEqual(List<Parameter> params1, List<Parameter> params2) { 675 if (params1 == null) { 676 return params2 == null; 677 } 678 679 if (params2 == null) { 680 return false; 681 } 682 683 if (params1.size() != params2.size()) { 684 return false; 685 } 686 687 boolean found; 688 for (Parameter param1 : params1) { 689 found = false; 690 691 for (Parameter param2 : params2) { 692 if (param1.equals(param2)) { 693 found = true; 694 break; 695 } 696 } 697 698 if (!found) { 699 return false; 700 } 701 } 702 703 return true; 704 } 705 663 706 664 707 /** … … 668 711 */ 669 712 private class Session { 713 714 /** */ 670 715 private String type; 716 717 /** */ 671 718 private List<Event> events = new ArrayList<Event>(); 672 719 673 public void dump(PrintStream out) { 720 /** 721 * 722 */ 723 private Session(String type) { 724 if (type == null) { 725 throw new IllegalArgumentException("type must not be null"); 726 } 727 728 this.type = type; 729 } 730 731 /** 732 * 733 */ 734 private void addEvent(Event event) { 735 if (event == null) { 736 throw new IllegalArgumentException("event must not be null"); 737 } 738 739 events.add(event); 740 } 741 742 /** 743 * @return the events 744 */ 745 private List<Event> getEvents() { 746 return Collections.unmodifiableList(events); 747 } 748 749 /** 750 * 751 */ 752 private void dump(PrintStream out) { 753 if (out == null) { 754 throw new IllegalArgumentException("out must not be null"); 755 } 756 674 757 out.print("<"); 675 758 out.print(type); … … 692 775 */ 693 776 private class Event { 777 778 /** */ 694 779 private String id; 695 private List<String[]> params = new ArrayList<String[]>(); 780 781 /** */ 782 private List<Parameter> params = new ArrayList<Parameter>(); 783 784 /** */ 696 785 private Source source; 697 786 787 /** 788 * 789 */ 790 private Event(String id) { 791 if (id == null) { 792 throw new IllegalArgumentException("id must not be null"); 793 } 794 795 this.id = id; 796 } 797 798 /** 799 * @param source the source to set 800 */ 801 private void setSource(Source source) { 802 this.source = source; 803 } 804 805 /** 806 * @return the source 807 */ 808 private Source getSource() { 809 return source; 810 } 811 812 /** 813 * 814 */ 815 private void addParameter(String name, String value) { 816 if (name == null) { 817 throw new IllegalArgumentException("name must not be null"); 818 } 819 820 if (value == null) { 821 throw new IllegalArgumentException("value must not be null"); 822 } 823 824 params.add(new Parameter(name, value)); 825 } 826 827 /** 828 * 829 */ 698 830 private void dump(PrintStream out) { 831 if (out == null) { 832 throw new IllegalArgumentException("out must not be null"); 833 } 834 699 835 out.print("<event id=\""); 700 836 out.print(StringTools.xmlEntityReplacement(id)); … … 714 850 */ 715 851 private class Source { 716 private List<String[]> params = new ArrayList<String[]>(); 852 853 /** */ 854 private List<Parameter> params = new ArrayList<Parameter>(); 855 856 /** */ 717 857 private List<Component> components = new ArrayList<Component>(); 718 858 859 /** */ 860 private String toStringValue = null; 861 862 /** 863 * 864 */ 865 private String getToStringValue() { 866 if (toStringValue == null) { 867 for (Parameter param : params) { 868 if (("toString".equals(param.getName())) && 869 (param.getValue() != null) && (!"".equals(param.getValue()))) 870 { 871 toStringValue = param.getValue(); 872 break; 873 } 874 } 875 } 876 877 return toStringValue; 878 } 879 880 /** 881 * 882 */ 883 private void addParameter(String name, String value) { 884 if (name == null) { 885 throw new IllegalArgumentException("name must not be null"); 886 } 887 888 if (value == null) { 889 throw new IllegalArgumentException("value must not be null"); 890 } 891 892 params.add(new Parameter(name, value)); 893 } 894 895 /** 896 * 897 */ 898 private void addParameter(Parameter parameter) { 899 if (parameter == null) { 900 throw new IllegalArgumentException("parameter must not be null"); 901 } 902 903 params.add(parameter); 904 } 905 906 /** 907 * @return the params 908 */ 909 private List<Parameter> getParameters() { 910 return Collections.unmodifiableList(params); 911 } 912 913 /** 914 * 915 */ 916 private void addComponent(Component component) { 917 if (component == null) { 918 throw new IllegalArgumentException("component must not be null"); 919 } 920 921 components.add(component); 922 } 923 924 /** 925 * @return the components 926 */ 927 private List<Component> getComponents() { 928 return Collections.unmodifiableList(components); 929 } 930 931 /** 932 * 933 */ 719 934 private void dump(PrintStream out) { 935 if (out == null) { 936 throw new IllegalArgumentException("out must not be null"); 937 } 938 720 939 out.println(" <source>"); 721 940 … … 728 947 out.println(" </source>"); 729 948 } 949 950 /* (non-Javadoc) 951 * @see java.lang.Object#equals(java.lang.Object) 952 */ 953 @Override 954 public boolean equals(Object obj) { 955 if (this == obj) { 956 return true; 957 } 958 959 if (obj instanceof Source) { 960 Source other = (Source) obj; 961 962 if ((getToStringValue() != other.getToStringValue()) || 963 ((getToStringValue() != null) && 964 (!getToStringValue().equals(other.getToStringValue())))) 965 { 966 return false; 967 } 968 969 if (!parametersEqual(params, other.params)) { 970 return false; 971 } 972 973 if (components == null) { 974 return other.components == null; 975 } 976 977 if (other.components == null) { 978 return false; 979 } 980 981 if (components.size() != other.components.size()) { 982 return false; 983 } 984 985 for (int i = 0; i < components.size(); i++) { 986 if (!components.get(i).equals(other.components.get(i))) { 987 return false; 988 } 989 } 990 991 return true; 992 } 993 994 return false; 995 } 996 997 /* (non-Javadoc) 998 * @see java.lang.Object#hashCode() 999 */ 1000 @Override 1001 public int hashCode() { 1002 String str = getToStringValue(); 1003 1004 if (str != null) { 1005 return str.hashCode(); 1006 } 1007 else { 1008 // ensure that all incomplete sources provide the same hashcode 1009 return 0; 1010 } 1011 } 1012 730 1013 } 731 1014 … … 736 1019 */ 737 1020 private class Component { 738 protected List<String[]> params = new ArrayList<String[]>(); 739 1021 1022 /** */ 1023 private List<Parameter> params = new ArrayList<Parameter>(); 1024 1025 /** 1026 * 1027 */ 1028 protected void addParameter(String name, String value) { 1029 if (name == null) { 1030 throw new IllegalArgumentException("name must not be null"); 1031 } 1032 1033 if (value == null) { 1034 throw new IllegalArgumentException("value must not be null"); 1035 } 1036 1037 params.add(new Parameter(name, value)); 1038 } 1039 1040 /** 1041 * @return the params 1042 */ 1043 private List<Parameter> getParameters() { 1044 return Collections.unmodifiableList(params); 1045 } 1046 1047 /** 1048 * 1049 */ 740 1050 protected void dump(PrintStream out) { 1051 if (out == null) { 1052 throw new IllegalArgumentException("out must not be null"); 1053 } 1054 741 1055 out.println(" <component>"); 742 1056 dumpParams(out, params, " "); … … 744 1058 } 745 1059 746 public boolean equals(Object other) { 747 if (this == other) { 1060 /** 1061 * 1062 */ 1063 public boolean equals(Object obj) { 1064 if (this == obj) { 748 1065 return true; 749 1066 } 750 1067 751 if (!(other instanceof Component)) { 752 return false; 753 } 754 755 Component otherComp = (Component) other; 756 757 boolean allParamsEqual = (params.size() == otherComp.params.size()); 758 759 if (allParamsEqual) { 760 for (int i = 0; i < params.size(); i++) { 761 if (!params.get(i)[0].equals(otherComp.params.get(i)[0]) && 762 !params.get(i)[1].equals(otherComp.params.get(i)[1])) 763 { 764 allParamsEqual = false; 765 break; 766 } 767 } 768 } 769 770 return allParamsEqual; 1068 if (obj instanceof Component) { 1069 return parametersEqual(params, ((Component) obj).params); 1070 } 1071 else { 1072 return false; 1073 } 1074 } 1075 1076 /* (non-Javadoc) 1077 * @see java.lang.Object#hashCode() 1078 */ 1079 @Override 1080 public int hashCode() { 1081 // all components with an equally sized parameter list can be equal. This does not 1082 // work, if not all component parameters are set yet. But we do not use components 1083 // in a hash map so we provide an easy implementation 1084 return params.size(); 771 1085 } 772 1086 } … … 778 1092 */ 779 1093 private class ComponentFromToString extends Component { 1094 1095 /** */ 780 1096 private int x; 1097 1098 /** */ 781 1099 private int y; 1100 1101 /** */ 782 1102 private int width; 1103 1104 /** */ 783 1105 private int height; 784 1106 1107 /** 1108 * @param x the x to set 1109 */ 1110 private void setX(int x) { 1111 this.x = x; 1112 } 1113 1114 /** 1115 * @return the x 1116 */ 1117 private int getX() { 1118 return x; 1119 } 1120 1121 /** 1122 * @param y the y to set 1123 */ 1124 private void setY(int y) { 1125 this.y = y; 1126 } 1127 1128 /** 1129 * @return the y 1130 */ 1131 private int getY() { 1132 return y; 1133 } 1134 1135 /** 1136 * @param width the width to set 1137 */ 1138 private void setWidth(int width) { 1139 this.width = width; 1140 } 1141 1142 /** 1143 * @param height the height to set 1144 */ 1145 private void setHeight(int height) { 1146 this.height = height; 1147 } 1148 1149 /** 1150 * 1151 */ 785 1152 @Override 786 1153 protected void dump(PrintStream out) { 1154 if (out == null) { 1155 throw new IllegalArgumentException("out must not be null"); 1156 } 1157 787 1158 out.println(" <component>"); 788 1159 … … 807 1178 out.println("\" />"); 808 1179 809 dumpParams(out, params, " ");1180 dumpParams(out, super.getParameters(), " "); 810 1181 out.println(" </component>"); 811 1182 } 812 1183 813 /*public boolean equals(Object other) { 814 if (this == other) { 815 return true; 816 } 817 818 if (!(other instanceof ComponentFromToString)) { 1184 /** 1185 * 1186 */ 1187 public boolean equals(Object obj) { 1188 if (!super.equals(obj)) { 819 1189 return false; 820 1190 } 821 1191 822 ComponentFromToString otherComp = (ComponentFromToString) other; 823 824 // ignore the coordinates and the width as it may change over time 825 boolean allParamsEqual = 826 (height == otherComp.height) && (params.size() == otherComp.params.size()); 827 828 if (allParamsEqual) { 829 for (int i = 0; i < params.size(); i++) { 830 if (!"x".equals(params.get(i)[0]) && !"y".equals(params.get(i)[0]) && 831 !"width".equals(params.get(i)[0]) && !"height".equals(params.get(i)[0]) && 832 !"index".equals(params.get(i)[0]) && !"hash".equals(params.get(i)[0]) && 833 !params.get(i)[0].equals(otherComp.params.get(i)[0]) && 834 !params.get(i)[1].equals(otherComp.params.get(i)[1])) 835 { 836 allParamsEqual = false; 837 break; 838 } 839 } 840 } 841 842 return allParamsEqual; 843 }*/ 844 } 845 1192 if (obj instanceof ComponentFromToString) { 1193 ComponentFromToString other = (ComponentFromToString) obj; 1194 return (x == other.x) && (y == other.y) && 1195 (width == other.width) && (height == other.height); 1196 } 1197 else { 1198 return false; 1199 } 1200 } 1201 1202 /* (non-Javadoc) 1203 * @see java.lang.Object#hashCode() 1204 */ 1205 @Override 1206 public int hashCode() { 1207 return super.hashCode() + x + y + width + height; 1208 } 1209 } 1210 1211 /** 1212 * <p> 1213 * used to carry all information about a parameter being a key and a value 1214 * </p> 1215 */ 1216 private class Parameter { 1217 1218 /** */ 1219 private String name; 1220 1221 /** */ 1222 private String value; 1223 1224 /** 1225 * 1226 */ 1227 private Parameter(String name, String value) { 1228 if (name == null) { 1229 throw new IllegalArgumentException("name must not be null"); 1230 } 1231 1232 if (value == null) { 1233 throw new IllegalArgumentException("value must not be null"); 1234 } 1235 1236 this.name = name; 1237 this.value = value; 1238 } 1239 1240 /** 1241 * @return the name 1242 */ 1243 private String getName() { 1244 return name; 1245 } 1246 1247 /** 1248 * @return the value 1249 */ 1250 private String getValue() { 1251 return value; 1252 } 1253 1254 /* (non-Javadoc) 1255 * @see java.lang.Object#equals(java.lang.Object) 1256 */ 1257 @Override 1258 public boolean equals(Object obj) { 1259 if (obj instanceof Parameter) { 1260 return 1261 (name.equals(((Parameter) obj).name) && value.equals(((Parameter) obj).value)); 1262 } 1263 else { 1264 return false; 1265 } 1266 } 1267 1268 /* (non-Javadoc) 1269 * @see java.lang.Object#hashCode() 1270 */ 1271 @Override 1272 public int hashCode() { 1273 return name.hashCode() + value.hashCode(); 1274 } 1275 1276 1277 } 1278 846 1279 }
Note: See TracChangeset
for help on using the changeset viewer.