001
014
015 package com.liferay.portal.tools;
016
017 import java.util.Map;
018 import java.util.Set;
019 import java.util.TreeMap;
020 import java.util.TreeSet;
021
022
028 public class ComparableRoute implements Comparable<ComparableRoute> {
029
030 public static boolean hasRegex(String fragment) {
031 if (fragment.indexOf(":") != -1) {
032 return true;
033 }
034 else {
035 return false;
036 }
037 }
038
039 public static boolean isCaptureFragment(String fragment) {
040 if (fragment.indexOf("{") != -1) {
041 return true;
042 }
043 else {
044 return false;
045 }
046 }
047
048 public static boolean isMatchAny(String fragment) {
049 return fragment.matches(".*\\{.+?:\\.\\*\\}.*");
050 }
051
052 public ComparableRoute(String pattern) {
053 _pattern = pattern;
054 }
055
056 public void addGeneratedParameter(String name, String pattern) {
057 _generatedParameters.put(name, pattern);
058 }
059
060 public void addIgnoredParameter(String name) {
061 _ignoredParameters.add(name);
062 }
063
064 public void addImplicitParameter(String name, String value) {
065 _implicitParameters.put(name, value);
066 }
067
068 public void addOverriddenParameter(String name, String value) {
069 _overriddenParameters.put(name, value);
070 }
071
072 public int compareTo(ComparableRoute comparableRoute) {
073
074
075
076 String[] _fragments = _pattern.split("[/\\.](?!\\*)");
077
078 String pattern = comparableRoute.getPattern();
079
080 String[] fragments = pattern.split("[/\\.](?!\\*)");
081
082 int i;
083
084 for (i = 0; (i < _fragments.length) && (i < fragments.length); i++) {
085 String _fragment = _fragments[i];
086 String fragment = fragments[i];
087
088
089
090 if (!isCaptureFragment(_fragment) && isCaptureFragment(fragment)) {
091 return -1;
092 }
093
094 if (isCaptureFragment(_fragment) && !isCaptureFragment(fragment)) {
095 return 1;
096 }
097
098
099
100 if (!isMatchAny(_fragment) && isMatchAny(fragment)) {
101 return -1;
102 }
103
104 if (isMatchAny(_fragment) && !isMatchAny(fragment)) {
105 return 1;
106 }
107
108
109
110 if (hasRegex(_fragment) && !hasRegex(fragment)) {
111 return -1;
112 }
113
114 if (!hasRegex(_fragment) && hasRegex(fragment)) {
115 return 1;
116 }
117 }
118
119
120
121 if ((i < fragments.length) && (i >= _fragments.length)) {
122 return -1;
123 }
124
125 if ((i < _fragments.length) && (i >= fragments.length)) {
126 return 1;
127 }
128
129
130
131 Map<String, String> implicitParameters =
132 comparableRoute.getImplicitParameters();
133
134 if (_implicitParameters.size() > implicitParameters.size()) {
135 return -1;
136 }
137
138 if (_implicitParameters.size() < implicitParameters.size()) {
139 return 1;
140 }
141
142 return _pattern.compareTo(comparableRoute.getPattern());
143 }
144
145 @Override
146 public boolean equals(Object obj) {
147 if (this == obj) {
148 return true;
149 }
150
151 if (!(obj instanceof ComparableRoute)) {
152 return false;
153 }
154
155 ComparableRoute comparableRoute = (ComparableRoute)obj;
156
157 if (compareTo(comparableRoute) == 0) {
158 return true;
159 }
160 else {
161 return false;
162 }
163 }
164
165 public Map<String, String> getGeneratedParameters() {
166 return _generatedParameters;
167 }
168
169 public Set<String> getIgnoredParameters() {
170 return _ignoredParameters;
171 }
172
173 public Map<String, String> getImplicitParameters() {
174 return _implicitParameters;
175 }
176
177 public Map<String, String> getOverriddenParameters() {
178 return _overriddenParameters;
179 }
180
181 public String getPattern() {
182 return _pattern;
183 }
184
185 private Map<String, String> _generatedParameters =
186 new TreeMap<String, String>();
187 private Set<String> _ignoredParameters = new TreeSet<String>();
188 private Map<String, String> _implicitParameters =
189 new TreeMap<String, String>();
190 private Map<String, String> _overriddenParameters =
191 new TreeMap<String, String>();
192 private String _pattern;
193
194 }