keycloak-d4science-spi-parent/avatar-realm-resource/src/main/java/org/gcube/keycloak/avatar/storage/file/FileAvatarStorageProvider.java

87 lines
3.0 KiB
Java

package org.gcube.keycloak.avatar.storage.file;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.gcube.keycloak.avatar.storage.AvatarStorageProvider;
import org.jboss.logging.Logger;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
public class FileAvatarStorageProvider implements AvatarStorageProvider {
private static final Logger logger = Logger.getLogger(FileAvatarStorageProvider.class);
private final File avatarFolder;
private final Boolean useEmailAsFilename;
public FileAvatarStorageProvider() {
this(FileAvatarStorageProviderFactory.DEFAULT_AVATAR_FOLDER,
FileAvatarStorageProviderFactory.USE_EMAIL_AS_FILENAME_DEFAULT);
}
public FileAvatarStorageProvider(String avatarFolder, Boolean useEmailAsFilename) {
this.avatarFolder = new File(avatarFolder);
this.useEmailAsFilename = useEmailAsFilename;
if (!this.avatarFolder.exists()) {
logger.infof("Creating avatar folder: %s", this.avatarFolder.getAbsolutePath());
this.avatarFolder.mkdir();
}
}
@Override
public void saveAvatarImage(RealmModel realm, UserModel user, InputStream input) {
checkRealmFolderExistence(realm.getName());
File avatarFile = getAvatarFile(realm, user);
if (!avatarFile.exists()) {
try {
avatarFile.createNewFile();
} catch (IOException e) {
logger.error("Cannot create new avater file", e);
}
}
try (FileOutputStream fos = new FileOutputStream(avatarFile)) {
IOUtils.copy(input, fos);
} catch (IOException e) {
logger.error("Cannot save avatar stream into file", e);
}
}
private void checkRealmFolderExistence(String realmName) {
File realmFile = new File(avatarFolder, realmName);
if (!realmFile.exists()) {
logger.infof("Creating avatar folder for realm '%s' in %s", realmName, realmFile.getAbsolutePath());
realmFile.mkdir();
}
}
@Override
public InputStream loadAvatarImage(RealmModel realm, UserModel user) {
checkRealmFolderExistence(realm.getName());
File avatarFile = getAvatarFile(realm, user);
try {
return new FileInputStream(avatarFile);
} catch (FileNotFoundException e) {
logger.debugf("Avatar file not found for user '%s' in realm '%s'", user.getUsername(), realm.getName());
return new ByteArrayInputStream(new byte[0]);
}
}
private File getAvatarFile(RealmModel realm, UserModel user) {
return new File(new File(avatarFolder, realm.getName()),
useEmailAsFilename ? user.getEmail() : user.getUsername());
}
@Override
public void close() {
// NOOP
}
}