001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
042     * @author Jorge Ferrer
043     * @author Bruno Farache
044     * @author Raymond Augé
045     * @author Juan Fernández
046     */
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    }