001
014
015 package com.liferay.portlet.wiki.lar;
016
017 import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018 import com.liferay.portal.kernel.lar.BasePortletDataHandler;
019 import com.liferay.portal.kernel.lar.ExportImportThreadLocal;
020 import com.liferay.portal.kernel.lar.PortletDataContext;
021 import com.liferay.portal.kernel.lar.PortletDataException;
022 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
023 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
024 import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
025 import com.liferay.portal.kernel.lar.StagedModelType;
026 import com.liferay.portal.kernel.log.Log;
027 import com.liferay.portal.kernel.log.LogFactoryUtil;
028 import com.liferay.portal.kernel.util.StringUtil;
029 import com.liferay.portal.kernel.xml.Element;
030 import com.liferay.portal.model.Group;
031 import com.liferay.portal.service.GroupLocalServiceUtil;
032 import com.liferay.portlet.wiki.model.WikiNode;
033 import com.liferay.portlet.wiki.model.WikiPage;
034 import com.liferay.portlet.wiki.service.WikiNodeLocalServiceUtil;
035 import com.liferay.portlet.wiki.service.permission.WikiPermission;
036 import com.liferay.portlet.wiki.service.persistence.WikiNodeExportActionableDynamicQuery;
037 import com.liferay.portlet.wiki.service.persistence.WikiPageExportActionableDynamicQuery;
038 import com.liferay.portlet.wiki.util.WikiCacheThreadLocal;
039 import com.liferay.portlet.wiki.util.WikiCacheUtil;
040
041 import java.util.List;
042 import java.util.Map;
043
044 import javax.portlet.PortletPreferences;
045
046
054 public class WikiPortletDataHandler extends BasePortletDataHandler {
055
056 public static final String NAMESPACE = "wiki";
057
058 public WikiPortletDataHandler() {
059 setDataPortletPreferences("hiddenNodes, visibleNodes");
060 setDeletionSystemEventStagedModelTypes(
061 new StagedModelType(WikiNode.class),
062 new StagedModelType(WikiPage.class));
063 setExportControls(
064 new PortletDataHandlerBoolean(
065 NAMESPACE, "wiki-pages", true, false,
066 new PortletDataHandlerControl[] {
067 new PortletDataHandlerBoolean(
068 NAMESPACE, "referenced-content")
069 },
070 WikiPage.class.getName()));
071 setImportControls(getExportControls());
072 }
073
074 @Override
075 public PortletPreferences importData(
076 PortletDataContext portletDataContext, String portletId,
077 PortletPreferences portletPreferences, String data)
078 throws PortletDataException {
079
080 WikiCacheThreadLocal.setClearCache(false);
081
082 try {
083 return super.importData(
084 portletDataContext, portletId, portletPreferences, data);
085 }
086 finally {
087 WikiCacheThreadLocal.setClearCache(true);
088 }
089 }
090
091 @Override
092 protected PortletPreferences doDeleteData(
093 PortletDataContext portletDataContext, String portletId,
094 PortletPreferences portletPreferences)
095 throws Exception {
096
097 if (portletDataContext.addPrimaryKey(
098 WikiPortletDataHandler.class, "deleteData")) {
099
100 return portletPreferences;
101 }
102
103 WikiNodeLocalServiceUtil.deleteNodes(
104 portletDataContext.getScopeGroupId());
105
106 return portletPreferences;
107 }
108
109 @Override
110 protected String doExportData(
111 final PortletDataContext portletDataContext, String portletId,
112 PortletPreferences portletPreferences)
113 throws Exception {
114
115 Element rootElement = addExportDataRootElement(portletDataContext);
116
117 if (!portletDataContext.getBooleanParameter(NAMESPACE, "wiki-pages")) {
118 return getExportDataRootElementString(rootElement);
119 }
120
121 portletDataContext.addPortletPermissions(WikiPermission.RESOURCE_NAME);
122
123 rootElement.addAttribute(
124 "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
125
126 ActionableDynamicQuery nodeActionableDynamicQuery =
127 new WikiNodeExportActionableDynamicQuery(portletDataContext);
128
129 nodeActionableDynamicQuery.performActions();
130
131 ActionableDynamicQuery pageActionableDynamicQuery =
132 new WikiPageExportActionableDynamicQuery(portletDataContext);
133
134 pageActionableDynamicQuery.performActions();
135
136 return getExportDataRootElementString(rootElement);
137 }
138
139 @Override
140 protected PortletPreferences doImportData(
141 PortletDataContext portletDataContext, String portletId,
142 PortletPreferences portletPreferences, String data)
143 throws Exception {
144
145 if (!portletDataContext.getBooleanParameter(NAMESPACE, "wiki-pages")) {
146 return null;
147 }
148
149 portletDataContext.importPortletPermissions(
150 WikiPermission.RESOURCE_NAME);
151
152 Element nodesElement = portletDataContext.getImportDataGroupElement(
153 WikiNode.class);
154
155 List<Element> nodeElements = nodesElement.elements();
156
157 for (Element nodeElement : nodeElements) {
158 StagedModelDataHandlerUtil.importStagedModel(
159 portletDataContext, nodeElement);
160 }
161
162 Element pagesElement = portletDataContext.getImportDataGroupElement(
163 WikiPage.class);
164
165 List<Element> pageElements = pagesElement.elements();
166
167 for (Element pageElement : pageElements) {
168 StagedModelDataHandlerUtil.importStagedModel(
169 portletDataContext, pageElement);
170 }
171
172 Map<Long, Long> nodeIds =
173 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
174 WikiNode.class);
175
176 for (long nodeId : nodeIds.values()) {
177 WikiCacheUtil.clearCache(nodeId);
178 }
179
180 return null;
181 }
182
183 @Override
184 protected void doPrepareManifestSummary(
185 PortletDataContext portletDataContext,
186 PortletPreferences portletPreferences)
187 throws Exception {
188
189 ActionableDynamicQuery nodeActionableDynamicQuery =
190 new WikiNodeExportActionableDynamicQuery(portletDataContext);
191
192 nodeActionableDynamicQuery.performCount();
193
194 ActionableDynamicQuery pageExportActionableDynamicQuery =
195 new WikiPageExportActionableDynamicQuery(portletDataContext);
196
197 pageExportActionableDynamicQuery.performCount();
198 }
199
200 @Override
201 protected PortletPreferences doProcessExportPortletPreferences(
202 PortletDataContext portletDataContext, String portletId,
203 PortletPreferences portletPreferences)
204 throws Exception {
205
206 Group group = GroupLocalServiceUtil.fetchGroup(
207 portletDataContext.getGroupId());
208
209 String hiddenNodeNames = portletPreferences.getValue(
210 "hiddenNodes", null);
211
212 for (String hiddenNodeName : StringUtil.split(hiddenNodeNames)) {
213 exportNode(portletDataContext, portletId, group, hiddenNodeName);
214 }
215
216 String visibleNodeNames = portletPreferences.getValue(
217 "visibleNodes", null);
218
219 for (String visibleNodeName : StringUtil.split(visibleNodeNames)) {
220 exportNode(portletDataContext, portletId, group, visibleNodeName);
221 }
222
223 return portletPreferences;
224 }
225
226 @Override
227 protected PortletPreferences doProcessImportPortletPreferences(
228 PortletDataContext portletDataContext, String portletId,
229 PortletPreferences portletPreferences)
230 throws Exception {
231
232 StagedModelDataHandlerUtil.importReferenceStagedModels(
233 portletDataContext, WikiNode.class);
234
235 return portletPreferences;
236 }
237
238 protected void exportNode(
239 PortletDataContext portletDataContext, String portletId,
240 Group group, String nodeName)
241 throws Exception {
242
243 if (ExportImportThreadLocal.isStagingInProcess() &&
244 !group.isStagedPortlet(portletId)) {
245
246 return;
247 }
248
249 WikiNode node = WikiNodeLocalServiceUtil.fetchNode(
250 portletDataContext.getScopeGroupId(), nodeName);
251
252 if (node == null) {
253 if (_log.isWarnEnabled()) {
254 _log.warn("Unable to export referenced wiki node " + nodeName);
255 }
256
257 return;
258 }
259
260 StagedModelDataHandlerUtil.exportReferenceStagedModel(
261 portletDataContext, portletId, node);
262 }
263
264 private static Log _log = LogFactoryUtil.getLog(
265 WikiPortletDataHandler.class);
266
267 }