| Modifications apportées à ACE 1.3 après le 30 septembre 2007 | |
Ce document vous décrit les modifications apportées au socle dans sa version 6.30. Cette version est destinée à être mise en production avec la version 1.3 d’ACE.
Ce document est un condensé des nouveautés associées au socle technique. Des guides utilisateurs, plus complets, sont disponibles pour chacun des différents sujets traités.
Mise à jour des librairies suivantes :
| Ancienne librairie | Nouvelle librairie | ||||||||||||||
| jdomb5 .jar | jdom.jar | ||||||||||||||
| log4j-1.2.8.jar | log4j-1.2.14.jar | ||||||||||||||
Bc4j 10.1.3.39.84
|
Bc4j 10.1.3.40.66
|
Il existe à ce jour deux possibilités de piloter les paramètres techniques de l’application :
· La ligne de commande de démarrage de l’application
· La définition de paramètres dans web.xml (descripteur XML J2EE du WebModule concerné)
L’objectif principal de l’externalisation des paramètres techniques est double :
· Pouvoir positionner des « cheat codes » afin de piloter des particularités en cours de version (patch activable uniquement par ce moyen)
· Modifier des paramètres dynamiquement sans redémarrer le serveur d’application
La modification de ces paramètres ne peut se faire que sous le couvert du Groupe d’Expertise Technique. ACE déclinera toute responsabilité dans le cas contraire.
Les paramètres techniques seront situés dans un fichier nommé ACE.properties, la présence de celui-ci est optionnelle. Il se situé à la racine physique des WebModule, au même niveau que le fichier de configuration.
Pour la première version, il a été décidé d’exploiter un fichier texte contenant la liste des paramètres (code=valeur). Dans le futur et si les études le permettent, ce fichier sera probablement XML et il permettra de classifier les paramètres par catégorie. Dans le même ordre d’idée, une console JMX du marché pourrait être exploitée pour modifier dynamiquement les paramètres.
La liste des paramètres est fournie par ACE exclusivement. Ces paramètres peuvent aussi bien piloter des actions au niveau du socle technique que du code métier.
A titre d’exemple (non significatif), le contenu du fichier pourrait ressembler à ceci :
fr.ACE.application.forcesupport=NAV/MIC
fr.ACE.abstractprocessus.rollback=true
fr.ACE.viewobject.garbage=true
fr.ACE.viewobject.remove=true
fr.ACE.configuration.validation=false
oracle.jbo.server.locktimeout=1
fr.ACE.gc=full
La relecture du fichier se fait via une action définie par le socle, elle se trouve dans le package : fr.ACE.technicalframework.application.action.PropertiesReload
Elle provoque une demande de rechargement du fichier de propriétés pour l’ensemble de la JVM concernée. Cette action doit être – bien entendu - définie dans le fichier de configuration.
Exemple de cinématique : ?cinematic=properties_reload()
Le but est de pouvoir appeler des blocs PL/SQL à partir de la configuration et d’intégrer les résultats au flux de présentation.
Les blocs PL/SQL sont déclarés dans la configuration sous la forme d’un nouveau type. Ils sont liés à un type de vue au même titre que les ViewObject et ApplicationModule.
La définition de l’appel d’un bloc PL/SQL se fait de la façon suivante :
· key : clé publique de bloc PL/SQL.
· resolverClass : classe métier attachée. Cette classe permet la résolution des inconnues du ploc PL/SQL.
· value : le code pour appeler le bloc PL/SQL lui-même.
L’appel au bloc PL/SQL se trouve intégré dans la déclaration d’un type de vue, sous le nœud retrieve.
< view_type name =" PLSQL " document =" PLSQL ">
< retrieve >
< plsql_bloc key =" TEST " resolverClass =" fr.ACE.technicalframework.application.DefaultPLSQLBlockResolver " value =" begin insert into roa values (?); end; "/>
< plsql_bloc key =" OT " resolverClass =" fr.ACE.technicalframework.application.DefaultPLSQLBlockResolver " value =" begin gxp_ot.pro_rec_fast(); end; "/>
</ retrieve >
< sort />
</ view_type >
< document name =" PLSQL " class =" fr.ACE.technicalframework.application.document.PLSQLDocumentImpl "/>
La cinématique est du type
retrieve(),assimilate()
L’action retrieve() provoque la résolution des inconnues, l’action assimilate() provoque l’exécution du bloc PL/SQL.
L’appel est asynchrone, on n'attend jamais de résultat. Seule l'action assimilate() permet l'exécution. Un code retour éventuel est positionné dans le flux XML de présentation.
Le principe est de pouvoir compléter le flux de présentation.
Le flux de présentation est actuellement construit à partir de deux sources distinctes :
· les ViewObject, en mode CRUD,
· Les DocumentRow, en mode API et bientôt en PL/SQL.
Maintenant, le métier aura la possibilité de générer son propre flux de présentation. Ce flux sera positionné au même niveau que la BusinessView, directement sous le nœud < layout_data >.
Cette nouveauté a des impacts sur 4 niveaux :
1. Des classes métier Java d’un nouveau type, présentes dans fr.generix.metier.businessflow. Ces classes fournissent des segments de flux XML.
2. De la configuration, afin de faire le lien entre les classes Java métier et le moteur (socle)
3. Les feuilles de styles, afin de prendre en compte le nouveau morceau de flux.
4. Et bien évidemment le socle qui, en interne, fait le lien entre les différents éléments.
La structure de la déclaration d’un type de BusinessFlow est la suivante :
name : nom du type de flux métier.
solverName : classe métier attachée. Cette classe permet la génération du flux métier. Nom logique. Fait référence à un Solver parmi les solver_def de type flow.
La définition d’un BusinessFlow est la suivante :
Name : le nom du BusinessFlow dans la BusinessView. Donne le nom du nœud de base dans le flux XML.
Type : nom logique vers le type de BusinessFlow
Expression : une expression logique qui permet de conditionner le flux. Cette expression est passée au solver attaché au BusinessFlowType.
Active : permet de désactiver la génération du flux métier.
A ceci s’ajoute des paramètres optionnels en nombre non limité :
parameter :name : le nom du paramètre, optionnel.
parameter :value : la valeur du paramètre.
On retrouve le lien avec les deux classes Java et la déclaration des types de BusinessFlow :
< solver_def >
< solver_type name =" GENPEV " solverClass =" fr.generix.metier.businessflow.PevBusinessFlowImpl " type =" flow "/>
< solver_type name =" GENPPE " solverClass =" fr.generix.metier.businessflow.ParamBusinessFlowImpl " type =" flow "/>
</ solver_def >
< businessflow_def >
< businessflow_type name =" M_QTE " solverName =" GENPPE "/>
< businessflow_type name =" TYPFOU " solverName =" GENPPE "/>
< businessflow_type name =" GENPEV " solverName =" GENPEV "/>
< businessflow_type name =" GENPPE " solverName =" GENPPE "/>
</ businessflow_def >
Un bussinessFlow peut être affecté au niveau général et/ou au niveau de chaque ViewStruct.
Au niveau général, la déclaration des BusinessFlow se fait sous le nœud properties. Un nouveau nœud <default_businessflow> permet de définir la liste des BusinessFlow valables pour l’ensemble des ViewStruct.
Au niveau des ViewStruct, la déclaration des BusinessFlow se fait sous le nœud ViewStruct. Un nouveau nœud <businessflow> permet de définir la liste des BusinessFlow valables pour cette ViewStruct.
Globalement, il s’agit d’une nouvelle possibilité permettant dans de nombreux cas d’éviter de dupliquer des BusinessView. C’est une volonté de découplage entre la présentation et le paramétrage fonctionnel.
Exemple 1 : gestion des qui/quoi, une seule page (BusinessView + feuille style) et X cibles de paramétrage.
Exemple 2 : gestion des codes catégories dans le portail des ventes (I_VTE_F), 1 ensemble de BusinessView/Feuilles et X cibles de paramétrage
Exemple d’URL :
http://localhost:8888/GCE130/btoe/ServletControl?sourceview=I_CAFCAF_F&cinematic=forward(0)&frame=default&entity=1&target=VCLI&...
Dans notre cas, quelle que soit la cible de paramétrage définie dans la configuration sur la BusinessView I_CAFCAF_F, elle sera forcée à VCLI. On notera que la vérification d’habilitation se fait bien sur la cible VCLI.
Il a été choisi une approche pragmatique, sans créer de nouvelle cinématique d’action. Le choix du tri final se fait en concaténant les clés publiques de tris et en les séparant par le caractère « | ».
Il n’y a pas de limite quant au nombre de tris que l’on peut proposer, si un tri n’existe pas (clé publique), il n’est pas pris en compte.
cinematic=sort(0,-NOM|COD|TYP)
Un nouveau template centralisé sera disponible dans e-Gx.xsl afin de prendre en compte cette nouveauté sur la couche de présentation.
Il existe à ce jour 3 types de paramètres que l’on sait passer dans les ViewLink du fichier de configuration :
· business : paramètre provenant du niveau de vue immédiatement supérieur (ou d’une vue de niveau supérieure si l’attribut viewName est utilisé)
· public : les paramètres provenant de l’URL
· value : directement la valeur du paramètre, on utilise ce type habituellement en projet une fois que le paramétrage est figé.
La ACE 1.3 propose une nouvelle façon de résoudre un paramètres qui va permettre de rendre le fichier de configuration complètement dynamique avec comme avantages principaux :
· Plus de valeur « en dur » alors qu’elles sont issues du paramétrage
· Allègement de la configuration
· Dynamisme lors de la mise en place pour les projets « in-run »
· Simplification des requêtes avec un gain de performances
· Nouvelles possibilités d’extensions vers la couche métier avec les « fournisseurs de valeurs »
Ce nouveau type de paramètre se nomme solved. Il est attaché à un solveur de valeur référencé par l’attribut solverName qui est un nom logique vers les déclarations de solveurs.
Différents solveurs sont disponibles pour répondre aux cas les plus courants. D’autres solveurs peuvent facilement être écrit et intégré par une déclaration dans la configuration.
Description des différents attributs :
· name : le nom « logique » du solver
· type : value ou active pour le cas qui nous préoccupe dans ce document
· solverClass : la référence à la classe Java
· value : la valeur par défaut (aucune utilisation ou exploitation pour le moment, cet attribut est réservé à un usage ultérieur)
Dans XDME, cette section est définie sous la forme d’un onglet général :
Voir le Guide utilisateur.
Les champs DATDEB et DATFIN ont été ajouté sur la table UT_LOGIN. Ils sont dorénavant pris en compte lors de la phase de login de l’utilisateur. Les utilisateurs dont la date est échue ne sont pas pris en compte dans le calcul de licence. Cela permet donc de définir des utilisateurs temporaires.
Derrière chaque frame HTML, il y a un contexte applicatif, avec principalement une BusinessView courante et tout ce qu’elle contient comme objet et services métier BC4J.
Le but et de ne pas conserver les contextes applicatifs inutiles jusqu’à la fin de la session http en donnant la possibilité de provoquer la suppression de ce contexte applicatif.
Cela provoquera la réutilisation des objets BC4J par d’autres contextes et limitera ainsi la signature mémoire de l’application.
L’action killContext(nomDeContexte) permet de demander la suppression d’un ou de plusieurs contexte.
Cette action peut être positionnée à n’importe quelle position dans une cinématique, elle sera toujours exécuté après le traitement des autres actions de cinématique.
Cette action doit être déclarée dans le fichier de configuration comme suis :
< action name =" killContext " class =" fr.ACE.technicalframework.application.action.KillContext ">
< required >
< param name =" ctxName " maxOccurs =" unbounded " minOccurs =" 1 " type =" String "/>
</ required >
</ action >
Une certaine souplesse est possible au niveau de l’écriture des contextes.
On peut demander la destruction de plusieurs contextes :
killContext(media|popup|detail)
pour détuire les contextes media, popup et detail.
On peut positionner le joker % en début et fin de nom de contexte :
killContext(media|popup_%)
pour détruire les contextes media, popup_produit et popup_tier par exemple.
Oracle propose une syntaxe optimisée pour gérer les locks sans provoquer d’overhead au niveau de la base et du serveur d’application. L’ordre SQL est de la forme suivante :
select * from tie where codsoc= ? and typtie= ? and sigtie= ? for update wait X
X représente le nombre de secondes à attendre avant de renvoyer un message d’erreur disant que le row concerné est locké.
Etant donné qu’il s’agit d’un paramétrage purement technique, le pilotage se fait via le fichier ACE.properties précédemment décrit. La ligne à ajouter est la suivante pour une attente de 10 secondes maximum :
oracle.jbo.server.locktimeout=10
Il est parfois gênant lors de la dérivation de ViewObject que le nom des nœuds change dans le flux de présentation. Le nom de la ViewObject est utilisé sur 2 niveaux, par exemple pour JProView on aura un XPath du type :
VueProduit/JProView/JProViewRow
Un changement de nom de ViewObject oblige alors à modifier le chemin des XPath correspondants dans les feuilles de style.
Le nouvel attribut XMLPresentationName porté par la définition des ViewObject dans le fichier de configuration permet de pallier à ceci, et donc de faciliter le travail.
Dans notre exemple ci-dessus, lors de la génération du flux pour la ViewObject JProZnView, le nom JProView sera utilisé.
Un contrôle plus fin sur le fichier de paramétrage de log4j permet de garantir sa cohérence.
En cas de problème, il y a création d’un fichier nommé log/LOG4JXMLError.log
Ce fichier log contient les anomalies remontées par le parseur.
Si le répertoire « log » n’existe pas, il est créé par l’application.
Des nouveaux chronos viennent s’ajouter aux précédents. Leur but est d’affiner le découpage de l’exécution d’une requête HTTP. Pour le moment, ces nouveaux timers ne sont activables que par le fichier ACE.properties et sont valables pour une JVM (et non un utilisateur). Ils sont à utiliser lors de phases de mise au point de scénarii, de maintenance ou de bench.
Les différents logger correspondant à ces nouveaux chronos sont :
| Nom du LOGGER Log4J | signification |
| buildViewObjectTimer | Temps de construction d’une ViewObject BC4J |
| buildApplicationModuleTimer | Temps de construction d’un ApplicationModule BC4J |
| buildViewTimer | Temps de construction d’une View eGX |
| buildBusinessViewTimer | Temps de construction d’une BusinessView eGX |
| processTimer | Temps de préparation à l’exécution d’une requête |
| beforeAndAfterRequestTimer | Temps complémentaire avant et après requestTimer |
Rappel des différents timer existants :
| Nom du LOGGER Log4J | Signification |
| requestTimer | Temps d’exécution de la requête, hors traitements secondaires. |
| actionTimer | Temps d’exécution d’une action |
| viewTimer | Temps de génération du flux de présentation pour une View |
| APITimer | Temps d’exécution d’une API |
| xsltTimer | Temps d’exécution du parsing XSL. |
Ce graphe illustre l’enchainement et les chevauchements éventuels des timers.
|
Before after |
request Timer |
process Timer |
buildBV Timer |
buildView Timer |
action Timer |
view Timer |
buildVO Timer |
buildAM Timer |
API Timer |
xslt Timer |
| 0-D | ||||||||||
| 0-F(*0) | ||||||||||
| 1-D | ||||||||||
|
|
2-D | |||||||||
|
|
3-D | |||||||||
|
|
4-D (BV) | |||||||||
| 5-F(BV) | ||||||||||
| 6-D(VS) | ||||||||||
| 7-F(VS) | ||||||||||
|
|
||||||||||
| 9-D (*1) | ||||||||||
| 10-F | ||||||||||
| 11-F(n*V) | ||||||||||
| 12-F | ||||||||||
| 11-F | ||||||||||
| 13-D | ||||||||||
|
|
14-D(*2) | 14-D | 14-D | |||||||
| 15-F | 15-F(*3) | 15F(*4) | ||||||||
| 16-F | ||||||||||
|
|
||||||||||
| 18-D | ||||||||||
| 19-F | ||||||||||
| 20-F | ||||||||||
| 21-D | ||||||||||
| 22-F | ||||||||||
| 23-F | ||||||||||
| 0-D(*0) | ||||||||||
| 0-F |
Légende :
D : début du chrono
F : fin du chrono
1, 2, .. Ordre de déclanchement/arrêt des chronos.
Exemple :
13–D début du chrono d’une action
14-D début du chrono de création d’une ViewObject
15–F fin du chrono de création d’une ViewObject
16–F Fin du chrono démarré en 11-D
BV : objet BusinessView .
VS : objet ViewStruct
n*V ; construction de n objets View. (Correspond aux nombres d’objets dans la ViewStruct)
(*0) Le temps du timer beforeAndAfterRequest est le cumul des deux courtes périodes de traitement avant et après le requestTimer.
(*1) Si Document de type APIDocument
(*2) : construction de ViewObject si action retrieve demandée. (rappel : forward contient retrieve)
(*3) Si une API appelle une autre API sur un autre ApplicationModule
(*4) Si action assimilate sur une API
Exemple de résultats de ces chronos lors de l’exécution de la BusinessView I_PRO_L
· requestTimer
[2007-05-23 15:09:53,596] 9484 I_PRO_L
· processTimer
[2007-05-23 15:09:44,690] 578¤I_PRO_L
· buildBusinesssViewTimer
[2007-05-23 15:09:44,518] 359¤I_PRO_L
· actionTimer
[2007-05-23 15:09:44,862]¤retrieve¤172¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 15:09:44,862]¤sort¤0¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 15:09:44,862]¤display¤0¤I_PRO_L¤forward(0,PRO1)
· xsltTimer
[2007-05-23 15:09:53,596]¤1860¤I_PRO_L
· buildViewObjectTimer
Il y a 218 demandes de creation de ViewObject pour cette businessView. Je ne mets que celle qui dépasse 0 ms.
[2007-05-23 14:31:12,511] 31¤JUt_UtiView¤I_PRO_L
[2007-05-23 14:31:12,652] 16¤Dyn¤I_PRO_L
[2007-05-23 14:31:18,120] 687¤JDskView¤I_PRO_L
[2007-05-23 14:31:18,792] 656¤JCtsPmtView¤I_PRO_L
[2007-05-23 14:31:19,292] 484¤JTscView¤I_PRO_L
[2007-05-23 14:31:21,589] 1031¤JProView¤I_PRO_L
[2007-05-23 14:31:21,792] 16¤JPrmView¤I_PRO_L
[2007-05-23 14:31:22,245] 47¤JPruView¤I_PRO_L
[2007-05-23 14:31:23,042] 16¤DDispo¤I_PRO_L
[2007-05-23 14:31:23,089] 16¤JTscView¤I_PRO_L
[2007-05-23 14:31:23,605] 16¤JCtsPmtView¤I_PRO_L
[2007-05-23 14:31:24,370] 16¤JCtsPmtView¤I_PRO_L
· buildViewTimer
On reconnait la décomposition de la BusinessView I_PRO_L
[2007-05-23 15:09:44,518] [I_PRO_L : 15, PRO_FST_L : 0, HierarchiePro : 0, UTIFAM : 0, LIBVAR : 0, VueDispo : 0, DepotPrincipal : 16, DepotEntite : 0, PromotionVente : 15, Tarif : 16, Referencement : 16, Produit : 235, Texte : 78, CatalogueRubrique : 78, NatureProduit : 0, BlocageProduit : 0, FamilleProduit : 0, Fournisseur : 15, Modele : 0, NATPRO : 0, PACK : 0, MULVAR : 16, CTSCRE : 0, NiveauMagasin : 0]¤I_PRO_L
Total : 500
· viewTimer
Il y a 196 view qui sont exécutée.
Un traitement initial :
[2007-05-23 14:31:12,636]¤ HierarchiePro¤0¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:12,652]¤ UTIFAM¤16¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:12,668]¤ LIBVAR¤16¤I_PRO_L¤forward(0,PRO1)
Il y a 30 lignes dans le tableau, d’où 30 fois l’ensemble suivant :
[2007-05-23 14:31:17,433]¤ VueDispo¤47¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:18,120]¤ DepotPrincipal¤687¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:18,136]¤ DepotEntite¤16¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:18,808]¤ PromotionVente¤672¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:19,308]¤ Tarif¤500¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:19,652]¤ Referencement¤344¤I_PRO_L¤forward(0,PRO1)
Pour finir un traitement lié au courant :
[2007-05-23 14:31:25,198]¤ Referencement¤5232¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,198]¤ CatalogueRubrique¤0¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,214]¤ NatureProduit¤16¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,229]¤ BlocageProduit¤15¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,229]¤ FamilleProduit¤0¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,245]¤ Fournisseur¤16¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,308]¤ Modele¤63¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,323]¤ NATPRO¤15¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,323]¤ PACK¤0¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,354]¤ MULVAR¤31¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,354]¤ CTSCRE¤0¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,370]¤ NiveauMagasin¤16¤I_PRO_L¤forward(0,PRO1)
[2007-05-23 14:31:25,370]¤ NiveauMagasin¤156¤I_PRO_L¤forward(0,PRO1)
Total = 4780 ms.
Exemple de chrono de la construction des ApplicationModule :
buildApplicationModuleTimer.log
[2007-05-30 17:28:51,724] 1484¤BusinessSession¤
[2007-05-30 17:28:52,302] 0¤MessageManager¤
[2007-05-30 17:28:52,615] 32¤LicenceManager¤
[2007-05-30 17:28:57,052] 78¤GestionUtilisateur¤
[2007-05-30 17:28:59,146] 0¤UuidManager¤I_MENU_FCT
[2007-05-30 17:31:47,647] 0¤GestionEvenement¤I_ACDAC_F
[2007-05-30 17:31:50,475] 328¤GestionAnalytique¤I_ACDAC_E
Exemple de paramétrage LOG4J pour les différents appender et logger
< appender name =" processTimerAppender " class =" org.apache.log4j.DailyRollingFileAppender ">
< param name =" File " value =" log/processTimer.log "/>
< param name =" DatePattern " value =" yyyy-MM-dd'.' "/>
< layout class =" org.apache.log4j.PatternLayout ">
< param name =" ConversionPattern " value =" %X{ELAPSE_TIME}¤%X{REQUEST_CURRENT_BUSINESSVIEW}%n "/>
</ layout >
</ appender >
< appender name =" buildViewTimerAppender " class =" org.apache.log4j.DailyRollingFileAppender ">
< param name =" File " value =" log/buildViewTimer.log "/>
< param name =" DatePattern " value =" yyyy-MM-dd'.' "/>
< layout class =" org.apache.log4j.PatternLayout ">
< param name =" ConversionPattern " value =" %X{BUILD_TIMER_RECURSIVE}¤%X{REQUEST_CURRENT_BUSINESSVIEW}%n "/>
</ layout >
</ appender >
< appender name =" buildBusinessViewTimerAppender " class =" org.apache.log4j.DailyRollingFileAppender ">
< param name =" File " value =" log/buildBusinessViewTimer.log "/>
< param name =" DatePattern " value =" yyyy-MM-dd'.' "/>
< layout class =" org.apache.log4j.PatternLayout ">
< param name =" ConversionPattern " value =" %X{ELAPSE_TIME}¤%X{REQUEST_CURRENT_BUSINESSVIEW}%n "/>
</ layout >
</ appender >
< appender name =" buildViewObjectTimerAppender " class =" org.apache.log4j.DailyRollingFileAppender ">
< param name =" File " value =" log/buildViewObjectTimer.log "/>
< param name =" DatePattern " value =" yyyy-MM-dd'.' "/>
< layout class =" org.apache.log4j.PatternLayout ">
< param name =" ConversionPattern " value =" %X{ELAPSE_TIME}¤%X{VIEWOBJECT}¤%X{REQUEST_CURRENT_BUSINESSVIEW}%n "/>
</ layout >
</ appender >
< appender name =" buildApplicationModuleTimerAppender " class =" org.apache.log4j.DailyRollingFileAppender ">
< param name =" File " value =" log/buildApplicationModuleTimer.log "/>
< param name =" DatePattern " value =" yyyy-MM-dd'.' "/>
< layout class =" org.apache.log4j.PatternLayout ">
< param name =" ConversionPattern " value =" %X{ELAPSE_TIME}¤%X{APPMODULE}¤%X{REQUEST_CURRENT_BUSINESSVIEW}%n "/>
</ layout >
</ appender >
< logger name =" buildBusinessViewTimer " additivity =" false ">
< level value =" info "/>
< appender-ref ref =" buildBusinessViewTimerAppender "/>
</ logger >
< logger name =" buildViewObjectTimer " additivity =" false ">
< level value =" info "/>
< appender-ref ref =" buildViewObjectTimerAppender "/>
</ logger >
< logger name =" buildApplicationModuleTimer " additivity =" false ">
< level value =" info "/>
< appender-ref ref =" buildApplicationModuleTimerAppender "/>
</ logger >
< logger name =" buildViewTimer " additivity =" false ">
< level value =" info "/>
< appender-ref ref =" buildViewTimerAppender "/>
</ logger >
< logger name =" processTimer " additivity =" false ">
< level value =" info "/>
< appender-ref ref =" processTimerAppender "/>
</ logger >
Lié aux nouveautés fonctionnelles proposées par le socle, de nouveaux codes couleurs font leur apparition dans la visualisation des ViewStruct.
Exemple :
· Jaune : executeQuery n’est pas présent
· Vert : executeQuery vaut optimize
· Coche verte
: un solver d’activation de la vue est paramétré
· Flèche rouge
: verboseDetail vaut true sur cette vue
· Entre parenthèses : le type de document associé à la vue (BC4J, Dynamique …)
· Bleu
: API
· Icône création
: ViewObject utilisée en création (attribut create à true)
Les descripteurs BC4J standards sont maintenant intégrés dans resources.jar fourni avec XDME. Cela permet de fournir certaines informations directement dans l’interface graphique d’XDME, en particulier sur les ViewLink.
Dorénavant, on peut voir directement la requête qui sera exécutée, avec dans la fenêtre de visualisation, des couleurs différentes afin de détailler au mieux l’ordre SQL.
On notera au passage que le bouton « Insérer » fait son apparition dans tous les tableaux en liste.
Afin de faciliter la publication des champs dans le flux de présentation, des aménagements ont été fait dans le popup fields (View composite d’un ViewStruct).
On a dorénavant une visualisation des champs disponibles sur la vue concernée. Le bouton « Transférer » permet de basculer un ensemble de champs vers le tableau de gauche.
Il est possible dans les tableaux de supprimer les éléments en liste. La sélection se fait par le mécanisme Windows habituel (touche CTRL pour une sélection multiple).
Les feuilles de style peuvent être directement ouvertes depuis XDME, il suffit pour cela de paramétrer la racine du répertoire local dans les propriétés générales. L’éditeur utilisé est celui par défaut du poste client pour les extension .xsl.