001
014
015 package com.liferay.portlet.bookmarks.lar;
016
017 import com.liferay.portal.kernel.lar.BasePortletDataHandler;
018 import com.liferay.portal.kernel.lar.PortletDataContext;
019 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
020 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
021 import com.liferay.portal.kernel.util.MapUtil;
022 import com.liferay.portal.kernel.util.StringBundler;
023 import com.liferay.portal.kernel.xml.Document;
024 import com.liferay.portal.kernel.xml.Element;
025 import com.liferay.portal.kernel.xml.SAXReaderUtil;
026 import com.liferay.portal.service.ServiceContext;
027 import com.liferay.portal.util.PortletKeys;
028 import com.liferay.portlet.bookmarks.model.BookmarksEntry;
029 import com.liferay.portlet.bookmarks.model.BookmarksFolder;
030 import com.liferay.portlet.bookmarks.model.BookmarksFolderConstants;
031 import com.liferay.portlet.bookmarks.service.BookmarksEntryLocalServiceUtil;
032 import com.liferay.portlet.bookmarks.service.BookmarksFolderLocalServiceUtil;
033 import com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryUtil;
034 import com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderUtil;
035
036 import java.util.List;
037 import java.util.Map;
038
039 import javax.portlet.PortletPreferences;
040
041
047 public class BookmarksPortletDataHandlerImpl extends BasePortletDataHandler {
048
049 @Override
050 public PortletDataHandlerControl[] getExportControls() {
051 return new PortletDataHandlerControl[] {
052 _foldersAndEntries, _categories, _ratings, _tags
053 };
054 }
055
056 @Override
057 public PortletDataHandlerControl[] getImportControls() {
058 return new PortletDataHandlerControl[] {
059 _foldersAndEntries, _categories, _ratings, _tags
060 };
061 }
062
063 @Override
064 public boolean isAlwaysExportable() {
065 return _ALWAYS_EXPORTABLE;
066 }
067
068 @Override
069 public boolean isPublishToLiveByDefault() {
070 return _PUBLISH_TO_LIVE_BY_DEFAULT;
071 }
072
073 @Override
074 protected PortletPreferences doDeleteData(
075 PortletDataContext portletDataContext, String portletId,
076 PortletPreferences portletPreferences)
077 throws Exception {
078
079 if (!portletDataContext.addPrimaryKey(
080 BookmarksPortletDataHandlerImpl.class, "deleteData")) {
081
082 BookmarksFolderLocalServiceUtil.deleteFolders(
083 portletDataContext.getScopeGroupId());
084
085 BookmarksEntryLocalServiceUtil.deleteEntries(
086 portletDataContext.getScopeGroupId(),
087 BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID);
088 }
089
090 return null;
091 }
092
093 @Override
094 protected String doExportData(
095 PortletDataContext portletDataContext, String portletId,
096 PortletPreferences portletPreferences)
097 throws Exception {
098
099 portletDataContext.addPermissions(
100 "com.liferay.portlet.bookmarks",
101 portletDataContext.getScopeGroupId());
102
103 Document document = SAXReaderUtil.createDocument();
104
105 Element rootElement = document.addElement("bookmarks-data");
106
107 rootElement.addAttribute(
108 "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
109
110 Element foldersElement = rootElement.addElement("folders");
111 Element entriesElement = rootElement.addElement("entries");
112
113 List<BookmarksFolder> folders = BookmarksFolderUtil.findByGroupId(
114 portletDataContext.getScopeGroupId());
115
116 for (BookmarksFolder folder : folders) {
117 exportFolder(
118 portletDataContext, foldersElement, entriesElement, folder);
119 }
120
121 List<BookmarksEntry> entries = BookmarksEntryUtil.findByG_F(
122 portletDataContext.getScopeGroupId(),
123 BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID);
124
125 for (BookmarksEntry entry : entries) {
126 exportEntry(portletDataContext, null, entriesElement, entry);
127 }
128
129 return document.formattedString();
130 }
131
132 @Override
133 protected PortletPreferences doImportData(
134 PortletDataContext portletDataContext, String portletId,
135 PortletPreferences portletPreferences, String data)
136 throws Exception {
137
138 portletDataContext.importPermissions(
139 "com.liferay.portlet.bookmarks",
140 portletDataContext.getSourceGroupId(),
141 portletDataContext.getScopeGroupId());
142
143 Document document = SAXReaderUtil.read(data);
144
145 Element rootElement = document.getRootElement();
146
147 Element foldersElement = rootElement.element("folders");
148
149 for (Element folderElement : foldersElement.elements("folder")) {
150 String path = folderElement.attributeValue("path");
151
152 if (!portletDataContext.isPathNotProcessed(path)) {
153 continue;
154 }
155
156 BookmarksFolder folder =
157 (BookmarksFolder)portletDataContext.getZipEntryAsObject(path);
158
159 importFolder(portletDataContext, path, folder);
160 }
161
162 Element entriesElement = rootElement.element("entries");
163
164 for (Element entryElement : entriesElement.elements("entry")) {
165 String path = entryElement.attributeValue("path");
166
167 if (!portletDataContext.isPathNotProcessed(path)) {
168 continue;
169 }
170
171 BookmarksEntry entry =
172 (BookmarksEntry)portletDataContext.getZipEntryAsObject(path);
173
174 importEntry(portletDataContext, entryElement, entry);
175 }
176
177 return null;
178 }
179
180 protected void exportFolder(
181 PortletDataContext portletDataContext, Element foldersElement,
182 Element entriesElement, BookmarksFolder folder)
183 throws Exception {
184
185 if (portletDataContext.isWithinDateRange(folder.getModifiedDate())) {
186 exportParentFolder(
187 portletDataContext, foldersElement, folder.getParentFolderId());
188
189 String path = getFolderPath(portletDataContext, folder);
190
191 if (portletDataContext.isPathNotProcessed(path)) {
192 Element folderElement = foldersElement.addElement("folder");
193
194 portletDataContext.addClassedModel(
195 folderElement, path, folder, _NAMESPACE);
196 }
197 }
198
199 List<BookmarksEntry> entries = BookmarksEntryUtil.findByG_F(
200 folder.getGroupId(), folder.getFolderId());
201
202 for (BookmarksEntry entry : entries) {
203 exportEntry(
204 portletDataContext, foldersElement, entriesElement, entry);
205 }
206 }
207
208 protected void exportEntry(
209 PortletDataContext portletDataContext, Element foldersElement,
210 Element entriesElement, BookmarksEntry entry)
211 throws Exception {
212
213 if (!portletDataContext.isWithinDateRange(entry.getModifiedDate())) {
214 return;
215 }
216
217 if (foldersElement != null) {
218 exportParentFolder(
219 portletDataContext, foldersElement, entry.getFolderId());
220 }
221
222 String path = getEntryPath(portletDataContext, entry);
223
224 if (portletDataContext.isPathNotProcessed(path)) {
225 Element entryElement = entriesElement.addElement("entry");
226
227 portletDataContext.addClassedModel(
228 entryElement, path, entry, _NAMESPACE);
229 }
230 }
231
232 protected void exportParentFolder(
233 PortletDataContext portletDataContext, Element foldersElement,
234 long folderId)
235 throws Exception {
236
237 if (folderId == BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
238 return;
239 }
240
241 BookmarksFolder folder = BookmarksFolderUtil.findByPrimaryKey(folderId);
242
243 exportParentFolder(
244 portletDataContext, foldersElement, folder.getParentFolderId());
245
246 String path = getFolderPath(portletDataContext, folder);
247
248 if (portletDataContext.isPathNotProcessed(path)) {
249 Element folderElement = foldersElement.addElement("folder");
250
251 portletDataContext.addClassedModel(
252 folderElement, path, folder, _NAMESPACE);
253 }
254 }
255
256 protected String getEntryPath(
257 PortletDataContext portletDataContext, BookmarksEntry entry) {
258
259 StringBundler sb = new StringBundler(4);
260
261 sb.append(portletDataContext.getPortletPath(PortletKeys.BOOKMARKS));
262 sb.append("/entries/");
263 sb.append(entry.getEntryId());
264 sb.append(".xml");
265
266 return sb.toString();
267 }
268
269 protected String getFolderPath(
270 PortletDataContext portletDataContext, BookmarksFolder folder) {
271
272 StringBundler sb = new StringBundler(4);
273
274 sb.append(portletDataContext.getPortletPath(PortletKeys.BOOKMARKS));
275 sb.append("/folders/");
276 sb.append(folder.getFolderId());
277 sb.append(".xml");
278
279 return sb.toString();
280 }
281
282 protected String getImportFolderPath(
283 PortletDataContext portletDataContext, long folderId) {
284
285 StringBundler sb = new StringBundler(4);
286
287 sb.append(
288 portletDataContext.getSourcePortletPath(PortletKeys.BOOKMARKS));
289 sb.append("/folders/");
290 sb.append(folderId);
291 sb.append(".xml");
292
293 return sb.toString();
294 }
295
296 protected void importEntry(
297 PortletDataContext portletDataContext, Element entryElement,
298 BookmarksEntry entry)
299 throws Exception {
300
301 long userId = portletDataContext.getUserId(entry.getUserUuid());
302
303 Map<Long, Long> folderPKs =
304 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
305 BookmarksFolder.class);
306
307 long folderId = MapUtil.getLong(
308 folderPKs, entry.getFolderId(), entry.getFolderId());
309
310 if ((folderId != BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
311 (folderId == entry.getFolderId())) {
312
313 String path = getImportFolderPath(portletDataContext, folderId);
314
315 BookmarksFolder folder =
316 (BookmarksFolder)portletDataContext.getZipEntryAsObject(path);
317
318 importFolder(portletDataContext, path, folder);
319
320 folderId = MapUtil.getLong(
321 folderPKs, entry.getFolderId(), entry.getFolderId());
322 }
323
324 ServiceContext serviceContext = portletDataContext.createServiceContext(
325 entryElement, entry, _NAMESPACE);
326
327 BookmarksEntry importedEntry = null;
328
329 if (portletDataContext.isDataStrategyMirror()) {
330 BookmarksEntry existingEntry = BookmarksEntryUtil.fetchByUUID_G(
331 entry.getUuid(), portletDataContext.getScopeGroupId());
332
333 if (existingEntry == null) {
334 serviceContext.setUuid(entry.getUuid());
335
336 importedEntry = BookmarksEntryLocalServiceUtil.addEntry(
337 userId, portletDataContext.getScopeGroupId(), folderId,
338 entry.getName(), entry.getUrl(), entry.getDescription(),
339 serviceContext);
340 }
341 else {
342 importedEntry = BookmarksEntryLocalServiceUtil.updateEntry(
343 userId, existingEntry.getEntryId(),
344 portletDataContext.getScopeGroupId(), folderId,
345 entry.getName(), entry.getUrl(), entry.getDescription(),
346 serviceContext);
347 }
348 }
349 else {
350 importedEntry = BookmarksEntryLocalServiceUtil.addEntry(
351 userId, portletDataContext.getScopeGroupId(), folderId,
352 entry.getName(), entry.getUrl(), entry.getDescription(),
353 serviceContext);
354 }
355
356 portletDataContext.importClassedModel(entry, importedEntry, _NAMESPACE);
357 }
358
359 protected void importFolder(
360 PortletDataContext portletDataContext, String folderPath,
361 BookmarksFolder folder)
362 throws Exception {
363
364 long userId = portletDataContext.getUserId(folder.getUserUuid());
365
366 Map<Long, Long> folderPKs =
367 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
368 BookmarksFolder.class);
369
370 long parentFolderId = MapUtil.getLong(
371 folderPKs, folder.getParentFolderId(), folder.getParentFolderId());
372
373 if ((parentFolderId !=
374 BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
375 (parentFolderId == folder.getParentFolderId())) {
376
377 String path = getImportFolderPath(
378 portletDataContext, parentFolderId);
379
380 BookmarksFolder parentFolder =
381 (BookmarksFolder)portletDataContext.getZipEntryAsObject(path);
382
383 importFolder(portletDataContext, path, parentFolder);
384
385 parentFolderId = MapUtil.getLong(
386 folderPKs, folder.getParentFolderId(),
387 folder.getParentFolderId());
388 }
389
390 ServiceContext serviceContext = portletDataContext.createServiceContext(
391 folderPath, folder, _NAMESPACE);
392
393 BookmarksFolder importedFolder = null;
394
395 if (portletDataContext.isDataStrategyMirror()) {
396 BookmarksFolder existingFolder = BookmarksFolderUtil.fetchByUUID_G(
397 folder.getUuid(), portletDataContext.getScopeGroupId());
398
399 if (existingFolder == null) {
400 serviceContext.setUuid(folder.getUuid());
401
402 importedFolder = BookmarksFolderLocalServiceUtil.addFolder(
403 userId, parentFolderId, folder.getName(),
404 folder.getDescription(), serviceContext);
405 }
406 else {
407 importedFolder = BookmarksFolderLocalServiceUtil.updateFolder(
408 existingFolder.getFolderId(), parentFolderId,
409 folder.getName(), folder.getDescription(), false,
410 serviceContext);
411 }
412 }
413 else {
414 importedFolder = BookmarksFolderLocalServiceUtil.addFolder(
415 userId, parentFolderId, folder.getName(),
416 folder.getDescription(), serviceContext);
417 }
418
419 portletDataContext.importClassedModel(
420 folder, importedFolder, _NAMESPACE);
421 }
422
423 private static final boolean _ALWAYS_EXPORTABLE = true;
424
425 private static final String _NAMESPACE = "bookmarks";
426
427 private static final boolean _PUBLISH_TO_LIVE_BY_DEFAULT = true;
428
429 private static PortletDataHandlerBoolean _categories =
430 new PortletDataHandlerBoolean(_NAMESPACE, "categories");
431
432 private static PortletDataHandlerBoolean _foldersAndEntries =
433 new PortletDataHandlerBoolean(
434 _NAMESPACE, "folders-and-entries", true, true);
435
436 private static PortletDataHandlerBoolean _ratings =
437 new PortletDataHandlerBoolean(_NAMESPACE, "ratings");
438
439 private static PortletDataHandlerBoolean _tags =
440 new PortletDataHandlerBoolean(_NAMESPACE, "tags");
441
442 }