Utilisation de fonctions dans des expressions avancées
Cette rubrique détaille les différentes méthodes de définition des fonctions utilisées dans des expressions affectées à des articles et liens de cas d'emploi, et qui sont évaluées lors du processus de filtrage d'options effectué par le délégué de filtrage d'options. Les sections ci-après couvrent les aspects suivants :
• Les différentes méthodes de spécification d'un alias pour une fonction, afin de réduire la taille et de permettre la réutilisation d'expressions.
• Méthode adoptée par le responsable de l'implémentation des fonctions pour accéder aux objets de la structure de filtrage (filtre de navigation d'options, critères de navigation, jeu d'options, date d'entrée en vigueur et objets filtrés ou impliqués dans le processus de filtrage, comme des articles, des liens de cas d'emploi et les données associées).
Présentation de la définition des fonctions et de leur utilisation dans des expressions
Définissez une classe Java avec une méthode statique publique (une fonction) récupérant les arguments que vous voulez passer à la fonction. Les seuls arguments de variable que vous pouvez passer aux fonctions sont les choix (leur statut de sélection étant true s'ils sont sélectionnés, et false s'ils ne le sont pas) et l'objet de type com.ptc.windchill.option.model.ATONavigationBean fourni et rempli par la structure de filtrage lors de l'exécution (décrite dans une des sections suivantes). Une fois définie, la méthode statique publique de la classe Java peut être utilisée dans l'expression de différentes matières, selon les formats suivants :
• Utilisation du chemin de classe complète vers la méthode
• Utilisation du format ClassName.MethodName() lorsque l'importation correspondante de la classe est définie
• Utilisation de MethodName() format () lorsque l'importation statique correspondante de la classe est définie
• Utilisation de MethodAbbreviation() lorsque l'abréviation (ou l'alias) sont définis pour la méthode
• Utilisation de la macro lorsque celle-ci est définie
Dans les sections suivantes, vous trouverez des exemples de construction de fonctions et d'expressions présentant ces fonctions, pour chacune des situations décrites ci-dessus. Vous pouvez écrire des fonctions afin de tirer parti de l'objet ATONavigationBean de variable et de permettre l'accès aux critères de navigation actuels, à l'élément ATONavigationFilter, à la date d'entrée en vigueur du filtre d'options, au jeu d'options du filtre d'options, aux choix sélectionnés dans ce dernier, au statut de sélection pour tous les choix du jeu d'options, à l'unité de navigation en cours avec le noeud Filtrable (par exemple, WTPartUsageLink) et aux noeuds de prise en charge (par exemple, l'article enfant du lien de cas d'emploi). Cela permet tout particulièrement d'utiliser d'autres objets (valeurs d'attribut sur les articles, liens de cas d'emploi et occurrences d'utilisation) lors de décisions relatives au filtrage.
Définition de fonctions
Pour définir une fonction, écrivez une classe Java avec une méthode statique publique incluant les arguments souhaités.
Code Java :
Explication :
Voici un exemple de fonction booléenne statique qui récupère quatre arguments booléens et renvoie une valeur, déterminée par le tableau de valeurs suivant (T=True et F=False) :
Tableau de valeurs :
x1 | x2 | x3 | x4 | Retourner |
T | F | T | F | T |
T | T | F | F | T |
F | T | F | T | T |
F | F | T | T | T |
Toutes les autres combinaisons des éléments x1, x2, x3 et x4 produisent la valeur FALSE (F).
Pour parvenir à l'expression correspondante dans chaque ligne, remplacez le nom du paramètre par la valeur T (par exemple, x1), la négation du paramètre pour F (! x1) et concaténez ces résultats avec les opérateurs de conjonction (&&). Par exemple, la première ligne a pour résultat l'expression suivante :
x1 && ! x2 && x3 && ! x4
Ensuite, vous concaténez les expressions booléennes des lignes via les opérateurs de disjonction (||) afin de parvenir à l'expression représentant le tableau de valeurs.
| Si vous utilisez le même choix plusieurs fois dans l'expression, vous pouvez tirer parti de l'introduction d'une fonction et de son utilisation dans l'expression (voir ci-après). |
La fonction peut renvoyer n'importe quel type (par exemple, l'une des valeurs primitives de nombre comme int, double ou décimale), avant d'être comparée à la constante du même type, afin de produire une expression booléenne similaire à ce qui suit.
Ces types de fonctions vous permettent de filtrer les configurations qui dépassent le coût total indiqué. Une autre méthode consiste à passer l'entier relatif au coût en tant qu'autre paramètre à la fonction et à effectuer une comparaison dans la fonction elle-même. Le résultat est le renvoi d'une valeur booléenne à partir de la fonction.
Utilisation dans des expressions
Dans les exemples suivants, nous partons du principe que nous disposons des choix RED, GREEN, BLUE, WHITE pour l'option COLOR ; des choix UK, US, MX pour l'option COUNTRY ; des choix PLASTIC, STEEL, WOOD pour l'option MATERIAL et des choix SMALL, MEDIUM, LARGE, X_LARGE pour l'option SIZE. Nous employons également les choix hasHD_TV, hasBLUERAY, hasWI_FI.
Utilisation du chemin de classe complète vers la méthode
Dans ce cas, vous utilisez le chemin de classe complète en plus du nom de la méthode pour spécifier la fonction. Vous passez les noms de choix en tant qu'arguments à la fonction, dans cet exemple. Les exemples suivants illustrent cette approche :
• com.ptc.ext.BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && com.ptc.ext.BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• com.ptc.ext.CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
Utilisation de déclarations d'importation
Les classes à importer peuvent être spécifiées dans le fichier de propriétés WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties, comme suit :
• exparser.import.1=com.ptc.ext.BooleanTableFunction
• exparser.import.2=com.ptc.ext.CostFunction
Dans ce cas, vous pouvez omettre le chemin du lot lorsque vous spécifiez la fonction dans l'expression :
• BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
Utilisation de déclarations d'importation statiques
Dans ce cas, vous devez commencer par spécifier les déclarations d'importation statiques dans le fichier de propriétés WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties, comme suit :
exparser.static.import.1=com.ptc.ext.BooleanTableFunction
exparser.static.import.2=com.ptc.ext.CostFunction
Dans ce cas, vous pouvez omettre le chemin du lot dans le nom de classe (en laissant uniquement le nom de la méthode) lorsque vous spécifiez la fonction dans l'expression :
• evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• getCost(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
Utilisation d'abréviations (alias) pour les méthodes
Dans ce cas, vous définissez le mappage entre une abréviation pour une méthode et le chemin complet vers la méthode dans le fichier de propriétés WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties, comme suit :
exparser.abbreviation.1=EVAL=com.ptc.ext.BooleanTableFunction.evaluate
exparser.abbreviation.2=COST=com.ptc.ext.CostFunction.getCost
Ensuite, vous pouvez utiliser ces alias pour accéder à la fonction dans l'expression :
• EVAL(RED, UK, PLASTIC, LARGE)
• BLUE && EVAL(GREEN, US, STEEL, SMALL) || MEDIUM
• COST(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
Utilisation de macros
Contrairement aux abréviations qui fournissent des alias pour le chemin d'accès à la fonction complète d'une seule fonction, une macro est un alias correspondant à un fragment d'expression. Elle est utile lorsqu'un fragment d'expression est utilisé plusieurs fois sur de nombreux objets, comme des articles et des liens de cas d'emploi. Les déclarations d'abréviation, d'importation statique et d'importation sont résolues à la volée lors de l'analyse de l'expression. Tout d'abord, les fragments de macro sont remplacés pour les macros de l'expression. Ensuite, cette dernière est analysée. Comme les autres propriétés du parseur, les mappages de macro sont définis dans le fichier WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties, comme suit :
exparser.macro.1=EVALUATE=com.ptc.ext.BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL)
exparser.macro.2=GET_COST= com.ptc.ext.CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)
Ensuite, les deux dernières expressions prennent la forme suivante :
• BLUE && EVALUATE || MEDIUM
• GET_COST > 100
Les macros sont utiles pour indiquer l'élément ATONavigationBean qui contient des informations sur les critères de navigation et les objets structurels filtrés.
Accès aux informations sur le filtrage en cours
L'objet com.ptc.windchill.option.model.ATONavigationBean est un wrapper de bean sur des instances des éléments ATONavigationFilter et NavigationUnit en cours, fournies par la structure de filtrage. Indépendamment du filtre et de l'unité de navigation, le bean définit les méthodes permettant d'obtenir l'élément NavigationCriteria, la date d'entrée en vigueur de l'élément du filtre d'options, l'élément OptionSet, les choix sélectionnés dans le filtre d'options et le statut de sélection pour tous les choix de l'élément OptionSet regroupés par l'option.
public ATONavigationFilter getFilter();
public NavigationUnit getNavigationUnit();
public NavigationCriteria getNavigationCriteria();
public Timestamp getFilterEffectivityDate();
public OptionSet getFilterOptionSet();
public Map<String, Set<String>> getFilterChoiceMap();
public Map<String, Boolean> getFilterSelectedChoiceMap();
Utilisation de l'élément ATONavigationBean dans des expressions
Pour pouvoir utiliser le bean, vous devez d'abord définir une fonction qui l'inclue en tant que paramètre. Voici un exemple de classe intégrée mise à votre disposition : com.ptc.windchill.option.filter.NavigationUtils. Cette classe propose des méthodes (fonctions) dédiées à la comparaison des dates d'entrée en vigueur du filtre avec les limites d'horodatage inférieures et/ou supérieures fixes.
public static boolean afterDate(ATONavigationBean beanOfActivity, String after)
public static boolean beforeDate(ATONavigationBean beanOfActivity, String before)
public static boolean betweenDate(ATONavigationBean beanOfActivity, String after, String before)
Il existe trois autres méthodes qui utilisent un argument de chaîne supplémentaire pour spécifier le modèle de date (utile pour les paramètres régionaux autres qu'américains). Lorsque vous indiquez l'objet concret dans l'expression, vous devez passer un objet vide du type ATONavigationBean, tel qu'il est renvoyé par la méthode statique ATONavigationBean.newATONavigationBean(). L'utilisation d'une macro pour indiquer le bean fourni par ce fragment est pratique. La structure de filtrage renseigne le bean via les éléments ATONavigationFilter et NavigationUnit, ce qui vous permet d'accéder aux données de filtrage en cours.
Tout d'abord, définissez une macro pour une instance de l'élément ATONavigationBean et des abréviations pour les méthodes NavigationUtils dans le fichier LookUpService.properties, comme suit :
exparser.macro.1=EFFECTIVITY_INFO= com.ptc.windchill.option.model.ATONavigationBean.newATONavigationBean()
exparser.abbreviation.1=BEFORE= com.ptc.windchill.option.filter.NavigationUtils.beforeDate
exparser.abbreviation.2=AFTER= com.ptc.windchill.option.filter.NavigationUtils.afterDate
exparser.abbreviation.3=BETWEEN= com.ptc.windchill.option.filter.NavigationUtils.betweenDates
Vous pouvez à présent définir une expression dépendant de l'intervalle défini pour la date d'entrée en vigueur :
RED && SMALL && BEFORE(EFFECTIVITY_INFO, “05/05/2005”) ||
GREEN && LARGE && BETWEEN(EFFECTIVITY_INFO, “05/05/2005”, “06/06/2006”) ||
BLUE && MEDIUM && BETWEEN(EFFECTIVITY_INFO, “06/06/2006”, “07/07/2007”) ||
WHITE && X_LARGE && AFTER(EFFECTIVITY_INFO, “07/07/2007”)
En effet, cette expression inclut quatre formes différentes, comme indiqué dans chaque ligne, sur la base des quatre différents intervalles non consécutifs :
RED && SMALL : si la date d'entrée en vigueur est antérieure à 05/05/2005
GREEN && LARGE : si la date d'entrée en vigueur est incluse entre 05/05/2005 et 06/06/2006
BLUE && MEDIUM : si la date d'entrée en vigueur est incluse entre 06/06/2006 et 07/07/2007
WHITE && X_LARGE : si la date d'entrée en vigueur est ultérieure à 07/07/2007