--- /dev/null
+/**\r
+ * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to deal\r
+ * in the Software without restriction, including without limitation the rights\r
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+ * copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+package com.liferay.documentlibrary.util;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.Arrays;\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.GetterUtil;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.util.PropsUtil;\r
+import com.liferay.portlet.documentlibrary.NoSuchDirectoryException;\r
+import com.liferay.portlet.documentlibrary.NoSuchFileException;\r
+import com.liferay.portlet.documentlibrary.folder.service.DLFolderLocalServiceUtil;\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.pentila.entSavoie.cartable.model.DlLink;\r
+import com.pentila.entSavoie.cartable.service.DlLinkLocalServiceUtil;\r
+\r
+/**\r
+ * <a href="FileSystemHook.java.html"><b><i>View Source</i></b></a>\r
+ *\r
+ * @author Brian Wing Shun Chan\r
+ * @author Sten Martinez\r
+ *\r
+ */\r
+public class FileSystemHook {\r
+\r
+ public final double DEFAULT_VERSION = 1.0;\r
+ \r
+ public FileSystemHook() {\r
+ if (!_rootDir.exists()) {\r
+ _rootDir.mkdirs();\r
+ }\r
+ }\r
+\r
+ public void checkRoot(long companyId) {\r
+ }\r
+\r
+\r
+ public InputStream getFileAsStream(\r
+ long companyId, long repositoryId, String fileName,\r
+ double versionNumber)\r
+ throws PortalException, SystemException {\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
+ try {\r
+ if (versionNumber == 0) {\r
+ versionNumber = getHeadVersionNumber(\r
+ companyId, repositoryId, fileName);\r
+ }\r
+\r
+ File fileNameVersionFile = getFileNameVersionFile(\r
+ companyId, repositoryId, fileName, versionNumber);\r
+ \r
+ if (!fileNameVersionFile.exists()) {\r
+ System.out.println("FILE NOT EXISTS " + fileNameVersionFile.getPath());\r
+ throw new NoSuchFileException();\r
+ }\r
+\r
+ return new FileInputStream(fileNameVersionFile);\r
+ }\r
+ catch (IOException ioe) {\r
+ throw new SystemException();\r
+ }\r
+ }\r
+\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();\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
+ 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
+ File repositoryDir = getRepositoryDir(companyId, repositoryId);\r
+\r
+ return new File(repositoryDir + StringPool.SLASH + dirName);\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
+ protected File getRepositoryDir(long companyId, long repositoryId) {\r
+ // ok on hack tout cela pour hasher le repository ID !!!!\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
+\r
+ protected File getFileNameDir(\r
+ long companyId, long repositoryId, String fileName) {\r
+\r
+ String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);\r
+\r
+ int pos = fileName.lastIndexOf(StringPool.SLASH);\r
+\r
+ if (pos == -1) {\r
+ StringBuilder sb = new StringBuilder();\r
+\r
+ String fileNameFragment = removeExtension(fileName);\r
+\r
+ if (fileNameFragment.startsWith("DLFE-")) {\r
+ fileNameFragment = fileNameFragment.substring(5);\r
+\r
+ sb.append("DLFE" + StringPool.SLASH);\r
+ }\r
+\r
+ buildPath(sb, fileNameFragment);\r
+\r
+ File repositoryDir = getRepositoryDir(companyId, repositoryId);\r
+\r
+ return new File(\r
+ repositoryDir + StringPool.SLASH + sb.toString() +\r
+ StringPool.SLASH + fileNameFragment + ext);\r
+ }\r
+ else {\r
+ File fileNameDir = getDirNameDir(companyId, repositoryId, fileName);\r
+ return fileNameDir;\r
+ }\r
+ }\r
+\r
+ protected File getFileNameVersionFile(\r
+ long companyId, long repositoryId, String fileName, double version) {\r
+\r
+\r
+ String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);\r
+\r
+ int pos = fileName.lastIndexOf(StringPool.SLASH);\r
+\r
+ if (pos == -1) {\r
+ StringBuilder sb = new StringBuilder();\r
+\r
+ String fileNameFragment = removeExtension(fileName);\r
+\r
+ if (fileNameFragment.startsWith("DLFE-")) {\r
+ fileNameFragment = fileNameFragment.substring(5);\r
+\r
+ sb.append("DLFE" + StringPool.SLASH);\r
+ }\r
+ else {\r
+ sb.append("DLFE" + StringPool.SLASH);\r
+ }\r
+\r
+ buildPath(sb, fileNameFragment);\r
+\r
+ File repositoryDir = getRepositoryDir(companyId, repositoryId);\r
+\r
+ return new File(\r
+ repositoryDir + StringPool.SLASH + sb.toString() +\r
+ StringPool.SLASH + fileNameFragment + ext +\r
+ StringPool.SLASH + fileNameFragment +\r
+ StringPool.UNDERLINE + version + ext);\r
+ }\r
+ else {\r
+ File fileNameDir = getDirNameDir(companyId, repositoryId, fileName);\r
+\r
+ String fileNameFragment = removeExtension(\r
+ fileName.substring(pos + 1));\r
+\r
+ return new File(\r
+ fileNameDir + StringPool.SLASH + fileNameFragment +\r
+ StringPool.UNDERLINE + version + ext);\r
+ }\r
+ }\r
+\r
+ protected double getHeadVersionNumber(\r
+ long companyId, long repositoryId, String fileName) {\r
+\r
+ File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);\r
+ if (!fileNameDir.exists()) {\r
+ return DEFAULT_VERSION;\r
+ }\r
+\r
+ String[] versionNumbers = FileUtil.listFiles(fileNameDir);\r
+\r
+ double headVersionNumber = DEFAULT_VERSION;\r
+\r
+ for (int i = 0; i < versionNumbers.length; i++) {\r
+ double versionNumber = GetterUtil.getDouble(versionNumbers[i]);\r
+\r
+ if (versionNumber > headVersionNumber) {\r
+ headVersionNumber = versionNumber;\r
+ }\r
+ }\r
+\r
+ return headVersionNumber;\r
+ }\r
+\r
+ protected String removeExtension(String fileName) {\r
+ String ext = FileUtil.getExtension(fileName);\r
+\r
+ if (ext != null) {\r
+ fileName = fileName.substring(\r
+ 0, fileName.length() - ext.length() - 1);\r
+ }\r
+\r
+ return fileName;\r
+ }\r
+ \r
+ protected void buildPath(StringBuilder sb, String fileNameFragment) {\r
+ if (fileNameFragment.length() <= 2) {\r
+ return;\r
+ }\r
+\r
+ if (getDepth(sb.toString()) > 3) {\r
+ return;\r
+ }\r
+\r
+ sb.append(fileNameFragment.substring(0, 2) + StringPool.SLASH);\r
+\r
+ buildPath(sb, fileNameFragment.substring(2));\r
+ }\r
+\r
+ protected int getDepth(String path) {\r
+ String[] fragments = StringUtil.split(path, StringPool.SLASH);\r
+\r
+ return fragments.length;\r
+ }\r
+ \r
+ private File _rootDir = new File(PropsUtil.get("liferay.5.2.3.file.system.root.dir"));\r
+}
\ No newline at end of file