001
014
015 package com.liferay.portlet.wiki.lar;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
020 import com.liferay.portal.kernel.lar.ExportImportHelperUtil;
021 import com.liferay.portal.kernel.lar.ExportImportPathUtil;
022 import com.liferay.portal.kernel.lar.PortletDataContext;
023 import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
024 import com.liferay.portal.kernel.log.Log;
025 import com.liferay.portal.kernel.log.LogFactoryUtil;
026 import com.liferay.portal.kernel.repository.model.FileEntry;
027 import com.liferay.portal.kernel.trash.TrashHandler;
028 import com.liferay.portal.kernel.util.MapUtil;
029 import com.liferay.portal.kernel.util.MimeTypesUtil;
030 import com.liferay.portal.kernel.util.StreamUtil;
031 import com.liferay.portal.kernel.util.Validator;
032 import com.liferay.portal.kernel.xml.Element;
033 import com.liferay.portal.service.ServiceContext;
034 import com.liferay.portlet.documentlibrary.NoSuchFileException;
035 import com.liferay.portlet.documentlibrary.lar.FileEntryUtil;
036 import com.liferay.portlet.wiki.NoSuchPageException;
037 import com.liferay.portlet.wiki.model.WikiNode;
038 import com.liferay.portlet.wiki.model.WikiPage;
039 import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
040
041 import java.io.InputStream;
042
043 import java.util.List;
044 import java.util.Map;
045
046
049 public class WikiPageStagedModelDataHandler
050 extends BaseStagedModelDataHandler<WikiPage> {
051
052 public static final String[] CLASS_NAMES = {WikiPage.class.getName()};
053
054 @Override
055 public void deleteStagedModel(
056 String uuid, long groupId, String className, String extraData)
057 throws PortalException, SystemException {
058
059 WikiPage wikiPage =
060 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
061 uuid, groupId);
062
063 if (wikiPage != null) {
064 WikiPageLocalServiceUtil.deletePage(wikiPage);
065 }
066 }
067
068 @Override
069 public String[] getClassNames() {
070 return CLASS_NAMES;
071 }
072
073 @Override
074 protected void doExportStagedModel(
075 PortletDataContext portletDataContext, WikiPage page)
076 throws Exception {
077
078 Element pageElement = portletDataContext.getExportDataElement(page);
079
080 StagedModelDataHandlerUtil.exportReferenceStagedModel(
081 portletDataContext, page, page.getNode(),
082 PortletDataContext.REFERENCE_TYPE_PARENT);
083
084 String content = ExportImportHelperUtil.replaceExportContentReferences(
085 portletDataContext, page, pageElement, page.getContent(),
086 portletDataContext.getBooleanParameter(
087 WikiPortletDataHandler.NAMESPACE, "referenced-content"));
088
089 page.setContent(content);
090
091 if (page.isHead()) {
092 for (FileEntry fileEntry : page.getAttachmentsFileEntries()) {
093 StagedModelDataHandlerUtil.exportReferenceStagedModel(
094 portletDataContext, page, fileEntry,
095 PortletDataContext.REFERENCE_TYPE_WEAK);
096 }
097 }
098
099 portletDataContext.addClassedModel(
100 pageElement, ExportImportPathUtil.getModelPath(page), page);
101 }
102
103 @Override
104 protected void doImportCompanyStagedModel(
105 PortletDataContext portletDataContext, String uuid, long pageId)
106 throws Exception {
107
108 WikiPage existingPage =
109 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
110 uuid, portletDataContext.getCompanyGroupId());
111
112 Map<Long, Long> pageIds =
113 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
114 WikiPage.class);
115
116 pageIds.put(pageId, existingPage.getPageId());
117 }
118
119 @Override
120 protected void doImportStagedModel(
121 PortletDataContext portletDataContext, WikiPage page)
122 throws Exception {
123
124 long userId = portletDataContext.getUserId(page.getUserUuid());
125
126 StagedModelDataHandlerUtil.importReferenceStagedModel(
127 portletDataContext, page, WikiNode.class, page.getNodeId());
128
129 Element pageElement =
130 portletDataContext.getImportDataStagedModelElement(page);
131
132 String content = ExportImportHelperUtil.replaceImportContentReferences(
133 portletDataContext, pageElement, page.getContent(),
134 portletDataContext.getBooleanParameter(
135 WikiPortletDataHandler.NAMESPACE, "referenced-content"));
136
137 page.setContent(content);
138
139 ServiceContext serviceContext = portletDataContext.createServiceContext(
140 page);
141
142 Map<Long, Long> nodeIds =
143 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
144 WikiNode.class);
145
146 long nodeId = MapUtil.getLong(
147 nodeIds, page.getNodeId(), page.getNodeId());
148
149 WikiPage importedPage = null;
150
151 WikiPage existingPage =
152 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
153 page.getUuid(), portletDataContext.getScopeGroupId());
154
155 if (existingPage == null) {
156 try {
157 existingPage = WikiPageLocalServiceUtil.getPage(
158 nodeId, page.getTitle());
159 }
160 catch (NoSuchPageException nspe) {
161 }
162 }
163
164 if (existingPage == null) {
165 serviceContext.setUuid(page.getUuid());
166
167 importedPage = WikiPageLocalServiceUtil.addPage(
168 userId, nodeId, page.getTitle(), page.getVersion(),
169 page.getContent(), page.getSummary(), page.isMinorEdit(),
170 page.getFormat(), page.getHead(), page.getParentTitle(),
171 page.getRedirectTitle(), serviceContext);
172 }
173 else {
174 importedPage = WikiPageLocalServiceUtil.updatePage(
175 userId, nodeId, existingPage.getTitle(), 0, page.getContent(),
176 page.getSummary(), page.isMinorEdit(), page.getFormat(),
177 page.getParentTitle(), page.getRedirectTitle(), serviceContext);
178 }
179
180 if (page.isHead()) {
181 List<Element> attachmentElements =
182 portletDataContext.getReferenceDataElements(
183 pageElement, FileEntry.class,
184 PortletDataContext.REFERENCE_TYPE_WEAK);
185
186 for (Element attachmentElement : attachmentElements) {
187 String path = attachmentElement.attributeValue("path");
188
189 FileEntry fileEntry =
190 (FileEntry)portletDataContext.getZipEntryAsObject(path);
191
192 InputStream inputStream = null;
193 String mimeType = null;
194
195 try {
196 String binPath = attachmentElement.attributeValue(
197 "bin-path");
198
199 if (Validator.isNull(binPath) &&
200 portletDataContext.isPerformDirectBinaryImport()) {
201
202 try {
203 inputStream = FileEntryUtil.getContentStream(
204 fileEntry);
205 }
206 catch (NoSuchFileException nsfe) {
207 }
208 }
209 else {
210 inputStream =
211 portletDataContext.getZipEntryAsInputStream(
212 binPath);
213 }
214
215 if (inputStream == null) {
216 if (_log.isWarnEnabled()) {
217 _log.warn(
218 "Unable to import attachment for file entry " +
219 fileEntry.getFileEntryId());
220 }
221
222 continue;
223 }
224
225 mimeType = MimeTypesUtil.getContentType(
226 inputStream, fileEntry.getTitle());
227
228 WikiPageLocalServiceUtil.addPageAttachment(
229 userId, importedPage.getNodeId(),
230 importedPage.getTitle(), fileEntry.getTitle(),
231 inputStream, mimeType);
232 }
233 finally {
234 StreamUtil.cleanUp(inputStream);
235 }
236 }
237 }
238
239 portletDataContext.importClassedModel(page, importedPage);
240 }
241
242 @Override
243 protected void doRestoreStagedModel(
244 PortletDataContext portletDataContext, WikiPage page)
245 throws Exception {
246
247 long userId = portletDataContext.getUserId(page.getUserUuid());
248
249 WikiPage existingPage =
250 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
251 page.getUuid(), portletDataContext.getScopeGroupId());
252
253 if ((existingPage == null) || !existingPage.isInTrash()) {
254 return;
255 }
256
257 TrashHandler trashHandler = existingPage.getTrashHandler();
258
259 if (trashHandler.isRestorable(existingPage.getResourcePrimKey())) {
260 trashHandler.restoreTrashEntry(
261 userId, existingPage.getResourcePrimKey());
262 }
263 }
264
265 private static Log _log = LogFactoryUtil.getLog(
266 WikiPageStagedModelDataHandler.class);
267
268 }