1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.documentlibrary.util;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.log.LogFactoryUtil;
19  import com.liferay.portal.kernel.search.Document;
20  import com.liferay.portal.kernel.search.Field;
21  import com.liferay.portal.kernel.search.SearchEngineUtil;
22  import com.liferay.portal.kernel.util.CharPool;
23  import com.liferay.portal.kernel.util.FileUtil;
24  import com.liferay.portal.kernel.util.GetterUtil;
25  import com.liferay.portal.kernel.util.StringBundler;
26  import com.liferay.portal.kernel.util.StringPool;
27  import com.liferay.portal.kernel.util.StringUtil;
28  import com.liferay.portal.kernel.util.Validator;
29  
30  import java.io.File;
31  
32  /**
33   * <a href="AdvancedFileSystemHook.java.html"><b><i>View Source</i></b></a>
34   *
35   * <p>
36   * See http://issues.liferay.com/browse/LPS-1976.
37   * </p>
38   *
39   * @author Jorge Ferrer
40   */
41  public class AdvancedFileSystemHook extends FileSystemHook {
42  
43      public void reIndex(String[] ids) {
44          long companyId = GetterUtil.getLong(ids[0]);
45          String portletId = ids[1];
46          long groupId = GetterUtil.getLong(ids[2]);
47          long repositoryId = GetterUtil.getLong(ids[3]);
48  
49          File repositoryDir = getRepositoryDir(companyId, repositoryId);
50  
51          String[] fileNames = FileUtil.listDirs(repositoryDir);
52  
53          boolean dlFile = false;
54  
55          for (String fileName : fileNames) {
56              reindex(
57                  companyId, portletId, groupId, repositoryId,
58                  repositoryDir.getPath() + StringPool.SLASH + fileName, dlFile);
59          }
60      }
61  
62      protected void buildPath(StringBundler sb, String fileNameFragment) {
63          int fileNameFragmentLength = fileNameFragment.length();
64  
65          if ((fileNameFragmentLength <= 2) || (getDepth(sb.toString()) > 3)) {
66              return;
67          }
68  
69          for (int i = 0;i < fileNameFragmentLength;i += 2) {
70              if ((i + 2) < fileNameFragmentLength) {
71                  sb.append(fileNameFragment.substring(i, i + 2));
72                  sb.append(StringPool.SLASH);
73  
74                  if (getDepth(sb.toString()) > 3) {
75                      return;
76                  }
77              }
78          }
79  
80          return;
81      }
82  
83      protected int getDepth(String path) {
84          String[] fragments = StringUtil.split(path, StringPool.SLASH);
85  
86          return fragments.length;
87      }
88  
89      protected File getDirNameDir(
90          long companyId, long repositoryId, String dirName) {
91  
92          File repositoryDir = getRepositoryDir(companyId, repositoryId);
93  
94          return new File(repositoryDir + StringPool.SLASH + dirName);
95      }
96  
97      protected File getFileNameDir(
98          long companyId, long repositoryId, String fileName) {
99  
100         if (fileName.indexOf(CharPool.SLASH) != -1) {
101             return getDirNameDir(companyId, repositoryId, fileName);
102         }
103 
104         String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);
105 
106         StringBundler sb = new StringBundler();
107 
108         String fileNameFragment = removeExtension(fileName);
109 
110         if (fileNameFragment.startsWith("DLFE-")) {
111             fileNameFragment = fileNameFragment.substring(5);
112 
113             sb.append("DLFE" + StringPool.SLASH);
114         }
115 
116         buildPath(sb, fileNameFragment);
117 
118         File repositoryDir = getRepositoryDir(companyId, repositoryId);
119 
120         File fileNameDir = new File(
121             repositoryDir + StringPool.SLASH + sb.toString() +
122                 StringPool.SLASH + fileNameFragment + ext);
123 
124         return fileNameDir;
125     }
126 
127     protected File getFileNameVersionFile(
128         long companyId, long repositoryId, String fileName, double version) {
129 
130         String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);
131 
132         int pos = fileName.lastIndexOf(StringPool.SLASH);
133 
134         if (pos == -1) {
135             StringBundler sb = new StringBundler();
136 
137             String fileNameFragment = removeExtension(fileName);
138 
139             if (fileNameFragment.startsWith("DLFE-")) {
140                 fileNameFragment = fileNameFragment.substring(5);
141 
142                 sb.append("DLFE" + StringPool.SLASH);
143             }
144 
145             buildPath(sb, fileNameFragment);
146 
147             File repositoryDir = getRepositoryDir(companyId, repositoryId);
148 
149             return new File(
150                 repositoryDir + StringPool.SLASH + sb.toString() +
151                     StringPool.SLASH + fileNameFragment + ext +
152                         StringPool.SLASH + fileNameFragment +
153                             StringPool.UNDERLINE + version + ext);
154         }
155         else {
156             File fileNameDir = getDirNameDir(companyId, repositoryId, fileName);
157 
158             String fileNameFragment = removeExtension(
159                 fileName.substring(pos + 1));
160 
161             return new File(
162                 fileNameDir + StringPool.SLASH + fileNameFragment +
163                     StringPool.UNDERLINE + version + ext);
164         }
165     }
166 
167     protected double getHeadVersionNumber(
168         long companyId, long repositoryId, String fileName) {
169 
170         File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
171 
172         if (!fileNameDir.exists()) {
173             return DEFAULT_VERSION;
174         }
175 
176         String[] versionNumbers = FileUtil.listFiles(fileNameDir);
177 
178         double headVersionNumber = DEFAULT_VERSION;
179 
180         for (int i = 0; i < versionNumbers.length; i++) {
181             String versionNumberFragment = versionNumbers[i];
182 
183             versionNumberFragment = removeExtension(versionNumberFragment);
184 
185             int pos = versionNumberFragment.lastIndexOf(StringPool.UNDERLINE);
186 
187             if (pos > -1) {
188                 versionNumberFragment = versionNumberFragment.substring(
189                     pos + 1);
190             }
191 
192             double versionNumber = GetterUtil.getDouble(versionNumberFragment);
193 
194             if (versionNumber > headVersionNumber) {
195                 headVersionNumber = versionNumber;
196             }
197         }
198 
199         return headVersionNumber;
200     }
201 
202     protected void reindex(
203         long companyId, String portletId, long groupId, long repositoryId,
204         String fileName, boolean dlFile) {
205 
206         String shortFileName = FileUtil.getShortFileName(fileName);
207 
208         if (shortFileName.equals("DLFE")) {
209             dlFile = true;
210         }
211 
212         if (shortFileName.equals("DLFE") ||
213             Validator.isNumber(shortFileName)) {
214 
215             String[] curFileNames = FileUtil.listDirs(fileName);
216 
217             for (String curFileName : curFileNames) {
218                 reindex(
219                     companyId, portletId, groupId, repositoryId,
220                     fileName + StringPool.SLASH + curFileName, dlFile);
221             }
222         }
223         else {
224             if (dlFile) {
225                 shortFileName = "DLFE-" + shortFileName;
226             }
227 
228             try {
229                 Document doc = DLIndexerUtil.getFileDocument(
230                     companyId, portletId, groupId, 0, repositoryId,
231                     shortFileName);
232 
233                 if (doc != null) {
234                     SearchEngineUtil.updateDocument(
235                         companyId, doc.get(Field.UID), doc);
236                 }
237             }
238             catch (Exception e) {
239                 _log.error("Reindexing " + shortFileName, e);
240             }
241         }
242     }
243 
244     protected String removeExtension(String fileName) {
245         String ext = FileUtil.getExtension(fileName);
246 
247         if (ext != null) {
248             fileName = fileName.substring(
249                 0, fileName.length() - ext.length() - 1);
250         }
251 
252         return fileName;
253     }
254 
255     private static Log _log = LogFactoryUtil.getLog(
256         AdvancedFileSystemHook.class);
257 
258 }