1
22
23 package com.liferay.portlet.bookmarks.lar;
24
25 import com.liferay.portal.PortalException;
26 import com.liferay.portal.SystemException;
27 import com.liferay.portal.kernel.lar.PortletDataContext;
28 import com.liferay.portal.kernel.lar.PortletDataException;
29 import com.liferay.portal.kernel.lar.PortletDataHandler;
30 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
31 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
32 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
33 import com.liferay.portal.util.DocumentUtil;
34 import com.liferay.portal.util.PortletKeys;
35 import com.liferay.portlet.bookmarks.NoSuchEntryException;
36 import com.liferay.portlet.bookmarks.NoSuchFolderException;
37 import com.liferay.portlet.bookmarks.model.BookmarksEntry;
38 import com.liferay.portlet.bookmarks.model.BookmarksFolder;
39 import com.liferay.portlet.bookmarks.model.impl.BookmarksFolderImpl;
40 import com.liferay.portlet.bookmarks.service.BookmarksEntryLocalServiceUtil;
41 import com.liferay.portlet.bookmarks.service.BookmarksFolderLocalServiceUtil;
42 import com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryFinderUtil;
43 import com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryUtil;
44 import com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderUtil;
45 import com.liferay.util.MapUtil;
46 import com.liferay.util.xml.XMLFormatter;
47
48 import java.util.List;
49 import java.util.Map;
50
51 import javax.portlet.PortletPreferences;
52
53 import org.apache.commons.logging.Log;
54 import org.apache.commons.logging.LogFactory;
55
56 import org.dom4j.Document;
57 import org.dom4j.DocumentHelper;
58 import org.dom4j.Element;
59
60
69 public class BookmarksPortletDataHandlerImpl implements PortletDataHandler {
70
71 public PortletPreferences deleteData(
72 PortletDataContext context, String portletId,
73 PortletPreferences prefs)
74 throws PortletDataException {
75
76 try {
77 if (!context.addPrimaryKey(
78 BookmarksPortletDataHandlerImpl.class, "deleteData")) {
79
80 BookmarksFolderLocalServiceUtil.deleteFolders(
81 context.getGroupId());
82 }
83
84 return null;
85 }
86 catch (Exception e) {
87 throw new PortletDataException(e);
88 }
89 }
90
91 public String exportData(
92 PortletDataContext context, String portletId,
93 PortletPreferences prefs)
94 throws PortletDataException {
95
96 try {
97 Document doc = DocumentHelper.createDocument();
98
99 Element root = doc.addElement("bookmarks-data");
100
101 root.addAttribute("group-id", String.valueOf(context.getGroupId()));
102
103 Element foldersEl = root.addElement("folders");
104 Element entriesEl = root.addElement("entries");
105
106 List<BookmarksFolder> folders = BookmarksFolderUtil.findByGroupId(
107 context.getGroupId());
108
109 for (BookmarksFolder folder : folders) {
110 exportFolder(context, foldersEl, entriesEl, folder);
111 }
112
113 return XMLFormatter.toString(doc);
114 }
115 catch (Exception e) {
116 throw new PortletDataException(e);
117 }
118 }
119
120 public PortletDataHandlerControl[] getExportControls() {
121 return new PortletDataHandlerControl[] {_foldersAndEntries, _tags};
122 }
123
124 public PortletDataHandlerControl[] getImportControls() {
125 return new PortletDataHandlerControl[] {_foldersAndEntries, _tags};
126 }
127
128 public PortletPreferences importData(
129 PortletDataContext context, String portletId,
130 PortletPreferences prefs, String data)
131 throws PortletDataException {
132
133 try {
134 Document doc = DocumentUtil.readDocumentFromXML(data);
135
136 Element root = doc.getRootElement();
137
138 List<Element> folderEls = root.element("folders").elements(
139 "folder");
140
141 Map<Long, Long> folderPKs = context.getNewPrimaryKeysMap(
142 BookmarksFolder.class);
143
144 for (Element folderEl : folderEls) {
145 String path = folderEl.attributeValue("path");
146
147 if (context.isPathNotProcessed(path)) {
148 BookmarksFolder folder =
149 (BookmarksFolder)context.getZipEntryAsObject(path);
150
151 importFolder(context, folderPKs, folder);
152 }
153 }
154
155 List<Element> entryEls = root.element("entries").elements("entry");
156
157 for (Element entryEl : entryEls) {
158 String path = entryEl.attributeValue("path");
159
160 if (context.isPathNotProcessed(path)) {
161 BookmarksEntry entry =
162 (BookmarksEntry)context.getZipEntryAsObject(path);
163
164 importEntry(context, folderPKs, entry);
165 }
166 }
167
168 return null;
169 }
170 catch (Exception e) {
171 throw new PortletDataException(e);
172 }
173 }
174
175 public boolean isPublishToLiveByDefault() {
176 return false;
177 }
178
179 protected void exportFolder(
180 PortletDataContext context, Element foldersEl, Element entriesEl,
181 BookmarksFolder folder)
182 throws PortalException, SystemException {
183
184 if (context.isWithinDateRange(folder.getModifiedDate())) {
185 String path = getFolderPath(context, folder);
186
187 Element folderEl = foldersEl.addElement("folder");
188
189 folderEl.addAttribute("path", path);
190
191 if (context.isPathNotProcessed(path)) {
192 folder.setUserUuid(folder.getUserUuid());
193
194 context.addZipEntry(path, folder);
195 }
196
197 exportParentFolder(context, foldersEl, folder.getParentFolderId());
198 }
199
200 List<BookmarksEntry> entries = BookmarksEntryUtil.findByFolderId(
201 folder.getFolderId());
202
203 for (BookmarksEntry entry : entries) {
204 exportEntry(context, foldersEl, entriesEl, entry);
205 }
206 }
207
208 protected void exportEntry(
209 PortletDataContext context, Element foldersEl, Element entriesEl,
210 BookmarksEntry entry)
211 throws PortalException, SystemException {
212
213 if (!context.isWithinDateRange(entry.getModifiedDate())) {
214 return;
215 }
216
217 String path = getEntryPath(context, entry);
218
219 Element entryEl = entriesEl.addElement("entry");
220
221 entryEl.addAttribute("path", path);
222
223 if (context.isPathNotProcessed(path)) {
224 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
225 context.addTagsEntries(
226 BookmarksEntry.class, entry.getEntryId());
227 }
228
229 entry.setUserUuid(entry.getUserUuid());
230
231 context.addZipEntry(path, entry);
232 }
233
234 exportParentFolder(context, foldersEl, entry.getFolderId());
235 }
236
237 protected void exportParentFolder(
238 PortletDataContext context, Element foldersEl, long folderId)
239 throws PortalException, SystemException {
240
241 if ((!context.hasDateRange()) ||
242 (folderId == BookmarksFolderImpl.DEFAULT_PARENT_FOLDER_ID)) {
243
244 return;
245 }
246
247 BookmarksFolder folder = BookmarksFolderUtil.findByPrimaryKey(folderId);
248
249 String path = getFolderPath(context, folder);
250
251 Element folderEl = foldersEl.addElement("folder");
252
253 folderEl.addAttribute("path", path);
254
255 if (context.isPathNotProcessed(path)) {
256 folder.setUserUuid(folder.getUserUuid());
257
258 context.addZipEntry(path, folder);
259 }
260
261 exportParentFolder(context, foldersEl, folder.getParentFolderId());
262 }
263
264 protected String getEntryPath(
265 PortletDataContext context, BookmarksEntry entry) {
266
267 StringBuilder sb = new StringBuilder();
268
269 sb.append(context.getPortletPath(PortletKeys.BOOKMARKS));
270 sb.append("/entries/");
271 sb.append(entry.getEntryId());
272 sb.append(".xml");
273
274 return sb.toString();
275 }
276
277 protected String getFolderPath(
278 PortletDataContext context, BookmarksFolder folder) {
279
280 StringBuilder sb = new StringBuilder();
281
282 sb.append(context.getPortletPath(PortletKeys.BOOKMARKS));
283 sb.append("/folders/");
284 sb.append(folder.getFolderId());
285 sb.append(".xml");
286
287 return sb.toString();
288 }
289
290 protected void importEntry(
291 PortletDataContext context, Map<Long, Long> folderPKs,
292 BookmarksEntry entry)
293 throws Exception {
294
295 long userId = context.getUserId(entry.getUserUuid());
296 long folderId = MapUtil.getLong(
297 folderPKs, entry.getFolderId(), entry.getFolderId());
298
299 String[] tagsEntries = null;
300
301 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
302 tagsEntries = context.getTagsEntries(
303 BookmarksEntry.class, entry.getEntryId());
304 }
305
306 boolean addCommunityPermissions = true;
307 boolean addGuestPermissions = true;
308
309 BookmarksEntry existingEntry = null;
310
311 try {
312 BookmarksFolderUtil.findByPrimaryKey(folderId);
313
314 if (context.getDataStrategy().equals(
315 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
316
317 try {
318 existingEntry = BookmarksEntryFinderUtil.findByUuid_G(
319 entry.getUuid(), context.getGroupId());
320
321 BookmarksEntryLocalServiceUtil.updateEntry(
322 userId, existingEntry.getEntryId(), folderId,
323 entry.getName(), entry.getUrl(), entry.getComments(),
324 tagsEntries);
325 }
326 catch (NoSuchEntryException nsee) {
327 BookmarksEntryLocalServiceUtil.addEntry(
328 entry.getUuid(), userId, folderId, entry.getName(),
329 entry.getUrl(), entry.getComments(), tagsEntries,
330 addCommunityPermissions, addGuestPermissions);
331 }
332 }
333 else {
334 BookmarksEntryLocalServiceUtil.addEntry(
335 userId, folderId, entry.getName(), entry.getUrl(),
336 entry.getComments(), tagsEntries, addCommunityPermissions,
337 addGuestPermissions);
338 }
339 }
340 catch (NoSuchFolderException nsfe) {
341 _log.error(
342 "Could not find the parent folder for entry " +
343 entry.getEntryId());
344 }
345 }
346
347 protected void importFolder(
348 PortletDataContext context, Map<Long, Long> folderPKs,
349 BookmarksFolder folder)
350 throws Exception {
351
352 long userId = context.getUserId(folder.getUserUuid());
353 long plid = context.getPlid();
354 long parentFolderId = MapUtil.getLong(
355 folderPKs, folder.getParentFolderId(), folder.getParentFolderId());
356
357 boolean addCommunityPermissions = true;
358 boolean addGuestPermissions = true;
359
360 BookmarksFolder existingFolder = null;
361
362 try {
363 if (parentFolderId !=
364 BookmarksFolderImpl.DEFAULT_PARENT_FOLDER_ID) {
365
366 BookmarksFolderUtil.findByPrimaryKey(parentFolderId);
367 }
368
369 if (context.getDataStrategy().equals(
370 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
371 existingFolder = BookmarksFolderUtil.fetchByUUID_G(
372 folder.getUuid(), context.getGroupId());
373
374 if (existingFolder == null) {
375 existingFolder = BookmarksFolderLocalServiceUtil.addFolder(
376 folder.getUuid(), userId, plid, parentFolderId,
377 folder.getName(), folder.getDescription(),
378 addCommunityPermissions, addGuestPermissions);
379 }
380 else {
381 existingFolder =
382 BookmarksFolderLocalServiceUtil.updateFolder(
383 existingFolder.getFolderId(), parentFolderId,
384 folder.getName(), folder.getDescription(), false);
385 }
386 }
387 else {
388 existingFolder = BookmarksFolderLocalServiceUtil.addFolder(
389 userId, plid, parentFolderId, folder.getName(),
390 folder.getDescription(), addCommunityPermissions,
391 addGuestPermissions);
392 }
393
394 folderPKs.put(folder.getFolderId(), existingFolder.getFolderId());
395 }
396 catch (NoSuchFolderException nsfe) {
397 _log.error(
398 "Could not find the parent folder for folder " +
399 folder.getFolderId());
400 }
401 }
402
403 private static final String _NAMESPACE = "bookmarks";
404
405 private static final PortletDataHandlerBoolean _foldersAndEntries =
406 new PortletDataHandlerBoolean(
407 _NAMESPACE, "folders-and-entries", true, true);
408
409 private static final PortletDataHandlerBoolean _tags =
410 new PortletDataHandlerBoolean(_NAMESPACE, "tags");
411
412 private static Log _log =
413 LogFactory.getLog(BookmarksPortletDataHandlerImpl.class);
414
415 }