No código abaixo o framework Riffe utiliza continuations para armazenar valores temporários na sessão, sem tem que usar a sessão. Basicamente o pause() espera de alguma maneira o cliente entrar com o valor no formulário para continuar.
No final ele limpa o contexto do continuation.
Qualquer seria a real vantagem disso ao invés de ussar a session, guardar as coisas na session e no final limpar a session???
Comparando com a versão em Mentawai, percebo que o código com continuation é um pouco mais limpo, pois não precisa ficar colocando e tirando as coisas da session. Tirando isso não vejo mais nenhuma vantagem.
Opiniões / Comentários ???
RIFFE:
public class Game extends Element {
private static Random randomNumbers = new Random();
public void processElement() {
Template template = getHtmlTemplate("game");
int answer = 0, guesses = 0, guess = -1;
answer = randomNumbers.nextInt(101);
while (guess != answer) {
print(template);
pause();
template.clear();
guess = getParameterInt("guess", -1);
if (guess < 0 || guess > 100) {
template.setBlock("warning", "invalid");
continue;
}
guesses++;
if (answer < guess) template.setBlock("msg", "lower");
else if (answer > guess) template.setBlock("msg", "higher");
}
ContinuationContext.getActiveContext().removeContextTree();
template = getHtmlTemplate("success");
template.setValue("answer", answer);
template.setValue("guesses", guesses);
print(template);
}
}
Mentawai:
package examples.numberguess;
import java.util.*;
import org.mentawai.core.*;
import org.mentawai.validation.*;
import org.mentawai.rule.*;
public class NumberGuess extends BaseAction implements Validatable {
public static final String BINGO = "bingo";
public static final String FIRST = "first";
public static final String WRONG = "wrong";
private static final Random random = new Random();
private void incrementGuesses() {
Integer i = (Integer) session.getAttribute("guesses");
session.setAttribute("guesses", new Integer(i.intValue() + 1));
}
public void initValidator(Validator val, String innerAction) {
val.add("guess", new IntegerRule(0, 100), "Invalid guess!");
}
public String execute() throws Exception {
// Check if a game is in progess, by fetching the current answer...
int answer = -1;
if (session.getAttribute("answer") == null) {
answer = random.nextInt(101);
session.setAttribute("answer", new Integer(answer));
session.setAttribute("guesses", new Integer(0));
} else {
answer = ( (Integer) session.getAttribute("answer")).intValue();
}
if (input.getValue("guess") != null) {
incrementGuesses();
int guess = input.getIntValue("guess");
if (answer == guess) {
output.setValue("answer", session.getAttribute("answer").toString());
output.setValue("guesses", session.getAttribute("guesses").toString());
session.removeAttribute("answer");
session.removeAttribute("guesses");
return BINGO;
} else {
if (guess < answer) {
addMessage("Number is higher!"); // of course this can be i18n...
} else {
addMessage("Number is lower!"); // of course this can be i18n...
}
return WRONG;
}
}
return FIRST;
}
}

