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.SearchEngineUtil;
33 import com.liferay.portal.kernel.search.SearchException;
34 import com.liferay.portal.kernel.util.FileUtil;
35 import com.liferay.portal.kernel.util.GetterUtil;
36 import com.liferay.portal.kernel.util.StringPool;
37 import com.liferay.portal.util.PropsKeys;
38 import com.liferay.portal.util.PropsUtil;
39
40 import java.io.File;
41 import java.io.FileInputStream;
42 import java.io.IOException;
43 import java.io.InputStream;
44
45 import java.util.Arrays;
46
47 import org.apache.commons.logging.Log;
48 import org.apache.commons.logging.LogFactory;
49
50
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, String[] tagsEntries,
82 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, 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.addDocument(companyId, doc);
259 }
260 catch (Exception e) {
261 _log.error("Reindexing " + fileName, e);
262 }
263 }
264 }
265
266 public void updateFile(
267 long companyId, String portletId, long groupId, long repositoryId,
268 String fileName, double versionNumber, String sourceFileName,
269 String properties, String[] tagsEntries, InputStream is)
270 throws PortalException, SystemException {
271
272 try {
273 File fileNameVersionFile = getFileNameVersionFile(
274 companyId, repositoryId, fileName, versionNumber);
275
276 if (fileNameVersionFile.exists()) {
277 throw new DuplicateFileException();
278 }
279
280 FileUtil.write(fileNameVersionFile, is);
281
282 Indexer.updateFile(
283 companyId, portletId, groupId, repositoryId, fileName,
284 properties, tagsEntries);
285 }
286 catch (IOException ioe) {
287 throw new SystemException();
288 }
289 }
290
291 public void updateFile(
292 long companyId, String portletId, long groupId, long repositoryId,
293 long newRepositoryId, String fileName)
294 throws SystemException {
295
296 try {
297 File fileNameDir = getFileNameDir(
298 companyId, repositoryId, fileName);
299 File newFileNameDir = getFileNameDir(
300 companyId, newRepositoryId, fileName);
301
302 FileUtil.copyDirectory(fileNameDir, newFileNameDir);
303
304 FileUtil.deltree(fileNameDir);
305
306 try {
307 Indexer.deleteFile(
308 companyId, portletId, repositoryId, fileName);
309 }
310 catch (SearchException se) {
311 }
312
313 Indexer.addFile(
314 companyId, portletId, groupId, newRepositoryId, fileName);
315 }
316 catch (SearchException se) {
317 throw new SystemException();
318 }
319 }
320
321 protected File getCompanyDir(long companyId) {
322 File companyDir = new File(_rootDir + StringPool.SLASH + companyId);
323
324 if (!companyDir.exists()) {
325 companyDir.mkdirs();
326 }
327
328 return companyDir;
329 }
330
331 protected File getDirNameDir(
332 long companyId, long repositoryId, String dirName) {
333
334 return getFileNameDir(companyId, repositoryId, dirName);
335 }
336
337 protected File getRepositoryDir(long companyId, long repositoryId) {
338 File companyDir = getCompanyDir(companyId);
339
340 File repositoryDir = new File(
341 companyDir + StringPool.SLASH + repositoryId);
342
343 if (!repositoryDir.exists()) {
344 repositoryDir.mkdirs();
345 }
346
347 return repositoryDir;
348 }
349
350 protected File getFileNameDir(
351 long companyId, long repositoryId, String fileName) {
352
353 File repositoryDir = getRepositoryDir(companyId, repositoryId);
354
355 File fileNameDir = new File(
356 repositoryDir + StringPool.SLASH + fileName);
357
358 return fileNameDir;
359 }
360
361 protected File getFileNameVersionFile(
362 long companyId, long repositoryId, String fileName, double version) {
363
364 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
365
366 File fileNameVersionFile = new File(
367 fileNameDir + StringPool.SLASH + version);
368
369 return fileNameVersionFile;
370 }
371
372 protected double getHeadVersionNumber(
373 long companyId, long repositoryId, String fileName) {
374
375 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
376
377 if (!fileNameDir.exists()) {
378 return DEFAULT_VERSION;
379 }
380
381 String[] versionNumbers = FileUtil.listFiles(fileNameDir);
382
383 double headVersionNumber = DEFAULT_VERSION;
384
385 for (int i = 0; i < versionNumbers.length; i++) {
386 double versionNumber = GetterUtil.getDouble(versionNumbers[i]);
387
388 if (versionNumber > headVersionNumber) {
389 headVersionNumber = versionNumber;
390 }
391 }
392
393 return headVersionNumber;
394 }
395
396 private static final String _ROOT_DIR = PropsUtil.get(
397 PropsKeys.DL_HOOK_FILE_SYSTEM_ROOT_DIR);
398
399 private static Log _log = LogFactory.getLog(FileSystemHook.class);
400
401 private File _rootDir;
402
403 }