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
58 public class FileSystemHook extends BaseHook {
59
60 public FileSystemHook() {
61 _rootDir = new File(_ROOT_DIR);
62
63 if (!_rootDir.exists()) {
64 _rootDir.mkdirs();
65 }
66 }
67
68 public void addDirectory(long companyId, long repositoryId, String dirName)
69 throws PortalException {
70
71 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
72
73 if (dirNameDir.exists()) {
74 throw new DuplicateDirectoryException();
75 }
76
77 dirNameDir.mkdirs();
78 }
79
80 public void addFile(
81 long companyId, String portletId, long groupId, long repositoryId,
82 String fileName, long fileEntryId, String properties,
83 Date modifiedDate, String[] tagsCategories, String[] tagsEntries,
84 InputStream is)
85 throws PortalException, SystemException {
86
87 try {
88 File fileNameVersionFile = getFileNameVersionFile(
89 companyId, repositoryId, fileName, DEFAULT_VERSION);
90
91 if (fileNameVersionFile.exists()) {
92 throw new DuplicateFileException();
93 }
94
95 FileUtil.write(fileNameVersionFile, is);
96
97 Indexer.addFile(
98 companyId, portletId, groupId, repositoryId, fileName,
99 fileEntryId, properties, modifiedDate, tagsCategories,
100 tagsEntries);
101 }
102 catch (IOException ioe) {
103 throw new SystemException();
104 }
105 }
106
107 public void checkRoot(long companyId) {
108 }
109
110 public void deleteDirectory(
111 long companyId, String portletId, long repositoryId, String dirName)
112 throws PortalException {
113
114 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
115
116 if (!dirNameDir.exists()) {
117 throw new NoSuchDirectoryException();
118 }
119
120 FileUtil.deltree(dirNameDir);
121 }
122
123 public void deleteFile(
124 long companyId, String portletId, long repositoryId,
125 String fileName)
126 throws PortalException, SystemException {
127
128 try {
129 File fileNameDir = getFileNameDir(
130 companyId, repositoryId, fileName);
131
132 if (!fileNameDir.exists()) {
133 throw new NoSuchFileException();
134 }
135
136 FileUtil.deltree(fileNameDir);
137
138 Indexer.deleteFile(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();
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();
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();
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();
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 = Indexer.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 String fileName, double versionNumber, String sourceFileName,
273 long fileEntryId, String properties, Date modifiedDate,
274 String[] tagsCategories, String[] tagsEntries, InputStream is)
275 throws PortalException, SystemException {
276
277 try {
278 File fileNameVersionFile = getFileNameVersionFile(
279 companyId, repositoryId, fileName, versionNumber);
280
281 if (fileNameVersionFile.exists()) {
282 throw new DuplicateFileException();
283 }
284
285 FileUtil.write(fileNameVersionFile, is);
286
287 Indexer.updateFile(
288 companyId, portletId, groupId, repositoryId, fileName,
289 fileEntryId, properties, modifiedDate, tagsCategories,
290 tagsEntries);
291 }
292 catch (IOException ioe) {
293 throw new SystemException();
294 }
295 }
296
297 public void updateFile(
298 long companyId, String portletId, long groupId, long repositoryId,
299 long newRepositoryId, String fileName, long fileEntryId)
300 throws SystemException {
301
302 try {
303 File fileNameDir = getFileNameDir(
304 companyId, repositoryId, fileName);
305 File newFileNameDir = getFileNameDir(
306 companyId, newRepositoryId, fileName);
307
308 FileUtil.copyDirectory(fileNameDir, newFileNameDir);
309
310 FileUtil.deltree(fileNameDir);
311
312 try {
313 Indexer.deleteFile(
314 companyId, portletId, repositoryId, fileName);
315 }
316 catch (SearchException se) {
317 }
318
319 Indexer.addFile(
320 companyId, portletId, groupId, newRepositoryId, fileName);
321 }
322 catch (SearchException se) {
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 getRepositoryDir(long companyId, long repositoryId) {
344 File companyDir = getCompanyDir(companyId);
345
346 File repositoryDir = new File(
347 companyDir + StringPool.SLASH + repositoryId);
348
349 if (!repositoryDir.exists()) {
350 repositoryDir.mkdirs();
351 }
352
353 return repositoryDir;
354 }
355
356 protected File getFileNameDir(
357 long companyId, long repositoryId, String fileName) {
358
359 File repositoryDir = getRepositoryDir(companyId, repositoryId);
360
361 File fileNameDir = new File(
362 repositoryDir + StringPool.SLASH + fileName);
363
364 return fileNameDir;
365 }
366
367 protected File getFileNameVersionFile(
368 long companyId, long repositoryId, String fileName, double version) {
369
370 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
371
372 File fileNameVersionFile = new File(
373 fileNameDir + StringPool.SLASH + version);
374
375 return fileNameVersionFile;
376 }
377
378 protected double getHeadVersionNumber(
379 long companyId, long repositoryId, String fileName) {
380
381 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
382
383 if (!fileNameDir.exists()) {
384 return DEFAULT_VERSION;
385 }
386
387 String[] versionNumbers = FileUtil.listFiles(fileNameDir);
388
389 double headVersionNumber = DEFAULT_VERSION;
390
391 for (int i = 0; i < versionNumbers.length; i++) {
392 double versionNumber = GetterUtil.getDouble(versionNumbers[i]);
393
394 if (versionNumber > headVersionNumber) {
395 headVersionNumber = versionNumber;
396 }
397 }
398
399 return headVersionNumber;
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 }