001    /**
002     * Copyright (c) 2000-present 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.portal.repository.cmis.model;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.lar.StagedModelType;
020    import com.liferay.portal.kernel.log.Log;
021    import com.liferay.portal.kernel.log.LogFactoryUtil;
022    import com.liferay.portal.kernel.repository.model.Folder;
023    import com.liferay.portal.kernel.repository.model.RepositoryModelOperation;
024    import com.liferay.portal.kernel.util.CharPool;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.model.User;
027    import com.liferay.portal.repository.cmis.CMISRepository;
028    import com.liferay.portal.security.permission.ActionKeys;
029    import com.liferay.portal.security.permission.PermissionChecker;
030    import com.liferay.portal.service.CMISRepositoryLocalServiceUtil;
031    import com.liferay.portlet.documentlibrary.model.DLFolder;
032    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
033    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
034    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
035    import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission;
036    
037    import java.io.Serializable;
038    
039    import java.util.ArrayList;
040    import java.util.Calendar;
041    import java.util.Date;
042    import java.util.HashMap;
043    import java.util.List;
044    import java.util.Map;
045    
046    import org.apache.chemistry.opencmis.client.api.CmisObject;
047    import org.apache.chemistry.opencmis.client.api.Session;
048    
049    /**
050     * @author Alexander Chow
051     */
052    public class CMISFolder extends CMISModel implements Folder {
053    
054            public CMISFolder(
055                    CMISRepository cmisRepository, String uuid, long folderId,
056                    org.apache.chemistry.opencmis.client.api.Folder cmisFolder) {
057    
058                    _cmisRepository = cmisRepository;
059                    _uuid = uuid;
060                    _folderId = folderId;
061                    _cmisFolder = cmisFolder;
062            }
063    
064            @Override
065            public Object clone() {
066                    CMISFolder cmisFolder = new CMISFolder(
067                            _cmisRepository, _uuid, _folderId, _cmisFolder);
068    
069                    cmisFolder.setCompanyId(getCompanyId());
070                    cmisFolder.setFolderId(getFolderId());
071                    cmisFolder.setGroupId(getGroupId());
072    
073                    try {
074                            cmisFolder.setParentFolder(getParentFolder());
075                    }
076                    catch (Exception e) {
077                    }
078    
079                    cmisFolder.setPrimaryKey(getPrimaryKey());
080    
081                    return cmisFolder;
082            }
083    
084            @Override
085            public boolean containsPermission(
086                    PermissionChecker permissionChecker, String actionId) {
087    
088                    if (_cmisFolder.isRootFolder() &&
089                            (actionId.equals(ActionKeys.DELETE) ||
090                             actionId.equals(ActionKeys.UPDATE))) {
091    
092                            try {
093                                    Folder folder = DLAppLocalServiceUtil.getMountFolder(
094                                            getRepositoryId());
095    
096                                    DLFolder dlFolder = DLFolderLocalServiceUtil.getFolder(
097                                            folder.getFolderId());
098    
099                                    return DLFolderPermission.contains(
100                                            permissionChecker, dlFolder, actionId);
101                            }
102                            catch (PortalException pe) {
103                                    throw new SystemException(pe);
104                            }
105                    }
106                    else {
107                            return containsPermission(_cmisFolder, actionId);
108                    }
109            }
110    
111            @Override
112            public void execute(RepositoryModelOperation repositoryModelOperation)
113                    throws PortalException {
114    
115                    repositoryModelOperation.execute(this);
116            }
117    
118            @Override
119            public List<Long> getAncestorFolderIds() throws PortalException {
120                    List<Long> folderIds = new ArrayList<Long>();
121    
122                    Folder folder = this;
123    
124                    while (!folder.isRoot()) {
125                            folder = folder.getParentFolder();
126    
127                            folderIds.add(folder.getFolderId());
128                    }
129    
130                    return folderIds;
131            }
132    
133            @Override
134            public List<Folder> getAncestors() throws PortalException {
135                    List<Folder> folders = new ArrayList<Folder>();
136    
137                    Folder folder = this;
138    
139                    while (!folder.isRoot()) {
140                            folder = folder.getParentFolder();
141    
142                            folders.add(folder);
143                    }
144    
145                    return folders;
146            }
147    
148            @Override
149            public Map<String, Serializable> getAttributes() {
150                    return new HashMap<String, Serializable>();
151            }
152    
153            @Override
154            public long getCompanyId() {
155                    return _cmisRepository.getCompanyId();
156            }
157    
158            @Override
159            public Date getCreateDate() {
160                    Calendar calendar = _cmisFolder.getCreationDate();
161    
162                    if (calendar != null) {
163                            return calendar.getTime();
164                    }
165                    else {
166                            return new Date();
167                    }
168            }
169    
170            @Override
171            public long getFolderId() {
172                    return _folderId;
173            }
174    
175            @Override
176            public long getGroupId() {
177                    return _cmisRepository.getGroupId();
178            }
179    
180            @Override
181            public Date getLastPostDate() {
182                    return getModifiedDate();
183            }
184    
185            @Override
186            public Object getModel() {
187                    return _cmisFolder;
188            }
189    
190            @Override
191            public Class<?> getModelClass() {
192                    return CMISFolder.class;
193            }
194    
195            @Override
196            public String getModelClassName() {
197                    return CMISFolder.class.getName();
198            }
199    
200            @Override
201            public Date getModifiedDate() {
202                    Calendar calendar = _cmisFolder.getLastModificationDate();
203    
204                    if (calendar != null) {
205                            return calendar.getTime();
206                    }
207                    else {
208                            return new Date();
209                    }
210            }
211    
212            @Override
213            public String getName() {
214                    if (_cmisFolder.isRootFolder()) {
215                            try {
216                                    Folder folder = DLAppLocalServiceUtil.getMountFolder(
217                                            getRepositoryId());
218    
219                                    return folder.getName();
220                            }
221                            catch (Exception e) {
222                                    _log.error(e, e);
223                            }
224                    }
225    
226                    return _cmisFolder.getName();
227            }
228    
229            @Override
230            public Folder getParentFolder() throws PortalException {
231                    Folder parentFolder = null;
232    
233                    try {
234                            parentFolder = super.getParentFolder();
235    
236                            if (parentFolder != null) {
237                                    return parentFolder;
238                            }
239                    }
240                    catch (Exception e) {
241                    }
242    
243                    if (_cmisFolder.isRootFolder()) {
244                            Folder folder = DLAppLocalServiceUtil.getMountFolder(
245                                    getRepositoryId());
246    
247                            parentFolder = folder.getParentFolder();
248                    }
249                    else {
250                            String path = _cmisFolder.getPath();
251    
252                            path = path.substring(0, path.lastIndexOf(CharPool.SLASH));
253    
254                            if (path.length() == 0) {
255                                    path = StringPool.SLASH;
256                            }
257    
258                            Session session =
259                                    (Session)CMISRepositoryLocalServiceUtil.getSession(
260                                            getRepositoryId());
261    
262                            CmisObject parentCmisFolder = session.getObjectByPath(path);
263    
264                            parentFolder = CMISRepositoryLocalServiceUtil.toFolder(
265                                    getRepositoryId(), parentCmisFolder);
266                    }
267    
268                    setParentFolder(parentFolder);
269    
270                    return parentFolder;
271            }
272    
273            @Override
274            public long getParentFolderId() {
275                    try {
276                            Folder parentFolder = getParentFolder();
277    
278                            if (parentFolder != null) {
279                                    return parentFolder.getFolderId();
280                            }
281                    }
282                    catch (Exception e) {
283                            _log.error(e, e);
284                    }
285    
286                    return DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
287            }
288    
289            @Override
290            public long getPrimaryKey() {
291                    return _folderId;
292            }
293    
294            @Override
295            public Serializable getPrimaryKeyObj() {
296                    return getPrimaryKey();
297            }
298    
299            @Override
300            public long getRepositoryId() {
301                    return _cmisRepository.getRepositoryId();
302            }
303    
304            @Override
305            public StagedModelType getStagedModelType() {
306                    return new StagedModelType(DLFolderConstants.getClassName());
307            }
308    
309            @Override
310            public long getUserId() {
311                    User user = getUser(_cmisFolder.getCreatedBy());
312    
313                    if (user == null) {
314                            return 0;
315                    }
316                    else {
317                            return user.getUserId();
318                    }
319            }
320    
321            @Override
322            public String getUserName() {
323                    User user = getUser(_cmisFolder.getCreatedBy());
324    
325                    if (user == null) {
326                            return StringPool.BLANK;
327                    }
328                    else {
329                            return user.getFullName();
330                    }
331            }
332    
333            @Override
334            public String getUserUuid() {
335                    User user = getUser(_cmisFolder.getCreatedBy());
336    
337                    try {
338                            return user.getUserUuid();
339                    }
340                    catch (Exception e) {
341                    }
342    
343                    return StringPool.BLANK;
344            }
345    
346            @Override
347            public String getUuid() {
348                    return _uuid;
349            }
350    
351            @Override
352            public boolean hasInheritableLock() {
353                    return false;
354            }
355    
356            @Override
357            public boolean hasLock() {
358                    return false;
359            }
360    
361            @Override
362            public boolean isDefaultRepository() {
363                    return false;
364            }
365    
366            @Override
367            public boolean isEscapedModel() {
368                    return false;
369            }
370    
371            @Override
372            public boolean isLocked() {
373                    return false;
374            }
375    
376            @Override
377            public boolean isMountPoint() {
378                    return false;
379            }
380    
381            @Override
382            public boolean isRoot() {
383                    if (getParentFolderId() == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
384                            return true;
385                    }
386                    else {
387                            return false;
388                    }
389            }
390    
391            @Override
392            public boolean isSupportsLocking() {
393                    return true;
394            }
395    
396            @Override
397            public boolean isSupportsMetadata() {
398                    return false;
399            }
400    
401            @Override
402            public boolean isSupportsMultipleUpload() {
403                    return false;
404            }
405    
406            @Override
407            public boolean isSupportsShortcuts() {
408                    return false;
409            }
410    
411            @Override
412            public boolean isSupportsSocial() {
413                    return false;
414            }
415    
416            @Override
417            public boolean isSupportsSubscribing() {
418                    return false;
419            }
420    
421            @Override
422            public void setCompanyId(long companyId) {
423                    _cmisRepository.setCompanyId(companyId);
424            }
425    
426            @Override
427            public void setCreateDate(Date date) {
428            }
429    
430            public void setFolderId(long folderId) {
431                    _folderId = folderId;
432            }
433    
434            @Override
435            public void setGroupId(long groupId) {
436                    _cmisRepository.setGroupId(groupId);
437            }
438    
439            @Override
440            public void setModifiedDate(Date date) {
441            }
442    
443            public void setPrimaryKey(long primaryKey) {
444                    setFolderId(primaryKey);
445            }
446    
447            @Override
448            public void setPrimaryKeyObj(Serializable primaryKeyObj) {
449                    setPrimaryKey(((Long)primaryKeyObj).longValue());
450            }
451    
452            @Override
453            public void setUserId(long userId) {
454            }
455    
456            @Override
457            public void setUserName(String userName) {
458            }
459    
460            @Override
461            public void setUserUuid(String userUuid) {
462            }
463    
464            @Override
465            public void setUuid(String uuid) {
466            }
467    
468            @Override
469            public Folder toEscapedModel() {
470                    return this;
471            }
472    
473            @Override
474            public Folder toUnescapedModel() {
475                    return this;
476            }
477    
478            @Override
479            protected CMISRepository getCmisRepository() {
480                    return _cmisRepository;
481            }
482    
483            private static final Log _log = LogFactoryUtil.getLog(CMISFolder.class);
484    
485            private final org.apache.chemistry.opencmis.client.api.Folder _cmisFolder;
486            private final CMISRepository _cmisRepository;
487            private long _folderId;
488            private final String _uuid;
489    
490    }