Funktionen in erweiterten Ausdrücken verwenden
In diesem Thema werden verschiedene Methoden zum Definieren von Funktionen erläutert, die in Ausdrücken verwendet werden, die Verwendungs-Links und Teilen zugewiesen sind und die während der Optionsfilterung vom Optionsfilterungs-Delegate ausgewertet werden. Die nächsten Abschnitte behandeln die folgenden Aspekte:
• Verschiedene Möglichkeiten zum Angeben eines Alias für eine Funktion, um die Größe zu verringern und die Wiederverwendung von Ausdrücken zu ermöglichen
• Informationen darüber, wie der Durchführer der Funktionen Zugriff auf die Objekte des Filterungsframeworks erhalten kann: Optionsnavigationsfilter, Navigationskriterien, Optionssatz, Gültigkeitsdatum, gefilterte oder am Filterungsprozess beteiligte Objekte (wie Teile, Verwendungs-Links und diesen zugeordnete Daten).
Übersicht über die Funktionsdefinition und ihre Verwendung in Ausdrücken
Definieren Sie eine Java-Klasse mit einer öffentlichen statischen Methode (einer Funktion), die Argumente akzeptiert, die Sie an die Funktion übergeben möchten. Die einzigen variablen Argumente, die Sie an die Funktionen übergeben können, sind Wahlmöglichkeiten (insbesondere ihr Auswahlstatus: true, wenn ausgewählt, und false, wenn nicht ausgewählt) und das Objekt des Typs com.ptc.windchill.option.model.ATONavigationBean, das vom Filterungsframework zur Laufzeit bereitgestellt und ausgefüllt wird (Erläuterungen in einem späteren Abschnitt). Nach ihrer Definition kann die öffentliche statische Methode der Java-Klasse im Ausdruck auf verschiedene Weisen in folgenden Formate verwendet werden:
• Mit dem vollständigen Klassenpfad zur Methode
• Mit dem Format ClassName.MethodName(), falls der entsprechende Import für die Klasse definiert ist
• Mit dem Format MethodName() format (), falls der entsprechende statische Import für die Klasse definiert ist
• Mit dem Format MethodAbbreviation(), falls die Abkürzung (oder der Alias) für die Methode definiert ist
• Mit dem Makros, falls das Makro definiert ist
In den folgenden Abschnitten finden Sie Beispiele für die Erstellung einiger Beispielfunktionen und -ausdrücke mit diesen Funktionen für jede der vorstehend genannten Situationen. Sie können Funktionen schreiben, um die Vorteile des variablen ATONavigationBean-Objekts zu nutzen, das Zugriff auf die aktuellen NavigationCriteria, den ATONavigationFilter, das Gültigkeitsdatum des Optionenfilters, den Optionssatz des Optionenfilters, die im Optionenfilter ausgewählten Wahlmöglichkeiten, den Auswahlstatus für alle Wahlmöglichkeiten im OptionSet, die aktuelle NavigationUnit mit dem Knoten "Filterbar" (z.B. WTPartUsageLink) und unterstützende Knoten (z.B. Kind-WTPart des Verwendungs-Links) bietet. Dies erlaubt insbesondere die Verwendung anderer Objekte (z.B. Attributwerte für Teile, Verwendungs-Links und Verwendungsvorkommen) in den Filterungsentscheidungen.
Funktionsdefinition
Um eine Funktion zu definieren, schreiben Sie eine Java-Klasse mit einer öffentlichen statischen Methode mit den gewünschten Argumenten.
Java-Code:
Erläuterung:
Dies ist ein Beispiel einer statischen booleschen Funktion, die vier boolesche Argumente verwendet und einen Wert gemäß der folgenden Wahrheitstabelle zurückgibt (T bedeutet wahr, F bedeutet falsch):
Wahrheitstabelle:
x1 | x2 | x3 | x4 | Rückgabe |
T | F | T | F | T |
T | T | F | F | T |
F | T | F | T | T |
F | F | T | T | T |
Alle anderen Kombinationen von x1, x2, x3 und x4 erzeugen den Wert FALSCH (F).
Um den entsprechenden Ausdruck für jede Zeile zu erhalten, ersetzen Sie T durch den Namen des Parameters (z.B. x1), F durch die Negation des Parameters (! x1), und verketten Sie diese Ergebnisse mit Konjunktionsoperatoren (&&). Die erste Zeile resultiert beispielsweise in folgendem Ausdruck:
x1 && ! x2 && x3 && ! x4
Dann verketten Sie boolesche Zeilenausdrücke mit den Disjunktionsoperatoren (||), um den Ausdruck zu erhalten, der die Wahrheitstabelle darstellt.
| Wenn Sie die gleiche Wahlmöglichkeit wiederholt im Ausdruck verwenden, kann es hilfreich sein, eine Funktion zu erstellen und im Ausdruck zu verwenden, wie im Folgenden erläutert. |
Die Funktion kann jeden Typ zurückgeben (z.B. alle primitiven Zahlentypen wie int, double, float) und kann dann mit der Konstante desselben Typs verglichen werden, um einen booleschen Ausdruck zu erzeugen, wie im folgenden Beispiel dargestellt.
Mit diesen Arten von Funktionen können Sie solche Konfigurationen herausfiltern, die die angegebenen Gesamtkosten überschreiten. Ein anderer Ansatz besteht darin, die Kostenganzzahl als weiteren Parameter an die Funktion zu übergeben und einen Vergleich innerhalb der Funktion selbst anzustellen. Als Ergebnis wird ein boolescher Wert von der Funktion zurückgegeben.
Verwendung in Ausdrücken
In den folgenden Beispielen wird davon ausgegangen, dass die folgenden Wahlmöglichkeiten verwendet werden: RED, GREEN, BLUE, WHITE aus der Option COLOR, UK, US, MX aus der Option COUNTRY, PLASTIC, STEEL, WOOD aus der Option MATERIAL und SMALL, MEDIUM, LARGE, X_LARGE aus der Option SIZE. Außerdem werden die Wahlmöglichkeiten hasHD_TV, hasBLUERAY, hasWI_FI verwendet.
Mit dem vollständigen Klassenpfad zur Methode
In diesem Fall geben Sie die Funktion unter Verwendung des vollständigen Klassenpfads sowie des Methodennamens an. In diesem Beispiel werden Wahlmöglichkeitnamen als Argumente an die Funktion übergeben. In den nachfolgenden Beispielen wird dieser Ansatz veranschaulicht.
• 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
Mit den Importdeklarationen
Die zu importierenden Klassen können wie folgt in der Eigenschaftendatei WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties angegeben werden:
• exparser.import.1=com.ptc.ext.BooleanTableFunction
• exparser.import.2=com.ptc.ext.CostFunction
In diesem Fall können Sie den Paketpfad weglassen, wenn Sie die Funktion im Ausdruck angeben:
• BooleanTableFunction.evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && BooleanTableFunction.evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• CostFunction.getCost(hasHD_TV, hasBLUERAY, hasWI_FI)> 100
Mit statischen Importdeklarationen
In diesem Fall geben Sie zuerst die statischen Importdeklarationen wie folgt in der Eigenschaftendatei WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties an:
exparser.static.import.1=com.ptc.ext.BooleanTableFunction
exparser.static.import.2=com.ptc.ext.CostFunction
In diesem Fall können Sie den Paketpfad und den Klassennamen weglassen (sodass nur der Methodenname übrig bleibt), wenn Sie die Funktion im Ausdruck angeben:
• evaluate(RED, UK, PLASTIC, LARGE)
• BLUE && evaluate(GREEN, US, STEEL, SMALL) || MEDIUM
• getCost(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
Mit Abkürzungen (Aliasnamen) für Methoden
In diesem Fall definieren Sie die Zuordnung zwischen einer Abkürzung für eine Methode und dem vollständigen Pfad zur Methode wie folgt in der Eigenschaftendatei WT_HOME/codebase/ com/ptc/wpcfg/exparser/LookUpService.properties:
exparser.abbreviation.1=EVAL=com.ptc.ext.BooleanTableFunction.evaluate
exparser.abbreviation.2=COST=com.ptc.ext.CostFunction.getCost
Anschließend können Sie diese Aliasnamen verwenden, um auf die Funktion im Ausdruck zuzugreifen:
• EVAL(RED, UK, PLASTIC, LARGE)
• BLUE && EVAL(GREEN, US, STEEL, SMALL) || MEDIUM
• COST(hasHD_TV, hasBLUERAY, hasWI_FI) > 100
Mit Makros
Im Gegensatz zu Abkürzungen, die Aliasnamen für den vollständigen Funktionspfad einer einzelnen Funktion bereitstellen, ist ein Makro ein Alias für ein Ausdrucksfragment. Es ist nützlich, wenn ein Ausdrucksfragment wiederholt für mehrere Objekte wie Verwendungs-Links und Teile verwendet wird. Import-, statische Import- und Abkürzungsdeklarationen werden direkt während der Ausdrucksanalyse gelöst. Makrofragmente werden zunächst anstelle von Makros im Ausdruck eingesetzt, und anschließend wird der Ausdruck analysiert. Wenn andere Parser-Eigenschaften werden auch Makrozuordnungen in der Eigenschaftendatei WT_HOME/codebase/com/ptc/wpcfg/exparser/LookUpService.properties definiert, wie folgt:
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)
Dann nehmen die letzten beiden Ausdrücke die folgende Form an:
• BLUE && EVALUATE || MEDIUM
• GET_COST > 100
Die Makros sind nützlich zum Kennzeichnen der ATONavigationBean, die Informationen zu Navigationskriterien und den gefilterten strukturellen Objekten enthält.
Auf aktuelle Filterungsinformationen zugreifen
Das Objekt com.ptc.windchill.option.model.ATONavigationBean ist ein Wrapper-Bean für Varianten des ATONavigationFilter und der aktuellen NavigationUnit, die vom Filterungsframework bereitgestellt werden. Abgesehen von dem Filter und der Navigationseinheit definiert die Bean die Methoden für den Abruf der NavigationCriteria, des Gültigkeitsdatum des Optionenfilters, des OptionSet, der im Optionenfilter ausgewählten Wahlmöglichkeiten und des Auswahlstatus für alle Wahlmöglichkeiten in dem von der Option gruppierten OptionSet.
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();
ATONavigationBean in Ausdrücken verwenden
Um die Bean zu verwenden, müssen Sie zunächst eine Funktion definieren, die die Bean als Parameter verwendet. Als Beispiel steht Ihnen die integrierte Klasse com.ptc.windchill.option.filter.NavigationUtils mit Methoden (Funktionen) zur Verfügung, um die Filtergültigkeitsdaten mit den festen oberen und/oder unteren Zeitstempelgrenzen zu vergleichen.
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)
Es gibt drei andere Methoden, die ein zusätzliches Zeichenfolgenargument verwenden, um das Datumsmuster anzugeben (nützlich für nicht-amerikanische Gebietsschemata). Wenn Sie das konkrete Objekt im Ausdruck angeben, müssen Sie ein leeres Objekt des Typs ATONavigationBean übergeben, wie von der statischen Methode ATONavigationBean.newATONavigationBean() zurückgegeben. Es ist nützlich, ein Makro zum Bezeichnen der Bean zu verwenden, die von diesem Fragment bereitgestellt wird. Das Filterungsframework füllt die Bean mit ATONavigationFilter und NavigationUnit und gibt Ihnen damit Zugriff auf die aktuellen Filterungsdaten.
Definieren Sie zunächst ein Makro für eine Variante der ATONavigationBean und Abkürzungen für die Methoden von NavigationUtils in der Datei LookUpService.properties, wie im Folgenden gezeigt:
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
Jetzt können Sie einen Ausdruck definieren, der von dem Zeitintervall abhängt, in das das Gültigkeitsdatum fällt:
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”)
Dieser Ausdruck verwendet tatsächlich vier verschiedene Formen, wie in den einzelnen Zeile angegeben; diese basieren auf den vier verschiedenen Zeitintervallen:
RED && SMALL: wenn das Gültigkeitsdatum vor dem 05.05.2005 liegt
GREEN && LARGE: wenn das Gültigkeitsdatum zwischen dem 05.05.2005 und dem 06.06.2006 liegt
BLUE && MEDIUM: wenn das Gültigkeitsdatum zwischen dem 06.06.2006 und dem 07.07.2007 liegt
WHITE && X_LARGE: wenn das Gültigkeitsdatum nach dem 07.07.2007 liegt