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.util.MapUtil;
026 import com.liferay.portal.kernel.util.MimeTypesUtil;
027 import com.liferay.portal.kernel.util.StreamUtil;
028 import com.liferay.portal.kernel.xml.Element;
029 import com.liferay.portal.service.ServiceContext;
030 import com.liferay.portlet.wiki.NoSuchPageException;
031 import com.liferay.portlet.wiki.model.WikiNode;
032 import com.liferay.portlet.wiki.model.WikiPage;
033 import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
034
035 import java.io.InputStream;
036
037 import java.util.List;
038 import java.util.Map;
039
040
043 public class WikiPageStagedModelDataHandler
044 extends BaseStagedModelDataHandler<WikiPage> {
045
046 public static final String[] CLASS_NAMES = {WikiPage.class.getName()};
047
048 @Override
049 public void deleteStagedModel(
050 String uuid, long groupId, String className, String extraData)
051 throws PortalException, SystemException {
052
053 WikiPage wikiPage =
054 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
055 uuid, groupId);
056
057 if (wikiPage != null) {
058 WikiPageLocalServiceUtil.deletePage(wikiPage);
059 }
060 }
061
062 @Override
063 public String[] getClassNames() {
064 return CLASS_NAMES;
065 }
066
067 @Override
068 protected void doExportStagedModel(
069 PortletDataContext portletDataContext, WikiPage page)
070 throws Exception {
071
072 Element pageElement = portletDataContext.getExportDataElement(page);
073
074 StagedModelDataHandlerUtil.exportReferenceStagedModel(
075 portletDataContext, page, page.getNode(),
076 PortletDataContext.REFERENCE_TYPE_PARENT);
077
078 String content = ExportImportHelperUtil.replaceExportContentReferences(
079 portletDataContext, page, pageElement, page.getContent(),
080 portletDataContext.getBooleanParameter(
081 WikiPortletDataHandler.NAMESPACE, "referenced-content"));
082
083 page.setContent(content);
084
085 if (page.isHead()) {
086 for (FileEntry fileEntry : page.getAttachmentsFileEntries()) {
087 StagedModelDataHandlerUtil.exportReferenceStagedModel(
088 portletDataContext, page, WikiPage.class, fileEntry,
089 FileEntry.class, PortletDataContext.REFERENCE_TYPE_WEAK);
090 }
091 }
092
093 portletDataContext.addClassedModel(
094 pageElement, ExportImportPathUtil.getModelPath(page), page,
095 WikiPortletDataHandler.NAMESPACE);
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, WikiPortletDataHandler.NAMESPACE);
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(
208 page, importedPage, WikiPortletDataHandler.NAMESPACE);
209 }
210
211 }