001
014
015 package com.liferay.portal.template;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.template.TemplateConstants;
020 import com.liferay.portal.kernel.util.CharPool;
021 import com.liferay.portal.kernel.util.StringPool;
022 import com.liferay.portal.kernel.util.StringUtil;
023
024 import java.net.URL;
025
026 import java.util.ArrayList;
027 import java.util.List;
028
029
032 public class ClassLoaderResourceParser extends URLResourceParser {
033
034 @Override
035 @SuppressWarnings("deprecation")
036 public URL getURL(String templateId) {
037 if (templateId.contains(TemplateConstants.JOURNAL_SEPARATOR) ||
038 templateId.contains(TemplateConstants.SERVLET_SEPARATOR) ||
039 templateId.contains(TemplateConstants.TEMPLATE_SEPARATOR) ||
040 templateId.contains(TemplateConstants.THEME_LOADER_SEPARATOR)) {
041
042 return null;
043 }
044
045 Class<?> clazz = getClass();
046
047 ClassLoader classLoader = clazz.getClassLoader();
048
049 if (_log.isDebugEnabled()) {
050 _log.debug("Loading " + templateId);
051 }
052
053 templateId = normalizePath(templateId);
054
055 return classLoader.getResource(templateId);
056 }
057
058 protected static String normalizePath(String path) {
059 List<String> elements = new ArrayList<String>();
060
061 boolean absolutePath = false;
062
063 int previousIndex = -1;
064
065 for (int index;
066 (index = path.indexOf(CharPool.SLASH, previousIndex + 1)) != -1;
067 previousIndex = index) {
068
069 if ((previousIndex + 1) == index) {
070
071
072
073 if (previousIndex == -1) {
074 absolutePath = true;
075
076 continue;
077 }
078
079
080
081 throw new IllegalArgumentException(
082 "Unable to parse path " + path);
083 }
084
085 String pathElement = path.substring(previousIndex + 1, index);
086
087
088
089 if (pathElement.equals(StringPool.PERIOD)) {
090 continue;
091 }
092
093
094
095 if (pathElement.equals(StringPool.DOUBLE_PERIOD)) {
096 if (elements.isEmpty()) {
097 throw new IllegalArgumentException(
098 "Unable to parse path " + path);
099 }
100
101 elements.remove(elements.size() - 1);
102
103 continue;
104 }
105
106
107
108 elements.add(pathElement);
109 }
110
111 if (previousIndex == -1) {
112 elements.add(path);
113 }
114 else if ((previousIndex + 1) < path.length()) {
115 elements.add(path.substring(previousIndex + 1));
116 }
117
118 String normalizedPath = StringUtil.merge(elements, StringPool.SLASH);
119
120 if (absolutePath) {
121 normalizedPath = StringPool.SLASH.concat(normalizedPath);
122 }
123
124 return normalizedPath;
125 }
126
127 private static final Log _log = LogFactoryUtil.getLog(
128 ClassLoaderResourceParser.class);
129
130 }