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.importStagedModel(portletDataContext, node);
112
113 Element pageElement =
114 portletDataContext.getImportDataStagedModelElement(page);
115
116 String content = ExportImportHelperUtil.replaceImportContentReferences(
117 portletDataContext, pageElement, page.getContent(),
118 portletDataContext.getBooleanParameter(
119 WikiPortletDataHandler.NAMESPACE, "referenced-content"));
120
121 page.setContent(content);
122
123 ServiceContext serviceContext = portletDataContext.createServiceContext(
124 page, WikiPortletDataHandler.NAMESPACE);
125
126 Map<Long, Long> nodeIds =
127 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
128 WikiNode.class);
129
130 long nodeId = MapUtil.getLong(
131 nodeIds, page.getNodeId(), page.getNodeId());
132
133 WikiPage importedPage = null;
134
135 WikiPage existingPage =
136 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
137 page.getUuid(), portletDataContext.getScopeGroupId());
138
139 if (existingPage == null) {
140 try {
141 existingPage = WikiPageLocalServiceUtil.getPage(
142 nodeId, page.getTitle());
143 }
144 catch (NoSuchPageException nspe) {
145 }
146 }
147
148 if (existingPage == null) {
149 serviceContext.setUuid(page.getUuid());
150
151 importedPage = WikiPageLocalServiceUtil.addPage(
152 userId, nodeId, page.getTitle(), page.getVersion(),
153 page.getContent(), page.getSummary(), page.isMinorEdit(),
154 page.getFormat(), page.getHead(), page.getParentTitle(),
155 page.getRedirectTitle(), serviceContext);
156 }
157 else {
158 importedPage = WikiPageLocalServiceUtil.updatePage(
159 userId, nodeId, existingPage.getTitle(), 0, page.getContent(),
160 page.getSummary(), page.isMinorEdit(), page.getFormat(),
161 page.getParentTitle(), page.getRedirectTitle(), serviceContext);
162 }
163
164 if (page.isHead()) {
165 List<Element> attachmentElements =
166 portletDataContext.getReferenceDataElements(
167 pageElement, FileEntry.class,
168 PortletDataContext.REFERENCE_TYPE_WEAK);
169
170 for (Element attachmentElement : attachmentElements) {
171 String path = attachmentElement.attributeValue("path");
172 String binPath = attachmentElement.attributeValue("bin-path");
173
174 FileEntry fileEntry =
175 (FileEntry)portletDataContext.getZipEntryAsObject(path);
176
177 InputStream inputStream = null;
178 String mimeType = null;
179
180 try {
181 inputStream = portletDataContext.getZipEntryAsInputStream(
182 binPath);
183
184 mimeType = MimeTypesUtil.getContentType(
185 inputStream, fileEntry.getTitle());
186 }
187 finally {
188 StreamUtil.cleanUp(inputStream);
189 }
190
191 try {
192 inputStream = portletDataContext.getZipEntryAsInputStream(
193 binPath);
194
195 WikiPageLocalServiceUtil.addPageAttachment(
196 userId, importedPage.getNodeId(),
197 importedPage.getTitle(), fileEntry.getTitle(),
198 inputStream, mimeType);
199 }
200 finally {
201 StreamUtil.cleanUp(inputStream);
202 }
203 }
204 }
205
206 portletDataContext.importClassedModel(
207 page, importedPage, WikiPortletDataHandler.NAMESPACE);
208 }
209
210 }