001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentlibrary.lar;
016    
017    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
019    import com.liferay.portal.kernel.dao.orm.Property;
020    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
021    import com.liferay.portal.kernel.exception.PortalException;
022    import com.liferay.portal.kernel.exception.SystemException;
023    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
024    import com.liferay.portal.kernel.lar.PortletDataContext;
025    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
026    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
027    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
028    import com.liferay.portal.kernel.repository.model.FileEntry;
029    import com.liferay.portal.kernel.repository.model.Folder;
030    import com.liferay.portal.kernel.util.GetterUtil;
031    import com.liferay.portal.kernel.util.MapUtil;
032    import com.liferay.portal.kernel.xml.Element;
033    import com.liferay.portal.model.Group;
034    import com.liferay.portal.service.GroupLocalServiceUtil;
035    import com.liferay.portal.util.PropsValues;
036    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
037    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
038    import com.liferay.portlet.documentlibrary.model.DLFileRank;
039    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
040    import com.liferay.portlet.documentlibrary.model.DLFolder;
041    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
042    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
043    import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryActionableDynamicQuery;
044    import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryTypeActionableDynamicQuery;
045    import com.liferay.portlet.documentlibrary.service.persistence.DLFileShortcutActionableDynamicQuery;
046    import com.liferay.portlet.documentlibrary.service.persistence.DLFolderActionableDynamicQuery;
047    
048    import java.util.List;
049    import java.util.Map;
050    
051    import javax.portlet.PortletPreferences;
052    
053    /**
054     * @author Bruno Farache
055     * @author Raymond Augé
056     * @author Sampsa Sohlman
057     * @author Mate Thurzo
058     */
059    public class DLPortletDataHandler extends BasePortletDataHandler {
060    
061            public static final String NAMESPACE = "document_library";
062    
063            public DLPortletDataHandler() {
064                    setAlwaysExportable(true);
065                    setDataLocalized(true);
066                    setDataPortletPreferences("rootFolderId");
067                    setExportControls(
068                            new PortletDataHandlerBoolean(
069                                    NAMESPACE, "folders-and-documents", true, true),
070                            new PortletDataHandlerBoolean(NAMESPACE, "shortcuts"),
071                            new PortletDataHandlerBoolean(NAMESPACE, "previews-and-thumbnails"),
072                            new PortletDataHandlerBoolean(NAMESPACE, "ranks"));
073                    setExportMetadataControls(
074                            new PortletDataHandlerBoolean(
075                                    NAMESPACE, "folders-and-documents", true,
076                                    new PortletDataHandlerControl[] {
077                                            new PortletDataHandlerBoolean(NAMESPACE, "categories"),
078                                            new PortletDataHandlerBoolean(NAMESPACE, "comments"),
079                                            new PortletDataHandlerBoolean(NAMESPACE, "ratings"),
080                                            new PortletDataHandlerBoolean(NAMESPACE, "tags")
081                                    }));
082                    setPublishToLiveByDefault(PropsValues.DL_PUBLISH_TO_LIVE_BY_DEFAULT);
083            }
084    
085            @Override
086            protected PortletPreferences doDeleteData(
087                            PortletDataContext portletDataContext, String portletId,
088                            PortletPreferences portletPreferences)
089                    throws Exception {
090    
091                    if (portletDataContext.addPrimaryKey(
092                                    DLPortletDataHandler.class, "deleteData")) {
093    
094                            return portletPreferences;
095                    }
096    
097                    DLAppLocalServiceUtil.deleteAll(portletDataContext.getScopeGroupId());
098    
099                    return portletPreferences;
100            }
101    
102            @Override
103            protected String doExportData(
104                            final PortletDataContext portletDataContext, String portletId,
105                            PortletPreferences portletPreferences)
106                    throws Exception {
107    
108                    portletDataContext.addPermissions(
109                            "com.liferay.portlet.documentlibrary",
110                            portletDataContext.getScopeGroupId());
111    
112                    Element rootElement = addExportDataRootElement(portletDataContext);
113    
114                    rootElement.addAttribute(
115                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
116    
117                    long rootFolderId = GetterUtil.getLong(
118                            portletPreferences.getValue("rootFolderId", null));
119    
120                    if (rootFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
121                            rootElement.addAttribute(
122                                    "root-folder-id", String.valueOf(rootFolderId));
123                    }
124    
125                    final Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
126                            portletDataContext.getCompanyId());
127    
128                    ActionableDynamicQuery fileEntryTypeActionableDynamicQuery =
129                            new DLFileEntryTypeActionableDynamicQuery() {
130    
131                            @Override
132                            protected void addCriteria(DynamicQuery dynamicQuery) {
133                                    portletDataContext.addDateRangeCriteria(
134                                            dynamicQuery, "modifiedDate");
135    
136                                    Property property = PropertyFactoryUtil.forName("groupId");
137    
138                                    dynamicQuery.add(
139                                            property.in(
140                                                    new Long[] {
141                                                            portletDataContext.getScopeGroupId(),
142                                                            companyGroup.getGroupId()
143                                                    }));
144                            }
145    
146                            @Override
147                            protected void performAction(Object object) throws PortalException {
148                                    DLFileEntryType fileEntryType = (DLFileEntryType)object;
149    
150                                    if (fileEntryType.isExportable()) {
151                                            StagedModelDataHandlerUtil.exportStagedModel(
152                                                    portletDataContext, fileEntryType);
153                                    }
154                            }
155    
156                    };
157    
158                    fileEntryTypeActionableDynamicQuery.performActions();
159    
160                    ActionableDynamicQuery folderActionableDynamicQuery =
161                            new DLFolderActionableDynamicQuery() {
162    
163                            @Override
164                            protected void addCriteria(DynamicQuery dynamicQuery) {
165                                    portletDataContext.addDateRangeCriteria(
166                                            dynamicQuery, "modifiedDate");
167                            }
168    
169                            @Override
170                            protected void performAction(Object object)
171                                    throws PortalException, SystemException {
172    
173                                    DLFolder dlFolder = (DLFolder)object;
174    
175                                    Folder folder = DLAppLocalServiceUtil.getFolder(
176                                            dlFolder.getFolderId());
177    
178                                    StagedModelDataHandlerUtil.exportStagedModel(
179                                            portletDataContext, folder);
180                            }
181    
182                    };
183    
184                    folderActionableDynamicQuery.setGroupId(
185                            portletDataContext.getScopeGroupId());
186    
187                    folderActionableDynamicQuery.performActions();
188    
189                    ActionableDynamicQuery fileEntryActionableDynamicQuery =
190                            new DLFileEntryActionableDynamicQuery() {
191    
192                            @Override
193                            protected void addCriteria(DynamicQuery dynamicQuery) {
194                                    portletDataContext.addDateRangeCriteria(
195                                            dynamicQuery, "modifiedDate");
196                            }
197    
198                            @Override
199                            protected void performAction(Object object)
200                                    throws PortalException, SystemException {
201    
202                                    DLFileEntry dlFileEntry = (DLFileEntry)object;
203    
204                                    FileEntry fileEntry =
205                                            DLAppLocalServiceUtil.getFileEntry(
206                                                    dlFileEntry.getFileEntryId());
207    
208                                    StagedModelDataHandlerUtil.exportStagedModel(
209                                            portletDataContext, fileEntry);
210                            }
211    
212                    };
213    
214                    fileEntryActionableDynamicQuery.setGroupId(
215                            portletDataContext.getScopeGroupId());
216    
217                    fileEntryActionableDynamicQuery.performActions();
218    
219                    if (!portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) {
220                            return getExportDataRootElementString(rootElement);
221                    }
222    
223                    ActionableDynamicQuery fileShortcutActionableDynamicQuery =
224                            new DLFileShortcutActionableDynamicQuery() {
225    
226                            @Override
227                            protected void addCriteria(DynamicQuery dynamicQuery) {
228                                    portletDataContext.addDateRangeCriteria(
229                                            dynamicQuery, "modifiedDate");
230    
231                                    Property property = PropertyFactoryUtil.forName("active");
232    
233                                    dynamicQuery.add(property.eq(Boolean.TRUE));
234                            }
235    
236                            @Override
237                            protected void performAction(Object object) throws PortalException {
238                                    DLFileShortcut fileShortcut = (DLFileShortcut)object;
239    
240                                    StagedModelDataHandlerUtil.exportStagedModel(
241                                            portletDataContext, fileShortcut);
242                            }
243    
244                    };
245    
246                    fileShortcutActionableDynamicQuery.setGroupId(
247                            portletDataContext.getScopeGroupId());
248    
249                    fileShortcutActionableDynamicQuery.performActions();
250    
251                    return getExportDataRootElementString(rootElement);
252            }
253    
254            @Override
255            protected PortletPreferences doImportData(
256                            PortletDataContext portletDataContext, String portletId,
257                            PortletPreferences portletPreferences, String data)
258                    throws Exception {
259    
260                    portletDataContext.importPermissions(
261                            "com.liferay.portlet.documentlibrary",
262                            portletDataContext.getSourceGroupId(),
263                            portletDataContext.getScopeGroupId());
264    
265                    Element fileEntryTypesElement =
266                            portletDataContext.getImportDataGroupElement(DLFileEntryType.class);
267    
268                    List<Element> fileEntryTypeElements = fileEntryTypesElement.elements();
269    
270                    for (Element fileEntryTypeElement : fileEntryTypeElements) {
271                            StagedModelDataHandlerUtil.importStagedModel(
272                                    portletDataContext, fileEntryTypeElement);
273                    }
274    
275                    Element foldersElement = portletDataContext.getImportDataGroupElement(
276                            Folder.class);
277    
278                    List<Element> folderElements = foldersElement.elements();
279    
280                    for (Element folderElement : folderElements) {
281                            StagedModelDataHandlerUtil.importStagedModel(
282                                    portletDataContext, folderElement);
283                    }
284    
285                    Element fileEntriesElement =
286                            portletDataContext.getImportDataGroupElement(FileEntry.class);
287    
288                    List<Element> fileEntryElements = fileEntriesElement.elements();
289    
290                    for (Element fileEntryElement : fileEntryElements) {
291                            StagedModelDataHandlerUtil.importStagedModel(
292                                    portletDataContext, fileEntryElement);
293                    }
294    
295                    if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) {
296                            Element fileShortcutsElement =
297                                    portletDataContext.getImportDataGroupElement(
298                                            DLFileShortcut.class);
299    
300                            List<Element> fileShortcutElements =
301                                    fileShortcutsElement.elements();
302    
303                            for (Element fileShortcutElement : fileShortcutElements) {
304                                    StagedModelDataHandlerUtil.importStagedModel(
305                                            portletDataContext, fileShortcutElement);
306                            }
307                    }
308    
309                    if (portletDataContext.getBooleanParameter(NAMESPACE, "ranks")) {
310                            Element fileRanksElement =
311                                    portletDataContext.getImportDataGroupElement(DLFileRank.class);
312    
313                            List<Element> fileRankElements = fileRanksElement.elements();
314    
315                            for (Element fileRankElement : fileRankElements) {
316                                    StagedModelDataHandlerUtil.importStagedModel(
317                                            portletDataContext, fileRankElement);
318                            }
319                    }
320    
321                    Element rootElement = portletDataContext.getImportDataRootElement();
322    
323                    long rootFolderId = GetterUtil.getLong(
324                            rootElement.attributeValue("root-folder-id"));
325    
326                    if (rootFolderId > 0) {
327                            Map<Long, Long> folderIds =
328                                    (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
329                                            DLFolder.class);
330    
331                            rootFolderId = MapUtil.getLong(
332                                    folderIds, rootFolderId, rootFolderId);
333    
334                            portletPreferences.setValue(
335                                    "rootFolderId", String.valueOf(rootFolderId));
336                    }
337    
338                    return portletPreferences;
339            }
340    
341    }