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