001
014
015 package com.liferay.portlet.documentlibrary.store;
016
017 import com.liferay.portal.kernel.bean.BeanReference;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.io.ByteArrayFileInputStream;
021 import com.liferay.portal.kernel.search.BooleanClause;
022 import com.liferay.portal.kernel.search.BooleanClauseOccur;
023 import com.liferay.portal.kernel.search.BooleanQuery;
024 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
025 import com.liferay.portal.kernel.search.Field;
026 import com.liferay.portal.kernel.search.Hits;
027 import com.liferay.portal.kernel.search.Indexer;
028 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
029 import com.liferay.portal.kernel.search.SearchContext;
030 import com.liferay.portal.kernel.search.SearchEngineUtil;
031 import com.liferay.portal.kernel.search.TermQuery;
032 import com.liferay.portal.kernel.search.TermQueryFactoryUtil;
033 import com.liferay.portal.kernel.util.ArrayUtil;
034 import com.liferay.portal.kernel.util.FileUtil;
035 import com.liferay.portal.model.Group;
036 import com.liferay.portal.security.permission.ActionKeys;
037 import com.liferay.portal.security.permission.PermissionChecker;
038 import com.liferay.portal.security.permission.PermissionThreadLocal;
039 import com.liferay.portal.service.GroupLocalService;
040 import com.liferay.portal.util.PropsValues;
041 import com.liferay.portlet.documentlibrary.DirectoryNameException;
042 import com.liferay.portlet.documentlibrary.antivirus.AntivirusScannerUtil;
043 import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants;
044 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
045 import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission;
046 import com.liferay.portlet.documentlibrary.util.DLValidatorUtil;
047
048 import java.io.File;
049 import java.io.IOException;
050 import java.io.InputStream;
051
052 import java.util.List;
053
054
059 public class DLStoreImpl implements DLStore {
060
061 @Override
062 public void addDirectory(long companyId, long repositoryId, String dirName)
063 throws PortalException {
064
065 if (!DLValidatorUtil.isValidName(dirName) || dirName.equals("/")) {
066 throw new DirectoryNameException(dirName);
067 }
068
069 store.addDirectory(companyId, repositoryId, dirName);
070 }
071
072 @Override
073 public void addFile(
074 long companyId, long repositoryId, String fileName,
075 boolean validateFileExtension, byte[] bytes)
076 throws PortalException {
077
078 validate(fileName, validateFileExtension, bytes);
079
080 if (PropsValues.DL_STORE_ANTIVIRUS_ENABLED) {
081 AntivirusScannerUtil.scan(bytes);
082 }
083
084 store.addFile(companyId, repositoryId, fileName, bytes);
085 }
086
087 @Override
088 public void addFile(
089 long companyId, long repositoryId, String fileName,
090 boolean validateFileExtension, File file)
091 throws PortalException {
092
093 validate(fileName, validateFileExtension, file);
094
095 if (PropsValues.DL_STORE_ANTIVIRUS_ENABLED) {
096 AntivirusScannerUtil.scan(file);
097 }
098
099 store.addFile(companyId, repositoryId, fileName, file);
100 }
101
102 @Override
103 public void addFile(
104 long companyId, long repositoryId, String fileName,
105 boolean validateFileExtension, InputStream is)
106 throws PortalException {
107
108 if (is instanceof ByteArrayFileInputStream) {
109 ByteArrayFileInputStream byteArrayFileInputStream =
110 (ByteArrayFileInputStream)is;
111
112 File file = byteArrayFileInputStream.getFile();
113
114 addFile(
115 companyId, repositoryId, fileName, validateFileExtension, file);
116
117 return;
118 }
119
120 validate(fileName, validateFileExtension, is);
121
122 if (!PropsValues.DL_STORE_ANTIVIRUS_ENABLED ||
123 !AntivirusScannerUtil.isActive()) {
124
125 store.addFile(companyId, repositoryId, fileName, is);
126 }
127 else {
128 File tempFile = null;
129
130 try {
131 if (is.markSupported()) {
132 is.mark(is.available() + 1);
133
134 AntivirusScannerUtil.scan(is);
135
136 is.reset();
137
138 store.addFile(companyId, repositoryId, fileName, is);
139 }
140 else {
141 tempFile = FileUtil.createTempFile();
142
143 FileUtil.write(tempFile, is);
144
145 AntivirusScannerUtil.scan(tempFile);
146
147 store.addFile(companyId, repositoryId, fileName, tempFile);
148 }
149 }
150 catch (IOException ioe) {
151 throw new SystemException(
152 "Unable to scan file " + fileName, ioe);
153 }
154 finally {
155 if (tempFile != null) {
156 tempFile.delete();
157 }
158 }
159 }
160 }
161
162 @Override
163 public void addFile(
164 long companyId, long repositoryId, String fileName, byte[] bytes)
165 throws PortalException {
166
167 addFile(companyId, repositoryId, fileName, true, bytes);
168 }
169
170 @Override
171 public void addFile(
172 long companyId, long repositoryId, String fileName, File file)
173 throws PortalException {
174
175 addFile(companyId, repositoryId, fileName, true, file);
176 }
177
178 @Override
179 public void addFile(
180 long companyId, long repositoryId, String fileName, InputStream is)
181 throws PortalException {
182
183 addFile(companyId, repositoryId, fileName, true, is);
184 }
185
186 @Override
187 public void checkRoot(long companyId) {
188 store.checkRoot(companyId);
189 }
190
191 @Override
192 public void copyFileVersion(
193 long companyId, long repositoryId, String fileName,
194 String fromVersionLabel, String toVersionLabel)
195 throws PortalException {
196
197 store.copyFileVersion(
198 companyId, repositoryId, fileName, fromVersionLabel,
199 toVersionLabel);
200 }
201
202 @Override
203 public void deleteDirectory(
204 long companyId, long repositoryId, String dirName)
205 throws PortalException {
206
207 store.deleteDirectory(companyId, repositoryId, dirName);
208 }
209
210 @Override
211 public void deleteFile(long companyId, long repositoryId, String fileName)
212 throws PortalException {
213
214 validate(fileName, false);
215
216 store.deleteFile(companyId, repositoryId, fileName);
217 }
218
219 @Override
220 public void deleteFile(
221 long companyId, long repositoryId, String fileName,
222 String versionLabel)
223 throws PortalException {
224
225 validate(fileName, false, versionLabel);
226
227 store.deleteFile(companyId, repositoryId, fileName, versionLabel);
228 }
229
230 @Override
231 public File getFile(long companyId, long repositoryId, String fileName)
232 throws PortalException {
233
234 validate(fileName, false);
235
236 return store.getFile(companyId, repositoryId, fileName);
237 }
238
239 @Override
240 public File getFile(
241 long companyId, long repositoryId, String fileName,
242 String versionLabel)
243 throws PortalException {
244
245 validate(fileName, false, versionLabel);
246
247 return store.getFile(companyId, repositoryId, fileName, versionLabel);
248 }
249
250 @Override
251 public byte[] getFileAsBytes(
252 long companyId, long repositoryId, String fileName)
253 throws PortalException {
254
255 validate(fileName, false);
256
257 return store.getFileAsBytes(companyId, repositoryId, fileName);
258 }
259
260 @Override
261 public byte[] getFileAsBytes(
262 long companyId, long repositoryId, String fileName,
263 String versionLabel)
264 throws PortalException {
265
266 validate(fileName, false, versionLabel);
267
268 return store.getFileAsBytes(
269 companyId, repositoryId, fileName, versionLabel);
270 }
271
272 @Override
273 public InputStream getFileAsStream(
274 long companyId, long repositoryId, String fileName)
275 throws PortalException {
276
277 validate(fileName, false);
278
279 return store.getFileAsStream(companyId, repositoryId, fileName);
280 }
281
282 @Override
283 public InputStream getFileAsStream(
284 long companyId, long repositoryId, String fileName,
285 String versionLabel)
286 throws PortalException {
287
288 validate(fileName, false, versionLabel);
289
290 return store.getFileAsStream(
291 companyId, repositoryId, fileName, versionLabel);
292 }
293
294 @Override
295 public String[] getFileNames(
296 long companyId, long repositoryId, String dirName)
297 throws PortalException {
298
299 if (!DLValidatorUtil.isValidName(dirName)) {
300 throw new DirectoryNameException(dirName);
301 }
302
303 return store.getFileNames(companyId, repositoryId, dirName);
304 }
305
306 @Override
307 public long getFileSize(long companyId, long repositoryId, String fileName)
308 throws PortalException {
309
310 validate(fileName, false);
311
312 return store.getFileSize(companyId, repositoryId, fileName);
313 }
314
315 @Override
316 public boolean hasDirectory(
317 long companyId, long repositoryId, String dirName)
318 throws PortalException {
319
320 if (!DLValidatorUtil.isValidName(dirName)) {
321 throw new DirectoryNameException(dirName);
322 }
323
324 return store.hasDirectory(companyId, repositoryId, dirName);
325 }
326
327 @Override
328 public boolean hasFile(long companyId, long repositoryId, String fileName)
329 throws PortalException {
330
331 validate(fileName, false);
332
333 return store.hasFile(companyId, repositoryId, fileName);
334 }
335
336 @Override
337 public boolean hasFile(
338 long companyId, long repositoryId, String fileName,
339 String versionLabel)
340 throws PortalException {
341
342 validate(fileName, false, versionLabel);
343
344 return store.hasFile(companyId, repositoryId, fileName, versionLabel);
345 }
346
347
351 @Deprecated
352 @Override
353 public boolean isValidName(String name) {
354 return DLValidatorUtil.isValidName(name);
355 }
356
357 @Override
358 public void move(String srcDir, String destDir) {
359 store.move(srcDir, destDir);
360 }
361
362 public Hits search(
363 long companyId, long userId, String portletId, long groupId,
364 long[] repositoryIds, String keywords, int start, int end) {
365
366 try {
367 SearchContext searchContext = new SearchContext();
368
369 searchContext.setCompanyId(companyId);
370 searchContext.setEnd(end);
371 searchContext.setEntryClassNames(
372 new String[] {DLFileEntryConstants.getClassName()});
373 searchContext.setGroupIds(new long[] {groupId});
374
375 Indexer indexer = IndexerRegistryUtil.getIndexer(
376 DLFileEntryConstants.getClassName());
377
378 searchContext.setSearchEngineId(indexer.getSearchEngineId());
379
380 searchContext.setStart(start);
381 searchContext.setUserId(userId);
382
383 BooleanQuery contextQuery = BooleanQueryFactoryUtil.create(
384 searchContext);
385
386 contextQuery.addRequiredTerm(Field.PORTLET_ID, portletId);
387
388 if (groupId > 0) {
389 Group group = groupLocalService.getGroup(groupId);
390
391 if (group.isLayout()) {
392 contextQuery.addRequiredTerm(Field.SCOPE_GROUP_ID, groupId);
393
394 groupId = group.getParentGroupId();
395 }
396
397 contextQuery.addRequiredTerm(Field.GROUP_ID, groupId);
398 }
399
400 if (ArrayUtil.isNotEmpty(repositoryIds)) {
401 BooleanQuery repositoryIdsQuery =
402 BooleanQueryFactoryUtil.create(searchContext);
403
404 for (long repositoryId : repositoryIds) {
405 try {
406 if (userId > 0) {
407 PermissionChecker permissionChecker =
408 PermissionThreadLocal.getPermissionChecker();
409
410 DLFolderPermission.check(
411 permissionChecker, groupId, repositoryId,
412 ActionKeys.VIEW);
413 }
414
415 if (repositoryId ==
416 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
417
418 repositoryId = groupId;
419 }
420
421 TermQuery termQuery = TermQueryFactoryUtil.create(
422 searchContext, "repositoryId", repositoryId);
423
424 repositoryIdsQuery.add(
425 termQuery, BooleanClauseOccur.SHOULD);
426 }
427 catch (Exception e) {
428 }
429 }
430
431 contextQuery.add(repositoryIdsQuery, BooleanClauseOccur.MUST);
432 }
433
434 BooleanQuery searchQuery = BooleanQueryFactoryUtil.create(
435 searchContext);
436
437 searchQuery.addTerms(_KEYWORDS_FIELDS, keywords);
438
439 BooleanQuery fullQuery = BooleanQueryFactoryUtil.create(
440 searchContext);
441
442 fullQuery.add(contextQuery, BooleanClauseOccur.MUST);
443
444 List<BooleanClause> clauses = searchQuery.clauses();
445
446 if (!clauses.isEmpty()) {
447 fullQuery.add(searchQuery, BooleanClauseOccur.MUST);
448 }
449
450 return SearchEngineUtil.search(searchContext, fullQuery);
451 }
452 catch (Exception e) {
453 throw new SystemException(e);
454 }
455 }
456
457 @Override
458 public void updateFile(
459 long companyId, long repositoryId, long newRepositoryId,
460 String fileName)
461 throws PortalException {
462
463 store.updateFile(companyId, repositoryId, newRepositoryId, fileName);
464 }
465
466 @Override
467 public void updateFile(
468 long companyId, long repositoryId, String fileName,
469 String newFileName)
470 throws PortalException {
471
472 store.updateFile(companyId, repositoryId, fileName, newFileName);
473 }
474
475 @Override
476 public void updateFile(
477 long companyId, long repositoryId, String fileName,
478 String fileExtension, boolean validateFileExtension,
479 String versionLabel, String sourceFileName, File file)
480 throws PortalException {
481
482 validate(
483 fileName, fileExtension, sourceFileName, validateFileExtension,
484 file, versionLabel);
485
486 if (PropsValues.DL_STORE_ANTIVIRUS_ENABLED) {
487 AntivirusScannerUtil.scan(file);
488 }
489
490 store.updateFile(companyId, repositoryId, fileName, versionLabel, file);
491 }
492
493 @Override
494 public void updateFile(
495 long companyId, long repositoryId, String fileName,
496 String fileExtension, boolean validateFileExtension,
497 String versionLabel, String sourceFileName, InputStream is)
498 throws PortalException {
499
500 if (is instanceof ByteArrayFileInputStream) {
501 ByteArrayFileInputStream byteArrayFileInputStream =
502 (ByteArrayFileInputStream)is;
503
504 File file = byteArrayFileInputStream.getFile();
505
506 updateFile(
507 companyId, repositoryId, fileName, fileExtension,
508 validateFileExtension, versionLabel, sourceFileName, file);
509
510 return;
511 }
512
513 validate(
514 fileName, fileExtension, sourceFileName, validateFileExtension, is,
515 versionLabel);
516
517 if (!PropsValues.DL_STORE_ANTIVIRUS_ENABLED ||
518 !AntivirusScannerUtil.isActive()) {
519
520 store.updateFile(
521 companyId, repositoryId, fileName, versionLabel, is);
522 }
523 else {
524 File tempFile = null;
525
526 try {
527 if (is.markSupported()) {
528 is.mark(is.available() + 1);
529
530 AntivirusScannerUtil.scan(is);
531
532 is.reset();
533
534 store.updateFile(
535 companyId, repositoryId, fileName, versionLabel, is);
536 }
537 else {
538 tempFile = FileUtil.createTempFile();
539
540 FileUtil.write(tempFile, is);
541
542 AntivirusScannerUtil.scan(tempFile);
543
544 store.updateFile(
545 companyId, repositoryId, fileName, versionLabel,
546 tempFile);
547 }
548 }
549 catch (IOException ioe) {
550 throw new SystemException(
551 "Unable to scan file " + fileName, ioe);
552 }
553 finally {
554 if (tempFile != null) {
555 tempFile.delete();
556 }
557 }
558 }
559 }
560
561 @Override
562 public void updateFileVersion(
563 long companyId, long repositoryId, String fileName,
564 String fromVersionLabel, String toVersionLabel)
565 throws PortalException {
566
567 store.updateFileVersion(
568 companyId, repositoryId, fileName, fromVersionLabel,
569 toVersionLabel);
570 }
571
572 @Override
573 public void validate(String fileName, boolean validateFileExtension)
574 throws PortalException {
575
576 DLValidatorUtil.validateFileName(fileName);
577
578 if (validateFileExtension) {
579 DLValidatorUtil.validateFileExtension(fileName);
580 }
581 }
582
583 @Override
584 public void validate(
585 String fileName, boolean validateFileExtension, byte[] bytes)
586 throws PortalException {
587
588 validate(fileName, validateFileExtension);
589
590 DLValidatorUtil.validateFileSize(fileName, bytes);
591 }
592
593 @Override
594 public void validate(
595 String fileName, boolean validateFileExtension, File file)
596 throws PortalException {
597
598 validate(fileName, validateFileExtension);
599
600 DLValidatorUtil.validateFileSize(fileName, file);
601 }
602
603 @Override
604 public void validate(
605 String fileName, boolean validateFileExtension, InputStream is)
606 throws PortalException {
607
608 validate(fileName, validateFileExtension);
609
610 DLValidatorUtil.validateFileSize(fileName, is);
611 }
612
613 @Override
614 public void validate(
615 String fileName, String fileExtension, String sourceFileName,
616 boolean validateFileExtension)
617 throws PortalException {
618
619 validate(fileName, validateFileExtension);
620
621 DLValidatorUtil.validateSourceFileExtension(
622 fileExtension, sourceFileName);
623 }
624
625 @Override
626 public void validate(
627 String fileName, String fileExtension, String sourceFileName,
628 boolean validateFileExtension, File file)
629 throws PortalException {
630
631 validate(
632 fileName, fileExtension, sourceFileName, validateFileExtension);
633
634 DLValidatorUtil.validateFileSize(fileName, file);
635 }
636
637 @Override
638 public void validate(
639 String fileName, String fileExtension, String sourceFileName,
640 boolean validateFileExtension, InputStream is)
641 throws PortalException {
642
643 validate(
644 fileName, fileExtension, sourceFileName, validateFileExtension);
645
646 DLValidatorUtil.validateFileSize(fileName, is);
647 }
648
649
653 @Deprecated
654 @Override
655 public void validateDirectoryName(String directoryName)
656 throws PortalException {
657
658 DLValidatorUtil.validateDirectoryName(directoryName);
659 }
660
661 protected void validate(
662 String fileName, boolean validateFileExtension, String versionLabel)
663 throws PortalException {
664
665 validate(fileName, validateFileExtension);
666
667 DLValidatorUtil.validateVersionLabel(versionLabel);
668 }
669
670 protected void validate(
671 String fileName, String fileExtension, String sourceFileName,
672 boolean validateFileExtension, File file, String versionLabel)
673 throws PortalException {
674
675 validate(
676 fileName, fileExtension, sourceFileName, validateFileExtension,
677 file);
678
679 DLValidatorUtil.validateVersionLabel(versionLabel);
680 }
681
682 protected void validate(
683 String fileName, String fileExtension, String sourceFileName,
684 boolean validateFileExtension, InputStream is, String versionLabel)
685 throws PortalException {
686
687 validate(
688 fileName, fileExtension, sourceFileName, validateFileExtension, is);
689
690 DLValidatorUtil.validateVersionLabel(versionLabel);
691 }
692
693 @BeanReference(type = GroupLocalService.class)
694 protected GroupLocalService groupLocalService;
695
696 @BeanReference(type = Store.class)
697 protected Store store;
698
699 private static final String[] _KEYWORDS_FIELDS = {
700 Field.ASSET_TAG_NAMES, Field.CONTENT, Field.PROPERTIES
701 };
702
703 }