1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.documentlibrary.util;
16  
17  import com.liferay.portal.kernel.util.FileUtil;
18  import com.liferay.portal.kernel.util.StringBundler;
19  import com.liferay.portal.kernel.util.StringPool;
20  import com.liferay.portal.kernel.util.StringUtil;
21  import com.liferay.portlet.documentlibrary.util.DLUtil;
22  
23  import java.io.File;
24  
25  /**
26   * <a href="AdvancedFileSystemHook.java.html"><b><i>View Source</i></b></a>
27   *
28   * <p>
29   * See http://issues.liferay.com/browse/LPS-1976.
30   * </p>
31   *
32   * @author Jorge Ferrer
33   */
34  public class AdvancedFileSystemHook extends FileSystemHook {
35  
36      protected void buildPath(StringBundler sb, String fileNameFragment) {
37          int fileNameFragmentLength = fileNameFragment.length();
38  
39          if ((fileNameFragmentLength <= 2) || (getDepth(sb.toString()) > 3)) {
40              return;
41          }
42  
43          for (int i = 0;i < fileNameFragmentLength;i += 2) {
44              if ((i + 2) < fileNameFragmentLength) {
45                  sb.append(fileNameFragment.substring(i, i + 2));
46                  sb.append(StringPool.SLASH);
47  
48                  if (getDepth(sb.toString()) > 3) {
49                      return;
50                  }
51              }
52          }
53  
54          return;
55      }
56  
57      protected int getDepth(String path) {
58          String[] fragments = StringUtil.split(path, StringPool.SLASH);
59  
60          return fragments.length;
61      }
62  
63      protected File getDirNameDir(
64          long companyId, long repositoryId, String dirName) {
65  
66          File repositoryDir = getRepositoryDir(companyId, repositoryId);
67  
68          return new File(repositoryDir + StringPool.SLASH + dirName);
69      }
70  
71      protected File getFileNameDir(
72          long companyId, long repositoryId, String fileName) {
73  
74          String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);
75  
76          StringBundler sb = new StringBundler();
77  
78          String fileNameFragment = FileUtil.stripExtension(fileName);
79  
80          if (fileNameFragment.startsWith("DLFE-")) {
81              fileNameFragment = fileNameFragment.substring(5);
82  
83              sb.append("DLFE" + StringPool.SLASH);
84          }
85  
86          buildPath(sb, fileNameFragment);
87  
88          File repositoryDir = getRepositoryDir(companyId, repositoryId);
89  
90          File fileNameDir = new File(
91              repositoryDir + StringPool.SLASH + sb.toString() +
92                  StringPool.SLASH + fileNameFragment + ext);
93  
94          return fileNameDir;
95      }
96  
97      protected File getFileNameVersionFile(
98          long companyId, long repositoryId, String fileName, String version) {
99  
100         String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);
101 
102         int pos = fileName.lastIndexOf(StringPool.SLASH);
103 
104         if (pos == -1) {
105             StringBundler sb = new StringBundler();
106 
107             String fileNameFragment = FileUtil.stripExtension(fileName);
108 
109             if (fileNameFragment.startsWith("DLFE-")) {
110                 fileNameFragment = fileNameFragment.substring(5);
111 
112                 sb.append("DLFE" + StringPool.SLASH);
113             }
114 
115             buildPath(sb, fileNameFragment);
116 
117             File repositoryDir = getRepositoryDir(companyId, repositoryId);
118 
119             return new File(
120                 repositoryDir + StringPool.SLASH + sb.toString() +
121                     StringPool.SLASH + fileNameFragment + ext +
122                         StringPool.SLASH + fileNameFragment +
123                             StringPool.UNDERLINE + version + ext);
124         }
125         else {
126             File fileNameDir = getDirNameDir(companyId, repositoryId, fileName);
127 
128             String fileNameFragment = FileUtil.stripExtension(
129                 fileName.substring(pos + 1));
130 
131             return new File(
132                 fileNameDir + StringPool.SLASH + fileNameFragment +
133                     StringPool.UNDERLINE + version + ext);
134         }
135     }
136 
137     protected String getHeadVersionNumber(
138         long companyId, long repositoryId, String fileName) {
139 
140         File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
141 
142         if (!fileNameDir.exists()) {
143             return DEFAULT_VERSION;
144         }
145 
146         String[] versionNumbers = FileUtil.listFiles(fileNameDir);
147 
148         String headVersionNumber = DEFAULT_VERSION;
149 
150         for (int i = 0; i < versionNumbers.length; i++) {
151             String versionNumberFragment = versionNumbers[i];
152 
153             int pos = versionNumberFragment.lastIndexOf(StringPool.UNDERLINE);
154 
155             if (pos > -1) {
156                 versionNumberFragment = versionNumberFragment.substring(
157                     pos + 1);
158             }
159 
160             String versionNumber = versionNumberFragment;
161 
162             if (DLUtil.compareVersions(versionNumber, headVersionNumber) > 0) {
163                 headVersionNumber = versionNumber;
164             }
165         }
166 
167         return headVersionNumber;
168     }
169 
170 }