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
029
033 @DoPrivileged
034 public class FriendlyURLNormalizerImpl implements FriendlyURLNormalizer {
035
036 public String normalize(String friendlyURL) {
037 return normalize(friendlyURL, null);
038 }
039
040 public String normalize(String friendlyURL, char[] replaceChars) {
041 if (Validator.isNull(friendlyURL)) {
042 return friendlyURL;
043 }
044
045 friendlyURL = GetterUtil.getString(friendlyURL);
046 friendlyURL = friendlyURL.toLowerCase();
047 friendlyURL = Normalizer.normalizeToAscii(friendlyURL);
048
049 StringBuilder sb = null;
050
051 int index = 0;
052
053 for (int i = 0; i < friendlyURL.length(); i++) {
054 char c = friendlyURL.charAt(i);
055
056 if ((Arrays.binarySearch(_REPLACE_CHARS, c) >= 0) ||
057 ((replaceChars != null) &&
058 ArrayUtil.contains(replaceChars, c))) {
059
060 if (sb == null) {
061 sb = new StringBuilder();
062 }
063
064 if (i > index) {
065 sb.append(friendlyURL.substring(index, i));
066 }
067
068 sb.append(CharPool.DASH);
069
070 index = i + 1;
071 }
072 }
073
074 if (sb != null) {
075 if (index < friendlyURL.length()) {
076 sb.append(friendlyURL.substring(index));
077 }
078
079 friendlyURL = sb.toString();
080 }
081
082 while (friendlyURL.contains(StringPool.DOUBLE_DASH)) {
083 friendlyURL = StringUtil.replace(
084 friendlyURL, StringPool.DOUBLE_DASH, StringPool.DASH);
085 }
086
087
094
095 return friendlyURL;
096 }
097
098 private static final char[] _REPLACE_CHARS;
099
100 static {
101 char[] replaceChars = new char[] {
102 ' ', ',', '\\', '\'', '\"', '(', ')', '[', ']', '{', '}', '?', '#',
103 '@', '+', '~', ';', '$', '%', '!', '=', ':', '&'
104 };
105
106 Arrays.sort(replaceChars);
107
108 _REPLACE_CHARS = replaceChars;
109 }
110
111 }