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