Explication Exécution Recherche Webtop
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é.
Sommaire
Votre avis
Current user rating: 1/100 (1 votes)
|
|
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.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Confidential Property of Documentum, Inc. -->
<!-- (c) Copyright Documentum, Inc. 2001. -->
<!-- All Rights reserved. -->
<!-- May not be used without prior written agreement -->
<!-- signed by a Documentum corporate officer. -->
<!-- -->
<!-- Component: search -->
<!-- Scope: None -->
<!-- Revision $revision$ -->
<!-- Modified on $date$ -->
<config version='1.0'>
<!-- this component doesn't handle display of search results of a dm_query object -->
<scope>
<!-- the simple search component definition -->
<component id="search" extends="search:webcomponent/config/library/search/searchex/search_component.xml">
<!-- Component Behavior -->
<class>com.documentum.webtop.webcomponent.search.SearchEx</class>
</component>
</scope>
</config>
C'est également une extension du composant défini dans la couche webcomponent
à l'emplacement webcomponent/config/library/search/searchex/search_component.xml
.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Confidential Property of Documentum, Inc. -->
<!-- (c) Copyright Documentum, Inc. 2001. -->
<!-- All Rights reserved. -->
<!-- May not be used without prior written agreement -->
<!-- signed by a Documentum corporate officer. -->
<!-- -->
<!-- Revision $revision$ -->
<!-- Modified on $date$ -->
<config version='1.0'>
<!-- this component doesn't handle display of search results of a dm_query object -->
<scope>
<!-- the simple search component definition -->
<component id="search">
<!-- Description (not NLS'd) -->
<desc>
You can use the search component to do the following:
1. Perform search queries.
2. Display the search results.
</desc>
<params>
<!-- the query string. Its content type is specified queryType -->
<param name="query" required="true"></param>
<!-- a value "objectId": specify the object id of the smartlist -->
<!-- a value "querydef": specify the XML content of a smartlist -->
<!-- a value "queryId": (internal)specify the an active query for editing -->
<!-- a value "string" or null: specify the keywords -->
<param name="queryType" required="false"></param>
<!-- for non-dql query: specify whether to use streamline view; defaults to true -->
<param name="drilldown" required="false"></param>
<!-- for non-dql query: specify whether to show wait page; defaults to true -->
<param name="showwait" required="false"></param>
</params>
<!-- Component Layout -->
<pages>
<filter clientenv='not appintg'>
<start>/webcomponent/library/searchresultslist/searchex/wait.jsp</start>
</filter>
<filter clientenv='appintg'>
<start>/webcomponent/library/searchresultslist/searchex/appintgwait.jsp</start>
</filter>
<filter clientenv='not appintg'>
<classic>/webcomponent/library/searchresultslist/searchex/searchresults_list.jsp</classic>
</filter>
<filter clientenv='appintg'>
<classic>/webcomponent/library/searchresultslist/searchex/appintg_searchresults_list.jsp</classic>
</filter>
<streamline>/webcomponent/library/searchresultslist/searchex/searchresults_drilldown.jsp</streamline>
</pages>
<!-- Component Behaior -->
<class>com.documentum.webcomponent.library.search.SearchEx</class>
<nlsbundle>com.documentum.webcomponent.library.search.SearchExNlsProp</nlsbundle>
<!-- If this component supports failover/replication, the failoverenabled needs to be set to true-->
<failoverenabled>true</failoverenabled>
<!-- Component specific Configuration -->
<!-- default search docbases and sources -->
<!-- a value of "current_docbase": search the current docbase -->
<!-- a value of "visible_docbases": search all the visible docbase -->
<!-- a value of "preferred_sources": search the preferred sources -->
<!-- a value of "all_sources": all the visible docbases and external sources -->
<defaultsources>preferred_sources</defaultsources>
<!-- Indicate if the path information should be displayed for results coming from a docbase.-->
<!-- Fetching folder information may be an expensive operation -->
<displayresultspath>true</displayresultspath>
<!-- default object type for the search -->
<type>dm_sysobject</type>
<!-- 'true' active or 'false' de-active term-hit highlighting -->
<highlight_matching_terms>true</highlight_matching_terms>
<!-- visibility and order of attribute columns -->
<!-- attribute names starting with uppercase are pseudo -->
<columns_drilldown>
<loadinvisibleattribute>true</loadinvisibleattribute>
<column>
<attribute>object_name</attribute>
<label><nlsid>MSG_NAME</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>Location</attribute>
<label><nlsid>MSG_ATTR_LOCATION</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>title</attribute>
<label><nlsid>MSG_ATTR_TITLE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>authors</attribute>
<label><nlsid>MSG_AUTHORS</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>a_content_type</attribute>
<label><nlsid>MSG_FORMAT</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>r_content_size</attribute>
<label><nlsid>MSG_SIZE</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>owner_name</attribute>
<label><nlsid>MSG_OWNER_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>group_name</attribute>
<label><nlsid>MSG_GROUP_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_creator_name</attribute>
<label><nlsid>MSG_CREATOR_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_object_type</attribute>
<label><nlsid>MSG_OBJECT_TYPE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_version_label</attribute>
<label><nlsid>MSG_VERSION_LABEL</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_creation_date</attribute>
<label><nlsid>MSG_CREATION_DATE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_modify_date</attribute>
<label><nlsid>MSG_MODIFIED_DATE</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>r_modifier</attribute>
<label><nlsid>MSG_MODIFIER</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_access_date</attribute>
<label><nlsid>MSG_ACCESS_DATE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_lock_owner</attribute>
<label><nlsid>MSG_LOCK_OWNER</nlsid></label>
<visible>true</visible>
</column>
<!-- this is a pseudo attributes refering to the folder path or external source URL -->
<column>
<attribute>Source</attribute>
<label><nlsid>MSG_ATTR_SOURCE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>summary</attribute>
<label><nlsid>MSG_ATTR_SUMMARY</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>topic_status</attribute>
<label><nlsid>MSG_DISCUSSION</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>room_status</attribute>
<label><nlsid>MSG_ROOM_ICON</nlsid></label>
<visible>true</visible>
</column>
</columns_drilldown>
<!-- visibility and order of attribute columns -->
<!-- attribute names starting with uppercase are pseudo -->
<columns_list>
<loadinvisibleattribute>true</loadinvisibleattribute>
<column>
<attribute>object_name</attribute>
<label><nlsid>MSG_NAME</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>score</attribute>
<label><nlsid>MSG_ATTR_SCORE</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>summary</attribute>
<label><nlsid>MSG_ATTR_SUMMARY</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>title</attribute>
<label><nlsid>MSG_ATTR_TITLE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>authors</attribute>
<label><nlsid>MSG_AUTHORS</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>a_content_type</attribute>
<label><nlsid>MSG_FORMAT</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_content_size</attribute>
<label><nlsid>MSG_SIZE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>owner_name</attribute>
<label><nlsid>MSG_OWNER_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>group_name</attribute>
<label><nlsid>MSG_GROUP_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_creator_name</attribute>
<label><nlsid>MSG_CREATOR_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_object_type</attribute>
<label><nlsid>MSG_OBJECT_TYPE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_version_label</attribute>
<label><nlsid>MSG_VERSION_LABEL</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_creation_date</attribute>
<label><nlsid>MSG_CREATION_DATE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_modify_date</attribute>
<label><nlsid>MSG_MODIFIED_DATE</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>r_modifier</attribute>
<label><nlsid>MSG_MODIFIER</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_access_date</attribute>
<label><nlsid>MSG_ACCESS_DATE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_lock_owner</attribute>
<label><nlsid>MSG_LOCK_OWNER</nlsid></label>
<visible>false</visible>
</column>
<!-- this is a pseudo attributes refering to the folder path or external source URL -->
<column>
<attribute>Location</attribute>
<label><nlsid>MSG_ATTR_LOCATION</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>Source</attribute>
<label><nlsid>MSG_ATTR_SOURCE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>topic_status</attribute>
<label><nlsid>MSG_DISCUSSION</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>room_status</attribute>
<label><nlsid>MSG_ROOM_ICON</nlsid></label>
<visible>true</visible>
</column>
</columns_list>
<!-- visibility and order of attribute columns -->
<!-- attribute names starting with uppercase are pseudo -->
<columns_saved_search>
<loadinvisibleattribute>true</loadinvisibleattribute>
<column>
<attribute>object_name</attribute>
<label><nlsid>MSG_NAME</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>Location</attribute>
<label><nlsid>MSG_ATTR_LOCATION</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>title</attribute>
<label><nlsid>MSG_ATTR_TITLE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>authors</attribute>
<label><nlsid>MSG_AUTHORS</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>a_content_type</attribute>
<label><nlsid>MSG_FORMAT</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>r_content_size</attribute>
<label><nlsid>MSG_SIZE</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>owner_name</attribute>
<label><nlsid>MSG_OWNER_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>group_name</attribute>
<label><nlsid>MSG_GROUP_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_creator_name</attribute>
<label><nlsid>MSG_CREATOR_NAME</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_object_type</attribute>
<label><nlsid>MSG_OBJECT_TYPE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_version_label</attribute>
<label><nlsid>MSG_VERSION_LABEL</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_creation_date</attribute>
<label><nlsid>MSG_CREATION_DATE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_modify_date</attribute>
<label><nlsid>MSG_MODIFIED_DATE</nlsid></label>
<visible>true</visible>
</column>
<column>
<attribute>r_modifier</attribute>
<label><nlsid>MSG_MODIFIER</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_access_date</attribute>
<label><nlsid>MSG_ACCESS_DATE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>r_lock_owner</attribute>
<label><nlsid>MSG_LOCK_OWNER</nlsid></label>
<visible>true</visible>
</column>
<!-- this is a pseudo attributes refering to the folder path or external source URL -->
<column>
<attribute>Source</attribute>
<label><nlsid>MSG_ATTR_SOURCE</nlsid></label>
<visible>false</visible>
</column>
<column>
<attribute>summary</attribute>
<label><nlsid>MSG_ATTR_SUMMARY</nlsid></label>
<visible>true</visible>
</column>
</columns_saved_search>
<dragdrop>
<sourceactions>
</sourceactions>
<targetactions>
<targetaction>com.documentum.web.formext.control.dragdrop.CopyToFolderTargetAction</targetaction>
<targetaction>com.documentum.web.formext.control.dragdrop.LinkToFolderTargetAction</targetaction>
<targetaction>com.documentum.web.formext.control.dragdrop.ImportTargetAction</targetaction>
</targetactions>
<dataproviders>
<dataprovider>
<format>com.documentum.web.formext.control.dragdrop.ObjectIdData</format>
<provider>com.documentum.web.formext.control.dragdrop.ObjectIdDataProvider</provider>
</dataprovider>
<dataprovider>
<format>com.documentum.web.formext.control.dragdrop.FileDescriptorData</format>
<provider>com.documentum.web.formext.control.dragdrop.FileDescriptorDataProvider</provider>
</dataprovider>
<dataprovider>
<format>com.documentum.web.formext.control.dragdrop.FileContentsData</format>
<provider>com.documentum.web.formext.control.dragdrop.FileContentsDataProvider</provider>
</dataprovider>
</dataproviders>
</dragdrop>
</component>
</scope>
</config>
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.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: SearchEx.java
package com.documentum.webtop.webcomponent.search;
import com.documentum.web.common.ArgumentList;
import com.documentum.webtop.app.AppSessionContext;
import com.documentum.webtop.app.ApplicationNavigation;
public class SearchEx extends com.documentum.webcomponent.library.search.SearchEx
{
public SearchEx()
{
}
public void onInit(ArgumentList args)
{
if(args.get("drilldown") == null)
{
String strView = AppSessionContext.getView();
if(strView != null && strView.equals("classic"))
args.add("drilldown", "false");
else
args.add("drilldown", "true");
}
super.onInit(args);
}
protected void navigateToFolderPath(String strFolderPath)
{
ApplicationNavigation.navigateToFolderPath(this, strFolderPath);
}
}
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:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: SearchEx.java
public void onInit(ArgumentList args)
{
m_initializing = true;
super.onInit(args);
if(!delegateDqlSearch(args))
initSearch(args);
IConfigElement configElement = lookupElement("dragdrop");
m_dragDropSupportBuilder.initialize(configElement);
NavigationObservable.getObservable(this).addObserver(this);
m_initializing = false;
}
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
.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: SearchEx.java
private boolean delegateDqlSearch(ArgumentList args)
{
boolean fDelegated = false;
String strQueryType = args.get("queryType");
String strDelegateComponentName = "dqlsearchdelegate";
if(strQueryType != null && !strQueryType.equals("string") && !strQueryType.equals("objectId") && !strQueryType.equals("querydef") && !strQueryType.equals("queryId"))
{
args.add("useColumnsFromQuery", "true");
setComponentJump(strDelegateComponentName, args, getContext());
fDelegated = true;
}
return fDelegated;
}
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()
.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: SearchEx.java
protected void initSearch(ArgumentList args)
{
initSearchInfo(args);
String strDrillDown = args.get("drilldown");
if(strDrillDown != null && strDrillDown.equalsIgnoreCase("false"))
setDrillDownView(false);
String showWaitPage = args.get("showwait");
if(showWaitPage != null && showWaitPage.equalsIgnoreCase("false"))
m_fShowWaitPage = false;
Hidden hidden = (Hidden)getControl("waitRequestId", com.documentum.web.form.control.Hidden.class);
hidden.setValue(String.valueOf(getNewWaitRequestId()));
getControl("processing", com.documentum.web.form.control.Link.class);
getControl("revise", com.documentum.web.form.control.Link.class).setVisible(true);
m_datagrid = (Datagrid)getControl("doclistgrid", com.documentum.web.form.control.databound.Datagrid.class);
DataPaging dataPaging = (DataPaging)getControl("docpager", com.documentum.web.form.control.databound.DataPaging.class);
dataPaging.setEventHandler("onnextpage", "onNextPageClicked", this);
dataPaging.setEventHandler("onlastpage", "onLastPageClicked", this);
addControlListener(this);
buildQuery(args);
if(!processContextSensitiveJump(args) && authenticateSources() && checkQueryTypeExists())
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.
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: SearchEx.java
protected void executeQuery()
{
m_fSearchCompleted = false;
m_fAllDataRefreshed = false;
m_fHasNewData = false;
m_fSortRequested = false;
if(!hasConnectedSources())
{
setEmptyResultPage();
} else
{
doSetCustomAttributes();
initDisplayAttributes();
initQueryResultAttributes();
getContext().set("queryId", getSearchInfo().getQueryId());
IDfSearchService searchService = getSearchInfo().getSearchService();
IDfQueryDefinition idfQuertdef = getSearchInfo().getSmartListDefinition().getQueryDefinition();
IDfQueryProcessor idfQueryProcessor = searchService.newQueryProcessor(idfQuertdef, true);
getSearchInfo().setQueryProcessor(idfQueryProcessor);
com.documentum.fc.client.search.IDfResultsManipulator idfResultsManipulator = searchService.newResultsManipulator(idfQuertdef);
getSearchInfo().setResultsManipulator(idfResultsManipulator);
idfQueryProcessor.addListener(this);
idfQueryProcessor.search();
m_searchResultSet = new SearchResultSet(getSearchInfo());
m_searchResultSet.setFetchFolderInformation(getFetchFolderInformation());
m_dataProvider = new SearchResultsProvider();
String strCustomAttr[] = ((Datagrid)getControl("doclistgrid", com.documentum.web.form.control.databound.Datagrid.class)).getDataProvider().getCustomAttributesInQuery();
if(strCustomAttr == null)
strCustomAttr = new String[0];
m_dataProvider.setCustomAttributesInQuery(strCustomAttr);
m_searchResultSet.setCustomResultAttributes(this, strCustomAttr, m_strCustomPseudoAttributes);
getSearchInfo().getProperties().put(REVISINGSEARCH_CUSTOM_ATTR_PROP, strCustomAttr);
getSearchInfo().getProperties().put(REVISINGSEARCH_CUSTOM_PYSEUDOATTR_PROP, m_strCustomPseudoAttributes);
m_datagrid.setDataProvider(m_dataProvider);
m_dataProvider.setScrollableResultSet(m_searchResultSet);
onNextPageClicked(null, null);
}
}
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