2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portlet.documentlibrary.store;
\r
17 import java.io.File;
\r
18 import java.io.FileInputStream;
\r
19 import java.io.FileNotFoundException;
\r
20 import java.io.IOException;
\r
21 import java.io.InputStream;
\r
22 import java.util.Arrays;
\r
23 import java.util.Map;
\r
24 import java.util.concurrent.ConcurrentHashMap;
\r
26 import com.liferay.portal.kernel.exception.PortalException;
\r
27 import com.liferay.portal.kernel.exception.SystemException;
\r
28 import com.liferay.portal.kernel.util.FileUtil;
\r
29 import com.liferay.portal.kernel.util.StringPool;
\r
30 import com.liferay.portal.kernel.util.Validator;
\r
31 import com.liferay.portal.util.PropsValues;
\r
32 import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;
\r
33 import com.liferay.portlet.documentlibrary.DuplicateFileException;
\r
34 import com.liferay.portlet.documentlibrary.NoSuchDirectoryException;
\r
35 import com.liferay.portlet.documentlibrary.NoSuchFileException;
\r
36 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
\r
37 import com.liferay.portlet.documentlibrary.model.DLFolder;
\r
38 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
\r
39 import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
\r
40 import com.liferay.portlet.documentlibrary.util.DLUtil;
\r
41 import com.pentila.entSavoie.cartable.model.DlLink;
\r
42 import com.pentila.entSavoie.cartable.service.DlLinkLocalServiceUtil;
\r
43 import com.pentila.entSavoie.utils.ENTMainUtilsLocalServiceUtil;
\r
46 * @author Brian Wing Shun Chan
\r
47 * @author Sten Martinez
\r
48 * @author Alexander Chow
\r
49 * @author Edward Han
\r
51 public class FileSystemStore extends BaseStore {
\r
53 public static final String COMPANY_ROOT_FOLDER = "10202";
\r
55 public FileSystemStore() {
\r
56 if (!_rootDir.exists()) {
\r
62 public void addDirectory(long companyId, long repositoryId, String dirName)
\r
63 throws PortalException {
\r
65 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
\r
67 if (dirNameDir.exists()) {
\r
68 throw new DuplicateDirectoryException(dirNameDir.getPath());
\r
71 dirNameDir.mkdirs();
\r
75 public void addFile(
\r
76 long companyId, long repositoryId, String fileName, InputStream is)
\r
77 throws PortalException, SystemException {
\r
80 File fileNameVersionFile = getFileNameVersionFile(
\r
81 companyId, repositoryId, fileName, VERSION_DEFAULT);
\r
83 if (fileNameVersionFile.exists()) {
\r
84 throw new DuplicateFileException(fileNameVersionFile.getPath());
\r
87 FileUtil.write(fileNameVersionFile, is);
\r
89 catch (IOException ioe) {
\r
90 throw new SystemException(ioe);
\r
95 public void checkRoot(long companyId) {
\r
99 public void copyFileVersion(
\r
100 long companyId, long repositoryId, String fileName,
\r
101 String fromVersionLabel, String toVersionLabel)
\r
102 throws PortalException, SystemException {
\r
104 File fromFileNameVersionFile = getFileNameVersionFile(
\r
105 companyId, repositoryId, fileName, fromVersionLabel);
\r
107 File toFileNameVersionFile = getFileNameVersionFile(
\r
108 companyId, repositoryId, fileName, toVersionLabel);
\r
110 if (toFileNameVersionFile.exists()) {
\r
111 throw new DuplicateFileException(toFileNameVersionFile.getPath());
\r
115 toFileNameVersionFile.createNewFile();
\r
117 FileUtil.copyFile(fromFileNameVersionFile, toFileNameVersionFile);
\r
119 catch (IOException ioe) {
\r
120 throw new SystemException(ioe);
\r
125 public void deleteDirectory(
\r
126 long companyId, long repositoryId, String dirName)
\r
127 throws PortalException {
\r
129 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
\r
131 if (!dirNameDir.exists()) {
\r
132 throw new NoSuchDirectoryException(dirNameDir.getPath());
\r
135 File parentFile = dirNameDir.getParentFile();
\r
137 FileUtil.deltree(dirNameDir);
\r
139 RepositoryDirKey repositoryDirKey = new RepositoryDirKey(
\r
140 companyId, repositoryId);
\r
142 _repositoryDirs.remove(repositoryDirKey);
\r
144 deleteEmptyAncestors(parentFile);
\r
148 public void deleteFile(long companyId, long repositoryId, String fileName)
\r
149 throws PortalException {
\r
151 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
\r
153 if (!fileNameDir.exists()) {
\r
154 throw new NoSuchFileException(fileNameDir.getPath());
\r
157 File parentFile = fileNameDir.getParentFile();
\r
159 FileUtil.deltree(fileNameDir);
\r
161 deleteEmptyAncestors(companyId, repositoryId, parentFile);
\r
165 public void deleteFile(
\r
166 long companyId, long repositoryId, String fileName,
\r
167 String versionLabel)
\r
168 throws PortalException {
\r
170 File fileNameVersionFile = getFileNameVersionFile(
\r
171 companyId, repositoryId, fileName, versionLabel);
\r
173 if (!fileNameVersionFile.exists()) {
\r
174 throw new NoSuchFileException(fileNameVersionFile.getPath());
\r
177 File parentFile = fileNameVersionFile.getParentFile();
\r
179 fileNameVersionFile.delete();
\r
181 deleteEmptyAncestors(companyId, repositoryId, parentFile);
\r
185 public File getFile(
\r
186 long companyId, long repositoryId, String fileName,
\r
187 String versionLabel)
\r
188 throws PortalException {
\r
190 if (Validator.isNull(versionLabel)) {
\r
191 versionLabel = getHeadVersionLabel(
\r
192 companyId, repositoryId, fileName);
\r
195 File fileNameVersionFile = getFileNameVersionFile(
\r
196 companyId, repositoryId, fileName, versionLabel);
\r
198 if (!fileNameVersionFile.exists()) {
\r
199 throw new NoSuchFileException(fileNameVersionFile.getPath());
\r
202 return fileNameVersionFile;
\r
206 public InputStream getFileAsStream(
\r
207 long companyId, long repositoryId, String fileName,
\r
208 String versionLabel)
\r
209 throws PortalException {
\r
211 // check for a link --> dropBox use of link so no version, don't care of it!!!!
\r
213 DLFolder folder = DLFolderLocalServiceUtil.getDLFolder(repositoryId);
\r
214 DLFileEntry fileAsked = DLFileEntryLocalServiceUtil.getFileEntryByName(folder.getGroupId(), repositoryId, fileName);
\r
215 DlLink dll = DlLinkLocalServiceUtil.getDlFileLinkByTarget(fileAsked.getFileEntryId());
\r
216 // we have a link so we take the source content !!!!!
\r
217 DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(dll.getSourceId());
\r
218 repositoryId = dlfe.getFolderId();
\r
219 fileName = dlfe.getName();
\r
220 versionLabel = dlfe.getVersion();
\r
221 } catch (Exception e1) {
\r
224 if (Validator.isNull(versionLabel)) {
\r
225 versionLabel = getHeadVersionLabel(
\r
226 companyId, repositoryId, fileName);
\r
229 File fileNameVersionFile = getFileNameVersionFile(
\r
230 companyId, repositoryId, fileName, versionLabel);
\r
233 return new FileInputStream(fileNameVersionFile);
\r
235 catch (FileNotFoundException fnfe) {
\r
236 throw new NoSuchFileException(fileNameVersionFile.getPath(), fnfe);
\r
240 public String[] getFileNames(long companyId, long repositoryId) {
\r
241 File repositoryDir = getRepositoryDir(companyId, repositoryId);
\r
243 return FileUtil.listDirs(repositoryDir);
\r
247 public String[] getFileNames(
\r
248 long companyId, long repositoryId, String dirName)
\r
249 throws PortalException {
\r
251 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
\r
253 if (!dirNameDir.exists()) {
\r
254 throw new NoSuchDirectoryException(dirNameDir.getPath());
\r
257 String[] fileNames = FileUtil.listDirs(dirNameDir);
\r
259 Arrays.sort(fileNames);
\r
261 // Convert /${fileName} to /${dirName}/${fileName}
\r
263 for (int i = 0; i < fileNames.length; i++) {
\r
265 StringPool.SLASH + dirName + StringPool.SLASH + fileNames[i];
\r
272 public long getFileSize(long companyId, long repositoryId, String fileName)
\r
273 throws PortalException {
\r
275 // check for a link --> dropBox use of link so no version, don't care of it!!!!
\r
277 DLFolder folder = DLFolderLocalServiceUtil.getDLFolder(repositoryId);
\r
278 DLFileEntry fileAsked = DLFileEntryLocalServiceUtil.getFileEntry(folder.getGroupId(), repositoryId, fileName);
\r
279 DlLink dll = DlLinkLocalServiceUtil.getDlFileLinkByTarget(fileAsked.getFileEntryId());
\r
280 // we have a link so we take the source content !!!!!
\r
281 DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(dll.getSourceId());
\r
282 repositoryId = dlfe.getFolderId();
\r
283 fileName = dlfe.getName();
\r
284 } catch (Exception e1) {
\r
287 String versionLabel = getHeadVersionLabel(
\r
288 companyId, repositoryId, fileName);
\r
290 File fileNameVersionFile = getFileNameVersionFile(
\r
291 companyId, repositoryId, fileName, versionLabel);
\r
293 if (!fileNameVersionFile.exists()) {
\r
294 throw new NoSuchFileException(fileNameVersionFile.getPath());
\r
297 return fileNameVersionFile.length();
\r
301 public boolean hasDirectory(
\r
302 long companyId, long repositoryId, String dirName) {
\r
304 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
\r
306 return dirNameDir.exists();
\r
310 public boolean hasFile(
\r
311 long companyId, long repositoryId, String fileName,
\r
312 String versionLabel) {
\r
314 File fileNameVersionFile = getFileNameVersionFile(
\r
315 companyId, repositoryId, fileName, versionLabel);
\r
317 if (fileNameVersionFile.exists()) {
\r
326 public void move(String srcDir, String destDir) {
\r
330 public void updateFile(
\r
331 long companyId, long repositoryId, long newRepositoryId,
\r
333 throws PortalException {
\r
335 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
\r
336 File newFileNameDir = getFileNameDir(
\r
337 companyId, newRepositoryId, fileName);
\r
339 if (newFileNameDir.exists()) {
\r
340 throw new DuplicateFileException(fileName);
\r
343 File parentFile = fileNameDir.getParentFile();
\r
345 // MIGRATION MODIFICATION
\r
346 boolean success = fileNameDir.renameTo(newFileNameDir);
\r
349 this.moveFile(fileNameDir.getAbsolutePath(), newFileNameDir.getAbsolutePath());
\r
352 deleteEmptyAncestors(companyId, repositoryId, parentFile);
\r
355 public void updateFile(
\r
356 long companyId, long repositoryId, String fileName,
\r
357 String newFileName)
\r
358 throws PortalException {
\r
360 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
\r
361 File newFileNameDir = getFileNameDir(
\r
362 companyId, repositoryId, newFileName);
\r
364 if (newFileNameDir.exists()) {
\r
365 throw new DuplicateFileException(newFileName);
\r
368 File parentFile = fileNameDir.getParentFile();
\r
370 // MIGRATION MODIFICATION
\r
371 boolean success = fileNameDir.renameTo(newFileNameDir);
\r
374 this.moveFile(fileNameDir.getAbsolutePath(), newFileNameDir.getAbsolutePath());
\r
377 deleteEmptyAncestors(companyId, repositoryId, parentFile);
\r
381 public void updateFile(
\r
382 long companyId, long repositoryId, String fileName,
\r
383 String versionLabel, InputStream is)
\r
384 throws PortalException, SystemException {
\r
387 File fileNameVersionFile = getFileNameVersionFile(
\r
388 companyId, repositoryId, fileName, versionLabel);
\r
390 if (fileNameVersionFile.exists()) {
\r
391 throw new DuplicateFileException(fileNameVersionFile.getPath());
\r
394 FileUtil.write(fileNameVersionFile, is);
\r
396 catch (IOException ioe) {
\r
397 throw new SystemException(ioe);
\r
402 public void updateFileVersion(
\r
403 long companyId, long repositoryId, String fileName,
\r
404 String fromVersionLabel, String toVersionLabel)
\r
405 throws PortalException {
\r
407 File fromFileNameVersionFile = getFileNameVersionFile(
\r
408 companyId, repositoryId, fileName, fromVersionLabel);
\r
410 File toFileNameVersionFile = getFileNameVersionFile(
\r
411 companyId, repositoryId, fileName, toVersionLabel);
\r
413 if (toFileNameVersionFile.exists()) {
\r
414 throw new DuplicateFileException(toFileNameVersionFile.getPath());
\r
417 // MIGRATION MODIFICATION
\r
418 boolean success = fromFileNameVersionFile.renameTo(toFileNameVersionFile);
\r
421 this.moveFile(fromFileNameVersionFile.getAbsolutePath(), toFileNameVersionFile.getAbsolutePath());
\r
425 protected void deleteEmptyAncestors(File file) {
\r
426 deleteEmptyAncestors(-1, -1, file);
\r
429 protected void deleteEmptyAncestors(
\r
430 long companyId, long repositoryId, File file) {
\r
432 // Don't check the root company folder (should never be empty nor deleted)
\r
433 if ((file.getName().equals(COMPANY_ROOT_FOLDER))) {
\r
437 String[] fileNames = file.list();
\r
439 if ((fileNames == null) || (fileNames.length > 0)) {
\r
443 String fileName = file.getName();
\r
445 if ((repositoryId > 0) &&
\r
446 fileName.equals(String.valueOf(repositoryId))) {
\r
448 RepositoryDirKey repositoryDirKey = new RepositoryDirKey(
\r
449 companyId, repositoryId);
\r
451 _repositoryDirs.remove(repositoryDirKey);
\r
454 File parentFile = file.getParentFile();
\r
456 if (file.delete() && (parentFile != null)) {
\r
457 deleteEmptyAncestors(companyId, repositoryId, parentFile);
\r
461 protected File getCompanyDir(long companyId) {
\r
462 File companyDir = new File(_rootDir + StringPool.SLASH + companyId);
\r
464 if (!companyDir.exists()) {
\r
465 companyDir.mkdirs();
\r
471 protected File getDirNameDir(
\r
472 long companyId, long repositoryId, String dirName) {
\r
474 return getFileNameDir(companyId, repositoryId, dirName);
\r
477 protected File getFileNameDir(
\r
478 long companyId, long repositoryId, String fileName) {
\r
480 File repositoryDir = getRepositoryDir(companyId, repositoryId);
\r
482 File fileNameDir = new File(
\r
483 repositoryDir + StringPool.SLASH + fileName);
\r
485 return fileNameDir;
\r
488 protected File getFileNameVersionFile(
\r
489 long companyId, long repositoryId, String fileName, String version) {
\r
491 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
\r
493 File fileNameVersionFile = new File(
\r
494 fileNameDir + StringPool.SLASH + version);
\r
496 return fileNameVersionFile;
\r
499 protected String getHeadVersionLabel(
\r
500 long companyId, long repositoryId, String fileName) {
\r
502 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
\r
504 if (!fileNameDir.exists()) {
\r
505 return VERSION_DEFAULT;
\r
508 String[] versionLabels = FileUtil.listFiles(fileNameDir);
\r
510 String headVersionLabel = VERSION_DEFAULT;
\r
512 for (String versionLabel : versionLabels) {
\r
513 if (DLUtil.compareVersions(versionLabel, headVersionLabel) > 0) {
\r
514 headVersionLabel = versionLabel;
\r
518 return headVersionLabel;
\r
521 protected String hashRepositoryID(String base, String repositoryId) {
\r
522 if(repositoryId.length()==0){
\r
525 if (repositoryId.length()<=4){
\r
526 return base + StringPool.SLASH + repositoryId;
\r
529 return hashRepositoryID(base + StringPool.SLASH + repositoryId.substring(0, 4), repositoryId.substring(4));
\r
533 protected File getRepositoryDir(long companyId, long repositoryId) {
\r
535 // Different behaviors for HN and CO3
\r
536 // CO3 : repositoryId is hashed by 4-length
\r
537 // HN : repositoryId is full
\r
538 boolean isCO3 = ENTMainUtilsLocalServiceUtil.isDlStoreCO3(companyId);
\r
541 File companyDir = getCompanyDir(companyId);
\r
543 String newRepoId = hashRepositoryID("", String.valueOf(repositoryId));
\r
545 File repositoryDir = new File(
\r
546 companyDir + StringPool.SLASH + newRepoId);
\r
548 if (!repositoryDir.exists()) {
\r
549 repositoryDir.mkdirs();
\r
552 return repositoryDir;
\r
556 RepositoryDirKey repositoryDirKey = new RepositoryDirKey(
\r
557 companyId, repositoryId);
\r
559 File repositoryDir = _repositoryDirs.get(repositoryDirKey);
\r
561 if (repositoryDir == null) {
\r
562 File companyDir = getCompanyDir(companyId);
\r
564 repositoryDir = new File(
\r
565 companyDir + StringPool.SLASH + repositoryId);
\r
567 if (!repositoryDir.exists()) {
\r
568 repositoryDir.mkdirs();
\r
571 _repositoryDirs.put(repositoryDirKey, repositoryDir);
\r
574 return repositoryDir;
\r
579 // MIGRATION MODIFICATION
\r
580 protected void moveFile(String sourceFile, String destFile){
\r
582 FileUtil.copyDirectory(sourceFile, destFile);
\r
583 FileUtil.deltree(sourceFile);
\r
584 } catch (Exception e) {
\r
585 e.printStackTrace();
\r
589 private Map<RepositoryDirKey, File> _repositoryDirs =
\r
590 new ConcurrentHashMap<RepositoryDirKey, File>();
\r
591 private File _rootDir = new File(PropsValues.DL_STORE_FILE_SYSTEM_ROOT_DIR);
\r
593 private class RepositoryDirKey {
\r
595 public RepositoryDirKey(long companyId, long repositoryId) {
\r
596 _companyId = companyId;
\r
597 _repositoryId = repositoryId;
\r
601 public boolean equals(Object obj) {
\r
602 RepositoryDirKey repositoryDirKey = (RepositoryDirKey)obj;
\r
604 if ((_companyId == repositoryDirKey._companyId) &&
\r
605 (_repositoryId == repositoryDirKey._repositoryId)) {
\r
615 public int hashCode() {
\r
616 return (int)(_companyId * 11 + _repositoryId);
\r
619 private long _companyId;
\r
620 private long _repositoryId;
\r