package fi.otavanopisto.muikku.session;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.apache.commons.lang3.ArrayUtils;
import fi.otavanopisto.muikku.dao.users.SuperUserDAO;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.util.ResourceEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.users.UserEntityController;
import fi.otavanopisto.security.ContextReference;
import fi.otavanopisto.security.PermissionResolver;
public abstract class AbstractSessionController implements SessionController {
private static final String[] SUPPORTED_LOCALES = {"fi", "en"};
@Inject
private SuperUserDAO superUserDAO;
@Inject
private UserEntityController userEntityController;
@Override
public boolean isSuperuser() {
if (isLoggedIn())
return isSuperuser(getLoggedUserEntity());
else
return false;
}
@Override
public Locale getLocale() {
if (locale == null) {
locale = new Locale(SUPPORTED_LOCALES[0]);
}
return locale;
}
@Override
public void setLocale(Locale locale) {
this.locale = resolveLocale(locale);
}
@Override
public boolean hasPermission(String permission, ContextReference contextReference) {
return hasPermissionImpl(permission, contextReference);
}
protected boolean isSuperuser(UserEntity user) {
return superUserDAO.findById(user.getId()) != null;
}
@Override
public boolean hasEnvironmentPermission(String permission) {
return hasEnvironmentPermissionImpl(permission);
}
@Override
public boolean hasCoursePermission(String permission, WorkspaceEntity course) {
return hasCoursePermissionImpl(permission, course);
}
@Override
public boolean hasResourcePermission(String permission, ResourceEntity resource) {
return hasResourcePermissionImpl(permission, resource);
}
@Override
public UserEntity getLoggedUserEntity() {
if ((getLoggedUserSchoolDataSource() == null) || (getLoggedUserIdentifier() == null)) {
return null;
}
return userEntityController.findUserEntityByDataSourceAndIdentifier(getLoggedUserSchoolDataSource(), getLoggedUserIdentifier());
}
@Inject
@Any
private Instance<PermissionResolver> permissionResolvers;
protected PermissionResolver getPermissionResolver(String permission) {
for (PermissionResolver resolver : permissionResolvers) {
if (resolver.handlesPermission(permission))
return resolver;
}
return null;
}
@Override
public <T> List<T> filterResources(List<T> list, String permission) {
List<T> ret = new ArrayList<T>();
for (T o : list) {
ResourceEntity re = (ResourceEntity) o;
if (hasResourcePermission(permission, re))
ret.add(o);
}
return ret;
}
protected abstract boolean hasPermissionImpl(String permission, ContextReference contextReference);
protected abstract boolean hasEnvironmentPermissionImpl(String permission);
protected abstract boolean hasCoursePermissionImpl(String permission, WorkspaceEntity course);
protected abstract boolean hasResourcePermissionImpl(String permission, ResourceEntity resource);
private Locale resolveLocale(Locale requestLocale) {
if (requestLocale != null && ArrayUtils.contains(SUPPORTED_LOCALES, requestLocale.getLanguage())) {
return new Locale(requestLocale.getLanguage());
}
return new Locale(SUPPORTED_LOCALES[0]);
}
private Locale locale;
}