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