HTML-Suche anpassen
Um die HTML-Suche so anzupassen, dass entweder die Darstellung der Standardsuchobjekte geändert wird oder neue Klassen hinzugefügt werden, sehen Sie sich die folgende Datei an, die als Quelle verteilt wird: Windchill\src\wt\query\SearchAttributeList.java verteilt wird. Erstellen Sie gemäß den Anweisungen in der Java-Dokumentation für diese Klasse eine Unterklasse von SearchAttributeList, und nehmen Sie die entsprechenden Einträge in service.properties und wt.properties vor. Nachfolgend werden die Methoden (mit Beispielen) aufgeführt, die in eine angepasste SearchAttributeList implementiert werden sollten:
public final class MySearchAttributeList extends SearchAttributeList implements
Externalizable {
public void setLocale( Locale locale ) {
// Load in the values for the drop down list for selecting what to search against.
clientLocale = locale;
// **Customize --------------------------------------------------------------
--------------
// Add new classes to search to list below.
// Make sure that they are assigned numbers in sequence from 0 to N.
// Set dropDownListCount to N+1.
final int ALL = 0;
final int WTPART = 1;
…
final int MYCLASS = 22
int dropDownListCount = 23;
// -------------------------------------------------------------------------
------------…
pickList = new String[classCount];
pickList[ALL] =
WTMessage.getLocalizedMessage(RESOURCE,queryResource.ALL,null,clientLocale);
pickList[WTPART] =
WTMessage.getLocalizedMessage(RESOURCE,queryResource.WTPART,null,clientLocale);
…
pickList[MYCLASS] = WTMessage.getLocalizedMessage(RESOURCE,queryResource.
MYCLASS,null,clientLocale);
pickValues = new String[classCount];
pickValues[ALL] = queryResource.ALL;
pickValues[WTPART] = queryResource.WTPART;
…
pickValues[MYCLASS] = queryResource.MYCLASS;
// **Customize You will need a string in here to correspond to each item in
pickList
// The string is a space separated list of what classes to query
// against. If you want to query against multiple classes that have a common
parent that
// has all of the attributes that you are interested in use that one class. If
you want
// to query against multiple classes that don't have a good common parent then
you can
// add them to a list and the search will loop through each class and combine
the results
// at the end. All classes in one list must only search against COMMON
attributes or
// attributes with the same name and of the same class! If you add both a
parent and
// a child class to the list you will get duplicate entries, when the results
are
// combined duplicate entries are not deleted.
queryClass = new String[classCount];
queryClass[ALL] =
"wt.part.WTPart wt.doc.WTDocument wt.change2.WTChangeIssue
wt.change2.WTChangeRequest2 " +
"wt.change2.WTChangeInvestigation wt.change2.WTAnalysisActivity
wt.change2.WTChangeProposal " +
"wt.change2.WTChangeOrder2 wt.change2.WTChangeActivity2
wt.csm.businessentity.BusinessEntity " +
"wt.effectivity.ConfigurationItem wt.epm.EPMDocument " +
"wt.replication.unit.WTUnit " +
"wt.part.WTProductConfiguration " +
"wt.part.WTProductInstance2 "; // Please remember to keep a space at the
end so that conditionally added items work.
…
queryClass[WTPART] = "wt.part.WTPart";
…
queryClass[MYCLASS] = "?.?.MyClass";
// **Customize These are the
// attributes that can be queried against.
inputAttributes = new String[classCount];
inputAttributes[ALL] =
"number name lifeCycleState projectId cabinet creator modifier
modifyTimestamp";
inputAttributes[WTPART] =
"number name view versionIdentifier partType source lifeCycleState projectId
cabinet creator modifier modifyTimestamp";
…
inputAttributes[MYCLASS] =
"name modifyTimestamp";
// **Customize Each individual
// string must match with the string listed above for the inputAttributes. "0"
stands for no
// input processing. If an attribute is an enumerated type use "0" and the
code will generate
// the drop down list. In the first string: projectId is in the fourth
position in inputAttributes
// so the method to generate the drop down list for it is also in the fourth
position in the
// string. The "0"s and methods must match in number with the number of
attributes listed
// under inputAttributes. You may add a fully qualified method from your
customization package
// as long as it is static and returns a vector of strings.
inputProcessing = new String[classCount];
inputProcessing[ALL] =
"0 0 0 wt.query.LocalSearchProcessor.getProjectList
wt.query.LocalSearchProcessor.getCabinetList 0 0 0";
inputProcessing[WTPART] =
"0 0 wt.query.LocalSearchProcessor.getViewList 0 0 0 0
wt.query.LocalSearchProcessor.getProjectList
wt.query.LocalSearchProcessor.getCabinetList 0 0 0";
…
inputProcessing[MYCLASS] =
"0 0";
// **Customize This is similar in concept to inputAttributes only these are
the attributes
// that will be displayed in the search results.
outputAttributes = new String[classCount];
outputAttributes[ALL] =
"number name versionDisplayIdentifier displayType lifeCycleState projectId
modifyTimestamp";
outputAttributes[WTPART] =
"number name versionDisplayIdentifier projectId lifeCycleState
modifyTimestamp";
…
outputProcessing[MYCLASS] =
"ObjProps 0";
// **New for 6.0
// **Customize This is similar in concept to outputAttributes only this list
is used
// to indicate which attributes can be sorted, can't be sorted, or an alternate
attribute
// that can be sorted to have the same affect as the display attribute. The
string that is used
// here should be the column descriptor so that it can be used to create the
ClassAttribute for
// the query. The query that is used for search is a simple query that will
not sort on all
// of the display attributes. Changing the 0 to 1 for an unsupported attribute
will
// either cause exceptions or sorts that don't work. Attributes of the
following types are
// just some examples of the attributes that will either throw exceptions or
sort incorrectly:
// EnumeratedType, CabinetReference, DataFormatReference,
LifeCycleTemplateReference, ProjectReference,
// and ViewReference.
sortAttributes = new String[classCount];
sortAttributes[ALL] =
"1 1 versionInfo.identifier.versionId 0 0 01";
sortAttributes[WTPART] =
"1 1 versionInfo.identifier.versionId 0 0 1";
…
sortAttributes[MYCLASS] =
"1 1";
// **New for 6.0
// **Customize This is similar in concept to outputAttributes only this list
is used
// for assigning a unique key to the sort preferences for this search. This
string will
// be persisted and used to retrieve the sort preferences for users. If the
value of one
// of these strings is changed or deleted after the system is in operation it
will create orphaned
// preferences in the system and users will lose the value that they had
persisted for that
// search. New entries can be added when a new search is added so that sort
preferences
// can be saved for that new search. These strings are arbitrary and never
displayed to the user.
sortPref = new String[classCount];
sortPref[ALL] =
"all";
sortPref[WTPART] =
"wtpart";
…
sortPref[MYCLASS] =
"myclass";
}
/**
*
* <BR><BR><B> Supported API: </B>false
*
* @param locale
* @return MySearchAttributeList
**/
public MySearchAttributeList( Locale locale ) {
setLocale(locale);
}
/**
*
* <BR><BR><B> Supported API: </B>false
*
* @return MySearchAttributeList
**/
public MySearchAttributeList() {
return;
}
}
wt.query.SearchAttributeList ist immer am aktuellsten und sollte als Referenz verwendet werden.
Im restlichen Abschnitt werden zwei neue Arrays in wt.query.SearchAttributeList beschrieben: sortAttributes und sortPref.
Aufgrund der für einige Klassen verwendeten Datenstrukturen können nicht alle in den Suchergebnissen anzeigbaren Attribute sortiert werden. Mit dem Array sortAttributes in wt.query.SearchAttributeList wird festgelegt, welche Attribute sortierbar sind und ob ein alternatives Attribut für die Sortierung verwendet werden soll. Ein Beispiel für ein alternatives Attribut zum Sortieren ist das Versionsattribut. Zum Anzeigen wird das Attribut versionDisplayIdentifier verwendet, zum Sortieren jedoch das Attribut versionInfo.identifier.versionId. Java-Basistypen wie z.B. String und int können sortiert werden. Ermitteln Sie anhand der Beispiele in wt.query.SearchAttributeList, ob angepasste Typen sortiert werden können. Andernfalls können Sie mit einem einfachen Test feststellen, ob das Attribut funktioniert, keine Wirkung hat oder einen Ausnahmefehler verursacht.
Das Array sortPref (im vorangegangenen Code angezeigt) wird verwendet, um einen Basisnamen für die Sortiereinstellung zu definieren, sodass Benutzer ihre Sortiereinstellungen für dieses zu suchende Objekt festlegen können. Eine Standardeinstellung für die Sortiereinstellungen sollte auf Systemebene definiert werden, sodass bei der ersten Verwendung des Systems oder für den Fall, dass nie Einstellungen definiert werden, die Spalten in logischer Reihenfolge sortiert werden. Sie können die Standardeinstellung mithilfe von wt.load.LoadFromFile oder mit dem Einstellungsadministrator auf der Portalseite des Systemadministrators definieren.
Falls es sich um eine neue Datenbank handelt, werden die Standardeinstellungen während der Ausführung des erforderlichen Abschnitts von wt.load.Demo (mit dem wt.load.LoadFromFile ausgeführt wird) geladen. Die Standardeinstellungen für den Standort können einfach mit dem Einstellungsadministrator hinzugefügt oder geändert werden. Wenn die Datenbank auf einem System vor Version 6.0 erstellt wurde, können mit wt.load.LoadFromFile die Basisstandardeinstellungen für die gelieferte Konfiguration der HTML-Suchklassen geladen werden. Beispiele finden Sie in Windchill\loadFiles\preferences.txt in den Einträgen "PrefEntry…/wt/query/htmlsearch".
Jede Benutzereinstellung besitzt einen internen Namen, der außer im Einstellungsadministrator für den Client immer verborgen bleibt. Da die aktuelle Suche mit wt.query.SearchAttributeList durchgeführt wird, damit Benutzer neue Suchvorgänge hinzufügen können, und da ein Satz von Sucheinstellungen für jeden Suchvorgang vorhanden sein muss, ist für jeden Namen ein eindeutiger Sortiername in der Liste "Suchen nach" erforderlich. Ein Objekt in der Liste "Suchen nach" ist nicht zwangsläufig ein einzelnes Objekt, sondern kann auch aus einer Liste von Objekten bestehen. Das Array sortPref in wt.query.SearchAttributeList definiert eine eindeutige Zeichenfolge, die Teil des Namens der Einstellung ist. Die Sortiereinstellungen werden im Einstellungsknoten /wt/query/htmlsearch gespeichert. Der Name hat das folgende Format:
<Sortiereinstellungs-Basisname>sortAttrib<#>
<Sortiereinstellungs-Basisname>sortDirect<#>
Der <Sortiereinstellungs-Basisname> ist eine eindeutige Zeichenfolge des Arrays sortPref array in wt.query.SearchAttributeList. Er muss nur unter den Sortiernamen eindeutig sein. SortAttrib ist der Attributname, und sortDirect gibt an, ob die Sortierung auf- oder absteigend erfolgt. Die Einstellung für aufsteigend ist "falsch" und für absteigend "wahr". Das Zeichen <#> steht für die Nummer des Sortierschlüssels: 0 = erster Schlüssel usw. Nachfolgend sind die Einstellungen aufgelistet, die mit wt.load.LoadFromFile und Windchill\loadFiles\preferences.txt für die Sortierung aller Einträge (All) geladen werden:
#All
PrefEntry~allsortAttrib0~number~/wt/query/htmlsearch
PrefEntry~allsortDirect0~false~/wt/query/htmlsearch
PrefEntry~allsortAttrib1~versionInfo.identifier.versionId~/wt/query/htmlsearch
PrefEntry~allsortDirect1~true~/wt/query/htmlsearch
Im Standardbeispiel für "All" werden die Ergebnisse erst nach der Nummernspalte und dann nach der Versionsspalte sortiert, wobei die Nummern in aufsteigender und die Versionen in absteigender Reihenfolge aufgelistet werden. Derzeit werden drei Sortierschlüssel unterstützt, wobei die Anzahl theoretisch lediglich durch die Oracle-Leistung begrenzt ist. Es wurden bisher nur Tests mit maximal drei Schlüsseln durchgeführt.