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