Duvida com Projeto

olá pessoal,

estou desenvolvendo um projeto Web com JSF e estou com uma duvida referente a projeto…

bom… eu tenho uma pagina com a listagem de Proposta (um DataTable).

ao clicar em editar ele redirecina para pagina onde eu irei editar a proposta…

bem tranquilo… padrão!

porem 2 usuarios podem editar a mesma Proposta…

ex.: o usuaio “Jose” clicou em editar e esta alterando a proposta… dai o usario “Manoel” tambem vai editar…
dai pode ocorrer conflitos de informação (quem salvar por ultimo ganha)

gostaria de saber como proceder neste caso!!!

ate pensei em fazer alguma especie de bloqueio de recurso… mais não faço a minima ideia de como fazer algo assim…

gostaria da opinião da galera.

at.,

Jeferson

Bom, vc pode fazer de várias formas isso, uma delas é isso que vc falo mesmo, concorrência otimista, o ultimo que salvar é o que vai ficar na base de dados, agora vc pode fazer esquema de lock por entidade por exemplo, o EJB fornece isso, e pode fazer um esquema de expirar lock, que enquanto o cara estiver na tela, vc faz um requisião a cada 1 minuto por exemplo em ajax, que aumenta o tempo do lock, agora isso pode ser feito de diversas formas tb, depende da sua arquitetura mesmo, ou regra de negócio.

[]s

vc pode ter um bean de escopo application que faça o gerenciamento do que está sendo editado e por quem.

uma solucao completa está aqui: http://blog.caelum.com.br/2008/03/04/screencast-hibernate-e-concorrencia-otimista-na-web-com-vraptor/

basta abstrair e usar o jsf ao inves do vraptor no seu caso

abrassss

olá…

eu fiz exatamente oq vc falou…

criei um bean e coloquei no escopo da aplicação…
este bean possui um Map onde consta a viewId e o usuario…

criei uma CustomTag chamada lock… coloco nas paginas que serão bloqueadas…

atraves de um PhaseListener eu verifico se o viewId esta bloqueado ou não… e deixo o cara acessar ou não…

ate aqui eu consegui chegar…

eu queria assim:
meu DataTable tem 2 registros… ( Reg1 e Reg2 )
se o usuario “Jose” estiver editando o “Reg1” o usuario “Manoel” não podera editar o “Reg1”… porem ele podera editar o “Reg2”…

oq esta acontecendo:
se o “Jose” estiver editando o “Reg1” o “Manoel” não consegue editar nada… pq ele bloqueia a viewId

entenderam?

tem alguma coisa que eu possa fazer?

me parece que tem algum erro na lógica… tens como colar o código aí?

[quote=renanreismartins]uma solucao completa está aqui: http://blog.caelum.com.br/2008/03/04/screencast-hibernate-e-concorrencia-otimista-na-web-com-vraptor/

basta abstrair e usar o jsf ao inves do vraptor no seu caso

abrassss[/quote]

dei uma olhadinha nessa solução… porem não consegui abstrair muita coisa =(

filipenf
segue…

// codigo do metodo afterPhase(PhaseEvent event) 

FacesContext facesContext = event.getFacesContext();

ServletContext context = (ServletContext) facesContext.getExternalContext().getContext();
LockEditResource lock = (LockEditResource) context.getAttribute("lockEditResource");
				
System.out.println("Lock no Listener >>> "+lock);
		
if( lock.isLock(facesContext.getViewRoot().getViewId()) ){
			
       HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
       Usuario usr = (Usuario) session.getAttribute("usuario");

	if(lock.isLockForMe(usr.getLogin())){
		
		lock.removeLock(facesContext.getViewRoot().getViewId());
							
	}else{

		// Redireciona
		NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
		navigationHandler.handleNavigation( facesContext, null, "teste" );
			
		// Renderiza a Pagina
		facesContext.renderResponse();
	}
}
public class LockEditResource {

	private Map<String,String> lockResource;

	public LockEditResource() {
		lockResource = new HashMap<String,String>();
	}
	

	public boolean isLock(String resource){
		return lockResource.containsKey(resource);
	}
	
	public boolean isLockForMe(String owner){
		return lockResource.containsValue(owner);
	}
	
	public void addLock(String resource, String owner){
		lockResource.put(resource, owner);
	}
	 
	public void removeLock(String resource){
		lockResource.remove(resource);
	}
}

o problema e q estou bloqueando a pagina q edita… dai qnd ela esta com o “lock” nehum outro usuario consegue acessar… ou seja, ninguem mais consegue editar qlqr outro regitro do table…

faça o lock no objeto (bean) que está sendo alterado, assim evita esse problema que vc citou.

hum…

como eu poderia fazer isto?

para fazer o lock da viewId fiz uma customtag…

[code]
public class LockEditResourceTag extends SimpleTagSupport {

private String owner;
private String resource;

@Override
public void doTag() throws JspException, IOException {

    LockEditResource lock = (LockEditResource) getJspContext().getAttribute("lockEditResource",4);
	
    lock.addLock(getResource(),getOwner());

			
}
   // getter and setter

}[/code]

<%@ taglib uri="simpleTags" prefix="myTags"  %>

<myTags:lock owner="${usuario.login}" resource="${pageContext.request.servletPath}"/>

mas como faria pra fazer o lock do bean?

E ai moçada,

Eu sei q esse tópico não é de hoje, mas estou com o mesmo problema.

Eu até pensei em como resolver com um bean, ou seja, o objeto que quero dar um lock.

O problema está em quando dar um unlock nesse objeto.

Conseguiram resolver? Como?