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.exportStagedModel(
075 portletDataContext, page.getNode());
076
077 String content = ExportImportHelperUtil.replaceExportContentReferences(
078 portletDataContext, page, pageElement, page.getContent(),
079 portletDataContext.getBooleanParameter(
080 WikiPortletDataHandler.NAMESPACE, "referenced-content"));
081
082 page.setContent(content);
083
084 if (page.isHead()) {
085 for (FileEntry fileEntry : page.getAttachmentsFileEntries()) {
086 StagedModelDataHandlerUtil.exportStagedModel(
087 portletDataContext, fileEntry);
088
089 portletDataContext.addReferenceElement(
090 page, pageElement, fileEntry, FileEntry.class,
091 PortletDataContext.REFERENCE_TYPE_WEAK, false);
092 }
093 }
094
095 portletDataContext.addClassedModel(
096 pageElement, ExportImportPathUtil.getModelPath(page), page,
097 WikiPortletDataHandler.NAMESPACE);
098 }
099
100 @Override
101 protected void doImportStagedModel(
102 PortletDataContext portletDataContext, WikiPage page)
103 throws Exception {
104
105 long userId = portletDataContext.getUserId(page.getUserUuid());
106
107 String nodePath = ExportImportPathUtil.getModelPath(
108 portletDataContext, WikiNode.class.getName(), page.getNodeId());
109
110 WikiNode node = (WikiNode)portletDataContext.getZipEntryAsObject(
111 nodePath);
112
113 StagedModelDataHandlerUtil.importStagedModel(portletDataContext, node);
114
115 Element pageElement =
116 portletDataContext.getImportDataStagedModelElement(page);
117
118 String content = ExportImportHelperUtil.replaceImportContentReferences(
119 portletDataContext, pageElement, page.getContent(),
120 portletDataContext.getBooleanParameter(
121 WikiPortletDataHandler.NAMESPACE, "referenced-content"));
122
123 page.setContent(content);
124
125 ServiceContext serviceContext = portletDataContext.createServiceContext(
126 page, WikiPortletDataHandler.NAMESPACE);
127
128 Map<Long, Long> nodeIds =
129 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
130 WikiNode.class);
131
132 long nodeId = MapUtil.getLong(
133 nodeIds, page.getNodeId(), page.getNodeId());
134
135 WikiPage importedPage = null;
136
137 WikiPage existingPage =
138 WikiPageLocalServiceUtil.fetchWikiPageByUuidAndGroupId(
139 page.getUuid(), portletDataContext.getScopeGroupId());
140
141 if (existingPage == null) {
142 try {
143 existingPage = WikiPageLocalServiceUtil.getPage(
144 nodeId, page.getTitle());
145 }
146 catch (NoSuchPageException nspe) {
147 }
148 }
149
150 if (existingPage == null) {
151 serviceContext.setUuid(page.getUuid());
152
153 importedPage = WikiPageLocalServiceUtil.addPage(
154 userId, nodeId, page.getTitle(), page.getVersion(),
155 page.getContent(), page.getSummary(), page.isMinorEdit(),
156 page.getFormat(), page.getHead(), page.getParentTitle(),
157 page.getRedirectTitle(), serviceContext);
158 }
159 else {
160 importedPage = WikiPageLocalServiceUtil.updatePage(
161 userId, nodeId, existingPage.getTitle(), 0, page.getContent(),
162 page.getSummary(), page.isMinorEdit(), page.getFormat(),
163 page.getParentTitle(), page.getRedirectTitle(), serviceContext);
164 }
165
166 if (page.isHead()) {
167 List<Element> attachmentElements =
168 portletDataContext.getReferenceDataElements(
169 pageElement, FileEntry.class,
170 PortletDataContext.REFERENCE_TYPE_WEAK);
171
172 for (Element attachmentElement : attachmentElements) {
173 String path = attachmentElement.attributeValue("path");
174 String binPath = attachmentElement.attributeValue("bin-path");
175
176 FileEntry fileEntry =
177 (FileEntry)portletDataContext.getZipEntryAsObject(path);
178
179 InputStream inputStream = null;
180 String mimeType = null;
181
182 try {
183 inputStream = portletDataContext.getZipEntryAsInputStream(
184 binPath);
185
186 mimeType = MimeTypesUtil.getContentType(
187 inputStream, fileEntry.getTitle());
188 }
189 finally {
190 StreamUtil.cleanUp(inputStream);
191 }
192
193 try {
194 inputStream = portletDataContext.getZipEntryAsInputStream(
195 binPath);
196
197 WikiPageLocalServiceUtil.addPageAttachment(
198 userId, importedPage.getNodeId(),
199 importedPage.getTitle(), fileEntry.getTitle(),
200 inputStream, mimeType);
201 }
202 finally {
203 StreamUtil.cleanUp(inputStream);
204 }
205 }
206 }
207
208 portletDataContext.importClassedModel(
209 page, importedPage, WikiPortletDataHandler.NAMESPACE);
210 }
211
212 }