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.documentlibrary.DuplicateDirectoryException;
18  import com.liferay.documentlibrary.DuplicateFileException;
19  import com.liferay.documentlibrary.NoSuchDirectoryException;
20  import com.liferay.documentlibrary.NoSuchFileException;
21  import com.liferay.portal.PortalException;
22  import com.liferay.portal.SystemException;
23  import com.liferay.portal.kernel.log.Log;
24  import com.liferay.portal.kernel.log.LogFactoryUtil;
25  import com.liferay.portal.kernel.search.Document;
26  import com.liferay.portal.kernel.search.Field;
27  import com.liferay.portal.kernel.search.SearchEngineUtil;
28  import com.liferay.portal.kernel.search.SearchException;
29  import com.liferay.portal.kernel.util.FileUtil;
30  import com.liferay.portal.kernel.util.GetterUtil;
31  import com.liferay.portal.kernel.util.PropsKeys;
32  import com.liferay.portal.kernel.util.StringPool;
33  import com.liferay.portal.util.PropsUtil;
34  
35  import java.io.File;
36  import java.io.FileInputStream;
37  import java.io.IOException;
38  import java.io.InputStream;
39  
40  import java.util.Arrays;
41  import java.util.Date;
42  
43  /**
44   * <a href="FileSystemHook.java.html"><b><i>View Source</i></b></a>
45   *
46   * @author Brian Wing Shun Chan
47   * @author Sten Martinez
48   */
49  public class FileSystemHook extends BaseHook {
50  
51      public FileSystemHook() {
52          _rootDir = new File(_ROOT_DIR);
53  
54          if (!_rootDir.exists()) {
55              _rootDir.mkdirs();
56          }
57      }
58  
59      public void addDirectory(long companyId, long repositoryId, String dirName)
60          throws PortalException {
61  
62          File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
63  
64          if (dirNameDir.exists()) {
65              throw new DuplicateDirectoryException(dirNameDir.getPath());
66          }
67  
68          dirNameDir.mkdirs();
69      }
70  
71      public void addFile(
72              long companyId, String portletId, long groupId, long repositoryId,
73              String fileName, String properties, Date modifiedDate,
74              String[] tagsEntries, InputStream is)
75          throws PortalException, SystemException {
76  
77          try {
78              File fileNameVersionFile = getFileNameVersionFile(
79                  companyId, repositoryId, fileName, DEFAULT_VERSION);
80  
81              if (fileNameVersionFile.exists()) {
82                  throw new DuplicateFileException(fileNameVersionFile.getPath());
83              }
84  
85              FileUtil.write(fileNameVersionFile, is);
86  
87              DLIndexerUtil.addFile(
88                  companyId, portletId, groupId, repositoryId, fileName,
89                  properties, modifiedDate, tagsEntries);
90          }
91          catch (IOException ioe) {
92              throw new SystemException(ioe);
93          }
94      }
95  
96      public void checkRoot(long companyId) {
97      }
98  
99      public void deleteDirectory(
100             long companyId, String portletId, long repositoryId, String dirName)
101         throws PortalException {
102 
103         File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
104 
105         if (!dirNameDir.exists()) {
106             throw new NoSuchDirectoryException(dirNameDir.getPath());
107         }
108 
109         FileUtil.deltree(dirNameDir);
110     }
111 
112     public void deleteFile(
113             long companyId, String portletId, long repositoryId,
114             String fileName)
115         throws PortalException, SystemException {
116 
117         try {
118             File fileNameDir = getFileNameDir(
119                 companyId, repositoryId, fileName);
120 
121             if (!fileNameDir.exists()) {
122                 throw new NoSuchFileException(fileNameDir.getPath());
123             }
124 
125             FileUtil.deltree(fileNameDir);
126 
127             DLIndexerUtil.deleteFile(
128                 companyId, portletId, repositoryId, fileName);
129         }
130         catch (SearchException se) {
131             throw new SystemException();
132         }
133     }
134 
135     public void deleteFile(
136             long companyId, String portletId, long repositoryId,
137             String fileName, double versionNumber)
138         throws PortalException {
139 
140         File fileNameVersionFile = getFileNameVersionFile(
141             companyId, repositoryId, fileName, versionNumber);
142 
143         if (!fileNameVersionFile.exists()) {
144             throw new NoSuchFileException(fileNameVersionFile.getPath());
145         }
146 
147         fileNameVersionFile.delete();
148     }
149 
150     public InputStream getFileAsStream(
151             long companyId, long repositoryId, String fileName,
152             double versionNumber)
153         throws PortalException, SystemException {
154 
155         try {
156             if (versionNumber == 0) {
157                 versionNumber = getHeadVersionNumber(
158                     companyId, repositoryId, fileName);
159             }
160 
161             File fileNameVersionFile = getFileNameVersionFile(
162                 companyId, repositoryId, fileName, versionNumber);
163 
164             if (!fileNameVersionFile.exists()) {
165                 throw new NoSuchFileException(fileNameVersionFile.getPath());
166             }
167 
168             return new FileInputStream(fileNameVersionFile);
169         }
170         catch (IOException ioe) {
171             throw new SystemException(ioe);
172         }
173     }
174 
175     public String[] getFileNames(
176             long companyId, long repositoryId, String dirName)
177         throws PortalException {
178 
179         File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
180 
181         if (!dirNameDir.exists()) {
182             throw new NoSuchDirectoryException(dirNameDir.getPath());
183         }
184 
185         String[] fileNames = FileUtil.listDirs(dirNameDir);
186 
187         Arrays.sort(fileNames);
188 
189         // Convert /${fileName} to /${dirName}/${fileName}
190 
191         for (int i = 0; i < fileNames.length; i++) {
192             fileNames[i] =
193                 StringPool.SLASH + dirName + StringPool.SLASH + fileNames[i];
194         }
195 
196         return fileNames;
197     }
198 
199     public long getFileSize(
200             long companyId, long repositoryId, String fileName)
201         throws PortalException {
202 
203         double versionNumber = getHeadVersionNumber(
204             companyId, repositoryId, fileName);
205 
206         File fileNameVersionFile = getFileNameVersionFile(
207             companyId, repositoryId, fileName, versionNumber);
208 
209         if (!fileNameVersionFile.exists()) {
210             throw new NoSuchFileException(fileNameVersionFile.getPath());
211         }
212 
213         return fileNameVersionFile.length();
214     }
215 
216     public boolean hasFile(
217         long companyId, long repositoryId, String fileName,
218         double versionNumber) {
219 
220         File fileNameVersionFile = getFileNameVersionFile(
221             companyId, repositoryId, fileName, versionNumber);
222 
223         if (fileNameVersionFile.exists()) {
224             return true;
225         }
226         else {
227             return false;
228         }
229     }
230 
231     public void move(String srcDir, String destDir) {
232     }
233 
234     public void reIndex(String[] ids) {
235         long companyId = GetterUtil.getLong(ids[0]);
236         String portletId = ids[1];
237         long groupId = GetterUtil.getLong(ids[2]);
238         long repositoryId = GetterUtil.getLong(ids[3]);
239 
240         File repistoryDir = getRepositoryDir(companyId, repositoryId);
241 
242         String[] fileNames = FileUtil.listDirs(repistoryDir);
243 
244         for (int i = 0; i < fileNames.length; i++) {
245             String fileName = fileNames[i];
246 
247             try {
248                 Document doc = DLIndexerUtil.getFileDocument(
249                     companyId, portletId, groupId, repositoryId, fileName);
250 
251                 SearchEngineUtil.updateDocument(
252                     companyId, doc.get(Field.UID), doc);
253             }
254             catch (Exception e) {
255                 _log.error("Reindexing " + fileName, e);
256             }
257         }
258     }
259 
260     public void updateFile(
261             long companyId, String portletId, long groupId, long repositoryId,
262             long newRepositoryId, String fileName)
263         throws SystemException {
264 
265         try {
266             File fileNameDir = getFileNameDir(
267                 companyId, repositoryId, fileName);
268             File newFileNameDir = getFileNameDir(
269                 companyId, newRepositoryId, fileName);
270 
271             FileUtil.copyDirectory(fileNameDir, newFileNameDir);
272 
273             FileUtil.deltree(fileNameDir);
274 
275             try {
276                 DLIndexerUtil.deleteFile(
277                     companyId, portletId, repositoryId, fileName);
278             }
279             catch (SearchException se) {
280             }
281 
282             DLIndexerUtil.addFile(
283                 companyId, portletId, groupId, newRepositoryId, fileName);
284         }
285         catch (SearchException se) {
286             throw new SystemException();
287         }
288     }
289 
290     public void updateFile(
291             long companyId, String portletId, long groupId, long repositoryId,
292             String fileName, double versionNumber, String sourceFileName,
293             String properties, Date modifiedDate, String[] tagsEntries,
294             InputStream is)
295         throws PortalException, SystemException {
296 
297         try {
298             File fileNameVersionFile = getFileNameVersionFile(
299                 companyId, repositoryId, fileName, versionNumber);
300 
301             if (fileNameVersionFile.exists()) {
302                 throw new DuplicateFileException(fileNameVersionFile.getPath());
303             }
304 
305             FileUtil.write(fileNameVersionFile, is);
306 
307             DLIndexerUtil.updateFile(
308                 companyId, portletId, groupId, repositoryId, fileName,
309                 properties, modifiedDate, tagsEntries);
310         }
311         catch (IOException ioe) {
312             throw new SystemException(ioe);
313         }
314     }
315 
316     protected File getCompanyDir(long companyId) {
317         File companyDir = new File(_rootDir + StringPool.SLASH + companyId);
318 
319         if (!companyDir.exists()) {
320             companyDir.mkdirs();
321         }
322 
323         return companyDir;
324     }
325 
326     protected File getDirNameDir(
327         long companyId, long repositoryId, String dirName) {
328 
329         return getFileNameDir(companyId, repositoryId, dirName);
330     }
331 
332     protected File getFileNameDir(
333         long companyId, long repositoryId, String fileName) {
334 
335         File repositoryDir = getRepositoryDir(companyId, repositoryId);
336 
337         File fileNameDir = new File(
338             repositoryDir + StringPool.SLASH + fileName);
339 
340         return fileNameDir;
341     }
342 
343     protected File getFileNameVersionFile(
344         long companyId, long repositoryId, String fileName, double version) {
345 
346         File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
347 
348         File fileNameVersionFile = new File(
349             fileNameDir + StringPool.SLASH + version);
350 
351         return fileNameVersionFile;
352     }
353 
354     protected double getHeadVersionNumber(
355         long companyId, long repositoryId, String fileName) {
356 
357         File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
358 
359         if (!fileNameDir.exists()) {
360             return DEFAULT_VERSION;
361         }
362 
363         String[] versionNumbers = FileUtil.listFiles(fileNameDir);
364 
365         double headVersionNumber = DEFAULT_VERSION;
366 
367         for (int i = 0; i < versionNumbers.length; i++) {
368             double versionNumber = GetterUtil.getDouble(versionNumbers[i]);
369 
370             if (versionNumber > headVersionNumber) {
371                 headVersionNumber = versionNumber;
372             }
373         }
374 
375         return headVersionNumber;
376     }
377 
378     protected File getRepositoryDir(long companyId, long repositoryId) {
379         File companyDir = getCompanyDir(companyId);
380 
381         File repositoryDir = new File(
382             companyDir + StringPool.SLASH + repositoryId);
383 
384         if (!repositoryDir.exists()) {
385             repositoryDir.mkdirs();
386         }
387 
388         return repositoryDir;
389     }
390 
391     private static final String _ROOT_DIR = PropsUtil.get(
392         PropsKeys.DL_HOOK_FILE_SYSTEM_ROOT_DIR);
393 
394     private static Log _log = LogFactoryUtil.getLog(FileSystemHook.class);
395 
396     private File _rootDir;
397 
398 }