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 (folderId == BookmarksFolderImpl.DEFAULT_PARENT_FOLDER_ID) {
242 return;
243 }
244
245 BookmarksFolder folder = BookmarksFolderUtil.findByPrimaryKey(folderId);
246
247 String path = getFolderPath(context, folder);
248
249 Element folderEl = foldersEl.addElement("folder");
250
251 folderEl.addAttribute("path", path);
252
253 if (context.isPathNotProcessed(path)) {
254 folder.setUserUuid(folder.getUserUuid());
255
256 context.addZipEntry(path, folder);
257 }
258
259 exportParentFolder(context, foldersEl, folder.getParentFolderId());
260 }
261
262 protected String getEntryPath(
263 PortletDataContext context, BookmarksEntry entry) {
264
265 StringBuilder sb = new StringBuilder();
266
267 sb.append(context.getPortletPath(PortletKeys.BOOKMARKS));
268 sb.append("/entries/");
269 sb.append(entry.getEntryId());
270 sb.append(".xml");
271
272 return sb.toString();
273 }
274
275 protected String getFolderPath(
276 PortletDataContext context, BookmarksFolder folder) {
277
278 StringBuilder sb = new StringBuilder();
279
280 sb.append(context.getPortletPath(PortletKeys.BOOKMARKS));
281 sb.append("/folders/");
282 sb.append(folder.getFolderId());
283 sb.append(".xml");
284
285 return sb.toString();
286 }
287
288 protected void importEntry(
289 PortletDataContext context, Map<Long, Long> folderPKs,
290 BookmarksEntry entry)
291 throws Exception {
292
293 long userId = context.getUserId(entry.getUserUuid());
294 long folderId = MapUtil.getLong(
295 folderPKs, entry.getFolderId(), entry.getFolderId());
296
297 String[] tagsEntries = null;
298
299 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
300 tagsEntries = context.getTagsEntries(
301 BookmarksEntry.class, entry.getEntryId());
302 }
303
304 boolean addCommunityPermissions = true;
305 boolean addGuestPermissions = true;
306
307 BookmarksEntry existingEntry = null;
308
309 try {
310 BookmarksFolderUtil.findByPrimaryKey(folderId);
311
312 if (context.getDataStrategy().equals(
313 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
314
315 try {
316 existingEntry = BookmarksEntryFinderUtil.findByUuid_G(
317 entry.getUuid(), context.getGroupId());
318
319 BookmarksEntryLocalServiceUtil.updateEntry(
320 userId, existingEntry.getEntryId(), folderId,
321 entry.getName(), entry.getUrl(), entry.getComments(),
322 tagsEntries);
323 }
324 catch (NoSuchEntryException nsee) {
325 BookmarksEntryLocalServiceUtil.addEntry(
326 entry.getUuid(), userId, folderId, entry.getName(),
327 entry.getUrl(), entry.getComments(), tagsEntries,
328 addCommunityPermissions, addGuestPermissions);
329 }
330 }
331 else {
332 BookmarksEntryLocalServiceUtil.addEntry(
333 userId, folderId, entry.getName(), entry.getUrl(),
334 entry.getComments(), tagsEntries, addCommunityPermissions,
335 addGuestPermissions);
336 }
337 }
338 catch (NoSuchFolderException nsfe) {
339 _log.error(
340 "Could not find the parent folder for entry " +
341 entry.getEntryId());
342 }
343 }
344
345 protected void importFolder(
346 PortletDataContext context, Map<Long, Long> folderPKs,
347 BookmarksFolder folder)
348 throws Exception {
349
350 long userId = context.getUserId(folder.getUserUuid());
351 long plid = context.getPlid();
352 long parentFolderId = MapUtil.getLong(
353 folderPKs, folder.getParentFolderId(), folder.getParentFolderId());
354
355 boolean addCommunityPermissions = true;
356 boolean addGuestPermissions = true;
357
358 BookmarksFolder existingFolder = null;
359
360 try {
361 if (parentFolderId !=
362 BookmarksFolderImpl.DEFAULT_PARENT_FOLDER_ID) {
363
364 BookmarksFolderUtil.findByPrimaryKey(parentFolderId);
365 }
366
367 if (context.getDataStrategy().equals(
368 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
369 existingFolder = BookmarksFolderUtil.fetchByUUID_G(
370 folder.getUuid(), context.getGroupId());
371
372 if (existingFolder == null) {
373 existingFolder = BookmarksFolderLocalServiceUtil.addFolder(
374 folder.getUuid(), userId, plid, parentFolderId,
375 folder.getName(), folder.getDescription(),
376 addCommunityPermissions, addGuestPermissions);
377 }
378 else {
379 existingFolder =
380 BookmarksFolderLocalServiceUtil.updateFolder(
381 existingFolder.getFolderId(), parentFolderId,
382 folder.getName(), folder.getDescription(), false);
383 }
384 }
385 else {
386 existingFolder = BookmarksFolderLocalServiceUtil.addFolder(
387 userId, plid, parentFolderId, folder.getName(),
388 folder.getDescription(), addCommunityPermissions,
389 addGuestPermissions);
390 }
391
392 folderPKs.put(folder.getFolderId(), existingFolder.getFolderId());
393 }
394 catch (NoSuchFolderException nsfe) {
395 _log.error(
396 "Could not find the parent folder for folder " +
397 folder.getFolderId());
398 }
399 }
400
401 private static final String _NAMESPACE = "bookmarks";
402
403 private static final PortletDataHandlerBoolean _foldersAndEntries =
404 new PortletDataHandlerBoolean(
405 _NAMESPACE, "folders-and-entries", true, true);
406
407 private static final PortletDataHandlerBoolean _tags =
408 new PortletDataHandlerBoolean(_NAMESPACE, "tags");
409
410 private static Log _log =
411 LogFactory.getLog(BookmarksPortletDataHandlerImpl.class);
412
413 }