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