gvSIG bugs #3432

ApplicationLocator.getManager().getActiveComponent() junto con EditingExtension pueden crear bucles infinitos

Added by Cesar Martinez Izquierdo about 9 years ago. Updated about 9 years ago.

Status:Closed% Done:

100%

Priority:NormalSpent time:-
Assignee:Francisco Díaz Carsí
Category:Document view
Target version:2.2.0-2309
Severity:Major Add-on version:
gvSIG version:2.2.0 Add-on build:
gvSIG build: Add-on resolve version:
Operative System: Add-on resolve build:
Keywords: Proyecto:
Has patch: Hito:
Add-on name:Unknown

Description

Supongamos que queremos crear un documento vista nuevo y que queremos abrir su ventana de propiedades:

  ProjectManager projectManager = ApplicationLocator.getProjectManager();
  ViewManager viewManager = (ViewManager) projectManager.getDocumentManager(ViewManager.TYPENAME);
  view = (ViewDocument) viewManager.createDocument();
  ProjectManager.getInstance().getCurrentProject().addDocument(view);
  if (view!=null) {
    IWindow propWin = view.getPropertiesWindow();
    ApplicationManager manager = ApplicationLocator.getManager();
    manager.getUIManager().addWindow(propWin);
  }

El addWindow final provoca un MDIFrame.refreshControls(), que en el isVisible de algunas extensiones acaba llamando a ApplicationLocator.getManager().getActiveComponent(ViewDocument.class);

Debido a un comportamiento indeseado del método getActiveComponent, éste acaba creando la ventana de la vista (que no se había llegado a crear en el código de ejemplo), y al crearse se llama a los listeners (MapControlCreationListener).

Uno de estos listeners (creado en el postInitialize de EditingExtension) llama a ApplicationLocator.getManager().refreshMenusAndToolBars(), que a su vez vuelve a llamar al isVisible de las extensiones y se entra en el bucle infinito.

Este bucle infinito está causado por la concurrencia de varios comportamientos que habría que estudiar si son deseables o podemos considerarlos bugs en sí mismos:
- ApplicationLocator.getManager().getActiveComponent(Class) crea la ventana del documento como efecto colateral en ciertas circustancias
- No parece una buena idea llamar a refreshMenusAndToolBars() desde un listener de MapControlCreationListeners. Cuando la ventana que contenga el mapcontrol se active, ya se llamará a MDIFrame.refreshControls()


Related issues

Related to Application: gvSIG desktop - gvSIG bugs #3430: Añadir Vista al Mapa y configurar Vista se bloquea gvSIG Closed 04/29/2015
Related to Application: gvSIG desktop - gvSIG bugs #3433: ApplicationLocator.getManager().getActiveComponent(Class)... Closed 04/30/2015
Related to Application: gvSIG desktop - gvSIG bugs #3434: No se abren la propiedades de una vista copiada y pegada Closed 04/30/2015

Associated revisions

Revision 42165
Added by Francisco Díaz Carsí about 9 years ago

fixes #3432
fixes #3433
fixes #3434

Arreglado el método getActiveDocument en DefaultProject para que no intente devolver un documento si la window no es una instancia de IDocumentWindow.

Sincronizado el método refreshControl en la clase MDIFrame para evitar que se le invoque mientras se está ejecutando.

History

#1 Updated by Cesar Martinez Izquierdo about 9 years ago

  • Related to gvSIG bugs #3430: Añadir Vista al Mapa y configurar Vista se bloquea gvSIG added

#2 Updated by Cesar Martinez Izquierdo about 9 years ago

  • Related to gvSIG bugs #3433: ApplicationLocator.getManager().getActiveComponent(Class) crea la ventana del documento como efecto colateral en ciertas circustancias added

#3 Updated by Cesar Martinez Izquierdo about 9 years ago

  • Related to gvSIG bugs #3434: No se abren la propiedades de una vista copiada y pegada added

#4 Updated by Joaquín del Cerro Murciano about 9 years ago

  • Target version set to 2.2.0-2309
  • Assignee set to Francisco Díaz Carsí

#5 Updated by Joaquín del Cerro Murciano about 9 years ago

Hola, entiendo que se han mezclado dos errores y eso ocasiona cierto lio. Creo que con la correccion del #3433, dejara de suceder esto, pero algo habria que hacer para que no se entre en bucle si desde un isVisible/isEnabled se intenta refrescar los menus y botones.

Creo que la solucion mas simple para evitar esto es simplemente evitar la reentrancia del metodo refreshControls de MDIFrame, que es quien llama a los isVisible/isEnabled. Para lo cual bastaria una varible de la instancia a modo de semaforo y una pequeña comprobacion.

Con eso nos curamos en salud por si desde alguna extension acaba haciendose esto.
Tal vez estaria bien incluso sacar por el log un warning informanado de que esta pasando por si hay posibilidad de evitarlo.

Respecto a refrescar los controles en el listener de MapControlCreationListeners, creo que se metio por que si no, no se refrescaban correctamente los botones. Pero podria volverse a revisar, y si no hace falta mejor si se quita,

#6 Updated by Joaquín del Cerro Murciano about 9 years ago

  • Description updated (diff)

#7 Updated by Francisco Díaz Carsí about 9 years ago

  • % Done changed from 0 to 100
  • Status changed from New to Fixed

Applied in changeset svn-gvsig-desktop|r42165.

#8 Updated by Álvaro Anguix about 9 years ago

  • Status changed from Fixed to Closed

Also available in: Atom PDF