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