keycloak-d4science-spi-parent/avatar-realm-resource/src/main/java/org/gcube/keycloak/avatar/AbstractAvatarResource.java

68 lines
2.3 KiB
Java

package org.gcube.keycloak.avatar;
import java.io.InputStream;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import org.apache.commons.io.IOUtils;
import org.gcube.keycloak.avatar.storage.AvatarStorageProvider;
import org.gcube.keycloak.avatar.storage.file.FileAvatarStorageProvider;
import org.jboss.logging.Logger;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
public abstract class AbstractAvatarResource {
protected static final Logger logger = Logger.getLogger(AbstractAvatarResource.class);
protected static final String AVATAR_IMAGE_PARAMETER = "image";
public static final Class<?> DEFAULT_IMPLEMENTATION = FileAvatarStorageProvider.class;
protected KeycloakSession session;
public AbstractAvatarResource(KeycloakSession session) {
this.session = session;
}
public AvatarStorageProvider getAvatarStorageProvider() {
AvatarStorageProvider asp = lookupAvatarStorageProvider(session);
if (asp == null) {
logger.warnf("Provider not found via SPI configuration, defualting to: %s",
DEFAULT_IMPLEMENTATION.getName());
try {
asp = (AvatarStorageProvider) DEFAULT_IMPLEMENTATION.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
logger.error("Cannot instatiate storage implementation class", e);
}
}
return asp;
}
protected AvatarStorageProvider lookupAvatarStorageProvider(KeycloakSession keycloakSession) {
return keycloakSession.getProvider(AvatarStorageProvider.class);
}
protected Response unauthorized() {
return Response.status(Response.Status.UNAUTHORIZED).build();
}
protected Response invalidState() {
return Response.status(Response.Status.FORBIDDEN).build();
}
protected void saveUserImage(RealmModel realm, UserModel user, InputStream imageInputStream) {
getAvatarStorageProvider().saveAvatarImage(realm, user, imageInputStream);
}
protected StreamingOutput fetchUserImage(RealmModel realm, UserModel user) {
AvatarStorageProvider asp = getAvatarStorageProvider();
InputStream is = asp.loadAvatarImage(realm, user);
return output -> IOUtils.copy(is, output);
}
}