001
014
015 package com.liferay.portal.model.impl;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.log.Log;
019 import com.liferay.portal.kernel.log.LogFactoryUtil;
020 import com.liferay.portal.kernel.util.PropsKeys;
021 import com.liferay.portal.kernel.util.PropsUtil;
022 import com.liferay.portal.kernel.util.StringBundler;
023 import com.liferay.portal.kernel.util.StringPool;
024 import com.liferay.portal.kernel.util.WebKeys;
025 import com.liferay.portal.model.Group;
026 import com.liferay.portal.model.Layout;
027 import com.liferay.portal.model.LayoutSet;
028 import com.liferay.portal.model.LayoutType;
029 import com.liferay.portal.model.LayoutWrapper;
030 import com.liferay.portal.model.Portlet;
031 import com.liferay.portal.model.VirtualLayoutConstants;
032 import com.liferay.portal.theme.ThemeDisplay;
033 import com.liferay.portal.util.LayoutTypePortletFactoryUtil;
034
035 import java.util.List;
036 import java.util.Locale;
037
038 import javax.servlet.http.HttpServletRequest;
039
040
043 public class VirtualLayout extends LayoutWrapper {
044
045 public VirtualLayout(Layout sourceLayout, Group targetGroup) {
046 super(sourceLayout);
047
048 _sourceLayout = sourceLayout;
049 _targetGroup = targetGroup;
050 }
051
052 @Override
053 public Object clone() {
054 return new VirtualLayout((Layout)_sourceLayout.clone(), _targetGroup);
055 }
056
057 @Override
058 public List<Portlet> getEmbeddedPortlets() {
059 return super.getEmbeddedPortlets(getGroupId());
060 }
061
062 @Override
063 public String getFriendlyURL() {
064 return getFriendlyURL(null);
065 }
066
067 @Override
068 public String getFriendlyURL(Locale locale) {
069 StringBundler sb = new StringBundler(3);
070
071 sb.append(VirtualLayoutConstants.CANONICAL_URL_SEPARATOR);
072
073 try {
074 Group group = _sourceLayout.getGroup();
075
076 sb.append(group.getFriendlyURL());
077 }
078 catch (Exception e) {
079 _log.error(e, e);
080 }
081
082 if (locale == null) {
083 sb.append(_sourceLayout.getFriendlyURL());
084 }
085 else {
086 sb.append(_sourceLayout.getFriendlyURL(locale));
087 }
088
089 return sb.toString();
090 }
091
092 @Override
093 public Group getGroup() {
094 return getHostGroup();
095 }
096
097 @Override
098 public long getGroupId() {
099 return getVirtualGroupId();
100 }
101
102 public Group getHostGroup() {
103 return _targetGroup;
104 }
105
106 @Override
107 public LayoutSet getLayoutSet() {
108 if (isPrivateLayout()) {
109 return _targetGroup.getPrivateLayoutSet();
110 }
111
112 return _targetGroup.getPublicLayoutSet();
113 }
114
115 @Override
116 public LayoutType getLayoutType() {
117 if (_layoutType == null) {
118 _layoutType = LayoutTypePortletFactoryUtil.create(this);
119 }
120
121 return _layoutType;
122 }
123
124 @Override
125 public String getRegularURL(HttpServletRequest request)
126 throws PortalException {
127
128 String layoutURL = _sourceLayout.getRegularURL(request);
129
130 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
131 WebKeys.THEME_DISPLAY);
132
133 return injectVirtualGroupURL(layoutURL, themeDisplay.getLocale());
134 }
135
136 @Override
137 public String getResetLayoutURL(HttpServletRequest request)
138 throws PortalException {
139
140 String layoutURL = _sourceLayout.getResetLayoutURL(request);
141
142 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
143 WebKeys.THEME_DISPLAY);
144
145 return injectVirtualGroupURL(layoutURL, themeDisplay.getLocale());
146 }
147
148 @Override
149 public String getResetMaxStateURL(HttpServletRequest request)
150 throws PortalException {
151
152 String layoutURL = _sourceLayout.getResetMaxStateURL(request);
153
154 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
155 WebKeys.THEME_DISPLAY);
156
157 return injectVirtualGroupURL(layoutURL, themeDisplay.getLocale());
158 }
159
160 public long getSourceGroupId() {
161 return _sourceLayout.getGroupId();
162 }
163
164 public Layout getSourceLayout() {
165 return _sourceLayout;
166 }
167
168 public long getVirtualGroupId() {
169 return _targetGroup.getGroupId();
170 }
171
172 protected String injectVirtualGroupURL(String layoutURL, Locale locale) {
173 if (_sourceLayout.isTypeURL()) {
174 return layoutURL;
175 }
176
177 try {
178 Group group = _sourceLayout.getGroup();
179
180 StringBundler sb = new StringBundler(4);
181
182 if (_targetGroup.isUser() && isPrivateLayout()) {
183 layoutURL = layoutURL.replaceFirst(
184 _LAYOUT_FRIENDLY_URL_PRIVATE_GROUP_SERVLET_MAPPING,
185 _LAYOUT_FRIENDLY_URL_PRIVATE_USER_SERVLET_MAPPING);
186 }
187
188 int pos = layoutURL.indexOf(group.getFriendlyURL());
189
190 sb.append(layoutURL.substring(0, pos));
191 sb.append(_targetGroup.getFriendlyURL());
192 sb.append(getFriendlyURL(locale));
193
194 pos = layoutURL.indexOf(StringPool.QUESTION);
195
196 if (pos > 0) {
197 sb.append(layoutURL.substring(pos));
198 }
199
200 return sb.toString();
201 }
202 catch (Exception e) {
203 throw new IllegalStateException(e);
204 }
205 }
206
207 private static final String _LAYOUT_FRIENDLY_URL_PRIVATE_GROUP_SERVLET_MAPPING =
208 PropsUtil.get(
209 PropsKeys.LAYOUT_FRIENDLY_URL_PRIVATE_GROUP_SERVLET_MAPPING);
210
211 private static final String _LAYOUT_FRIENDLY_URL_PRIVATE_USER_SERVLET_MAPPING =
212 PropsUtil.get(
213 PropsKeys.LAYOUT_FRIENDLY_URL_PRIVATE_USER_SERVLET_MAPPING);
214
215 private static final Log _log = LogFactoryUtil.getLog(VirtualLayout.class);
216
217 private LayoutType _layoutType;
218 private final Layout _sourceLayout;
219 private final Group _targetGroup;
220
221 }