Refatorando Webwork Actions

6 respostas
dukejeffrie

eu tenho um código assim no método doExecute() das minhas Actions:

if (!this.isSimulationAvailable()) {
	return LOGIN;
}
this.openHibernateSession();
if (this.getHasErrorMessages()) {
	return ERROR;
}
try {
	model = loadEmployee();
	return SUCCESS;
}
catch (HibernateException e) {
	this.log.error("[" + this.getActionName() + "]:doDefault() failed", e);
	this.addErrorMessage(e.getMessage());
	return ERROR;
}
finally {
	this.closeHibernateSession();
}

Eu quero refatorar isso pra colocar num lugar só a parte que mexe com o hibernate, mas eu não posso/devo/quero usar AOP.

Também está muito tarde pra passar tudo pro WW2.

Todas as minhas actions já extendem HibernateAction, que tem os métodos de abrir e fechar a session.

O problema de reescrever o método execute() é que eu não quero abrir a session antes de chamar o doValidation(), pq é meio sem nexo, e eu não tô a fim de copiar o execute() da ActionSupport pra dentro da minha action.

Alguém tem alguma idéia??

[]s!

6 Respostas

smota

Alguem ae … o WW 1.x não tem interceptors? se tiver é só criar um :lol:

dukejeffrie

pois eh, acho que não.

eu acho que “tuuudo não dá”. Se eu quiser minha session aberta antes do doExecute() mas depois do doValidation(), eu tenho mesmo que sabotar a ActionSupport.

mas vai que alguém já passou por isso, queria ver como o pessoal resolve esse tipo de encrenca…

Minhas actions tão feiamente duplicadas…

smota

Porque ao invés de sabotar a ActionSupport você não faz uma classe extendendo a danada e escreve o doExecute() nela, ae vc muda o nome nas sua classes do método pra myDoExecute() :shock:

Entonces é só chamar o danado a partir do doExecute() padrão que trata tudo que tem que tratar com o Hibernate & cia (inclusive os erros) …

(vc podria tb chamar super.doExecute() no doexecute() de cada action, mas teria duplicado 1 linha em cada action 8) )

Esse principio é o mesmo dos interceptors, mais simples mas eh a mesma ideia.

hummm … funciona, mas se eh a melhor maneira nao sei … socorro, alguem que usa o 1.x … outra idéia?

ricardolecheta

eu faço deste jeito que o smota disse com o Struts, deixo o controle de transação do Hibernate em uma action mãe…

nesta action eu inicio uma transação do Hibernate, depois chamo um método abstrato para as subclasses tratarem a requisição, depois disto fecho a sessao/commit/rollback…

cv1

Eh, nao tem mto jeito pra se virar com isso sem interceptors alem do que o smota mencionou...

Talvez usar a tal da action-mae como decorator? ;)

public class Mae ... {

  ...

  public final String doExecute() ... {
    Action a = new HibernateDecorator(this);
    return a.doExecute();
  }

}

Nao pensei muuuuito bem nisso, mas acho que da pra passar a ideia. Isso da certo? :D

dukejeffrie

cv, viajei nessa que vc falou.

HibernateDecorator é a minha classe?

Então, galera… eu tb pensei nisso, ter um hibExecute() que seria executado só em modo “online”…

… mas daí eu tenho que implementar tb o hibDefault(), o hibPreview(), e todos os outros commands da classe.

Eu posso mexer na ActionFactory, colocar minha própria factory, botar um decorator nas actions que eu crio: se ela implementar HibernateAction (eu transformo a classe em interface, e a atual vira AbstractHibernateAction ou HibernateActionSupport), eu intercepto os métodos doXXX():

public HibernateDecorator implements InvocationHandler {
	public Object invoke(Object proxy, Method m, Object[] args) {
		boolean intercept =  (m.getName().beginsWith("do")
		&& proxy instanceof HiebrnateAction);
		if (intercept) {
			((HibernateAction)proxy).openHibernateSession();
			try {
				// chamo o método (requer uma certa promiscuidade)
			}
			catch (HibernateException e) {...}
			finally {
				((HibernateAction)proxy).closeHibernateSession();
			}
		}
		else {
			// chamo o método
		}
	}
}

mas olha o trampo que dá… editar webwork.properties!! : )
implementar mais várias classes…

se eu terminar antes do prazo (tá, tá, podem rir!) eu faço algo mais nessa linha…

ou então o cv explica a do decorator…

[]s!!

Criado 10 de fevereiro de 2004
Ultima resposta 10 de fev. de 2004
Respostas 6
Participantes 4