1 package com.pentila.entSavoie.utils;
3 import java.awt.Graphics;
5 import java.awt.image.BufferedImage;
7 import java.io.FileInputStream;
8 import java.io.FileNotFoundException;
9 import java.io.FileOutputStream;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.text.Normalizer;
13 import java.util.Enumeration;
15 import javax.imageio.ImageIO;
16 import javax.portlet.ResourceRequest;
18 import org.apache.commons.compress.utils.IOUtils;
20 import com.liferay.portal.kernel.exception.PortalException;
21 import com.liferay.portal.kernel.exception.SystemException;
22 import com.liferay.portal.kernel.log.Log;
23 import com.liferay.portal.kernel.log.LogFactoryUtil;
24 import com.liferay.portal.kernel.repository.model.FileEntry;
25 import com.liferay.portal.kernel.repository.model.Folder;
26 import com.liferay.portal.kernel.search.Indexer;
27 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
28 import com.liferay.portal.kernel.upload.UploadPortletRequest;
29 import com.liferay.portal.kernel.util.FileUtil;
30 import com.liferay.portal.kernel.util.MimeTypesOverrideUtil;
31 import com.liferay.portal.kernel.util.ParamUtil;
32 import com.liferay.portal.kernel.util.StringPool;
33 import com.liferay.portal.kernel.util.Validator;
34 import com.liferay.portal.model.CompanyConstants;
35 import com.liferay.portal.model.Organization;
36 import com.liferay.portal.model.User;
37 import com.liferay.portal.service.ServiceContext;
38 import com.liferay.portal.theme.ThemeDisplay;
39 import com.liferay.portal.util.PortalUtil;
40 import com.liferay.portlet.documentlibrary.DuplicateFileException;
41 import com.liferay.portlet.documentlibrary.FileSizeException;
42 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
43 import com.liferay.portlet.documentlibrary.model.DLFolder;
44 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
45 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
46 import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
47 import com.liferay.portlet.documentlibrary.util.DLUtil;
48 import com.liferay.portlet.documentlibrary.util.ImageProcessorUtil;
49 import com.pentila.entSavoie.cartable.service.CasierEntryLocalServiceUtil;
50 import com.pentila.entSavoie.directory.OrganizationFinderServiceUtil;
52 public class DLAppUtil {
54 private final static int NEWS_THUMBNAIL_SIZE = 500;
57 * Add Image From Existing File
62 * @throws PortalException
63 * @throws SystemException
65 public static long addImage(User user, long imageId, String portlet) throws PortalException, SystemException{
67 // Get temporary image
68 DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getFileEntry(imageId);
71 Organization cds = ENTOrganizationsUtil.getOrCreateRootOrg(user.getCompanyId());
73 Long cdsGpId = cds.getGroup().getGroupId();
75 if(portlet.equals(PortletConstant.ACTUALITES)){
76 folder = IGFoldersUtil.getActuFolder(user.getUserId(), cdsGpId);
78 else if(portlet.equals(PortletConstant.CANTINE)){
79 folder = IGFoldersUtil.getRecetteFolder(user.getUserId(), cdsGpId);
81 else if(portlet.equals(PortletConstant.GESTION_MENU)){
82 folder = IGFoldersUtil.getMenuImgFolder(user.getUserId(), cdsGpId);
86 FileEntry tempFe = DLAppLocalServiceUtil.getFileEntry(imageId);
90 String originalTitle = dlfe.getTitle();
91 String[] splitFN = DLEntryUtil.splitFileName(originalTitle);
92 originalTitle = splitFN[0];
93 String extension = "." + splitFN[1];
96 boolean finished = false;
100 while (!finished && count<50) {
102 name = originalTitle+suffixe+extension;
104 fe = DLAppLocalServiceUtil.addFileEntry(
107 folder.getFolderId(),
111 dlfe.getDescription(),
113 tempFe.getContentStream(),
115 new ServiceContext());
117 ImageProcessorUtil.generateImages(fe.getFileVersion());
119 // Permissions management
120 PermissionsUtils.setParentPermissionToFile(fe);
123 catch (Exception e) {
124 suffixe = "_" + count;
129 // Remove temporary image
131 DLAppLocalServiceUtil.deleteFileEntry(dlfe.getFileEntryId());
135 // Return new image id
136 return fe.getFileEntryId();
140 * Add Temporary Image From Existing File
142 * @param actionRequest
144 * @throws PortalException
145 * @throws SystemException
147 public static FileEntry addTemporaryImage(long fileEntryId, User user, String resize) throws PortalException, SystemException {
149 boolean fileResized = false;
152 DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntryId);
154 // Get temporary folder
155 long tmpUserFolderGroupId = user.getGroup().getGroupId();
156 Folder folder = IGFoldersUtil.getTmpFolder(user.getUserId(), tmpUserFolderGroupId);
162 String originalTitle = dlfe.getTitle();
163 String[] splitFN = DLEntryUtil.splitFileName(originalTitle);
164 originalTitle = splitFN[0];
165 String extension = "." + splitFN[1];
167 File tempFile = null;
169 if (resize.equals("newsImage")) {
172 tempFile = File.createTempFile(originalTitle, extension);
173 tempFile.deleteOnExit();
175 InputStream in = dlfe.getContentStream();
176 FileOutputStream out;
177 out = new FileOutputStream(tempFile);
178 IOUtils.copy(in, out);
182 tempFile = resizeImages(tempFile, splitFN[1], NEWS_THUMBNAIL_SIZE, NEWS_THUMBNAIL_SIZE);
186 } catch (FileNotFoundException e) {
188 } catch (IOException e) {
194 boolean finished = false;
198 while (!finished && count<50) {
200 name = originalTitle+suffixe+extension;
203 fe = DLAppLocalServiceUtil.addFileEntry(
206 folder.getFolderId(),
213 new ServiceContext());
216 fe = DLAppLocalServiceUtil.addFileEntry(
219 folder.getFolderId(),
223 dlfe.getDescription(),
225 dlfe.getContentStream(),
227 new ServiceContext());
230 //ImageProcessorUtil.generateImages(fe.getFileVersion());
232 // Permissions management
233 PermissionsUtils.setParentPermissionToFile(fe);
236 catch (Exception e) {
238 suffixe = "_" + count;
242 // Return temporary file entry
247 * Add Temporary Image From Upload Request
249 * @param actionRequest
251 * @throws PortalException
252 * @throws SystemException
254 public static FileEntry addTemporaryImage(UploadPortletRequest uploadRequest, User user, String resize) throws PortalException, SystemException {
256 // Get file parameter name
257 String fileNameParam = "";
258 Enumeration<String> enumeration = uploadRequest.getParameterNames();
259 while (enumeration.hasMoreElements()) {
260 String ee = (String) enumeration.nextElement();
261 if (ee.startsWith("ext-gen") || ee.startsWith("uploadedFile") || ee.startsWith("files")){
266 // Get file from upload request
267 File file = uploadRequest.getFile(fileNameParam);
268 String sourceFileName = uploadRequest.getFileName(fileNameParam);
273 // Get temporary folder
274 long tmpUserFolderGroupId = user.getGroup().getGroupId();
275 Folder folder = IGFoldersUtil.getTmpFolder(user.getUserId(), tmpUserFolderGroupId);
278 String originalTitle = sourceFileName;
279 String[] splitFN = DLEntryUtil.splitFileName(originalTitle);
280 originalTitle = splitFN[0];
281 String extension = "." + splitFN[1];
282 if (resize.equals("newsImage")) {
283 file = resizeImages(file, splitFN[1], NEWS_THUMBNAIL_SIZE, NEWS_THUMBNAIL_SIZE);
287 boolean finished = false;
291 while (!finished && count<50) {
293 name = originalTitle+suffixe+extension;
295 fe = DLAppLocalServiceUtil.addFileEntry(
298 folder.getFolderId(),
300 MimeTypesOverrideUtil.getContentType(file),
305 new ServiceContext());
307 ImageProcessorUtil.generateImages(fe.getFileVersion());
309 // Permissions management
310 PermissionsUtils.setParentPermissionToFile(fe);
313 catch (Exception e) {
315 suffixe = "_" + count;
319 // Return temporary file entry
324 * Resize an image received as a file. The resize will keep image proportion
325 * @param file : image to resize
326 * @param extension : image extension
327 * @param maxWidth target max width
328 * @param maxHeight target max height
329 * @return the image resized as a file
330 * @throws IOException
332 public static File resizeImages(File file, String extension, int maxWidth, int maxHeight) {
334 FileInputStream in = new FileInputStream(file);
335 BufferedImage image = ImageIO.read(in);
338 _log.error("ERROR : Null image for file=" + file.getName());
344 if (image.getHeight() <= maxHeight && image.getWidth() <= maxWidth) {
348 else if (image.getHeight() < image.getWidth()) {
349 scaledImg = image.getScaledInstance(maxWidth, -1, BufferedImage.SCALE_AREA_AVERAGING);
352 scaledImg = image.getScaledInstance(-1, maxHeight, Image.SCALE_AREA_AVERAGING);
355 image = new BufferedImage(scaledImg.getWidth(null), scaledImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
357 Graphics g = image.createGraphics();
358 g.drawImage(scaledImg, 0, 0, null);
361 ImageIO.write(image, extension, file);
363 } catch (IOException e) {
364 _log.error("Error with filename : " + file.getName());
372 * Add temporary file entry from existing file
375 * @throws SystemException
376 * @throws PortalException
377 * @throws IOException
379 public static FileEntry addTemporaryFileEntry(User user, long fileEntryId) throws PortalException, SystemException, IOException{
381 // Get exisiting file
382 FileEntry fe = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
383 InputStream is = fe.getContentStream();
385 // Get temporary folder
386 long folderId = user.getGroup().getGroupId();
387 Folder folder = FoldersUtil.getTmpFileFolderBox(user.getUserId(), folderId);
389 // Add temporary file entry
391 FileEntry fileEntry = addFileEntry(user, folder, fe.getTitle(), is);
393 } catch (FileSizeException e) {
394 throw new FileSizeException();
395 } catch (IOException e) {
396 throw new IOException();
401 * Add temporary file entry from upload request
402 * @param uploadRequest
403 * @param actionRequest
405 * @throws PortalException
406 * @throws SystemException
407 * @throws IOException
409 public static FileEntry addTemporaryFileEntry(UploadPortletRequest uploadRequest, User user, long folderId) throws PortalException, SystemException, IOException{
410 return addFileEntry(uploadRequest, user, folderId, true);
414 * Add file entry from upload request
415 * @param resourceRequest
417 * @throws PortalException
418 * @throws SystemException
419 * @throws IOException
421 public static FileEntry addFileEntry(ResourceRequest resourceRequest) throws PortalException, SystemException, IOException{
423 final User user = PortalUtil.getUser(resourceRequest);
425 // Get folder from request
426 long folderId = ParamUtil.getLong(resourceRequest, "folderId");
428 return addFileEntry(PortalUtil.getUploadPortletRequest(resourceRequest), user, folderId, false);
432 * Add file entry from upload request
433 * @param uploadRequest
436 * @throws PortalException
437 * @throws SystemException
438 * @throws IOException
440 public static FileEntry addFileEntry(UploadPortletRequest uploadRequest, User user, long folderId) throws PortalException, SystemException, IOException{
441 return addFileEntry(uploadRequest, user, folderId, false);
445 * Add file entry from upload request
446 * @param uploadRequest
450 * @throws PortalException
451 * @throws SystemException
452 * @throws IOException
454 public static FileEntry addFileEntry(UploadPortletRequest uploadRequest, User user, long folderId, boolean temporary) throws PortalException, SystemException, IOException {
456 // Get file parameter name
457 String fileNameParam = "";
458 Enumeration<String> enumeration = uploadRequest.getParameterNames();
459 while (enumeration.hasMoreElements()) {
460 String ee = enumeration.nextElement();
461 if (ee.startsWith("ext-gen") || ee.startsWith("uploadedFile") || ee.startsWith("files")){
466 if(!fileNameParam.isEmpty()){
467 // Get file from upload request
468 final java.io.File file = uploadRequest.getFile(fileNameParam);
469 String sourceFileName = uploadRequest.getFileName(fileNameParam);
474 // Get temporary folder
475 folderId = user.getGroup().getGroupId();
476 folder = FoldersUtil.getTmpFileFolderBox(user.getUserId(), folderId);
480 folderId = Long.valueOf(uploadRequest.getParameter("folderId")).longValue();
482 folder = DLAppLocalServiceUtil.getFolder(folderId);
487 FileEntry fileEntry = addFileEntry(user, folder, sourceFileName, file);
489 } catch (FileSizeException e) {
490 throw new FileSizeException();
491 } catch (IOException e) {
492 throw new IOException();
495 throw new FileSizeException();
500 * Add file entry from repository
505 * @throws PortalException
506 * @throws SystemException
507 * @throws IOException
509 public static FileEntry addFileEntry(User user, String dir, String fileName) throws PortalException, SystemException, IOException{
510 return addFileEntry(user, FoldersUtil.getDropBox(user.getUserId()), dir, fileName);
514 * Add file entry from repository
516 * @param receiverDropBox
520 * @throws PortalException
521 * @throws SystemException
522 * @throws IOException
524 public static FileEntry addFileEntry(User user, Folder folder, String dir, String fileName) throws PortalException, SystemException, IOException{
527 if(!dir.endsWith(StringPool.SLASH)){
528 dir += StringPool.SLASH;
530 String path = dir + fileName;
532 // Get file content from disk repository
533 InputStream is = DLStoreUtil.getFileAsStream(
534 user.getCompanyId(), CompanyConstants.SYSTEM, path);
538 FileEntry fileEntry = addFileEntry(user, folder, fileName, is);
540 } catch (FileSizeException e) {
541 throw new FileSizeException();
542 } catch (IOException e) {
543 throw new IOException();
548 * Add file entry from file
554 * @throws PortalException
555 * @throws SystemException
556 * @throws IOException
558 public static FileEntry addFileEntry(User user, Folder folder, String fileName, InputStream is) throws PortalException, SystemException, IOException{
559 return addFileEntry(user, folder, fileName, FileUtil.getBytes(is));
563 * Add file entry from input stream
569 * @throws PortalException
570 * @throws SystemException
571 * @throws IOException
573 public static FileEntry addFileEntry(User user, Folder folder, String fileName, File file) throws PortalException, SystemException, IOException{
574 return addFileEntry(user, folder, fileName, FileUtil.getBytes(file));
578 * Add file entry from bytes
584 * @throws PortalException
585 * @throws SystemException
587 public static FileEntry addFileEntry(User user, Folder folder, String fileName, byte[] bytes) throws PortalException, SystemException{
589 // Set default permissions
590 ServiceContext serviceContext = new ServiceContext();
591 serviceContext.setAddGroupPermissions(true);
592 serviceContext.setAddGuestPermissions(true);
595 String[] splitFN = DLEntryUtil.splitFileName(fileName);
596 String originalTitle = FileNameUtil.getValidName(splitFN[0]);
597 String extension = "." + splitFN[1];
601 boolean finished = false;
605 while (!finished && count<50) {
607 name = originalTitle+suffixe+extension;
608 //Normalize the name before adding it to DB. (Solve some issues with accented character with a form "plain char+combining accent" -- e' insteand of é)
609 name = Normalizer.normalize (name, Normalizer.Form.NFC);
611 fe = DLAppLocalServiceUtil.addFileEntry(
614 folder.getFolderId(),
616 MimeTypesOverrideUtil.getContentType(name),
623 // Permissions management
624 PermissionsUtils.setParentPermissionToFile(fe);
627 } catch (DuplicateFileException exception) {
629 suffixe = " (" + count + ")";
630 } catch (FileSizeException e) {
631 throw new FileSizeException();
639 * Update file entry title
644 public static FileEntry updateFileEntry(FileEntry fileEntry, String title){
646 return updateFileEntry(fileEntry, title, bytes);
650 * Update file entry content
654 * @throws IOException
656 public static FileEntry updateFileEntry(FileEntry fileEntry, InputStream is) throws IOException{
657 return updateFileEntry(fileEntry, null, FileUtil.getBytes(is));
661 * Update file entry content
665 * @throws IOException
667 public static FileEntry updateFileEntry(FileEntry fileEntry, File file) throws IOException{
668 return updateFileEntry(fileEntry, null, FileUtil.getBytes(file));
672 * Update file entry content
677 public static FileEntry updateFileEntry(FileEntry fileEntry, byte[] bytes){
678 return updateFileEntry(fileEntry, null, bytes);
682 * Update file entry title and content
687 * @throws IOException
689 public static FileEntry updateFileEntry(FileEntry fileEntry, String title, InputStream is) throws IOException{
690 return updateFileEntry(fileEntry, title, FileUtil.getBytes(is));
694 * Update file entry title and content
699 * @throws IOException
701 public static FileEntry updateFileEntry(FileEntry fileEntry, String title, File file) throws IOException{
702 return updateFileEntry(fileEntry, title, FileUtil.getBytes(file));
706 * Update file entry title and content
712 public static FileEntry updateFileEntry(FileEntry fileEntry, String title, byte[] bytes){
713 // Set default permissions
714 ServiceContext serviceContext = new ServiceContext();
715 serviceContext.setAddGroupPermissions(true);
716 serviceContext.setAddGuestPermissions(true);
718 boolean finished = false;
720 title = Validator.isNull(title)?fileEntry.getTitle():title;
721 String fileTitle = FileNameUtil.getValidName(title);
723 //Check if filename contains extension
724 if (fileTitle.endsWith(fileEntry.getExtension())) {
725 // Add one to extension length to count the dot
726 int substringEndIndex = fileTitle.length() - (fileEntry.getExtension().length() + 1);
727 fileTitle = fileTitle.substring(0, substringEndIndex);
731 while(!finished && count<50) {
734 fileEntry = DLAppLocalServiceUtil.updateFileEntry(
735 fileEntry.getUserId(),
736 fileEntry.getFileEntryId(),
737 fileEntry.getTitle(),
738 fileEntry.getMimeType(),
739 fileTitle + suffixe + "." + fileEntry.getExtension(),
740 fileEntry.getDescription(),
746 // No permissions management because this method just update a file
749 Indexer indexer = IndexerRegistryUtil.getIndexer(DLFileEntry.class);
750 indexer.reindex(fileEntry);
751 } catch (Exception e) {
752 _log.error("Error when reindexing file after updating file "+fileEntry.getFileEntryId());
755 } catch (Exception exception) {
756 _log.error(exception);
758 suffixe = " (" + count + ")";
769 * @param parentFolderId
772 * @throws PortalException
773 * @throws SystemException
775 public static Folder addFolder(long userId, long groupId, long parentFolderId, String name) throws PortalException, SystemException{
777 // Set default permissions
778 ServiceContext serviceContext = new ServiceContext();
779 serviceContext.setAddGroupPermissions(true);
780 serviceContext.setAddGuestPermissions(true);
782 boolean finished = false;
784 String folderTitle = FileNameUtil.getValidName(name);
787 Folder folder = null;
789 while(!finished && count<50) {
791 title = folderTitle+suffixe;
792 folder = DLAppLocalServiceUtil.addFolder(
800 } catch (Exception exception) {
802 suffixe = " (" + count + ")";
806 DLAppLocalServiceUtil.updateFolder(
807 folder.getFolderId(),
813 Indexer indexer = IndexerRegistryUtil.getIndexer(DLFolder.class);
814 indexer.reindex(folder);
816 // Permissions management
817 PermissionsUtils.setParentPermissionToFolder(folder);
827 public static Folder updateFolder(Folder folder, String name){
828 return updateFolder(folder, -1, name);
832 * Update folder parent
834 * @param parentFolderId
837 public static Folder updateFolder(Folder folder, long parentFolderId){
838 return updateFolder(folder, parentFolderId, null);
842 * Update folder name and parent
844 * @param parentFolderId
848 public static Folder updateFolder(Folder folder, long parentFolderId, String name){
850 // Set default permissions
851 ServiceContext serviceContext = new ServiceContext();
852 serviceContext.setAddGroupPermissions(true);
853 serviceContext.setAddGuestPermissions(true);
854 boolean isRename = (parentFolderId == -1)? true : false;
856 boolean finished = false;
858 String folderTitle = Validator.isNull(name)?folder.getName():FileNameUtil.getValidName(name);
859 parentFolderId = isRename?folder.getParentFolderId():parentFolderId;
862 while(!finished && count<50) {
864 folder = DLAppLocalServiceUtil.updateFolder(
865 folder.getFolderId(),
867 folderTitle + suffixe,
868 folder.getDescription(),
871 Indexer indexer = IndexerRegistryUtil.getIndexer(DLFolder.class);
872 indexer.reindex(folder);
874 // Permissions management, don't change permission if it's just a rename
876 PermissionsUtils.setParentPermissionToFolder(folder);
879 } catch (Exception exception) {
881 suffixe = " (" + count + ")";
892 * @throws PortalException
893 * @throws SystemException
895 public static String getPath(Folder folder) throws PortalException, SystemException{
896 StringBuilder sb = new StringBuilder();
898 while (folder != null) {
899 sb.insert(0, folder.getName());
900 sb.insert(0, StringPool.SLASH);
902 folder = folder.getParentFolder();
905 return sb.toString();
909 * Get image link from file entry
911 * @param themeDisplay
914 * @throws SystemException
915 * @throws PortalException
917 public static String getImageSrc(FileEntry fileEntry, ThemeDisplay themeDisplay, int index) throws PortalException, SystemException{
918 return DLUtil.getPreviewURL(
919 fileEntry, fileEntry.getFileVersion(), themeDisplay, "&imageThumbnail=" + index,
924 * Get image link from file entry
926 * @param themeDisplay
929 * @throws SystemException
930 * @throws PortalException
932 public static String getImageSrcRelative(FileEntry fileEntry, ThemeDisplay themeDisplay, int index) throws PortalException, SystemException{
933 return DLUtil.getPreviewURL(
934 fileEntry, fileEntry.getFileVersion(), themeDisplay, "&imageThumbnail=" + index,
939 * Send file to drop box
940 * @param actionRequest
945 * @throws PortalException
946 * @throws SystemException
948 public static String sendToDropbox(User user, byte[] bytes, String fileName) throws PortalException, SystemException {
952 Folder folder = FoldersUtil.getDropBox(user.getUserId());
954 // Create file entry from bytes array
955 FileEntry fe = DLAppUtil.addFileEntry(user, folder, fileName, bytes);
957 // Send file to drop box
958 CasierEntryLocalServiceUtil.addCasierEntry(user.getCompanyId(), folder.getGroupId(), fe.getFileEntryId(), fe.getUserId(), "", false);
960 return "&fileEntryId=" + fe.getFileEntryId();
962 } catch (Exception e) {
969 private static Log _log = LogFactoryUtil.getLog(DLAppUtil.class);