1
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
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
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 }