El código es malo no solo por los números mágicos , sino porque fusiona varios significados en el código de retorno, ocultando dentro de su significado un error, una advertencia, un permiso para crear una sesión o una combinación de los tres, lo que lo convierte en un mal aporte para la toma de decisiones.
Sugeriría la siguiente refactorización: devolver una enumeración con los posibles resultados (como se sugiere en otras respuestas), pero agregar a la enumeración un atributo que indique si es una negación, una exención (lo dejaré pasar esta última vez) o si está bien (PASAR):
public LoginResult processLogin(HttpServletRequest request, HttpServletResponse response,
int pwChangeDays, ServletContext ServContext) {
}
==> LoginResult.java <==
public enum LoginResult {
NOT_LOGGED_IN(Severity.DENIAL),
ALREADY_LOGGED_IN(Severity.PASS),
INACTIVE_USER(Severity.DENIAL),
VALID_USER(Severity.PASS),
NEEDS_PASSWORD_CHANGE(Severity.WAIVER),
INVALID_APP_USER(Severity.DENIAL),
INVALID_NETWORK_USER(Severity.DENIAL),
NON_APPROVED_ADDRESS(Severity.DENIAL),
ACCOUNT_LOCKED(Severity.DENIAL),
ACCOUNT_WILL_BE_LOCKED(Severity.WAIVER);
private Severity severity;
private LoginResult(Severity severity) {
this.severity = severity;
}
public Severity getSeverity() {
return this.severity;
}
}
==> Severity.java <==
public enum Severity {
PASS,
WAIVER,
DENIAL;
}
==> Test.java <==
public class Test {
public static void main(String[] args) {
for (LoginResult r: LoginResult.values()){
System.out.println(r + " " +r.getSeverity());
}
}
}
Salida para Test.java que muestra la gravedad de cada LoginResult:
NOT_LOGGED_IN : DENIAL
ALREADY_LOGGED_IN : PASS
INACTIVE_USER : DENIAL
VALID_USER : PASS
NEEDS_PASSWORD_CHANGE : WAIVER
INVALID_APP_USER : DENIAL
INVALID_NETWORK_USER : DENIAL
NON_APPROVED_ADDRESS : DENIAL
ACCOUNT_LOCKED : DENIAL
ACCOUNT_WILL_BE_LOCKED : WAIVER
Según el valor de enumeración y su gravedad, puede decidir si la creación de la sesión continúa o no.
EDITAR:
Como respuesta al comentario de @T.Sar, cambié los posibles valores de la gravedad a PASS, WAIVER y DENIAL en lugar de (OK, WARNING y ERROR). De esta manera, está claro que una DENEGACIÓN (anteriormente ERROR) no es un error per se y no necesariamente debe traducirse en arrojar una excepción. La persona que llama examina el objeto y decide si lanzar o no una excepción, pero DENIAL es un estado de resultado válido resultante de la llamada processLogin(...)
.
- PASS: adelante, crea una sesión si aún no existe
- RENUNCIA: adelante esta vez, pero la próxima vez que el usuario no se le permita pasar
- NEGACIÓN: lo siento, el usuario no puede pasar, no cree una sesión