/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.user;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.List;
import org.olat.basesecurity.BaseSecurityManager;
import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
import org.olat.core.commons.services.image.ImageService;
import org.olat.core.commons.services.image.Size;
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.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.FileUtils;
import org.olat.core.util.StringHelper;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
import org.olat.core.util.vfs.VFSLeaf;
/**
* Description: <br>
* TODO: alex Class Description
* <P>
*
* Initial Date: Sept 08, 2005 <br>
* @author Alexander Schneider
*/
public class DisplayPortraitManager implements UserDataDeletable {
private static final OLog log = Tracing.createLoggerFor(DisplayPortraitManager.class);
private static DisplayPortraitManager singleton;
private static final String LOGO_PREFIX_FILENAME = "logo";
private static final String LOGO_BIG_FILENAME = LOGO_PREFIX_FILENAME + "_big";
private static final String LOGO_SMALL_FILENAME = LOGO_PREFIX_FILENAME + "_small";
private static final String LOGO_MASTER_FILENAME = LOGO_PREFIX_FILENAME + "_master";
private static final String PORTRAIT_PREFIX_FILENAME = "portrait";
private static final String PORTRAIT_BIG_FILENAME = PORTRAIT_PREFIX_FILENAME + "_big";
private static final String PORTRAIT_SMALL_FILENAME = PORTRAIT_PREFIX_FILENAME + "_small";
private static final String PORTRAIT_MASTER_FILENAME = PORTRAIT_PREFIX_FILENAME + "_master";
// The following class names refer to CSS class names in olat.css
public static final String AVATAR_BIG_CSS_CLASS = "o_portrait_avatar";
public static final String AVATAR_SMALL_CSS_CLASS = "o_portrait_avatar_small";
public static final String LOGO_BIG_CSS_CLASS = "o_portrait_logo";
public static final String LOGO_SMALL_CSS_CLASS = "o_portrait_logo_small";
public static final String ANONYMOUS_BIG_CSS_CLASS = "o_portrait_anonymous";
public static final String ANONYMOUS_SMALL_CSS_CLASS = "o_portrait_anonymous_small";
public static final String DUMMY_BIG_CSS_CLASS = "o_portrait_dummy";
public static final String DUMMY_SMALL_CSS_CLASS = "o_portrait_dummy_small";
public static final String DUMMY_FEMALE_BIG_CSS_CLASS = "o_portrait_dummy_female_big";
public static final String DUMMY_FEMALE_SMALL_CSS_CLASS = "o_portrait_dummy_female_small";
public static final String DUMMY_MALE_BIG_CSS_CLASS = "o_portrait_dummy_male_big";
public static final String DUMMY_MALE_SMALL_CSS_CLASS = "o_portrait_dummy_male_small";
public static final int HEIGHT_BIG = 100; // 4-8 kbytes (jpeg)
public static final int HEIGHT_SMALL = 30; // 2-4
// If you change the following widths, don't forget to change them in basemod.scss as well.
public static final int WIDTH_PORTRAIT_BIG = HEIGHT_BIG; // 4-8 kbytes (jpeg)
public static final int WIDTH_PORTRAIT_SMALL = HEIGHT_SMALL; // 2-4
public static final int WIDTH_LOGO_BIG = HEIGHT_BIG * 4; // 4-8 kbytes (jpeg)
public static final int WIDTH_LOGO_SMALL = HEIGHT_SMALL * 4; // 2-4
/**
* [spring]
*/
private DisplayPortraitManager() {
singleton = this;
}
/**
* Singleton pattern
*
* @return instance
*/
public static DisplayPortraitManager getInstance() {
return singleton;
}
public MediaResource getSmallPortraitResource(String username) {
return getPortraitResource(username, PORTRAIT_SMALL_FILENAME);
}
public MediaResource getSmallPortraitResource(Long identityKey) {
return getPortraitResource(identityKey, PORTRAIT_SMALL_FILENAME);
}
public MediaResource getBigPortraitResource(String String) {
return getPortraitResource(String, PORTRAIT_BIG_FILENAME);
}
public MediaResource getBigPortraitResource(Long identityKey) {
return getPortraitResource(identityKey, PORTRAIT_BIG_FILENAME);
}
public MediaResource getMasterPortraitResource(String String) {
return getPortraitResource(String, PORTRAIT_MASTER_FILENAME);
}
public MediaResource getMasterPortraitResource(Long identityKey) {
return getPortraitResource(identityKey, PORTRAIT_MASTER_FILENAME);
}
public MediaResource getSmallLogoResource(String username) {
return getPortraitResource(username, LOGO_SMALL_FILENAME);
}
public MediaResource getSmallLogoResource(Long identityKey) {
return getPortraitResource(identityKey, LOGO_SMALL_FILENAME);
}
public MediaResource getBigLogoResource(String String) {
return getPortraitResource(String, LOGO_BIG_FILENAME);
}
public MediaResource getBigLogoResource(Long identityKey) {
return getPortraitResource(identityKey, LOGO_BIG_FILENAME);
}
/**
* Get the portrait media resource by identity name (username)
* @param identity
* @return imageResource portrait
*/
private MediaResource getPortraitResource(String username, String portraitName) {
MediaResource imageResource = null;
File imgFile = getPortraitFile(username, portraitName);
if (imgFile != null && imgFile.exists()){
imageResource = new FileMediaResource(imgFile);
}
return imageResource;
}
/**
* Alternate method to get the portrait resource by identity key.
* @param identityKey
* @param portraitName
* @return
*/
private MediaResource getPortraitResource(Long identityKey, String portraitName) {
Identity identity = BaseSecurityManager.getInstance().loadIdentityByKey(identityKey);
if (identity != null) {
return getPortraitResource(identity.getName(), portraitName);
}
return null;
}
public File getSmallPortrait(String username) {
return getPortraitFile(username, PORTRAIT_SMALL_FILENAME);
}
public File getBigPortrait(String username) {
return getPortraitFile(username, PORTRAIT_BIG_FILENAME);
}
public File getMasterPortrait(String username) {
return getPortraitFile(username, PORTRAIT_MASTER_FILENAME);
}
public VFSLeaf getLargestVFSPortrait(String username) {
VFSLeaf portrait = getPortraitLeaf(username, PORTRAIT_MASTER_FILENAME);
if(portrait == null || !portrait.exists()) {
portrait = getPortraitLeaf(username, PORTRAIT_BIG_FILENAME);
}
if(portrait == null || !portrait.exists()) {
portrait = getPortraitLeaf(username, PORTRAIT_SMALL_FILENAME);
}
return portrait;
}
public File getLargestPortrait(String username) {
File portrait = getPortraitFile(username, PORTRAIT_MASTER_FILENAME);
if(portrait == null || !portrait.exists()) {
portrait = getPortraitFile(username, PORTRAIT_BIG_FILENAME);
}
if(portrait == null || !portrait.exists()) {
portrait = getPortraitFile(username, PORTRAIT_SMALL_FILENAME);
}
return portrait;
}
public File getSmallLogo(String username) {
return getPortraitFile(username, LOGO_SMALL_FILENAME);
}
public File getBigLogo(String username) {
return getPortraitFile(username, LOGO_BIG_FILENAME);
}
public File getLargestLogo(String username) {
File portrait = getPortraitFile(username, LOGO_MASTER_FILENAME);
if(portrait == null || !portrait.exists()) {
portrait = getPortraitFile(username, LOGO_BIG_FILENAME);
}
if(portrait == null || !portrait.exists()) {
portrait = getPortraitFile(username, LOGO_SMALL_FILENAME);
}
return portrait;
}
public boolean hasPortrait(String username) {
File portraitDir = getPortraitDir(username);
if(portraitDir != null) {
File[] portraits = portraitDir.listFiles();
if(portraits.length > 0) {
for(File file:portraits) {
if(file.getName().startsWith(PORTRAIT_PREFIX_FILENAME)) {
return true;
}
}
}
}
return false;
}
private File getPortraitFile(String username, String prefix) {
File portraitDir = getPortraitDir(username);
if(portraitDir != null) {
File[] portraits = portraitDir.listFiles();
if(portraits.length > 0) {
for(File file:portraits) {
if(file.getName().startsWith(prefix)) {
return file;
}
}
}
}
return null;
}
private VFSLeaf getPortraitLeaf(String username, String prefix) {
VFSContainer portraitDir = getPortraitFolder(username);
if(portraitDir != null) {
List<VFSItem> portraits = portraitDir.getItems();
if(portraits.size() > 0) {
for(VFSItem file:portraits) {
if(file.getName().startsWith(prefix) && file instanceof VFSLeaf) {
return (VFSLeaf)file;
}
}
}
}
return null;
}
public void setPortrait(File file, String filename, String username) {
setImage(file, filename, username, PORTRAIT_PREFIX_FILENAME,
PORTRAIT_MASTER_FILENAME, PORTRAIT_BIG_FILENAME, PORTRAIT_SMALL_FILENAME,
WIDTH_PORTRAIT_BIG, WIDTH_PORTRAIT_SMALL);
}
public void setLogo(File file, String filename, String username) {
setImage(file, filename, username, LOGO_PREFIX_FILENAME,
LOGO_MASTER_FILENAME, LOGO_BIG_FILENAME, LOGO_SMALL_FILENAME,
WIDTH_LOGO_BIG, WIDTH_LOGO_SMALL);
}
private void setImage(File file, String filename, String username, String prefix,
String masterImagePrefix, String largeImagePrefix, String smallImagePrefix,
int maxBigWidth, int maxSmallWidth) {
File directory = getPortraitDir(username);
if(directory != null) {
for(File currentImage:directory.listFiles()) {
if(currentImage.equals(file)) {
continue;
} else if(currentImage.getName().startsWith(prefix)) {
currentImage.delete();
}
}
}
String extension = FileUtils.getFileSuffix(file.getName());
if(!StringHelper.containsNonWhitespace(extension)) {
if(StringHelper.containsNonWhitespace(filename)) {
extension = FileUtils.getFileSuffix(filename);
}
if(!StringHelper.containsNonWhitespace(extension)) {
extension = "png";
}
}
try {
File masterFile = new File(directory, masterImagePrefix + "." + extension);
Files.copy(file.toPath(), masterFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
log.error("", e);
}
File bigFile = new File(directory, largeImagePrefix + "." + extension);
File smallFile = new File(directory, smallImagePrefix + "." + extension);
ImageService imageHelper = CoreSpringFactory.getImpl(ImageService.class);
Size size = imageHelper.scaleImage(file, extension, bigFile, maxBigWidth, HEIGHT_BIG , false);
if(size != null){
size = imageHelper.scaleImage(file, extension, smallFile, maxSmallWidth, HEIGHT_SMALL, false);
}
}
public void deletePortrait(Identity identity) {
deleteImages(identity, PORTRAIT_PREFIX_FILENAME);
}
public void deleteLogo(Identity identity) {
deleteImages(identity, LOGO_PREFIX_FILENAME);
}
private void deleteImages(Identity identity, String prefix) {
File directory = getPortraitDir(identity.getName());
if(directory != null && directory.exists()) {
for(File file:directory.listFiles()) {
String filename = file.getName();
if(filename.startsWith(prefix)) {
file.delete();
}
}
}
}
/**
*
* @param identity
* @return imageResource portrait
*/
public MediaResource getPortrait(File uploadDir, String portraitName){
MediaResource imageResource = null;
File imgFile = new File(uploadDir, portraitName);
if (imgFile.exists()){
imageResource = new FileMediaResource(imgFile);
}
return imageResource;
}
/**
*
* @param identity
* @return
*/
public File getPortraitDir(String identityName){
String portraitPath = FolderConfig.getCanonicalRoot() +
FolderConfig.getUserHomePage(identityName) + "/portrait";
File portraitDir = new File(portraitPath);
portraitDir.mkdirs();
return portraitDir;
}
public OlatRootFolderImpl getPortraitFolder(String identityName) {
OlatRootFolderImpl folder = new OlatRootFolderImpl(FolderConfig.getUserHomePage(identityName) + "/portrait", null);
if(!folder.exists()) {
folder.getBasefile().mkdirs();
}
return folder;
}
/**
* Delete home-page config-file of a certain user.
* @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity)
*/
@Override
public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
String userHomePage = FolderConfig.getCanonicalRoot() + FolderConfig.getUserHomePage(identity.getName());
File portraitDir = new File(userHomePage, "portrait");
if(portraitDir.exists()) {
FileUtils.deleteDirsAndFiles(portraitDir, true, true);
}
log.debug("Homepage-config file deleted for identity=" + identity);
}
}