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…
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
filipenf
vc pode ter um bean de escopo application que faça o gerenciamento do que está sendo editado e por quem.
basta abstrair e usar o jsf ao inves do vraptor no seu caso
abrassss
Jeferson_Manetti
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?
filipenf
me parece que tem algum erro na lógica… tens como colar o código aí?
basta abstrair e usar o jsf ao inves do vraptor no seu caso
abrassss
dei uma olhadinha nessa solução… porem não consegui abstrair muita coisa =(
filipenf
segue…
// codigo do metodo afterPhase(PhaseEvent event) FacesContextfacesContext=event.getFacesContext();ServletContextcontext=(ServletContext)facesContext.getExternalContext().getContext();LockEditResourcelock=(LockEditResource)context.getAttribute("lockEditResource");System.out.println("Lock no Listener >>> "+lock);if(lock.isLock(facesContext.getViewRoot().getViewId())){HttpSessionsession=(HttpSession)facesContext.getExternalContext().getSession(false);Usuariousr=(Usuario)session.getAttribute("usuario");if(lock.isLockForMe(usr.getLogin())){lock.removeLock(facesContext.getViewRoot().getViewId());}else{// RedirecionaNavigationHandlernavigationHandler=facesContext.getApplication().getNavigationHandler();navigationHandler.handleNavigation(facesContext,null,"teste");// Renderiza a PaginafacesContext.renderResponse();}}
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…
filipenf
faça o lock no objeto (bean) que está sendo alterado, assim evita esse problema que vc citou.
Jeferson_Manetti
filipenf:
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...
publicclassLockEditResourceTagextendsSimpleTagSupport{privateStringowner;privateStringresource;@OverridepublicvoiddoTag()throwsJspException,IOException{LockEditResourcelock=(LockEditResource)getJspContext().getAttribute("lockEditResource",4);lock.addLock(getResource(),getOwner());}// getter and setter}