001
014
015 package com.liferay.portlet.documentlibrary.lar;
016
017 import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
018 import com.liferay.portal.kernel.lar.ExportImportPathUtil;
019 import com.liferay.portal.kernel.lar.PortletDataContext;
020 import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
021 import com.liferay.portal.kernel.repository.model.Folder;
022 import com.liferay.portal.kernel.util.GetterUtil;
023 import com.liferay.portal.kernel.util.MapUtil;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.kernel.xml.Element;
028 import com.liferay.portal.model.Group;
029 import com.liferay.portal.model.Repository;
030 import com.liferay.portal.model.StagedModel;
031 import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
032 import com.liferay.portal.service.GroupLocalServiceUtil;
033 import com.liferay.portal.service.ServiceContext;
034 import com.liferay.portal.service.persistence.RepositoryUtil;
035 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
036 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
037 import com.liferay.portlet.documentlibrary.model.DLFolder;
038 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
039 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
040 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
041 import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
042 import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryTypeUtil;
043
044 import java.util.ArrayList;
045 import java.util.List;
046 import java.util.Map;
047
048
051 public class FolderStagedModelDataHandler
052 extends BaseStagedModelDataHandler<Folder> {
053
054 public static final String[] CLASS_NAMES = {
055 DLFolder.class.getName(), Folder.class.getName(),
056 LiferayFolder.class.getName()
057 };
058
059 @Override
060 public String[] getClassNames() {
061 return CLASS_NAMES;
062 }
063
064 @Override
065 protected void doExportStagedModel(
066 PortletDataContext portletDataContext, Folder folder)
067 throws Exception {
068
069 Element folderGroupElement =
070 portletDataContext.getExportDataGroupElement(Folder.class);
071
072 Element folderElement = folderGroupElement.addElement("staged-model");
073
074 String folderPath = ExportImportPathUtil.getModelPath(
075 folder.getGroupId(), Folder.class.getName(), folder.getFolderId());
076
077 if (folder.isMountPoint()) {
078 Repository repository = RepositoryUtil.findByPrimaryKey(
079 folder.getRepositoryId());
080
081 StagedModelDataHandlerUtil.exportStagedModel(
082 portletDataContext, repository);
083
084 portletDataContext.addReferenceElement(folderElement, repository);
085 }
086 else if (!folder.isDefaultRepository()) {
087
088
089
090
091 return;
092 }
093
094 if (folder.getParentFolderId() !=
095 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
096
097 StagedModelDataHandlerUtil.exportStagedModel(
098 portletDataContext, folder.getParentFolder());
099 }
100
101 exportFolderFileEntryTypes(portletDataContext, folder, folderElement);
102
103 portletDataContext.addClassedModel(
104 folderElement, folderPath, folder, DLPortletDataHandler.NAMESPACE);
105 }
106
107 @Override
108 protected void doImportStagedModel(
109 PortletDataContext portletDataContext, Folder folder)
110 throws Exception {
111
112 long userId = portletDataContext.getUserId(folder.getUserUuid());
113
114 String path = ExportImportPathUtil.getModelPath(
115 portletDataContext, Folder.class.getName(), folder.getFolderId());
116
117 Element folderElement =
118 portletDataContext.getImportDataStagedModelElement(
119 Folder.class.getSimpleName(), "path", path);
120
121 Element referencesElement = folderElement.element("references");
122
123 if (referencesElement != null) {
124 List<Element> referenceElements = referencesElement.elements();
125
126 for (Element referenceElement : referenceElements) {
127 String className = referenceElement.attributeValue(
128 "class-name");
129
130 if (!className.equals(Repository.class.getSimpleName())) {
131 continue;
132 }
133
134 String classPK = referenceElement.attributeValue("class-pk");
135
136 String referencePath = ExportImportPathUtil.getModelPath(
137 portletDataContext, className, GetterUtil.getLong(classPK));
138
139 StagedModel referenceStagedModel =
140 (StagedModel)portletDataContext.getZipEntryAsObject(
141 referencePath);
142
143 StagedModelDataHandlerUtil.importStagedModel(
144 portletDataContext, referenceStagedModel);
145 }
146 }
147
148 if (folder.getParentFolderId() !=
149 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
150
151 String parentFolderPath = ExportImportPathUtil.getModelPath(
152 portletDataContext, Folder.class.getName(),
153 folder.getParentFolderId());
154
155 Folder parentFolder =
156 (Folder)portletDataContext.getZipEntryAsObject(
157 parentFolderPath);
158
159 StagedModelDataHandlerUtil.importStagedModel(
160 portletDataContext, parentFolder);
161 }
162
163 Map<Long, Long> folderIds =
164 (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
165 Folder.class);
166
167 long parentFolderId = MapUtil.getLong(
168 folderIds, folder.getParentFolderId(), folder.getParentFolderId());
169
170 ServiceContext serviceContext = portletDataContext.createServiceContext(
171 folder, DLPortletDataHandler.NAMESPACE);
172
173 serviceContext.setUserId(userId);
174
175 Folder importedFolder = null;
176
177 if (portletDataContext.isDataStrategyMirror()) {
178 Folder existingFolder = FolderUtil.fetchByUUID_R(
179 folder.getUuid(), portletDataContext.getScopeGroupId());
180
181 if (existingFolder == null) {
182 String name = getFolderName(
183 null, portletDataContext.getScopeGroupId(), parentFolderId,
184 folder.getName(), 2);
185
186 serviceContext.setUuid(folder.getUuid());
187
188 importedFolder = DLAppLocalServiceUtil.addFolder(
189 userId, portletDataContext.getScopeGroupId(),
190 parentFolderId, name, folder.getDescription(),
191 serviceContext);
192 }
193 else {
194 String name = getFolderName(
195 folder.getUuid(), portletDataContext.getScopeGroupId(),
196 parentFolderId, folder.getName(), 2);
197
198 importedFolder = DLAppLocalServiceUtil.updateFolder(
199 existingFolder.getFolderId(), parentFolderId, name,
200 folder.getDescription(), serviceContext);
201 }
202 }
203 else {
204 String name = getFolderName(
205 null, portletDataContext.getScopeGroupId(), parentFolderId,
206 folder.getName(), 2);
207
208 importedFolder = DLAppLocalServiceUtil.addFolder(
209 userId, portletDataContext.getScopeGroupId(), parentFolderId,
210 name, folder.getDescription(), serviceContext);
211 }
212
213 folderIds.put(folder.getFolderId(), importedFolder.getFolderId());
214
215 importFolderFileEntryTypes(
216 portletDataContext, folderElement, folder, serviceContext);
217
218 portletDataContext.importClassedModel(
219 folder, importedFolder, DLPortletDataHandler.NAMESPACE);
220 }
221
222 protected void exportFolderFileEntryTypes(
223 PortletDataContext portletDataContext, Folder folder,
224 Element folderElement)
225 throws Exception {
226
227 List<DLFileEntryType> dlFileEntryTypes =
228 DLFileEntryTypeLocalServiceUtil.getFolderFileEntryTypes(
229 new long[]{portletDataContext.getScopeGroupId()},
230 folder.getFolderId(), false);
231
232 long defaultFileEntryTypeId =
233 DLFileEntryTypeLocalServiceUtil.getDefaultFileEntryTypeId(
234 folder.getFolderId());
235
236 String defaultFileEntryTypeUuid = StringPool.BLANK;
237
238 for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
239 if (dlFileEntryType.getFileEntryTypeId() ==
240 DLFileEntryTypeConstants.
241 FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) {
242
243 folderElement.addAttribute("basic-document", "true");
244
245 continue;
246 }
247
248 if (defaultFileEntryTypeId ==
249 dlFileEntryType.getFileEntryTypeId()) {
250
251 defaultFileEntryTypeUuid = dlFileEntryType.getUuid();
252 }
253
254 if (dlFileEntryType.isExportable()) {
255 StagedModelDataHandlerUtil.exportStagedModel(
256 portletDataContext, dlFileEntryType);
257
258 portletDataContext.addReferenceElement(
259 folderElement, dlFileEntryType);
260 }
261 }
262
263 folderElement.addAttribute(
264 "defaultFileEntryTypeUuid", defaultFileEntryTypeUuid);
265 }
266
267
273 protected String getFolderName(
274 String uuid, long groupId, long parentFolderId, String name,
275 int count)
276 throws Exception {
277
278 Folder folder = FolderUtil.fetchByR_P_N(groupId, parentFolderId, name);
279
280 if (folder == null) {
281 return name;
282 }
283
284 if (Validator.isNotNull(uuid) && uuid.equals(folder.getUuid())) {
285 return name;
286 }
287
288 name = StringUtil.appendParentheticalSuffix(name, count);
289
290 return getFolderName(uuid, groupId, parentFolderId, name, ++count);
291 }
292
293 protected void importFolderFileEntryTypes(
294 PortletDataContext portletDataContext, Element folderElement,
295 Folder folder, ServiceContext serviceContext)
296 throws Exception {
297
298 List<Long> fileEntryTypeIds = new ArrayList<Long>();
299
300 String defaultFileEntryTypeUuid = GetterUtil.getString(
301 folderElement.attributeValue("defaultFileEntryTypeUuid"));
302
303 long defaultFileEntryTypeId = 0;
304
305 Element referencesElement = folderElement.element("references");
306
307 if (referencesElement == null) {
308 return;
309 }
310
311 List<Element> referenceElements = referencesElement.elements();
312
313 for (Element referenceElement : referenceElements) {
314 String className = referenceElement.attributeValue("class-name");
315
316 if (!className.equals(DLFileEntryType.class.getSimpleName())) {
317 continue;
318 }
319
320 String referencePath = referenceElement.attributeValue("path");
321
322 DLFileEntryType referenceDLFileEntryType =
323 (DLFileEntryType)portletDataContext.getZipEntryAsObject(
324 referencePath);
325
326 String fileEntryTypeUuid = referenceDLFileEntryType.getUuid();
327
328 DLFileEntryType dlFileEntryType = DLFileEntryTypeUtil.fetchByUUID_G(
329 fileEntryTypeUuid, portletDataContext.getScopeGroupId());
330
331 if (dlFileEntryType == null) {
332 Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
333 portletDataContext.getCompanyId());
334
335 dlFileEntryType = DLFileEntryTypeUtil.fetchByUUID_G(
336 fileEntryTypeUuid, companyGroup.getGroupId());
337 }
338
339 if (dlFileEntryType == null) {
340 continue;
341 }
342
343 fileEntryTypeIds.add(dlFileEntryType.getFileEntryTypeId());
344
345 if (defaultFileEntryTypeUuid.equals(dlFileEntryType.getUuid())) {
346 defaultFileEntryTypeId = dlFileEntryType.getFileEntryTypeId();
347 }
348 }
349
350 if (GetterUtil.getBoolean(
351 folderElement.attributeValue("basic-document"))) {
352
353 DLFileEntryType dlFileEntryType =
354 DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(0);
355
356 fileEntryTypeIds.add(dlFileEntryType.getFileEntryTypeId());
357 }
358
359 if (!fileEntryTypeIds.isEmpty()) {
360 DLFolder dlFolder = (DLFolder)folder.getModel();
361
362 dlFolder.setDefaultFileEntryTypeId(defaultFileEntryTypeId);
363 dlFolder.setOverrideFileEntryTypes(true);
364
365 DLFolderLocalServiceUtil.updateDLFolder(dlFolder);
366
367 DLFileEntryTypeLocalServiceUtil.updateFolderFileEntryTypes(
368 dlFolder, fileEntryTypeIds, defaultFileEntryTypeId,
369 serviceContext);
370 }
371 }
372
373 }