ADF : Contourner le bug Oracle 11652292

Le présent article a pour but d’expliquer comment contourner le
bug ADF référencé 11652292
toujours non corrigé par les dernières versions d’ADF (Jdev 11.1.1.7.0).

Le choix de la solution retenue est un peu différente de celle proposée par le support d’Oracle afin de mieux répondre à nos besoins.

Contexte d’apparition du bug

Si au sein de votre page jsp, vous utilisez le concept de régions dynamiques pour changer l’affichage d’une partie de votre écran, par exemple le cas classique d’un menu qui modifie à chaque lien le corps de votre page.

Si en outre, au sein de votre page, vous avez un tableau filtrable, utilisant la fonctionnalité intégrée par ADF.
Alors, vous êtes potentiellement sous la menace du bug 11652292.

Il survient alors dans le cas d’utilisation suivant :

  1. Clic sur lien du menu, entrée dans le TaskFlow
  2. Filtrage du tableau
  3. Clic sur un autre lien du menu , ce qui signifie entrée dans un TaskFlow différent
  4. Re-Clic sur le premier lien du menu, donc retour dans le TaskFlow du début
  5. Re-filtrage du même tableau

Vous voyez alors apparaître sur l’écran le message d’erreur suivant :

Message sur UI du bug 11652292
 

L’explication d’Oracle est que le ViewCriteria appliqué servant à gérer le filtrage est mal géré.

Choix du correctif de contournement

Le contournement proposé par Oracle consiste à appliquer une méthode de nettoyage des Criterias à l’arrivée sur le TaskFlow. Elle a pour effet de supprimer le filtrage des données et les inputs des zones de saisie des filtres.

Le bug est corrigé mais nous souhaitions, nous, conserver les données saisies dans les filtres au long de la session pour ne pas devoir les resaisir à chaque fois.

La solution retenue a donc été de customizer le build-in filtrage ADF des tables, c’est à dire le queryListener.

Etapes de la mise en place du contournement

    • Codage de la méthode clearVOCriterias() dans une classe d’Extension de ViewObjectImpl

Afin de bénéficier à l’ensemble des ViewObjects de l’application, le nettoyage des Criterias est implémenté dans une classe d’extension.

  public class ExtViewObjectImpl extends ViewObjectImpl {
       public void clearVOCriterias() {
	    clearViewCriterias();
       }
  }
    • Publication de la méthode dans l’interface client du ViewObject où on veut l’utiliser

Afin de respecter le pattern MVC, la méthode est rendue publique dans une interface client. Cet autre article Exécuter une méthode customisée au sein d’un TaskFlow peut vous aider si vous ne connaissez la méthodologie.

    • Appel de la méthode dans les bindings de la page jsp

On rajoute la méthode dans les bindings de la page.

    • Customisation de la méthode de filtrage par défaut d’un tableau

On customise le queryListener associé à la table dans le managedBean de la page.

<af:table value="#{bindings.Pays.collectionModel}" var="row"
                    rows="#{bindings.Pays.rangeSize}" id="t1"
                    filterModel="#{bindings.PaysQuery.queryDescriptor}"
                    filterVisible="true" varStatus="vs"
                    queryListener="#{pays.onFilterCountry}"/>

L’implémentation dans le managedBean est la suivante :

  private static final String CLEAR_VO_CRITERIAS = "clearVOCriterias";
  /**
   * Custom method of filtering Pays table
   * Clear Criterias to workaround the bug 11652292
   * And after apply ADF built-in method to filter data
   * @param queryEvent
   */
  public void onFilterCountry(QueryEvent queryEvent) {
    OperationBinding clearVOCriterias =
      ADFUtils.findOperation(CLEAR_VO_CRITERIAS);
    List operationErrors = (List)clearVOCriterias.execute();
    // Success : invoke ADF built-in filtering method
    // If not workaround of bug on filtering will not work => message
    if (operationErrors == null || operationErrors.isEmpty()) {
      JsfUtils.invokeMethodExpression("#{bindings.PaysQuery.processQuery}",
                                      Object.class, QueryEvent.class,
                                      queryEvent);
    } else {
      // Send a message to the user of the failure on filtering
    }
  }

Nota bene :

Pour une raison qui m’échappe, je n’ai pas pu reproduire ce bug sur le Weblo intégré à Jdev mais uniquement sur un Weblo distant. Donc attention à bien faire vos tests de correction sur l’environnement adéquat.