--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portlet.documentlibrary.store;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.Arrays;\r
+import java.util.Map;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.util.FileUtil;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;\r
+import com.liferay.portlet.documentlibrary.DuplicateFileException;\r
+import com.liferay.portlet.documentlibrary.NoSuchDirectoryException;\r
+import com.liferay.portlet.documentlibrary.NoSuchFileException;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntry;\r
+import com.liferay.portlet.documentlibrary.model.DLFolder;\r
+import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.util.DLUtil;\r
+import com.pentila.entSavoie.cartable.model.DlLink;\r
+import com.pentila.entSavoie.cartable.service.DlLinkLocalServiceUtil;\r
+import com.pentila.entSavoie.utils.ENTMainUtilsLocalServiceUtil;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Sten Martinez\r
+ * @author Alexander Chow\r
+ * @author Edward Han\r
+ */\r
+public class FileSystemStore extends BaseStore {\r
+ \r
+ public static final String COMPANY_ROOT_FOLDER = "10202";\r
+\r
+ public FileSystemStore() {\r
+ if (!_rootDir.exists()) {\r
+ _rootDir.mkdirs();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void addDirectory(long companyId, long repositoryId, String dirName)\r
+ throws PortalException {\r
+\r
+ File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);\r
+\r
+ if (dirNameDir.exists()) {\r
+ throw new DuplicateDirectoryException(dirNameDir.getPath());\r
+ }\r
+\r
+ dirNameDir.mkdirs();\r
+ }\r
+\r
+ @Override\r
+ public void addFile(\r
+ long companyId, long repositoryId, String fileName, InputStream is)\r
+ throws PortalException, SystemException {\r
+\r
+ try {\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, VERSION_DEFAULT);\r
+\r
+ if (fileNameVersionFile.exists()) {\r
+ throw new DuplicateFileException(fileNameVersionFile.getPath());\r
+ }\r
+\r
+ FileUtil.write(fileNameVersionFile, is);\r
+ }\r
+ catch (IOException ioe) {\r
+ throw new SystemException(ioe);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void checkRoot(long companyId) {\r
+ }\r
+\r
+ @Override\r
+ public void copyFileVersion(\r
+ long companyId, long repositoryId, String fileName,\r
+ String fromVersionLabel, String toVersionLabel)\r
+ throws PortalException, SystemException {\r
+\r
+ File fromFileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, fromVersionLabel);\r
+\r
+ File toFileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, toVersionLabel);\r
+\r
+ if (toFileNameVersionFile.exists()) {\r
+ throw new DuplicateFileException(toFileNameVersionFile.getPath());\r
+ }\r
+\r
+ try {\r
+ toFileNameVersionFile.createNewFile();\r
+\r
+ FileUtil.copyFile(fromFileNameVersionFile, toFileNameVersionFile);\r
+ }\r
+ catch (IOException ioe) {\r
+ throw new SystemException(ioe);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void deleteDirectory(\r
+ long companyId, long repositoryId, String dirName)\r
+ throws PortalException {\r
+\r
+ File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);\r
+\r
+ if (!dirNameDir.exists()) {\r
+ throw new NoSuchDirectoryException(dirNameDir.getPath());\r
+ }\r
+\r
+ File parentFile = dirNameDir.getParentFile();\r
+\r
+ FileUtil.deltree(dirNameDir);\r
+\r
+ RepositoryDirKey repositoryDirKey = new RepositoryDirKey(\r
+ companyId, repositoryId);\r
+\r
+ _repositoryDirs.remove(repositoryDirKey);\r
+\r
+ deleteEmptyAncestors(parentFile);\r
+ }\r
+\r
+ @Override\r
+ public void deleteFile(long companyId, long repositoryId, String fileName)\r
+ throws PortalException {\r
+\r
+ File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);\r
+\r
+ if (!fileNameDir.exists()) {\r
+ throw new NoSuchFileException(fileNameDir.getPath());\r
+ }\r
+\r
+ File parentFile = fileNameDir.getParentFile();\r
+\r
+ FileUtil.deltree(fileNameDir);\r
+\r
+ deleteEmptyAncestors(companyId, repositoryId, parentFile);\r
+ }\r
+\r
+ @Override\r
+ public void deleteFile(\r
+ long companyId, long repositoryId, String fileName,\r
+ String versionLabel)\r
+ throws PortalException {\r
+\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionLabel);\r
+\r
+ if (!fileNameVersionFile.exists()) {\r
+ throw new NoSuchFileException(fileNameVersionFile.getPath());\r
+ }\r
+\r
+ File parentFile = fileNameVersionFile.getParentFile();\r
+\r
+ fileNameVersionFile.delete();\r
+\r
+ deleteEmptyAncestors(companyId, repositoryId, parentFile);\r
+ }\r
+\r
+ @Override\r
+ public File getFile(\r
+ long companyId, long repositoryId, String fileName,\r
+ String versionLabel)\r
+ throws PortalException {\r
+\r
+ if (Validator.isNull(versionLabel)) {\r
+ versionLabel = getHeadVersionLabel(\r
+ companyId, repositoryId, fileName);\r
+ }\r
+\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionLabel);\r
+\r
+ if (!fileNameVersionFile.exists()) {\r
+ throw new NoSuchFileException(fileNameVersionFile.getPath());\r
+ }\r
+\r
+ return fileNameVersionFile;\r
+ }\r
+\r
+ @Override\r
+ public InputStream getFileAsStream(\r
+ long companyId, long repositoryId, String fileName,\r
+ String versionLabel)\r
+ throws PortalException {\r
+ \r
+ // check for a link --> dropBox use of link so no version, don't care of it!!!!\r
+ try {\r
+ DLFolder folder = DLFolderLocalServiceUtil.getDLFolder(repositoryId);\r
+ DLFileEntry fileAsked = DLFileEntryLocalServiceUtil.getFileEntryByName(folder.getGroupId(), repositoryId, fileName);\r
+ DlLink dll = DlLinkLocalServiceUtil.getDlFileLinkByTarget(fileAsked.getFileEntryId());\r
+ // we have a link so we take the source content !!!!!\r
+ DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(dll.getSourceId());\r
+ repositoryId = dlfe.getFolderId();\r
+ fileName = dlfe.getName();\r
+ versionLabel = dlfe.getVersion();\r
+ } catch (Exception e1) {\r
+ }\r
+\r
+ if (Validator.isNull(versionLabel)) {\r
+ versionLabel = getHeadVersionLabel(\r
+ companyId, repositoryId, fileName);\r
+ }\r
+ \r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionLabel);\r
+\r
+ try {\r
+ return new FileInputStream(fileNameVersionFile);\r
+ }\r
+ catch (FileNotFoundException fnfe) {\r
+ throw new NoSuchFileException(fileNameVersionFile.getPath(), fnfe);\r
+ }\r
+ }\r
+\r
+ public String[] getFileNames(long companyId, long repositoryId) {\r
+ File repositoryDir = getRepositoryDir(companyId, repositoryId);\r
+\r
+ return FileUtil.listDirs(repositoryDir);\r
+ }\r
+\r
+ @Override\r
+ public String[] getFileNames(\r
+ long companyId, long repositoryId, String dirName)\r
+ throws PortalException {\r
+\r
+ File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);\r
+\r
+ if (!dirNameDir.exists()) {\r
+ throw new NoSuchDirectoryException(dirNameDir.getPath());\r
+ }\r
+\r
+ String[] fileNames = FileUtil.listDirs(dirNameDir);\r
+\r
+ Arrays.sort(fileNames);\r
+\r
+ // Convert /${fileName} to /${dirName}/${fileName}\r
+\r
+ for (int i = 0; i < fileNames.length; i++) {\r
+ fileNames[i] =\r
+ StringPool.SLASH + dirName + StringPool.SLASH + fileNames[i];\r
+ }\r
+\r
+ return fileNames;\r
+ }\r
+\r
+ @Override\r
+ public long getFileSize(long companyId, long repositoryId, String fileName)\r
+ throws PortalException {\r
+\r
+ // check for a link --> dropBox use of link so no version, don't care of it!!!!\r
+ try {\r
+ DLFolder folder = DLFolderLocalServiceUtil.getDLFolder(repositoryId);\r
+ DLFileEntry fileAsked = DLFileEntryLocalServiceUtil.getFileEntry(folder.getGroupId(), repositoryId, fileName);\r
+ DlLink dll = DlLinkLocalServiceUtil.getDlFileLinkByTarget(fileAsked.getFileEntryId());\r
+ // we have a link so we take the source content !!!!!\r
+ DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(dll.getSourceId());\r
+ repositoryId = dlfe.getFolderId();\r
+ fileName = dlfe.getName();\r
+ } catch (Exception e1) {\r
+ }\r
+ \r
+ String versionLabel = getHeadVersionLabel(\r
+ companyId, repositoryId, fileName);\r
+\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionLabel);\r
+\r
+ if (!fileNameVersionFile.exists()) {\r
+ throw new NoSuchFileException(fileNameVersionFile.getPath());\r
+ }\r
+\r
+ return fileNameVersionFile.length();\r
+ }\r
+\r
+ @Override\r
+ public boolean hasDirectory(\r
+ long companyId, long repositoryId, String dirName) {\r
+\r
+ File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);\r
+\r
+ return dirNameDir.exists();\r
+ }\r
+\r
+ @Override\r
+ public boolean hasFile(\r
+ long companyId, long repositoryId, String fileName,\r
+ String versionLabel) {\r
+\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionLabel);\r
+\r
+ if (fileNameVersionFile.exists()) {\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void move(String srcDir, String destDir) {\r
+ }\r
+\r
+ @Override\r
+ public void updateFile(\r
+ long companyId, long repositoryId, long newRepositoryId,\r
+ String fileName)\r
+ throws PortalException {\r
+\r
+ File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);\r
+ File newFileNameDir = getFileNameDir(\r
+ companyId, newRepositoryId, fileName);\r
+\r
+ if (newFileNameDir.exists()) {\r
+ throw new DuplicateFileException(fileName);\r
+ }\r
+\r
+ File parentFile = fileNameDir.getParentFile();\r
+\r
+ // MIGRATION MODIFICATION\r
+ boolean success = fileNameDir.renameTo(newFileNameDir);\r
+ \r
+ if(!success){\r
+ this.moveFile(fileNameDir.getAbsolutePath(), newFileNameDir.getAbsolutePath());\r
+ }\r
+ \r
+ deleteEmptyAncestors(companyId, repositoryId, parentFile);\r
+ }\r
+\r
+ public void updateFile(\r
+ long companyId, long repositoryId, String fileName,\r
+ String newFileName)\r
+ throws PortalException {\r
+\r
+ File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);\r
+ File newFileNameDir = getFileNameDir(\r
+ companyId, repositoryId, newFileName);\r
+\r
+ if (newFileNameDir.exists()) {\r
+ throw new DuplicateFileException(newFileName);\r
+ }\r
+\r
+ File parentFile = fileNameDir.getParentFile();\r
+\r
+ // MIGRATION MODIFICATION\r
+ boolean success = fileNameDir.renameTo(newFileNameDir);\r
+ \r
+ if(!success){\r
+ this.moveFile(fileNameDir.getAbsolutePath(), newFileNameDir.getAbsolutePath());\r
+ }\r
+\r
+ deleteEmptyAncestors(companyId, repositoryId, parentFile);\r
+ }\r
+\r
+ @Override\r
+ public void updateFile(\r
+ long companyId, long repositoryId, String fileName,\r
+ String versionLabel, InputStream is)\r
+ throws PortalException, SystemException {\r
+\r
+ try {\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionLabel);\r
+\r
+ if (fileNameVersionFile.exists()) {\r
+ throw new DuplicateFileException(fileNameVersionFile.getPath());\r
+ }\r
+\r
+ FileUtil.write(fileNameVersionFile, is);\r
+ }\r
+ catch (IOException ioe) {\r
+ throw new SystemException(ioe);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void updateFileVersion(\r
+ long companyId, long repositoryId, String fileName,\r
+ String fromVersionLabel, String toVersionLabel)\r
+ throws PortalException {\r
+\r
+ File fromFileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, fromVersionLabel);\r
+\r
+ File toFileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, toVersionLabel);\r
+\r
+ if (toFileNameVersionFile.exists()) {\r
+ throw new DuplicateFileException(toFileNameVersionFile.getPath());\r
+ }\r
+\r
+ // MIGRATION MODIFICATION\r
+ boolean success = fromFileNameVersionFile.renameTo(toFileNameVersionFile);\r
+ \r
+ if(!success){\r
+ this.moveFile(fromFileNameVersionFile.getAbsolutePath(), toFileNameVersionFile.getAbsolutePath());\r
+ }\r
+ }\r
+\r
+ protected void deleteEmptyAncestors(File file) {\r
+ deleteEmptyAncestors(-1, -1, file);\r
+ }\r
+\r
+ protected void deleteEmptyAncestors(\r
+ long companyId, long repositoryId, File file) {\r
+\r
+ // Don't check the root company folder (should never be empty nor deleted)\r
+ if ((file.getName().equals(COMPANY_ROOT_FOLDER))) {\r
+ return;\r
+ }\r
+\r
+ String[] fileNames = file.list();\r
+\r
+ if ((fileNames == null) || (fileNames.length > 0)) {\r
+ return;\r
+ }\r
+\r
+ String fileName = file.getName();\r
+\r
+ if ((repositoryId > 0) &&\r
+ fileName.equals(String.valueOf(repositoryId))) {\r
+\r
+ RepositoryDirKey repositoryDirKey = new RepositoryDirKey(\r
+ companyId, repositoryId);\r
+\r
+ _repositoryDirs.remove(repositoryDirKey);\r
+ }\r
+\r
+ File parentFile = file.getParentFile();\r
+\r
+ if (file.delete() && (parentFile != null)) {\r
+ deleteEmptyAncestors(companyId, repositoryId, parentFile);\r
+ }\r
+ }\r
+\r
+ protected File getCompanyDir(long companyId) {\r
+ File companyDir = new File(_rootDir + StringPool.SLASH + companyId);\r
+\r
+ if (!companyDir.exists()) {\r
+ companyDir.mkdirs();\r
+ }\r
+\r
+ return companyDir;\r
+ }\r
+\r
+ protected File getDirNameDir(\r
+ long companyId, long repositoryId, String dirName) {\r
+\r
+ return getFileNameDir(companyId, repositoryId, dirName);\r
+ }\r
+\r
+ protected File getFileNameDir(\r
+ long companyId, long repositoryId, String fileName) {\r
+\r
+ File repositoryDir = getRepositoryDir(companyId, repositoryId);\r
+\r
+ File fileNameDir = new File(\r
+ repositoryDir + StringPool.SLASH + fileName);\r
+\r
+ return fileNameDir;\r
+ }\r
+\r
+ protected File getFileNameVersionFile(\r
+ long companyId, long repositoryId, String fileName, String version) {\r
+\r
+ File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);\r
+\r
+ File fileNameVersionFile = new File(\r
+ fileNameDir + StringPool.SLASH + version);\r
+\r
+ return fileNameVersionFile;\r
+ }\r
+\r
+ protected String getHeadVersionLabel(\r
+ long companyId, long repositoryId, String fileName) {\r
+\r
+ File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);\r
+\r
+ if (!fileNameDir.exists()) {\r
+ return VERSION_DEFAULT;\r
+ }\r
+\r
+ String[] versionLabels = FileUtil.listFiles(fileNameDir);\r
+\r
+ String headVersionLabel = VERSION_DEFAULT;\r
+\r
+ for (String versionLabel : versionLabels) {\r
+ if (DLUtil.compareVersions(versionLabel, headVersionLabel) > 0) {\r
+ headVersionLabel = versionLabel;\r
+ }\r
+ }\r
+\r
+ return headVersionLabel;\r
+ }\r
+\r
+ protected String hashRepositoryID(String base, String repositoryId) {\r
+ if(repositoryId.length()==0){\r
+ return base;\r
+ }\r
+ if (repositoryId.length()<=4){\r
+ return base + StringPool.SLASH + repositoryId;\r
+ }\r
+ else{\r
+ return hashRepositoryID(base + StringPool.SLASH + repositoryId.substring(0, 4), repositoryId.substring(4));\r
+ }\r
+ }\r
+\r
+ protected File getRepositoryDir(long companyId, long repositoryId) {\r
+ \r
+ // Different behaviors for HN and CO3\r
+ // CO3 : repositoryId is hashed by 4-length\r
+ // HN : repositoryId is full\r
+ boolean isCO3 = ENTMainUtilsLocalServiceUtil.isDlStoreCO3(companyId);\r
+ if (isCO3) {\r
+ \r
+ File companyDir = getCompanyDir(companyId);\r
+ \r
+ String newRepoId = hashRepositoryID("", String.valueOf(repositoryId));\r
+ \r
+ File repositoryDir = new File(\r
+ companyDir + StringPool.SLASH + newRepoId);\r
+ \r
+ if (!repositoryDir.exists()) {\r
+ repositoryDir.mkdirs();\r
+ }\r
+ \r
+ return repositoryDir;\r
+\r
+ } else {\r
+ \r
+ RepositoryDirKey repositoryDirKey = new RepositoryDirKey(\r
+ companyId, repositoryId);\r
+\r
+ File repositoryDir = _repositoryDirs.get(repositoryDirKey);\r
+\r
+ if (repositoryDir == null) {\r
+ File companyDir = getCompanyDir(companyId);\r
+\r
+ repositoryDir = new File(\r
+ companyDir + StringPool.SLASH + repositoryId);\r
+\r
+ if (!repositoryDir.exists()) {\r
+ repositoryDir.mkdirs();\r
+ }\r
+\r
+ _repositoryDirs.put(repositoryDirKey, repositoryDir);\r
+ }\r
+\r
+ return repositoryDir;\r
+ }\r
+ \r
+ }\r
+ \r
+ // MIGRATION MODIFICATION\r
+ protected void moveFile(String sourceFile, String destFile){\r
+ try {\r
+ FileUtil.copyDirectory(sourceFile, destFile);\r
+ FileUtil.deltree(sourceFile);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ private Map<RepositoryDirKey, File> _repositoryDirs =\r
+ new ConcurrentHashMap<RepositoryDirKey, File>();\r
+ private File _rootDir = new File(PropsValues.DL_STORE_FILE_SYSTEM_ROOT_DIR);\r
+\r
+ private class RepositoryDirKey {\r
+\r
+ public RepositoryDirKey(long companyId, long repositoryId) {\r
+ _companyId = companyId;\r
+ _repositoryId = repositoryId;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ RepositoryDirKey repositoryDirKey = (RepositoryDirKey)obj;\r
+\r
+ if ((_companyId == repositoryDirKey._companyId) &&\r
+ (_repositoryId == repositoryDirKey._repositoryId)) {\r
+\r
+ return true;\r
+ }\r
+ else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return (int)(_companyId * 11 + _repositoryId);\r
+ }\r
+\r
+ private long _companyId;\r
+ private long _repositoryId;\r
+\r
+ }\r
+\r
+}
\ No newline at end of file