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