1
22
23 package com.liferay.portlet.communities.model;
24
25 import com.liferay.portal.NoSuchGroupException;
26 import com.liferay.portal.PortalException;
27 import com.liferay.portal.SystemException;
28 import com.liferay.portal.kernel.io.FileCacheOutputStream;
29 import com.liferay.portal.kernel.log.Log;
30 import com.liferay.portal.kernel.log.LogFactoryUtil;
31 import com.liferay.portal.lar.PortletDataHandlerKeys;
32 import com.liferay.portal.lar.UserIdStrategy;
33 import com.liferay.portal.model.BaseModelListener;
34 import com.liferay.portal.model.Group;
35 import com.liferay.portal.model.GroupConstants;
36 import com.liferay.portal.model.LayoutSet;
37 import com.liferay.portal.service.GroupLocalServiceUtil;
38 import com.liferay.portal.service.LayoutLocalServiceUtil;
39
40 import java.util.LinkedHashMap;
41 import java.util.Map;
42
43
78 public class CommunityTemplateModelListener
79 extends BaseModelListener<LayoutSet> {
80
81 public CommunityTemplateModelListener() {
82 _templateParameters = getTemplateParameters();
83 }
84
85 public void onAfterCreate(LayoutSet layoutSet) {
86 FileCacheOutputStream fcos = null;
87
88 try {
89 Group group = GroupLocalServiceUtil.getGroup(
90 layoutSet.getGroupId());
91
92 if (!group.isCommunity() ||
93 group.getName().contains(_TEMPLATE_POSTFIX)) {
94
95 return;
96 }
97
98 Group templateGroup = getTemplateGroup(group);
99
100 if (templateGroup == null) {
101 return;
102 }
103
104 Group templateStagingGroup = templateGroup.getStagingGroup();
105
106 if (templateStagingGroup == null) {
107 return;
108 }
109
110 fcos = LayoutLocalServiceUtil.exportLayoutsAsStream(
111 templateStagingGroup.getGroupId(), layoutSet.isPrivateLayout(),
112 null, _templateParameters, null, null);
113
114 LayoutLocalServiceUtil.importLayouts(
115 group.getCreatorUserId(), group.getGroupId(),
116 layoutSet.isPrivateLayout(), _templateParameters,
117 fcos.getFileInputStream());
118 }
119 catch (Exception e) {
120 _log.error(
121 "Unble to import layouts for group " + layoutSet.getGroupId(),
122 e);
123 }
124 finally {
125 if (fcos != null) {
126 fcos.cleanUp();
127 }
128 }
129 }
130
131 protected Group getTemplateGroup(Group group)
132 throws PortalException, SystemException {
133
134 String templateCommunityName = null;
135
136 int type = group.getType();
137
138 if (type == GroupConstants.TYPE_COMMUNITY_OPEN) {
139 templateCommunityName = _OPEN_TEMPLATE_COMMUNITY_NAME;
140 }
141 else if (type == GroupConstants.TYPE_COMMUNITY_PRIVATE) {
142 templateCommunityName = _PRIVATE_TEMPLATE_COMMUNITY_NAME;
143 }
144 else if (type == GroupConstants.TYPE_COMMUNITY_RESTRICTED) {
145 templateCommunityName = _RESTRICTED_TEMPLATE_COMMUNITY_NAME;
146 }
147 else {
148 throw new IllegalArgumentException(
149 "Invalid community type " + group.getType());
150 }
151
152 Group templateGroup = null;
153
154 try {
155 templateGroup = GroupLocalServiceUtil.getGroup(
156 group.getCompanyId(), templateCommunityName);
157 }
158 catch (NoSuchGroupException nsge1) {
159 try {
160 templateGroup = GroupLocalServiceUtil.getGroup(
161 group.getCompanyId(), _DEFAULT_TEMPLATE_COMMUNITY_NAME);
162 }
163 catch (NoSuchGroupException nsge2) {
164 }
165 }
166
167 return templateGroup;
168 }
169
170 protected Map<String, String[]> getTemplateParameters() {
171 Map<String, String[]> parameterMap =
172 new LinkedHashMap<String, String[]>();
173
174 parameterMap.put(
175 PortletDataHandlerKeys.DATA_STRATEGY,
176 new String[] {PortletDataHandlerKeys.DATA_STRATEGY_MIRROR});
177 parameterMap.put(
178 PortletDataHandlerKeys.DELETE_MISSING_LAYOUTS,
179 new String[] {Boolean.FALSE.toString()});
180 parameterMap.put(
181 PortletDataHandlerKeys.DELETE_PORTLET_DATA,
182 new String[] {Boolean.FALSE.toString()});
183 parameterMap.put(
184 PortletDataHandlerKeys.LAYOUTS_IMPORT_MODE,
185 new String[] {
186 PortletDataHandlerKeys.LAYOUTS_IMPORT_MODE_MERGE_BY_LAYOUT_NAME
187 });
188 parameterMap.put(
189 PortletDataHandlerKeys.PERMISSIONS,
190 new String[] {Boolean.TRUE.toString()});
191 parameterMap.put(
192 PortletDataHandlerKeys.PORTLET_DATA,
193 new String[] {Boolean.TRUE.toString()});
194 parameterMap.put(
195 PortletDataHandlerKeys.PORTLET_DATA_ALL,
196 new String[] {Boolean.TRUE.toString()});
197 parameterMap.put(
198 PortletDataHandlerKeys.PORTLET_SETUP,
199 new String[] {Boolean.TRUE.toString()});
200 parameterMap.put(
201 PortletDataHandlerKeys.PORTLET_USER_PREFERENCES,
202 new String[] {Boolean.TRUE.toString()});
203 parameterMap.put(
204 PortletDataHandlerKeys.PORTLETS_MERGE_MODE,
205 new String[] {
206 PortletDataHandlerKeys.PORTLETS_MERGE_MODE_ADD_TO_BOTTOM
207 });
208 parameterMap.put(
209 PortletDataHandlerKeys.THEME,
210 new String[] {Boolean.FALSE.toString()});
211 parameterMap.put(
212 PortletDataHandlerKeys.USER_ID_STRATEGY,
213 new String[] {UserIdStrategy.CURRENT_USER_ID});
214 parameterMap.put(
215 PortletDataHandlerKeys.USER_PERMISSIONS,
216 new String[] {Boolean.FALSE.toString()});
217
218 return parameterMap;
219 }
220
221 private static final String _DEFAULT_TEMPLATE_COMMUNITY_NAME =
222 "DEFAULT_TEMPLATE";
223
224 private static final String _OPEN_TEMPLATE_COMMUNITY_NAME =
225 "OPEN_TEMPLATE";
226
227 private static final String _PRIVATE_TEMPLATE_COMMUNITY_NAME =
228 "PRIVATE_TEMPLATE";
229
230 private static final String _RESTRICTED_TEMPLATE_COMMUNITY_NAME =
231 "RESTRICTED_TEMPLATE";
232
233 private static final String _TEMPLATE_POSTFIX = "_TEMPLATE";
234
235 private static Log _log =
236 LogFactoryUtil.getLog(CommunityTemplateModelListener.class);
237
238 private Map<String, String[]> _templateParameters;
239
240 }