001
014
015 package com.liferay.portal.util;
016
017 import com.liferay.portal.kernel.security.pacl.DoPrivileged;
018 import com.liferay.portal.kernel.util.ArrayUtil;
019 import com.liferay.portal.kernel.util.CharPool;
020 import com.liferay.portal.kernel.util.FriendlyURLNormalizer;
021 import com.liferay.portal.kernel.util.GetterUtil;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.StringUtil;
024 import com.liferay.portal.kernel.util.Validator;
025 import com.liferay.util.Normalizer;
026
027 import java.util.Arrays;
028 import java.util.regex.Matcher;
029 import java.util.regex.Pattern;
030
031
035 @DoPrivileged
036 public class FriendlyURLNormalizerImpl implements FriendlyURLNormalizer {
037
038 @Override
039 public String normalize(String friendlyURL) {
040 return normalize(friendlyURL, _friendlyURLPattern);
041 }
042
043
046 @Deprecated
047 @Override
048 public String normalize(String friendlyURL, char[] replaceChars) {
049 if (Validator.isNull(friendlyURL)) {
050 return friendlyURL;
051 }
052
053 friendlyURL = GetterUtil.getString(friendlyURL);
054 friendlyURL = StringUtil.toLowerCase(friendlyURL);
055 friendlyURL = Normalizer.normalizeToAscii(friendlyURL);
056
057 StringBuilder sb = null;
058
059 int index = 0;
060
061 for (int i = 0; i < friendlyURL.length(); i++) {
062 char c = friendlyURL.charAt(i);
063
064 if ((Arrays.binarySearch(_REPLACE_CHARS, c) >= 0) ||
065 ((replaceChars != null) &&
066 ArrayUtil.contains(replaceChars, c))) {
067
068 if (sb == null) {
069 sb = new StringBuilder();
070 }
071
072 if (i > index) {
073 sb.append(friendlyURL.substring(index, i));
074 }
075
076 sb.append(CharPool.DASH);
077
078 index = i + 1;
079 }
080 }
081
082 if (sb != null) {
083 if (index < friendlyURL.length()) {
084 sb.append(friendlyURL.substring(index));
085 }
086
087 friendlyURL = sb.toString();
088 }
089
090 while (friendlyURL.contains(StringPool.DOUBLE_DASH)) {
091 friendlyURL = StringUtil.replace(
092 friendlyURL, StringPool.DOUBLE_DASH, StringPool.DASH);
093 }
094
095
102
103 return friendlyURL;
104 }
105
106 @Override
107 public String normalize(String friendlyURL, Pattern friendlyURLPattern) {
108 if (Validator.isNull(friendlyURL)) {
109 return friendlyURL;
110 }
111
112 friendlyURL = StringUtil.toLowerCase(friendlyURL);
113 friendlyURL = Normalizer.normalizeToAscii(friendlyURL);
114
115 Matcher matcher = friendlyURLPattern.matcher(friendlyURL);
116
117 friendlyURL = matcher.replaceAll(StringPool.DASH);
118
119 matcher = _friendlyURLHyphenPattern.matcher(friendlyURL);
120
121 friendlyURL = matcher.replaceAll(StringPool.DASH);
122
123 return friendlyURL;
124 }
125
126 private static final char[] _REPLACE_CHARS;
127
128 private static final Pattern _friendlyURLHyphenPattern = Pattern.compile(
129 "(-)\\1+");
130 private static final Pattern _friendlyURLPattern = Pattern.compile(
131 "[^a-z0-9./_-]");
132
133 static {
134 char[] replaceChars = new char[] {
135 ' ', ',', '\\', '\'', '\"', '(', ')', '[', ']', '{', '}', '?', '#',
136 '@', '+', '~', ';', '$', '%', '!', '=', ':', '&', '\u00a3',
137 '\u2013', '\u2014', '\u2018', '\u2019', '\u201c', '\u201d'
138 };
139
140 Arrays.sort(replaceChars);
141
142 _REPLACE_CHARS = replaceChars;
143 }
144
145 }