1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
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  /**
61   * <a href="BookmarksPortletDataHandlerImpl.java.html"><b><i>View Source</i></b>
62   * </a>
63   *
64   * @author Jorge Ferrer
65   * @author Bruno Farache
66   * @author Raymond Augé
67   *
68   */
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 }