001
014
015 package com.liferay.portlet;
016
017 import com.liferay.portal.kernel.portlet.Route;
018 import com.liferay.portal.kernel.util.InheritableMap;
019 import com.liferay.portal.kernel.util.MapUtil;
020 import com.liferay.portal.kernel.util.StringEncoder;
021 import com.liferay.portal.kernel.util.StringParser;
022 import com.liferay.portal.kernel.util.URLStringEncoder;
023 import com.liferay.portal.kernel.util.Validator;
024
025 import java.util.HashMap;
026 import java.util.LinkedHashSet;
027 import java.util.Map;
028 import java.util.Set;
029
030
034 public class RouteImpl implements Route {
035
036 public RouteImpl(String pattern) {
037 _stringParser = new StringParser(pattern);
038
039 _stringParser.setStringEncoder(_urlEncoder);
040 }
041
042 @Override
043 public void addGeneratedParameter(String name, String pattern) {
044 StringParser stringParser = new StringParser(pattern);
045
046 _generatedParameters.put(name, stringParser);
047 }
048
049 @Override
050 public void addIgnoredParameter(String name) {
051 _ignoredParameters.add(name);
052 }
053
054 @Override
055 public void addImplicitParameter(String name, String value) {
056 _implicitParameters.put(name, value);
057 }
058
059 @Override
060 public void addOverriddenParameter(String name, String value) {
061 _overriddenParameters.put(name, value);
062 }
063
064 @Override
065 public Map<String, StringParser> getGeneratedParameters() {
066 return _generatedParameters;
067 }
068
069 @Override
070 public Set<String> getIgnoredParameters() {
071 return _ignoredParameters;
072 }
073
074 @Override
075 public Map<String, String> getImplicitParameters() {
076 return _implicitParameters;
077 }
078
079 @Override
080 public Map<String, String> getOverriddenParameters() {
081 return _overriddenParameters;
082 }
083
084 @Override
085 public String parametersToUrl(Map<String, String> parameters) {
086 InheritableMap<String, String> allParameters = new InheritableMap<>();
087
088 allParameters.setParentMap(parameters);
089
090
091
092
093 for (Map.Entry<String, StringParser> entry :
094 _generatedParameters.entrySet()) {
095
096 String name = entry.getKey();
097 StringParser stringParser = entry.getValue();
098
099 String value = MapUtil.getString(allParameters, name);
100
101 if (!stringParser.parse(value, allParameters)) {
102 return null;
103 }
104 }
105
106 for (Map.Entry<String, String> entry : _implicitParameters.entrySet()) {
107 String name = entry.getKey();
108 String value = entry.getValue();
109
110 if (!value.equals(MapUtil.getString(allParameters, name))) {
111 return null;
112 }
113 }
114
115 String url = _stringParser.build(allParameters);
116
117 if (Validator.isNull(url)) {
118 return null;
119 }
120
121 for (String name : _generatedParameters.keySet()) {
122
123
124
125
126 parameters.remove(name);
127 }
128
129 for (String name : _implicitParameters.keySet()) {
130 parameters.remove(name);
131 }
132
133 for (String name : _ignoredParameters) {
134 parameters.remove(name);
135 }
136
137 return url;
138 }
139
140 @Override
141 public boolean urlToParameters(String url, Map<String, String> parameters) {
142 if (!_stringParser.parse(url, parameters)) {
143 return false;
144 }
145
146 parameters.putAll(_implicitParameters);
147 parameters.putAll(_overriddenParameters);
148
149
150
151
152 for (Map.Entry<String, StringParser> entry :
153 _generatedParameters.entrySet()) {
154
155 String name = entry.getKey();
156 StringParser stringParser = entry.getValue();
157
158 String value = stringParser.build(parameters);
159
160
161
162
163
164 if (value != null) {
165 parameters.put(name, value);
166 }
167 }
168
169 return true;
170 }
171
172 private static final StringEncoder _urlEncoder = new URLStringEncoder();
173
174 private final Map<String, StringParser> _generatedParameters =
175 new HashMap<>();
176 private final Set<String> _ignoredParameters = new LinkedHashSet<>();
177 private final Map<String, String> _implicitParameters = new HashMap<>();
178 private final Map<String, String> _overriddenParameters = new HashMap<>();
179 private final StringParser _stringParser;
180
181 }