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.search.Document;
32 import com.liferay.portal.kernel.search.Field;
33 import com.liferay.portal.kernel.search.SearchEngineUtil;
34 import com.liferay.portal.kernel.search.SearchException;
35 import com.liferay.portal.kernel.util.FileUtil;
36 import com.liferay.portal.kernel.util.GetterUtil;
37 import com.liferay.portal.kernel.util.StringPool;
38 import com.liferay.portal.util.PropsKeys;
39 import com.liferay.portal.util.PropsUtil;
40
41 import java.io.File;
42 import java.io.FileInputStream;
43 import java.io.IOException;
44 import java.io.InputStream;
45
46 import java.util.Arrays;
47
48 import org.apache.commons.logging.Log;
49 import org.apache.commons.logging.LogFactory;
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, String properties, 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();
92 }
93
94 FileUtil.write(fileNameVersionFile, is);
95
96 Indexer.addFile(
97 companyId, portletId, groupId, repositoryId, fileName,
98 properties, tagsEntries);
99 }
100 catch (IOException ioe) {
101 throw new SystemException();
102 }
103 }
104
105 public void checkRoot(long companyId) {
106 }
107
108 public void deleteDirectory(
109 long companyId, String portletId, long repositoryId, String dirName)
110 throws PortalException {
111
112 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
113
114 if (!dirNameDir.exists()) {
115 throw new NoSuchDirectoryException();
116 }
117
118 FileUtil.deltree(dirNameDir);
119 }
120
121 public void deleteFile(
122 long companyId, String portletId, long repositoryId,
123 String fileName)
124 throws PortalException, SystemException {
125
126 try {
127 File fileNameDir = getFileNameDir(
128 companyId, repositoryId, fileName);
129
130 if (!fileNameDir.exists()) {
131 throw new NoSuchFileException();
132 }
133
134 FileUtil.deltree(fileNameDir);
135
136 Indexer.deleteFile(companyId, portletId, repositoryId, fileName);
137 }
138 catch (SearchException se) {
139 throw new SystemException();
140 }
141 }
142
143 public void deleteFile(
144 long companyId, String portletId, long repositoryId,
145 String fileName, double versionNumber)
146 throws PortalException {
147
148 File fileNameVersionFile = getFileNameVersionFile(
149 companyId, repositoryId, fileName, versionNumber);
150
151 if (!fileNameVersionFile.exists()) {
152 throw new NoSuchFileException();
153 }
154
155 fileNameVersionFile.delete();
156 }
157
158 public InputStream getFileAsStream(
159 long companyId, long repositoryId, String fileName,
160 double versionNumber)
161 throws PortalException, SystemException {
162
163 try {
164 if (versionNumber == 0) {
165 versionNumber = getHeadVersionNumber(
166 companyId, repositoryId, fileName);
167 }
168
169 File fileNameVersionFile = getFileNameVersionFile(
170 companyId, repositoryId, fileName, versionNumber);
171
172 if (!fileNameVersionFile.exists()) {
173 throw new NoSuchFileException();
174 }
175
176 return new FileInputStream(fileNameVersionFile);
177 }
178 catch (IOException ioe) {
179 throw new SystemException();
180 }
181 }
182
183 public String[] getFileNames(
184 long companyId, long repositoryId, String dirName)
185 throws PortalException {
186
187 File dirNameDir = getDirNameDir(companyId, repositoryId, dirName);
188
189 if (!dirNameDir.exists()) {
190 throw new NoSuchDirectoryException();
191 }
192
193 String[] fileNames = FileUtil.listDirs(dirNameDir);
194
195 Arrays.sort(fileNames);
196
197
199 for (int i = 0; i < fileNames.length; i++) {
200 fileNames[i] =
201 StringPool.SLASH + dirName + StringPool.SLASH + fileNames[i];
202 }
203
204 return fileNames;
205 }
206
207 public long getFileSize(
208 long companyId, long repositoryId, String fileName)
209 throws PortalException {
210
211 double versionNumber = getHeadVersionNumber(
212 companyId, repositoryId, fileName);
213
214 File fileNameVersionFile = getFileNameVersionFile(
215 companyId, repositoryId, fileName, versionNumber);
216
217 if (!fileNameVersionFile.exists()) {
218 throw new NoSuchFileException();
219 }
220
221 return fileNameVersionFile.length();
222 }
223
224 public boolean hasFile(
225 long companyId, long repositoryId, String fileName,
226 double versionNumber) {
227
228 File fileNameVersionFile = getFileNameVersionFile(
229 companyId, repositoryId, fileName, versionNumber);
230
231 if (fileNameVersionFile.exists()) {
232 return true;
233 }
234 else {
235 return false;
236 }
237 }
238
239 public void move(String srcDir, String destDir) {
240 }
241
242 public void reIndex(String[] ids) {
243 long companyId = GetterUtil.getLong(ids[0]);
244 String portletId = ids[1];
245 long groupId = GetterUtil.getLong(ids[2]);
246 long repositoryId = GetterUtil.getLong(ids[3]);
247
248 File repistoryDir = getRepositoryDir(companyId, repositoryId);
249
250 String[] fileNames = FileUtil.listDirs(repistoryDir);
251
252 for (int i = 0; i < fileNames.length; i++) {
253 String fileName = fileNames[i];
254
255 try {
256 Document doc = Indexer.getFileDocument(
257 companyId, portletId, groupId, repositoryId, fileName);
258
259 SearchEngineUtil.updateDocument(
260 companyId, doc.get(Field.UID), doc);
261 }
262 catch (Exception e) {
263 _log.error("Reindexing " + fileName, e);
264 }
265 }
266 }
267
268 public void updateFile(
269 long companyId, String portletId, long groupId, long repositoryId,
270 String fileName, double versionNumber, String sourceFileName,
271 String properties, String[] tagsEntries, 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, 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 = LogFactory.getLog(FileSystemHook.class);
402
403 private File _rootDir;
404
405 }