diff --git a/src/main/java/org/olat/course/nodes/members/MembersCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/members/MembersCourseNodeRunController.java index 35db3d19f86cba77e3d3c64a497465905e07f4e3..914a265c67a5c47b130a6f1d1888fbee7e66b81a 100644 --- a/src/main/java/org/olat/course/nodes/members/MembersCourseNodeRunController.java +++ b/src/main/java/org/olat/course/nodes/members/MembersCourseNodeRunController.java @@ -209,7 +209,7 @@ public class MembersCourseNodeRunController extends FormBasicController { User user = identity.getUser(); String firstname = user.getProperty(UserConstants.FIRSTNAME, null); String lastname = user.getProperty(UserConstants.LASTNAME, null); - MediaResource rsrc = portraitManager.getPortrait(identity, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); + MediaResource rsrc = portraitManager.getSmallPortraitResource(identity); String portraitCssClass = null; String gender = identity.getUser().getProperty(UserConstants.GENDER, Locale.ENGLISH); @@ -330,7 +330,7 @@ public class MembersCourseNodeRunController extends FormBasicController { for(FormLink memberLink:memberLinks) { Member m = (Member)memberLink.getUserObject(); if(m.getIdentity().getKey().equals(key)) { - return portraitManager.getPortrait(m.getIdentity(), DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); + return portraitManager.getSmallPortraitResource(m.getIdentity()); } } } diff --git a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java index 72c400162fbda434abe3be934e73c52cfc699bd5..c6dee5ef7bd34f25ac745bb94d907442206c4aa4 100644 --- a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java +++ b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java @@ -497,9 +497,8 @@ public class ViteroManager extends BasicManager implements UserDataDeletable { protected boolean storePortrait(Identity identity, int userId) throws VmsNotAvailableException { try { - File portraitDir = DisplayPortraitManager.getInstance().getPortraitDir(identity); - File portrait = new File(portraitDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); - if(portrait.exists()) { + File portrait = DisplayPortraitManager.getInstance().getBigPortrait(identity); + if(portrait != null && portrait.exists()) { MtomServiceStub mtomWs = getMtomWebService(); MtomServiceStub.StoreAvatarRequest request = new MtomServiceStub.StoreAvatarRequest(); diff --git a/src/main/java/org/olat/user/DisplayPortraitController.java b/src/main/java/org/olat/user/DisplayPortraitController.java index 0fedf2e65b0a2ff6e03566c2a425f0bc510d3ad6..626b5065b4d5a14a1674ead7e9f3057fbb6fbb7b 100644 --- a/src/main/java/org/olat/user/DisplayPortraitController.java +++ b/src/main/java/org/olat/user/DisplayPortraitController.java @@ -114,7 +114,7 @@ public class DisplayPortraitController extends BasicController { } if (useLarge){ - portrait = DisplayPortraitManager.getInstance().getPortrait(portraitIdent, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); + portrait = DisplayPortraitManager.getInstance().getBigPortraitResource(portraitIdent); if (gender.equals("-")) { myContent.contextPut("portraitCssClass", DisplayPortraitManager.DUMMY_BIG_CSS_CLASS); } else if (gender.equals("male")) { @@ -123,7 +123,7 @@ public class DisplayPortraitController extends BasicController { myContent.contextPut("portraitCssClass", DisplayPortraitManager.DUMMY_FEMALE_BIG_CSS_CLASS); } } else { - portrait = DisplayPortraitManager.getInstance().getPortrait(portraitIdent, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); + portrait = DisplayPortraitManager.getInstance().getSmallPortraitResource(portraitIdent); if (gender.equals("-")) { myContent.contextPut("portraitCssClass", DisplayPortraitManager.DUMMY_SMALL_CSS_CLASS); } else if (gender.equals("male")) { diff --git a/src/main/java/org/olat/user/DisplayPortraitManager.java b/src/main/java/org/olat/user/DisplayPortraitManager.java index 2667813b81b17288fd8bf14ff94d612a4932fd30..4c6dc39f192810a7e7ac5eb50ffde1c47a7ea1d3 100644 --- a/src/main/java/org/olat/user/DisplayPortraitManager.java +++ b/src/main/java/org/olat/user/DisplayPortraitManager.java @@ -28,13 +28,16 @@ package org.olat.user; import java.io.File; import org.olat.admin.user.delete.service.UserDeletionManager; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.gui.media.FileMediaResource; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; -import org.olat.core.logging.Tracing; import org.olat.core.manager.BasicManager; import org.olat.core.util.FileUtils; +import org.olat.core.util.ImageHelper; +import org.olat.core.util.StringHelper; +import org.olat.core.util.image.Size; /** * Description: <br> @@ -48,8 +51,8 @@ public class DisplayPortraitManager extends BasicManager implements UserDataDele private static DisplayPortraitManager singleton; - public static final String PORTRAIT_BIG_FILENAME = "portrait_big.jpg"; - public static final String PORTRAIT_SMALL_FILENAME = "portrait_small.jpg"; + private static final String PORTRAIT_BIG_FILENAME = "portrait_big"; + private static final String PORTRAIT_SMALL_FILENAME = "portrait_small"; // The following class names refer to CSS class names in olat.css public static final String DUMMY_BIG_CSS_CLASS = "o_portrait_dummy"; public static final String DUMMY_SMALL_CSS_CLASS = "o_portrait_dummy_small"; @@ -78,21 +81,68 @@ public class DisplayPortraitManager extends BasicManager implements UserDataDele public static DisplayPortraitManager getInstance() { return singleton; } + + public MediaResource getSmallPortraitResource(Identity identity) { + return getPortraitResource(identity, PORTRAIT_SMALL_FILENAME); + } + + public MediaResource getBigPortraitResource(Identity identity) { + return getPortraitResource(identity, PORTRAIT_BIG_FILENAME); + } /** * * @param identity * @return imageResource portrait */ - public MediaResource getPortrait(Identity identity, String portraitName){ + private MediaResource getPortraitResource(Identity identity, String portraitName) { MediaResource imageResource = null; - File imgFile = new File(getPortraitDir(identity), portraitName); - if (imgFile.exists()){ + File imgFile = getPortraitFile(identity, portraitName); + if (imgFile != null && imgFile.exists()){ imageResource = new FileMediaResource(imgFile); } return imageResource; } + public File getSmallPortrait(Identity identity) { + return getPortraitFile(identity, PORTRAIT_SMALL_FILENAME); + } + + public File getBigPortrait(Identity identity) { + return getPortraitFile(identity, PORTRAIT_BIG_FILENAME); + } + + private File getPortraitFile(Identity identity, String prefix) { + File portraitDir = getPortraitDir(identity); + if(portraitDir != null) { + for(File file:portraitDir.listFiles()) { + if(file.getName().startsWith(prefix)) { + return file; + } + } + } + return null; + } + + public void setPortrait(File file, Identity identity) { + String extension = FileUtils.getFileSuffix(file.getName()); + if(!StringHelper.containsNonWhitespace(extension)) { + extension = "png"; + } + File portraitDir = getPortraitDir(identity); + File pBigFile = new File(portraitDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME + "." + extension); + File pSmallFile = new File(portraitDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME + "." + extension); + ImageHelper imageHelper = CoreSpringFactory.getImpl(ImageHelper.class); + Size size = imageHelper.scaleImage(file, pBigFile, DisplayPortraitManager.WIDTH_PORTRAIT_BIG, DisplayPortraitManager.WIDTH_PORTRAIT_BIG); + if(size != null){ + size = imageHelper.scaleImage(file, pSmallFile, DisplayPortraitManager.WIDTH_PORTRAIT_SMALL, DisplayPortraitManager.WIDTH_PORTRAIT_SMALL); + } + } + + public void deletePortrait(Identity identity) { + FileUtils.deleteDirsAndFiles(getPortraitDir(identity), true, true); + } + /** * * @param identity @@ -125,8 +175,7 @@ public class DisplayPortraitManager extends BasicManager implements UserDataDele * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ public void deleteUserData(Identity identity, String newDeletedUserName) { - FileUtils.deleteDirsAndFiles(getPortraitDir(identity), true, true); - Tracing.logDebug("Homepage-config file deleted for identity=" + identity, this.getClass()); + deletePortrait(identity); + logDebug("Homepage-config file deleted for identity=" + identity); } - } \ No newline at end of file diff --git a/src/main/java/org/olat/user/PortraitUploadController.java b/src/main/java/org/olat/user/PortraitUploadController.java index 7fe6fc857b74dfbc505657df1efd9be7ec33a3d3..0b077195f53cfc85e43e16b5fc55d1ebdc62b37e 100644 --- a/src/main/java/org/olat/user/PortraitUploadController.java +++ b/src/main/java/org/olat/user/PortraitUploadController.java @@ -28,7 +28,6 @@ import java.io.File; import java.util.HashSet; import java.util.Set; -import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FileUploadController; import org.olat.core.commons.modules.bc.FolderEvent; import org.olat.core.gui.UserRequest; @@ -43,8 +42,6 @@ import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; import org.olat.core.util.FileUtils; -import org.olat.core.util.ImageHelper; -import org.olat.core.util.image.Size; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; @@ -75,6 +72,7 @@ public class PortraitUploadController extends BasicController { private File newFile = null; private int limitKB; // max UL limit + private final DisplayPortraitManager dps; /** * Display upload form to upload a file to the given currentPath. @@ -85,7 +83,7 @@ public class PortraitUploadController extends BasicController { */ public PortraitUploadController(UserRequest ureq, WindowControl wControl, Identity portraitIdent, long limitKB) { super(ureq, wControl); - DisplayPortraitManager dps = DisplayPortraitManager.getInstance(); + dps = DisplayPortraitManager.getInstance(); this.portraitIdent = portraitIdent; this.uploadDir = dps.getPortraitDir(portraitIdent); this.limitKB = (int) limitKB; @@ -93,7 +91,7 @@ public class PortraitUploadController extends BasicController { folderContainer = createVelocityContainer("portraitupload"); deleteButton = LinkFactory.createButtonSmall("command.delete", this.folderContainer, this); - MediaResource mr = dps.getPortrait(portraitIdent, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); + MediaResource mr = dps.getSmallPortraitResource(portraitIdent); if (mr != null) folderContainer.contextPut("hasPortrait", Boolean.TRUE); else folderContainer.contextPut("hasPortrait", Boolean.FALSE); @@ -140,14 +138,7 @@ public class PortraitUploadController extends BasicController { if (!newFile.exists()) { showError("Failed"); } else { - // Scale uploaded image - ImageHelper imageHelper = CoreSpringFactory.getImpl(ImageHelper.class); - File pBigFile = new File(uploadDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); - File pSmallFile = new File(uploadDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); - Size size = imageHelper.scaleImage(newFile, pBigFile, DisplayPortraitManager.WIDTH_PORTRAIT_BIG, DisplayPortraitManager.WIDTH_PORTRAIT_BIG); - if(size != null){ - imageHelper.scaleImage(newFile, pSmallFile, DisplayPortraitManager.WIDTH_PORTRAIT_SMALL, DisplayPortraitManager.WIDTH_PORTRAIT_SMALL); - } + dps.setPortrait(newFile, portraitIdent); // Cleanup original file newFile.delete(); // And finish workflow diff --git a/src/main/java/org/olat/user/restapi/UserVOFactory.java b/src/main/java/org/olat/user/restapi/UserVOFactory.java index 370075558af382dc5cd0d39f7f1293e8f4a20305..f15916d513226137b82dad90f86d91f5e4123ad7 100644 --- a/src/main/java/org/olat/user/restapi/UserVOFactory.java +++ b/src/main/java/org/olat/user/restapi/UserVOFactory.java @@ -103,9 +103,8 @@ public class UserVOFactory { userVO.setEmail(user.getProperty(UserConstants.EMAIL, null)); if(withPortrait) { - File portraitDir = DisplayPortraitManager.getInstance().getPortraitDir(identity); - File portrait = new File(portraitDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); - if(portrait.exists()) { + File portrait = DisplayPortraitManager.getInstance().getSmallPortrait(identity); + if(portrait != null && portrait.exists()) { try { InputStream input = new FileInputStream(portrait); byte[] datas = IOUtils.toByteArray(input); diff --git a/src/main/java/org/olat/user/restapi/UserWebService.java b/src/main/java/org/olat/user/restapi/UserWebService.java index f2df7175cb70d4cb69c460662bb97e2f171bce5e..e00e9901e64b9f6619a9ef1b8d2e7b4b79e77855 100644 --- a/src/main/java/org/olat/user/restapi/UserWebService.java +++ b/src/main/java/org/olat/user/restapi/UserWebService.java @@ -65,7 +65,6 @@ import org.olat.basesecurity.AuthHelper; import org.olat.basesecurity.Authentication; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityManager; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.components.form.ValidationError; import org.olat.core.gui.translator.PackageTranslator; import org.olat.core.gui.translator.Translator; @@ -76,10 +75,8 @@ import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.CodeHelper; import org.olat.core.util.FileUtils; -import org.olat.core.util.ImageHelper; import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; -import org.olat.core.util.image.Size; import org.olat.restapi.group.MyGroupWebService; import org.olat.restapi.support.vo.ErrorVO; import org.olat.user.DisplayPortraitManager; @@ -325,9 +322,8 @@ public class UserWebService { return Response.serverError().status(Status.NOT_FOUND).build(); } - File portraitDir = DisplayPortraitManager.getInstance().getPortraitDir(identity); - File portrait = new File(portraitDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); - if(!portrait.exists()) { + File portrait = DisplayPortraitManager.getInstance().getBigPortrait(identity); + if(portrait == null || !portrait.exists()) { return Response.serverError().status(Status.NOT_FOUND).build(); } @@ -372,16 +368,7 @@ public class UserWebService { File tmpFile = getTmpFile(filename); FileUtils.save(file, tmpFile); - - DisplayPortraitManager dps = DisplayPortraitManager.getInstance(); - File uploadDir = dps.getPortraitDir(identity); - File pBigFile = new File(uploadDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); - File pSmallFile = new File(uploadDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); - ImageHelper imageHelper = CoreSpringFactory.getImpl(ImageHelper.class); - Size size = imageHelper.scaleImage(tmpFile, pBigFile, DisplayPortraitManager.WIDTH_PORTRAIT_BIG, DisplayPortraitManager.WIDTH_PORTRAIT_BIG); - if(size != null){ - size = imageHelper.scaleImage(tmpFile, pSmallFile, DisplayPortraitManager.WIDTH_PORTRAIT_SMALL, DisplayPortraitManager.WIDTH_PORTRAIT_SMALL); - } + DisplayPortraitManager.getInstance().setPortrait(tmpFile, identity); tmpFile.delete(); return Response.ok().build(); } catch (Throwable e) { @@ -405,20 +392,11 @@ public class UserWebService { Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey, false); if(identity == null) { return Response.serverError().status(Status.NOT_FOUND).build(); - }else if(!isUserManager(request) && !identity.equalsByPersistableKey(authIdentity)) { + } else if(!isUserManager(request) && !identity.equalsByPersistableKey(authIdentity)) { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - DisplayPortraitManager dps = DisplayPortraitManager.getInstance(); - File uploadDir = dps.getPortraitDir(identity); - File pBigFile = new File(uploadDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); - if(pBigFile.exists()) { - pBigFile.delete(); - } - File pSmallFile = new File(uploadDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); - if(pSmallFile.exists()) { - pSmallFile.delete(); - } + DisplayPortraitManager.getInstance().deletePortrait(identity); return Response.ok().build(); } catch (Throwable e) { throw new WebApplicationException(e); diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java index 2a653f1c1676dc79ffc31ffc2d2a513cdfd1ec15..0e7ca098d2bd6c6cef08c6ebef7874b832a557fe 100644 --- a/src/test/java/org/olat/restapi/UserMgmtTest.java +++ b/src/test/java/org/olat/restapi/UserMgmtTest.java @@ -869,9 +869,10 @@ public class UserMgmtTest extends OlatJerseyTestCase { //check if big and small portraits exist DisplayPortraitManager dps = DisplayPortraitManager.getInstance(); - File uploadDir = dps.getPortraitDir(id1); - assertTrue(new File(uploadDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME).exists()); - assertTrue(new File(uploadDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME).exists()); + File bigPortrait = dps.getBigPortrait(id1); + assertNotNull(bigPortrait); + assertTrue(bigPortrait.exists()); + assertTrue(bigPortrait.exists()); //check get portrait String getRequest = "/users/" + id1.getKey() + "/portrait"; @@ -888,7 +889,8 @@ public class UserMgmtTest extends OlatJerseyTestCase { assertEquals(-1, b);//up to end of file assertTrue(count > 1000);//enough bytes - File bigPortrait = new File(uploadDir, DisplayPortraitManager.PORTRAIT_BIG_FILENAME); + bigPortrait = dps.getBigPortrait(id1); + assertNotNull(bigPortrait); assertEquals(count, bigPortrait.length()); //check get portrait as Base64 @@ -905,7 +907,8 @@ public class UserMgmtTest extends OlatJerseyTestCase { assertNotNull(datas); assertTrue(datas.length > 0); - File smallPortrait = new File(uploadDir, DisplayPortraitManager.PORTRAIT_SMALL_FILENAME); + File smallPortrait = dps.getSmallPortrait(id1); + assertNotNull(smallPortrait); assertEquals(datas.length, smallPortrait.length()); try {