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