Explication Exécution Recherche Webtop

De EjnTricks

Lors de l'exécution d'une recherche sous Webtop, les résultats sont affichées alors que la recherche n'est pas totalement terminée. C'est pourquoi le nombre de page est parfois "Page 1 sur 10+", indiquant que tous les résultats ne sont pas disponibles. Il est possible de changer de page et au bout d'un certain temps, cette information devient pertinente.

Cet article va décrire les différents points importants dans le code entraînant cette fonctionnalité.

Hand-icon.png Votre avis

Current user rating: 1/100 (1 votes)

 You need to enable JavaScript to vote


Version 5.3 SP2

Définition du composant search

La définition de ce composant se situe dans le fichier webtop\config\searchex_component.xml, où seule la classe d'instance est spécifiée.

C'est également une extension du composant défini dans la couche webcomponent à l'emplacement webcomponent/config/library/search/searchex/search_component.xml.

La définition du composant trouvé, il faut regarder de plus près aux classes d'instance définie dans ces fichiers XML.

Classe d'instance

Première analyse

Comme à chaque fois, il faut regarder la couche la plus haute, à savoir sous webtop. Dans le cas de la recherche, la classe d'instance ne présente aucun intérêt pour cette explication. Elle permet juste de sélectionner la bonne jsp à afficher en fonction du contexte de l'utilisateur.

La partie la plus importante se situe donc au niveau de la classe définie dans la couche webcomponent. Cette classe est trop imposante pour être présentée dans le cadre de cette page, seule les méthodes utiles à l'explication seront présentées. La méthode executeQuery(), comme son nom l'indique, est responsable de l'exécution de la requête. L'analyse pourrait débuter par cette méthode, mais il est intéressant de comprendre pourquoi et comment est elle appelée.

L'utilisation d'un IDE, comme Eclipse, falicite la tâche d'analyse en donnant les chaînes d'appel d'une méthode. Ce qui donne les appels suivants:


Initialisation composant

Sans grande surprise, celle ci peut être appelée lors de l'exécution de la méthode onInit(ArgumentList args) dont le code est:

Pour que la méthode initSearch(ArgumentList args) soit exécutée, il faut donc que la fonction delegateDqlSearch(ArgumentList args) retourne la valeur false.

Celle ci retourne vrai que dans le cas où:

  • Argument queryType est non null.
  • Et argument queryType n'est pas string
  • Et argument queryType n'est pas objectId
  • Et argument queryType n'est pas queryDef
  • Et argument queryType n'est pas queryId

Si toutes ces conditions sont validées, le composant est redirigé vers dqlsearchdelegate, ne faisant pas partie de cette explication. Dans le cas de recherche simple ou avancée, ces conditions ne sont pas remplies et la fonction retourne false, entraînant alors l'exécution de initSearch(ArgumentList args) depuis onInit(ArgumentList args).

Construction de la recherche

Cette méthode va alors positionner un ensemble de variables pour définir l'interface de l'utilisateur. Les deux instructions importantes sont la construction de la recherche à travers la méthode buildQuery(ArgumentList args), et son exécution par executeQuery().

La méthode buildQuery(ArgumentList args) est très importante, car celle ci va compléter l'instance de com.documentum.webcomponent.library.search.SearchInfo avec une instance de com.documentum.fc.client.search.IDfSmartListDefinition. Cette dernière est construite soit à partir de critères de recherche ou d'un "mot clé" dans le cas d'une recherche rapide.

Exécution recherche

Ensuite, quelques vérifications sont réalisées sur la validité du contexte, mais cela est hors périmètre de l'explication, et la méthode executeQuery() est exécutée.

Finalement, l'étude se termine à se niveau. En effet, une instance de com.documentum.fc.client.search.IDfQueryProcessor est construite, à partir d'une instance de com.documentum.fc.client.search.IDfSearchService, à laquelle est ajoutée l'instance courante comme listener. Et c'est celle ci qui va effectuer informer périodique de la disponibilité de résultats. L'étude de ce fonctionnement est réalisée au niveau de la page Explication IDfQueryProcessor DFC


Tracer la requête

L'analyse de l'exécution de la requête à travers IDfQueryBuilder, cf Explication IDfQueryProcessor DFC, un niveau de trace a été identifié permettant de tracer la requête exécutée. La mise en place de cette log est explicitée sur l'article Logger DFC#IDfQueryProcessor. Le fichier log4j.properties mis en place lors de l'installation de Webtop contenait:

log4j.rootCategory=FATAL, stdout, file
log4j.category.MUTE=OFF
log4j.additivity.tracing=false
log4j.category.tracing=DEBUG, FILE_TRACE

#------------------- CONSOLE --------------------------
log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.threshold=ERROR
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c - %m%n

#------------------- FILE --------------------------
log4j.appender.F1=org.apache.log4j.RollingFileAppender

log4j.appender.F1.File=E\:/Documentum/logs/log4j.log
log4j.appender.F1.MaxFileSize=10MB
log4j.appender.F1.layout=org.apache.log4j.PatternLayout
log4j.appender.F1.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c - %m%n

#------------------- FILE_TRACE --------------------------
log4j.appender.FILE_TRACE=org.apache.log4j.RollingFileAppender

log4j.appender.FILE_TRACE.File=E\:/Documentum/logs/trace.log
log4j.appender.FILE_TRACE.MaxFileSize=100MB
log4j.appender.FILE_TRACE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE_TRACE.layout.ConversionPattern=%d{ABSOLUTE} [%t] %m%n

log4j.logger.com.documentum.debug=DEBUG
log4j.logger.com.documentum.web=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}|%-5p|%-22t|%C|%M|%-4L] %m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=E\:/Documentum/logs/wdk.log
log4j.appender.file.MaxFileSize=500KB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{ISO8601}|%-5p|%-22t|%C|%M|%-4L] %m%n

Il est modifié ainsi pour activer juste sur la package com.documentum.fc.client.search.impl.broker:

log4j.rootCategory=FATAL, stdout, file
log4j.category.MUTE=OFF
log4j.additivity.tracing=false
log4j.category.tracing=ERROR, FILE_TRACE

#------------------- CONSOLE --------------------------
log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.threshold=ERROR
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c - %m%n

#------------------- FILE --------------------------
log4j.appender.F1=org.apache.log4j.RollingFileAppender

log4j.appender.F1.File=E\:/Documentum/logs/log4j.log
log4j.appender.F1.MaxFileSize=10MB
log4j.appender.F1.layout=org.apache.log4j.PatternLayout
log4j.appender.F1.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c - %m%n

#------------------- FILE_TRACE --------------------------
log4j.appender.FILE_TRACE=org.apache.log4j.RollingFileAppender

log4j.appender.FILE_TRACE.File=E\:/Documentum/logs/trace.log
log4j.appender.FILE_TRACE.MaxFileSize=100MB
log4j.appender.FILE_TRACE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE_TRACE.layout.ConversionPattern=%d{ABSOLUTE} [%t] %m%n

log4j.logger.com.documentum.debug=ERROR
log4j.logger.com.documentum.web=ERROR
log4j.logger.com.documentum.fc.client.search.impl.broker=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}|%-5p|%-22t|%C|%M|%-4L] %m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=E\:/Documentum/logs/wdk.log
log4j.appender.file.MaxFileSize=500KB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{ISO8601}|%-5p|%-22t|%C|%M|%-4L] %m%n