001
014
015 package com.liferay.portlet.documentlibrary.lar;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
020 import com.liferay.portal.kernel.lar.ExportImportPathUtil;
021 import com.liferay.portal.kernel.lar.PortletDataContext;
022 import com.liferay.portal.kernel.lar.PortletDataException;
023 import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
024 import com.liferay.portal.kernel.log.Log;
025 import com.liferay.portal.kernel.log.LogFactoryUtil;
026 import com.liferay.portal.kernel.repository.model.Folder;
027 import com.liferay.portal.kernel.trash.TrashHandler;
028 import com.liferay.portal.kernel.trash.TrashHandlerRegistryUtil;
029 import com.liferay.portal.kernel.util.GetterUtil;
030 import com.liferay.portal.kernel.util.MapUtil;
031 import com.liferay.portal.kernel.util.StringPool;
032 import com.liferay.portal.kernel.util.StringUtil;
033 import com.liferay.portal.kernel.util.Validator;
034 import com.liferay.portal.kernel.xml.Element;
035 import com.liferay.portal.model.Repository;
036 import com.liferay.portal.repository.liferayrepository.LiferayRepository;
037 import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
038 import com.liferay.portal.service.RepositoryLocalServiceUtil;
039 import com.liferay.portal.service.ServiceContext;
040 import com.liferay.portal.util.PortalUtil;
041 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
042 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
043 import com.liferay.portlet.documentlibrary.model.DLFolder;
044 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
045 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
046 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
047 import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
048
049 import java.util.ArrayList;
050 import java.util.List;
051 import java.util.Map;
052
053
056 public class FolderStagedModelDataHandler
057 extends BaseStagedModelDataHandler<Folder> {
058
059 public static final String[] CLASS_NAMES = {
060 DLFolder.class.getName(), Folder.class.getName(),
061 LiferayFolder.class.getName()
062 };
063
064 @Override
065 public void deleteStagedModel(
066 String uuid, long groupId, String className, String extraData)
067 throws PortalException, SystemException {
068
069 Folder folder = FolderUtil.fetchByUUID_R(uuid, groupId);
070
071 if (folder != null) {
072 DLAppLocalServiceUtil.deleteFolder(folder.getFolderId());
073 }
074 }
075
076 @Override
077 public String[] getClassNames() {
078 return CLASS_NAMES;
079 }
080
081 @Override
082 public String getDisplayName(Folder folder) {
083 return folder.getName();
084 }
085
086 @Override
087 protected void doExportStagedModel(
088 PortletDataContext portletDataContext, Folder folder)
089 throws Exception {
090
091 Element folderElement = portletDataContext.getExportDataElement(folder);
092
093 String folderPath = ExportImportPathUtil.getModelPath(folder);
094
095 if (!folder.isDefaultRepository()) {
096 Repository repository = RepositoryLocalServiceUtil.getRepository(
097 folder.getRepositoryId());
098
099 StagedModelDataHandlerUtil.exportReferenceStagedModel(
100 portletDataContext, folder, repository,
101 PortletDataContext.REFERENCE_TYPE_STRONG);
102
103 portletDataContext.addClassedModel(
104 folderElement, folderPath, folder);
105
106 long liferayRepositoryClassNameId = PortalUtil.getClassNameId(
107 LiferayRepository.class.getName());
108
109 if (repository.getClassNameId() != liferayRepositoryClassNameId) {
110 return;
111 }
112 }
113
114 if (folder.getParentFolderId() !=
115 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
116
117 StagedModelDataHandlerUtil.exportReferenceStagedModel(
118 portletDataContext, folder, folder.getParentFolder(),
119 PortletDataContext.REFERENCE_TYPE_PARENT);
120 }
121
122 exportFolderFileEntryTypes(portletDataContext, folderElement, folder);
123
124 portletDataContext.addClassedModel(
125 folderElement, folderPath, folder, DLFolder.class);
126 }
127
128 @Override
129 protected void doImportCompanyStagedModel(
130 PortletDataContext portletDataContext, String uuid, long folderId)
131 throws Exception {
132
133 Folder existingFolder = FolderUtil.fetchByUUID_R(
134 uuid, portletDataContext.getCompanyGroupId());
135
136 Map<Long, Long> folderIds =
137 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
138 Folder.class);
139
140 folderIds.put(folderId, existingFolder.getFolderId());
141 }
142
143 @Override
144 protected void doImportStagedModel(
145 PortletDataContext portletDataContext, Folder folder)
146 throws Exception {
147
148 if (!folder.isDefaultRepository()) {
149 StagedModelDataHandlerUtil.importReferenceStagedModel(
150 portletDataContext, folder, Repository.class,
151 folder.getRepositoryId());
152
153 return;
154 }
155
156 long userId = portletDataContext.getUserId(folder.getUserUuid());
157
158 if (folder.getParentFolderId() !=
159 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
160
161 StagedModelDataHandlerUtil.importReferenceStagedModel(
162 portletDataContext, folder, DLFolder.class,
163 folder.getParentFolderId());
164 }
165
166 Map<Long, Long> folderIds =
167 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
168 Folder.class);
169
170 long parentFolderId = MapUtil.getLong(
171 folderIds, folder.getParentFolderId(), folder.getParentFolderId());
172
173 ServiceContext serviceContext = portletDataContext.createServiceContext(
174 folder, DLFolder.class);
175
176 serviceContext.setUserId(userId);
177
178 Folder importedFolder = null;
179
180 if (portletDataContext.isDataStrategyMirror()) {
181 Folder existingFolder = FolderUtil.fetchByUUID_R(
182 folder.getUuid(), portletDataContext.getScopeGroupId());
183
184 if (existingFolder == null) {
185 String name = getFolderName(
186 null, portletDataContext.getScopeGroupId(), parentFolderId,
187 folder.getName(), 2);
188
189 serviceContext.setUuid(folder.getUuid());
190
191 importedFolder = DLAppLocalServiceUtil.addFolder(
192 userId, portletDataContext.getScopeGroupId(),
193 parentFolderId, name, folder.getDescription(),
194 serviceContext);
195 }
196 else {
197 String name = getFolderName(
198 folder.getUuid(), portletDataContext.getScopeGroupId(),
199 parentFolderId, folder.getName(), 2);
200
201 importedFolder = DLAppLocalServiceUtil.updateFolder(
202 existingFolder.getFolderId(), parentFolderId, name,
203 folder.getDescription(), serviceContext);
204 }
205 }
206 else {
207 String name = getFolderName(
208 null, portletDataContext.getScopeGroupId(), parentFolderId,
209 folder.getName(), 2);
210
211 importedFolder = DLAppLocalServiceUtil.addFolder(
212 userId, portletDataContext.getScopeGroupId(), parentFolderId,
213 name, folder.getDescription(), serviceContext);
214 }
215
216 Element folderElement = portletDataContext.getImportDataElement(folder);
217
218 importFolderFileEntryTypes(
219 portletDataContext, folderElement, folder, importedFolder,
220 serviceContext);
221
222 portletDataContext.importClassedModel(
223 folder, importedFolder, DLFolder.class);
224
225 folderIds.put(folder.getFolderId(), importedFolder.getFolderId());
226 }
227
228 @Override
229 protected void doRestoreStagedModel(
230 PortletDataContext portletDataContext, Folder folder)
231 throws Exception {
232
233 long userId = portletDataContext.getUserId(folder.getUserUuid());
234
235 Folder existingFolder = FolderUtil.fetchByUUID_R(
236 folder.getUuid(), portletDataContext.getScopeGroupId());
237
238 if ((existingFolder == null) ||
239 !(existingFolder.getModel() instanceof DLFolder)) {
240
241 return;
242 }
243
244 DLFolder dlFolder = (DLFolder)existingFolder.getModel();
245
246 if (!dlFolder.isInTrash()) {
247 return;
248 }
249
250 TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(
251 DLFolder.class.getName());
252
253 if (trashHandler.isRestorable(existingFolder.getFolderId())) {
254 trashHandler.restoreTrashEntry(
255 userId, existingFolder.getFolderId());
256 }
257 }
258
259 protected void exportFolderFileEntryTypes(
260 PortletDataContext portletDataContext, Element folderElement,
261 Folder folder)
262 throws Exception {
263
264 List<DLFileEntryType> dlFileEntryTypes =
265 DLFileEntryTypeLocalServiceUtil.getFolderFileEntryTypes(
266 new long[] {
267 portletDataContext.getCompanyGroupId(),
268 portletDataContext.getScopeGroupId()
269 },
270 folder.getFolderId(), false);
271
272 long defaultFileEntryTypeId =
273 DLFileEntryTypeLocalServiceUtil.getDefaultFileEntryTypeId(
274 folder.getFolderId());
275
276 String defaultFileEntryTypeUuid = StringPool.BLANK;
277
278 for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
279 if (dlFileEntryType.getFileEntryTypeId() ==
280 DLFileEntryTypeConstants.
281 FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) {
282
283 folderElement.addAttribute("basic-document", "true");
284
285 continue;
286 }
287
288 if (defaultFileEntryTypeId ==
289 dlFileEntryType.getFileEntryTypeId()) {
290
291 defaultFileEntryTypeUuid = dlFileEntryType.getUuid();
292 }
293
294 if (dlFileEntryType.isExportable()) {
295 StagedModelDataHandlerUtil.exportReferenceStagedModel(
296 portletDataContext, folder, dlFileEntryType,
297 PortletDataContext.REFERENCE_TYPE_STRONG);
298 }
299 }
300
301 folderElement.addAttribute(
302 "defaultFileEntryTypeUuid", defaultFileEntryTypeUuid);
303 }
304
305
311 protected String getFolderName(
312 String uuid, long groupId, long parentFolderId, String name,
313 int count)
314 throws Exception {
315
316 Folder folder = FolderUtil.fetchByR_P_N(groupId, parentFolderId, name);
317
318 if (folder == null) {
319 return name;
320 }
321
322 if (Validator.isNotNull(uuid) && uuid.equals(folder.getUuid())) {
323 return name;
324 }
325
326 name = StringUtil.appendParentheticalSuffix(name, count);
327
328 return getFolderName(uuid, groupId, parentFolderId, name, ++count);
329 }
330
331 protected void importFolderFileEntryTypes(
332 PortletDataContext portletDataContext, Element folderElement,
333 Folder folder, Folder importedFolder, ServiceContext serviceContext)
334 throws Exception {
335
336 List<Long> currentFolderFileEntryTypeIds = new ArrayList<Long>();
337
338 String defaultFileEntryTypeUuid = GetterUtil.getString(
339 folderElement.attributeValue("defaultFileEntryTypeUuid"));
340
341 long defaultFileEntryTypeId = 0;
342
343 List<Element> referenceElements =
344 portletDataContext.getReferenceElements(
345 folder, DLFileEntryType.class);
346
347 for (Element referenceElement : referenceElements) {
348 long referenceDlFileEntryTypeId = GetterUtil.getLong(
349 referenceElement.attributeValue("class-pk"));
350 String referenceDlFileEntryTypeUuid =
351 referenceElement.attributeValue("uuid");
352
353 StagedModelDataHandlerUtil.importReferenceStagedModel(
354 portletDataContext, folder, DLFileEntryType.class,
355 referenceDlFileEntryTypeId);
356
357 Map<Long, Long> dlFileEntryTypeIds =
358 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
359 DLFileEntryType.class);
360
361 long dlFileEntryTypeId = MapUtil.getLong(
362 dlFileEntryTypeIds, referenceDlFileEntryTypeId,
363 referenceDlFileEntryTypeId);
364
365 DLFileEntryType existingDLFileEntryType =
366 DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(
367 dlFileEntryTypeId);
368
369 if (existingDLFileEntryType == null) {
370 continue;
371 }
372
373 currentFolderFileEntryTypeIds.add(
374 existingDLFileEntryType.getFileEntryTypeId());
375
376 if (defaultFileEntryTypeUuid.equals(referenceDlFileEntryTypeUuid)) {
377 defaultFileEntryTypeId =
378 existingDLFileEntryType.getFileEntryTypeId();
379 }
380 }
381
382 if (GetterUtil.getBoolean(
383 folderElement.attributeValue("basic-document"))) {
384
385 currentFolderFileEntryTypeIds.add(
386 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT);
387 }
388
389 if (!currentFolderFileEntryTypeIds.isEmpty()) {
390 DLFolder dlFolder = (DLFolder)importedFolder.getModel();
391
392 dlFolder.setDefaultFileEntryTypeId(defaultFileEntryTypeId);
393 dlFolder.setOverrideFileEntryTypes(true);
394
395 DLFolderLocalServiceUtil.updateDLFolder(dlFolder);
396
397 DLFileEntryTypeLocalServiceUtil.updateFolderFileEntryTypes(
398 dlFolder, currentFolderFileEntryTypeIds, defaultFileEntryTypeId,
399 serviceContext);
400 }
401 }
402
403 @Override
404 protected void validateExport(
405 PortletDataContext portletDataContext, Folder folder)
406 throws PortletDataException {
407
408 if ((folder.getGroupId() != portletDataContext.getGroupId()) &&
409 (folder.getGroupId() != portletDataContext.getScopeGroupId())) {
410
411 PortletDataException pde = new PortletDataException(
412 PortletDataException.INVALID_GROUP);
413
414 pde.setStagedModel(folder);
415
416 throw pde;
417 }
418
419 TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(
420 DLFolder.class.getName());
421
422 if (trashHandler != null) {
423 try {
424 if (trashHandler.isInTrash(folder.getFolderId()) ||
425 trashHandler.isInTrashContainer(folder.getFolderId())) {
426
427 throw new PortletDataException(
428 PortletDataException.STATUS_IN_TRASH);
429 }
430 }
431 catch (PortletDataException pde) {
432 throw pde;
433 }
434 catch (Exception e) {
435 if (_log.isDebugEnabled()) {
436 _log.debug(e, e);
437 }
438 else if (_log.isWarnEnabled()) {
439 _log.warn(
440 "Unable to check trash status for folder " +
441 folder.getFolderId());
442 }
443 }
444 }
445 }
446
447 @Override
448 protected boolean validateMissingReference(
449 String uuid, long companyId, long groupId)
450 throws Exception {
451
452 DLFolder dlFolder =
453 DLFolderLocalServiceUtil.fetchDLFolderByUuidAndGroupId(
454 uuid, groupId);
455
456 if (dlFolder == null) {
457 return false;
458 }
459
460 return true;
461 }
462
463 private static Log _log = LogFactoryUtil.getLog(
464 FolderStagedModelDataHandler.class);
465
466 }