Problema com Ajax + JSF CommandButton e ModalPanel, Urgente!

Boas galera!

Eu estou precisando muuito da ajuda de vcs pois tenho um problema aqui no trabalho que infelizmente, ou eu não consegui a lógica certa para resolver, ou não tem mesmo como fazer o que eu estou tentando, ou os 2 xD. É que eu sou novo nessa tecnologia e começei a pouco tempo com javaWeb.

Ok, vamos ao problema. Eu tenho que cadastrar uma determinada garagem para um prédio. Ao cadastrar a garagem eu posso ou não selecionar um veículo para ela. O problema é que um veículo só pode pertencer a uma garagem. Então ao cadastrar uma nova garagem, com um veículo já pertencente a outra, é gerada uma Exception. Quado eu clico no botão salvar, eu preciso verificar se a ação é salvar ou alterar, se for alterar eu exibo um modal panel ao usuário solicitando que ele confirme a alteração, caso o usuário confirme, o método salvar é chamado. Em seguida é feita a verificação se o veículo selecionado não está cadastrado em outra garagem. Caso o veículo esteja cadastrado em outra garagem deve ser exibido um outro modal panel ao usuário solicitando que ele escolha se deseja alterar a garagem do veículo ou não, caso o usuário confirme, a nova garagem deve ser relacionada ao veículo e não a anterior. Detalhe o relacionamento veículo - Garagem é 1:1. O problema é que eu tentei fazer de várias formas e não consegui, eu tentei fazer alguns ifs/elses no action também, mas não deu certo (tem como usar ifs nos actions?), eu gostaria de saber também se eu consigo chamar os Modais panels direto da classe garagemMB

Seguem os trechos de Códigos:

Aqui eu verifico se a ação é alteração ou inclusão

<a4j:commandButton value="Salvar"
	value="Salvar" action="#{garagemMB.verificar}"
    oncomplete="if (#{garagemMB.garagem.id > 0}) #{rich:component('confirmaAlteracao')}.show()" />

Aqui está o modal panel de confirmação de alteração

<rich:modalPanel id="confirmaAlteracao" width="350" height="100"
		resizeable="false">
		<f:facet name="header">
			<h:panelGroup>
				<h:outputText value="Confirmação de alteração"></h:outputText>
			</h:panelGroup>
		</f:facet>
		<f:facet name="controls">
			<h:panelGroup>
				<h:graphicImage value="/images/modal/close.png"
					styleClass="hidelinks" id="hidelinks" />
				<rich:componentControl for="confirmaAlteracao" attachTo="hidelinks"
					operation="hide" event="onclick" />
			</h:panelGroup>
		</f:facet>
		<h:outputLabel value="Deseja realmente alterar a garagem?" />
		<br />
		<br />
		<center><a4j:form>
			<a4j:commandButton styleClass="botoes" value="Sim"
				action="#{garagemMB.salvar}" reRender="grdGaragens"
				oncomplete="#{rich:component('confirmaAlteracao')}.hide()" />
			<a4j:commandButton styleClass="botoes" value="Não"
			onclick="#{rich:component('confirmaAlteracao')}.hide()"
				 oncomplete="RichFaces.switchTab('abas','tabLista','Lista')"/>
		</a4j:form></center>
</rich:modalPanel>

Aqui está o modal panel de confirmação de veículo (pergunta ao usuário se ele deseja alterar o veículo, para a garagem que está sendo cadastrada)

<rich:modalPanel id="confirmaGaragem" width="350" height="100"
		resizeable="false">
		<f:facet name="header">
			<h:panelGroup>
				<h:outputText value="Atenção"></h:outputText>
			</h:panelGroup>
		</f:facet>
		<f:facet name="controls">
			<h:panelGroup>
				<h:graphicImage value="/images/modal/close.png"
					styleClass="hidelinks" id="hidelinksGaragem" />
				<rich:componentControl for="confirmaGaragem" attachTo="hidelinks"
					operation="hide" event="onclick" />
			</h:panelGroup>
		</f:facet>
		<h:outputLabel value="O veículo escolhido ja está cadastrado para outra garagem Deseja move-lo para a nova garagem?" />
		<br />
		<br />
		<center><a4j:form>
			<a4j:commandButton styleClass="botoes" value="Sim"
				action="#{garagemMB.alterarVeiculo}"
				oncomplete="#{rich:component('confirmaGaragem')}.hide()" />
			<a4j:commandButton styleClass="botoes" value="Não"
			onclick="#{rich:component('confirmaGaragem')}.hide()"
				 oncomplete="RichFaces.switchTab('abas','tabLista','Lista')"/>
		</a4j:form></center>
	</rich:modalPanel>

Estes são os métodos do meu ManagedBeam (garagemMB)

public String validarAcao() {
		//verifica se ação é salvar ou alterar
		if(garagem.getId() > 0){
			return "false";//ação alterar
		}
		return "true";
	}
	//-----------Verificar

	public String verificar() throws Exception{

		System.out.println("Entrou no verificar");
		for(Garagem garagem: GaragemDAO.listar()){
			if(this.garagem.getVeiculo().getId()==garagem.getVeiculo().getId()&&garagem.getId()==this.garagem.getId()){
				return "false";
			}
		}
		salvar();
		return "true";
	}

	//--------Salvar

	public String salvar()
	{
		try{
			garagemDAO = new GaragemDAO(garagem);
			garagemDAO.salvar();
			limparGaragem();
		}catch(Exception e){ // erro ao salvar
			e.printStackTrace();
			garagemDAO.mostrarMensagem(e.toString(), null);
		}
		return refresh();
	}

Agradeço desde já a ajuda

tu pode fazer o sequinte:

1 - cria atributos booleans para renderizar o botão necessário, pq vai depender do erro gerado que vai aparecer o botão
2 - no managedBean vc vai levantar a excessão, dependendo do caso , e colocar o atributo boleano para true e colocar os outros como false


<!-- isto aqui vc pode colocar no template, se vc usar, ou colocar antes chamar as variaves -->
<c:set value="Richfaces.hideModalPanel('alertModalBox');" var="hideError" />
<c:set value="Richfaces.showModalPanel('alertModalBox');" var="showError" />

<!-- isto aqui no botão -->
...oncomplete="#{facesContext.maximumSeverity == null ? hideError : showError }"

<!-- só lembrando -->
//alertModalBox é o modalPanel que vai ter a mensagem e os botões com o render igual ao atributo boleano do managedBean

bom acho que é isto, qualquer dúvida posta ai.

rjbcordeiro, obrigado pela resposta kra, mas vc poderia explicar o que cada comando dali faz. eh que eu tenho váarias duúvidas, por exemplo, gostaria de saber seé possível eu colocar um if no action.

foi criada duas variáveis para saber se é para mostrar o panel ou se é para esconder

mostrar se for gerado alguma excessão. Caso alguma daquelas condições não seja válida, vc vai levantar uma excessão ok.

se tudo ocorrer bem ai não é mostrado o modal panel.

agora temos que mostrar o botão dependendo do erro, se é para cadastrar, se é para atualizar …
e quem vai mostrar isto são as variaveis do managedbean para cada botão, pois cada um é uma ação diferente ok?
estas variaveis são um booleano para indicar qual o botão (true) vai aparecer e vc deve lembrar de deixar as outras como false

ai vc colocar no renderer de cada botão uma variavel do managedbean e só vai ser renderizado aquela que estiver como true. ok?

Ahh tahh pod kre.

Muito obrigado pela ajuda (e pela paciencia) xD

Vou tentar aqui.

VLW!