001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentlibrary.store;
016    
017    import com.liferay.document.library.kernel.antivirus.AntivirusScannerUtil;
018    import com.liferay.document.library.kernel.exception.DirectoryNameException;
019    import com.liferay.document.library.kernel.store.DLStore;
020    import com.liferay.document.library.kernel.store.Store;
021    import com.liferay.document.library.kernel.util.DLValidatorUtil;
022    import com.liferay.portal.kernel.bean.BeanReference;
023    import com.liferay.portal.kernel.exception.PortalException;
024    import com.liferay.portal.kernel.exception.SystemException;
025    import com.liferay.portal.kernel.io.ByteArrayFileInputStream;
026    import com.liferay.portal.kernel.service.GroupLocalService;
027    import com.liferay.portal.kernel.util.FileUtil;
028    import com.liferay.portal.util.PropsValues;
029    
030    import java.io.File;
031    import java.io.IOException;
032    import java.io.InputStream;
033    
034    /**
035     * @author Brian Wing Shun Chan
036     * @author Alexander Chow
037     * @author Edward Han
038     */
039    public class DLStoreImpl implements DLStore {
040    
041            public DLStoreImpl() {
042                    _storeFactory = StoreFactory.getInstance();
043            }
044    
045            @Override
046            public void addDirectory(long companyId, long repositoryId, String dirName)
047                    throws PortalException {
048    
049                    if (!DLValidatorUtil.isValidName(dirName) || dirName.equals("/")) {
050                            throw new DirectoryNameException(dirName);
051                    }
052    
053                    Store store = _storeFactory.getStore();
054    
055                    store.addDirectory(companyId, repositoryId, dirName);
056            }
057    
058            @Override
059            public void addFile(
060                            long companyId, long repositoryId, String fileName,
061                            boolean validateFileExtension, byte[] bytes)
062                    throws PortalException {
063    
064                    validate(fileName, validateFileExtension);
065    
066                    if (PropsValues.DL_STORE_ANTIVIRUS_ENABLED) {
067                            AntivirusScannerUtil.scan(bytes);
068                    }
069    
070                    Store store = _storeFactory.getStore();
071    
072                    store.addFile(companyId, repositoryId, fileName, bytes);
073            }
074    
075            @Override
076            public void addFile(
077                            long companyId, long repositoryId, String fileName,
078                            boolean validateFileExtension, File file)
079                    throws PortalException {
080    
081                    validate(fileName, validateFileExtension);
082    
083                    if (PropsValues.DL_STORE_ANTIVIRUS_ENABLED) {
084                            AntivirusScannerUtil.scan(file);
085                    }
086    
087                    Store store = _storeFactory.getStore();
088    
089                    store.addFile(companyId, repositoryId, fileName, file);
090            }
091    
092            @Override
093            public void addFile(
094                            long companyId, long repositoryId, String fileName,
095                            boolean validateFileExtension, InputStream is)
096                    throws PortalException {
097    
098                    if (is instanceof ByteArrayFileInputStream) {
099                            ByteArrayFileInputStream byteArrayFileInputStream =
100                                    (ByteArrayFileInputStream)is;
101    
102                            File file = byteArrayFileInputStream.getFile();
103    
104                            addFile(
105                                    companyId, repositoryId, fileName, validateFileExtension, file);
106    
107                            return;
108                    }
109    
110                    validate(fileName, validateFileExtension);
111    
112                    Store store = _storeFactory.getStore();
113    
114                    if (!PropsValues.DL_STORE_ANTIVIRUS_ENABLED ||
115                            !AntivirusScannerUtil.isActive()) {
116    
117                            store.addFile(companyId, repositoryId, fileName, is);
118                    }
119                    else {
120                            File tempFile = null;
121    
122                            try {
123                                    if (is.markSupported()) {
124                                            is.mark(is.available() + 1);
125    
126                                            AntivirusScannerUtil.scan(is);
127    
128                                            is.reset();
129    
130                                            store.addFile(companyId, repositoryId, fileName, is);
131                                    }
132                                    else {
133                                            tempFile = FileUtil.createTempFile();
134    
135                                            FileUtil.write(tempFile, is);
136    
137                                            AntivirusScannerUtil.scan(tempFile);
138    
139                                            store.addFile(companyId, repositoryId, fileName, tempFile);
140                                    }
141                            }
142                            catch (IOException ioe) {
143                                    throw new SystemException(
144                                            "Unable to scan file " + fileName, ioe);
145                            }
146                            finally {
147                                    if (tempFile != null) {
148                                            tempFile.delete();
149                                    }
150                            }
151                    }
152            }
153    
154            @Override
155            public void addFile(
156                            long companyId, long repositoryId, String fileName, byte[] bytes)
157                    throws PortalException {
158    
159                    addFile(companyId, repositoryId, fileName, true, bytes);
160            }
161    
162            @Override
163            public void addFile(
164                            long companyId, long repositoryId, String fileName, File file)
165                    throws PortalException {
166    
167                    addFile(companyId, repositoryId, fileName, true, file);
168            }
169    
170            @Override
171            public void addFile(
172                            long companyId, long repositoryId, String fileName, InputStream is)
173                    throws PortalException {
174    
175                    addFile(companyId, repositoryId, fileName, true, is);
176            }
177    
178            @Override
179            public void checkRoot(long companyId) {
180                    Store store = _storeFactory.getStore();
181    
182                    store.checkRoot(companyId);
183            }
184    
185            @Override
186            public void copyFileVersion(
187                            long companyId, long repositoryId, String fileName,
188                            String fromVersionLabel, String toVersionLabel)
189                    throws PortalException {
190    
191                    Store store = _storeFactory.getStore();
192    
193                    store.copyFileVersion(
194                            companyId, repositoryId, fileName, fromVersionLabel,
195                            toVersionLabel);
196            }
197    
198            @Override
199            public void deleteDirectory(
200                    long companyId, long repositoryId, String dirName) {
201    
202                    Store store = _storeFactory.getStore();
203    
204                    store.deleteDirectory(companyId, repositoryId, dirName);
205            }
206    
207            @Override
208            public void deleteFile(long companyId, long repositoryId, String fileName)
209                    throws PortalException {
210    
211                    validate(fileName, false);
212    
213                    Store store = _storeFactory.getStore();
214    
215                    store.deleteFile(companyId, repositoryId, fileName);
216            }
217    
218            @Override
219            public void deleteFile(
220                            long companyId, long repositoryId, String fileName,
221                            String versionLabel)
222                    throws PortalException {
223    
224                    validate(fileName, false, versionLabel);
225    
226                    Store store = _storeFactory.getStore();
227    
228                    store.deleteFile(companyId, repositoryId, fileName, versionLabel);
229            }
230    
231            @Override
232            public File getFile(long companyId, long repositoryId, String fileName)
233                    throws PortalException {
234    
235                    validate(fileName, false);
236    
237                    Store store = _storeFactory.getStore();
238    
239                    return store.getFile(companyId, repositoryId, fileName);
240            }
241    
242            @Override
243            public File getFile(
244                            long companyId, long repositoryId, String fileName,
245                            String versionLabel)
246                    throws PortalException {
247    
248                    validate(fileName, false, versionLabel);
249    
250                    Store store = _storeFactory.getStore();
251    
252                    return store.getFile(companyId, repositoryId, fileName, versionLabel);
253            }
254    
255            @Override
256            public byte[] getFileAsBytes(
257                            long companyId, long repositoryId, String fileName)
258                    throws PortalException {
259    
260                    validate(fileName, false);
261    
262                    Store store = _storeFactory.getStore();
263    
264                    return store.getFileAsBytes(companyId, repositoryId, fileName);
265            }
266    
267            @Override
268            public byte[] getFileAsBytes(
269                            long companyId, long repositoryId, String fileName,
270                            String versionLabel)
271                    throws PortalException {
272    
273                    validate(fileName, false, versionLabel);
274    
275                    Store store = _storeFactory.getStore();
276    
277                    return store.getFileAsBytes(
278                            companyId, repositoryId, fileName, versionLabel);
279            }
280    
281            @Override
282            public InputStream getFileAsStream(
283                            long companyId, long repositoryId, String fileName)
284                    throws PortalException {
285    
286                    validate(fileName, false);
287    
288                    Store store = _storeFactory.getStore();
289    
290                    return store.getFileAsStream(companyId, repositoryId, fileName);
291            }
292    
293            @Override
294            public InputStream getFileAsStream(
295                            long companyId, long repositoryId, String fileName,
296                            String versionLabel)
297                    throws PortalException {
298    
299                    validate(fileName, false, versionLabel);
300    
301                    Store store = _storeFactory.getStore();
302    
303                    return store.getFileAsStream(
304                            companyId, repositoryId, fileName, versionLabel);
305            }
306    
307            @Override
308            public String[] getFileNames(
309                            long companyId, long repositoryId, String dirName)
310                    throws PortalException {
311    
312                    if (!DLValidatorUtil.isValidName(dirName)) {
313                            throw new DirectoryNameException(dirName);
314                    }
315    
316                    Store store = _storeFactory.getStore();
317    
318                    return store.getFileNames(companyId, repositoryId, dirName);
319            }
320    
321            @Override
322            public long getFileSize(long companyId, long repositoryId, String fileName)
323                    throws PortalException {
324    
325                    validate(fileName, false);
326    
327                    Store store = _storeFactory.getStore();
328    
329                    return store.getFileSize(companyId, repositoryId, fileName);
330            }
331    
332            @Override
333            public boolean hasDirectory(
334                            long companyId, long repositoryId, String dirName)
335                    throws PortalException {
336    
337                    if (!DLValidatorUtil.isValidName(dirName)) {
338                            throw new DirectoryNameException(dirName);
339                    }
340    
341                    Store store = _storeFactory.getStore();
342    
343                    return store.hasDirectory(companyId, repositoryId, dirName);
344            }
345    
346            @Override
347            public boolean hasFile(long companyId, long repositoryId, String fileName)
348                    throws PortalException {
349    
350                    validate(fileName, false);
351    
352                    Store store = _storeFactory.getStore();
353    
354                    return store.hasFile(companyId, repositoryId, fileName);
355            }
356    
357            @Override
358            public boolean hasFile(
359                            long companyId, long repositoryId, String fileName,
360                            String versionLabel)
361                    throws PortalException {
362    
363                    validate(fileName, false, versionLabel);
364    
365                    Store store = _storeFactory.getStore();
366    
367                    return store.hasFile(companyId, repositoryId, fileName, versionLabel);
368            }
369    
370            /**
371             * @deprecated As of 7.0.0, replaced by {@link
372             *             DLValidatorUtil#isValidName(String)}
373             */
374            @Deprecated
375            @Override
376            public boolean isValidName(String name) {
377                    return DLValidatorUtil.isValidName(name);
378            }
379    
380            @Override
381            public void move(String srcDir, String destDir) {
382                    Store store = _storeFactory.getStore();
383    
384                    store.move(srcDir, destDir);
385            }
386    
387            @Override
388            public void updateFile(
389                            long companyId, long repositoryId, long newRepositoryId,
390                            String fileName)
391                    throws PortalException {
392    
393                    Store store = _storeFactory.getStore();
394    
395                    store.updateFile(companyId, repositoryId, newRepositoryId, fileName);
396            }
397    
398            @Override
399            public void updateFile(
400                            long companyId, long repositoryId, String fileName,
401                            String newFileName)
402                    throws PortalException {
403    
404                    Store store = _storeFactory.getStore();
405    
406                    store.updateFile(companyId, repositoryId, fileName, newFileName);
407            }
408    
409            @Override
410            public void updateFile(
411                            long companyId, long repositoryId, String fileName,
412                            String fileExtension, boolean validateFileExtension,
413                            String versionLabel, String sourceFileName, File file)
414                    throws PortalException {
415    
416                    validate(
417                            fileName, fileExtension, sourceFileName, validateFileExtension);
418    
419                    DLValidatorUtil.validateVersionLabel(versionLabel);
420    
421                    if (PropsValues.DL_STORE_ANTIVIRUS_ENABLED) {
422                            AntivirusScannerUtil.scan(file);
423                    }
424    
425                    Store store = _storeFactory.getStore();
426    
427                    store.updateFile(companyId, repositoryId, fileName, versionLabel, file);
428            }
429    
430            @Override
431            public void updateFile(
432                            long companyId, long repositoryId, String fileName,
433                            String fileExtension, boolean validateFileExtension,
434                            String versionLabel, String sourceFileName, InputStream is)
435                    throws PortalException {
436    
437                    if (is instanceof ByteArrayFileInputStream) {
438                            ByteArrayFileInputStream byteArrayFileInputStream =
439                                    (ByteArrayFileInputStream)is;
440    
441                            File file = byteArrayFileInputStream.getFile();
442    
443                            updateFile(
444                                    companyId, repositoryId, fileName, fileExtension,
445                                    validateFileExtension, versionLabel, sourceFileName, file);
446    
447                            return;
448                    }
449    
450                    validate(
451                            fileName, fileExtension, sourceFileName, validateFileExtension);
452    
453                    DLValidatorUtil.validateVersionLabel(versionLabel);
454    
455                    Store store = _storeFactory.getStore();
456    
457                    if (!PropsValues.DL_STORE_ANTIVIRUS_ENABLED ||
458                            !AntivirusScannerUtil.isActive()) {
459    
460                            store.updateFile(
461                                    companyId, repositoryId, fileName, versionLabel, is);
462                    }
463                    else {
464                            File tempFile = null;
465    
466                            try {
467                                    if (is.markSupported()) {
468                                            is.mark(is.available() + 1);
469    
470                                            AntivirusScannerUtil.scan(is);
471    
472                                            is.reset();
473    
474                                            store.updateFile(
475                                                    companyId, repositoryId, fileName, versionLabel, is);
476                                    }
477                                    else {
478                                            tempFile = FileUtil.createTempFile();
479    
480                                            FileUtil.write(tempFile, is);
481    
482                                            AntivirusScannerUtil.scan(tempFile);
483    
484                                            store.updateFile(
485                                                    companyId, repositoryId, fileName, versionLabel,
486                                                    tempFile);
487                                    }
488                            }
489                            catch (IOException ioe) {
490                                    throw new SystemException(
491                                            "Unable to scan file " + fileName, ioe);
492                            }
493                            finally {
494                                    if (tempFile != null) {
495                                            tempFile.delete();
496                                    }
497                            }
498                    }
499            }
500    
501            @Override
502            public void updateFileVersion(
503                            long companyId, long repositoryId, String fileName,
504                            String fromVersionLabel, String toVersionLabel)
505                    throws PortalException {
506    
507                    Store store = _storeFactory.getStore();
508    
509                    store.updateFileVersion(
510                            companyId, repositoryId, fileName, fromVersionLabel,
511                            toVersionLabel);
512            }
513    
514            @Override
515            public void validate(String fileName, boolean validateFileExtension)
516                    throws PortalException {
517    
518                    DLValidatorUtil.validateFileName(fileName);
519    
520                    if (validateFileExtension) {
521                            DLValidatorUtil.validateFileExtension(fileName);
522                    }
523            }
524    
525            @Override
526            public void validate(
527                            String fileName, boolean validateFileExtension, byte[] bytes)
528                    throws PortalException {
529    
530                    validate(fileName, validateFileExtension);
531    
532                    DLValidatorUtil.validateFileSize(fileName, bytes);
533            }
534    
535            @Override
536            public void validate(
537                            String fileName, boolean validateFileExtension, File file)
538                    throws PortalException {
539    
540                    validate(fileName, validateFileExtension);
541    
542                    DLValidatorUtil.validateFileSize(fileName, file);
543            }
544    
545            @Override
546            public void validate(
547                            String fileName, boolean validateFileExtension, InputStream is)
548                    throws PortalException {
549    
550                    validate(fileName, validateFileExtension);
551    
552                    DLValidatorUtil.validateFileSize(fileName, is);
553            }
554    
555            @Override
556            public void validate(
557                            String fileName, String fileExtension, String sourceFileName,
558                            boolean validateFileExtension)
559                    throws PortalException {
560    
561                    validate(fileName, validateFileExtension);
562    
563                    DLValidatorUtil.validateSourceFileExtension(
564                            fileExtension, sourceFileName);
565            }
566    
567            @Override
568            public void validate(
569                            String fileName, String fileExtension, String sourceFileName,
570                            boolean validateFileExtension, File file)
571                    throws PortalException {
572    
573                    validate(
574                            fileName, fileExtension, sourceFileName, validateFileExtension);
575    
576                    DLValidatorUtil.validateFileSize(fileName, file);
577            }
578    
579            @Override
580            public void validate(
581                            String fileName, String fileExtension, String sourceFileName,
582                            boolean validateFileExtension, InputStream is)
583                    throws PortalException {
584    
585                    validate(
586                            fileName, fileExtension, sourceFileName, validateFileExtension);
587    
588                    DLValidatorUtil.validateFileSize(fileName, is);
589            }
590    
591            /**
592             * @deprecated As of 7.0.0, replaced by {@link
593             *             DLValidatorUtil#validateDirectoryName(String)}
594             */
595            @Deprecated
596            @Override
597            public void validateDirectoryName(String directoryName)
598                    throws PortalException {
599    
600                    DLValidatorUtil.validateDirectoryName(directoryName);
601            }
602    
603            protected void validate(
604                            String fileName, boolean validateFileExtension, String versionLabel)
605                    throws PortalException {
606    
607                    validate(fileName, validateFileExtension);
608    
609                    DLValidatorUtil.validateVersionLabel(versionLabel);
610            }
611    
612            protected void validate(
613                            String fileName, String fileExtension, String sourceFileName,
614                            boolean validateFileExtension, File file, String versionLabel)
615                    throws PortalException {
616    
617                    validate(
618                            fileName, fileExtension, sourceFileName, validateFileExtension,
619                            file);
620    
621                    DLValidatorUtil.validateVersionLabel(versionLabel);
622            }
623    
624            protected void validate(
625                            String fileName, String fileExtension, String sourceFileName,
626                            boolean validateFileExtension, InputStream is, String versionLabel)
627                    throws PortalException {
628    
629                    validate(
630                            fileName, fileExtension, sourceFileName, validateFileExtension, is);
631    
632                    DLValidatorUtil.validateVersionLabel(versionLabel);
633            }
634    
635            @BeanReference(type = GroupLocalService.class)
636            protected GroupLocalService groupLocalService;
637    
638            private final StoreFactory _storeFactory;
639    
640    }