001
014
015 package com.liferay.portal.tools.sourceformatter;
016
017 import com.liferay.portal.kernel.util.NaturalOrderStringComparator;
018 import com.liferay.portal.kernel.util.StringUtil;
019
020 import java.util.Comparator;
021 import java.util.List;
022
023
026 public class JavaTermComparator implements Comparator<JavaTerm> {
027
028 public JavaTermComparator() {
029 this(true);
030 }
031
032 public JavaTermComparator(boolean ascending) {
033 _ascending = ascending;
034 }
035
036 @Override
037 public int compare(JavaTerm javaTerm1, JavaTerm javaTerm2) {
038 int value = doCompare(javaTerm1, javaTerm2);
039
040 if (_ascending) {
041 return value;
042 }
043 else {
044 return -value;
045 }
046 }
047
048 protected int compareParameterTypes(
049 JavaTerm javaTerm1, JavaTerm javaTerm2) {
050
051 List<String> parameterTypes2 = javaTerm2.getParameterTypes();
052
053 if (parameterTypes2.isEmpty()) {
054 return 1;
055 }
056
057 List<String> parameterTypes1 = javaTerm1.getParameterTypes();
058
059 if (parameterTypes1.isEmpty()) {
060 return -1;
061 }
062
063 for (int i = 0; i < parameterTypes1.size(); i++) {
064 if (parameterTypes2.size() < (i + 1)) {
065 return 1;
066 }
067
068 String parameterType1 = parameterTypes1.get(i);
069 String parameterType2 = parameterTypes2.get(i);
070
071 if ((parameterTypes1.size() != parameterTypes2.size()) &&
072 (parameterType1.equals(parameterType2.concat("...")) ||
073 parameterType2.equals(parameterType1.concat("...")))) {
074
075 continue;
076 }
077
078 if (parameterType1.compareToIgnoreCase(parameterType2) != 0) {
079 return parameterType1.compareToIgnoreCase(parameterType2);
080 }
081
082 if (parameterType1.compareTo(parameterType2) != 0) {
083 return -parameterType1.compareTo(parameterType2);
084 }
085 }
086
087 return -1;
088 }
089
090 protected int doCompare(JavaTerm javaTerm1, JavaTerm javaTerm2) {
091 int type1 = javaTerm1.getType();
092 int type2 = javaTerm2.getType();
093
094 if (type1 != type2) {
095 return type1 - type2;
096 }
097
098 String name1 = javaTerm1.getName();
099 String name2 = javaTerm2.getName();
100
101 if (javaTerm1.isVariable()) {
102 if (StringUtil.isUpperCase(name1) &&
103 !StringUtil.isLowerCase(name1) &&
104 !StringUtil.isUpperCase(name2)) {
105
106 return -1;
107 }
108
109 if (!StringUtil.isUpperCase(name1) &&
110 StringUtil.isUpperCase(name2) &&
111 !StringUtil.isLowerCase(name2)) {
112
113 return 1;
114 }
115 }
116
117 if (type1 == JavaTerm.TYPE_VARIABLE_PRIVATE_STATIC) {
118 if (name2.equals("_log") || name2.equals("_logger")) {
119 return 1;
120 }
121
122 if (name1.equals("_instance") || name1.equals("_log") ||
123 name1.equals("_logger")) {
124
125 return -1;
126 }
127
128 if (name2.equals("_instance")) {
129 return 1;
130 }
131 }
132
133 if (name1.compareToIgnoreCase(name2) != 0) {
134 NaturalOrderStringComparator naturalOrderStringComparator =
135 new NaturalOrderStringComparator(true, false);
136
137 return naturalOrderStringComparator.compare(name1, name2);
138 }
139
140 if (name1.compareTo(name2) != 0) {
141 NaturalOrderStringComparator naturalOrderStringComparator =
142 new NaturalOrderStringComparator(true, true);
143
144 return -naturalOrderStringComparator.compare(name1, name2);
145 }
146
147 return compareParameterTypes(javaTerm1, javaTerm2);
148 }
149
150 private boolean _ascending;
151
152 }