高度なカスタマイズ > ビジネスロジックのカスタマイズ > PDM のカスタマイズ > HTML クライアントのオブジェクト選択ページのカスタマイズ > HTML サーチのカスタマイズ
  
HTML サーチのカスタマイズ
デフォルトのサーチオブジェクトの表示を変更するか、新しいクラスを追加するように HTML サーチをカスタマイズするには、ソースとして配布されているファイル Windchill\src\wt\query\SearchAttributeList.java を確認します。このクラスの Javadoc で説明されているように、サブクラス SearchAttributeListservice.properties および wt.properties には適切なエントリが作成されています。カスタム SearchAttributeList に実装すべきメソッドの例は、次のとおりです。
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 は常に最新で、参照用として使用する必要があります。
セクションの残りでは、wt.query.SearchAttributeList の新しい配列 2 つ (sortAttributes および sortPref) を説明しています。
一部のクラスで使用されているデータ構造により、サーチ結果内に表示される属性はすべてがサーチ結果内で並べ替えできるわけではありません。wt.query.SearchAttributeListsortAttributes 配列は、どの属性が並べ替え可能であるか、また別の属性を使用して並べ替えるべきかを指定するために使用します。
並べ替えに使用する代替の属性の例にバージョン属性があります。表示に使用する属性は versionDisplayIdentifier ですが、並べ替えに使用する属性は versionInfo.identifier.versionId です。
String および int などの基本的な Java タイプは並べ替え可能です。wt.query.SearchAttributeList の例を使用し、カスタムタイプが並べ替え可能か判断します。そうでない場合、属性が機能しているか、効力がないか、例外を発生するか簡単なテストを実行して判断します。
(前述のコード内に示した) sortPref 配列は、ユーザーが "サーチ対象" オブジェクトの並べ替えプリファレンスを定義できるように、並べ替えプリファレンスのベース名を定義するために使用します。デフォルトの並べ替えプリファレンスはシステムレベルで定義して、ユーザーが初めてシステムを使用するとき、またはユーザーがプリファレンスを定義しない場合に、列が論理的に並べ替えられるようにする必要があります。デフォルトは、wt.load.LoadFromFile を使用するか、システム管理者のポータルページの「プリファレンス管理」ユーティリティを使用して定義します。
新しいデータベースで作業している場合、デフォルトは wt.load.Demo (wt.load.LoadFromFile を実行する) の必要なセクションを実行する一部としてロードされます。サイトのデフォルトは、「プリファレンス管理」ユーティリティを使用して簡単に追加または修正できます。データベースがリリース 6.0 以前に作成されたものである場合、wt.load.LoadFromFile を使用して HTML サーチクラスの配信されたコンフィギュレーションのベースデフォルトをロードできます。例として、Windchill\loadFiles\preferences.txt の「PrefEntry…/wt/query/htmlsearch」のエントリを参照してください。
各ユーザープリファレンスには内部名がありますが、クライアントからは「プリファレンス管理」ユーティリティ以外では確認できません。現在のサーチではユーザーが新しいサーチを追加できるように wt.query.SearchAttributeList が使用されており、サーチにはそれぞれに並べ替えプリファレンスのセットが必要なため、サーチ対象リストの各名前に一意の並べ替え名が必要です。
"サーチ対象" リスト内の各オブジェクトは、必ずしも 1 つのオブジェクトではなく、複数のオブジェクトが含まれたリストである場合もあります。wt.query.SearchAttributeListsortPref 配列では、プリファレンスの名前の一部を形成する一意の文字列が定義されます。並べ替えのプリファレンスは /wt/query/htmlsearch プリファレンスノードに保存され、ネーミングのフォーマットは次のとおりです。
<sort preference base name>sortAttrib<#>
<sort preference base name>sortDirect<#>
<sort preference base name> は、wt.query.SearchAttributeListsortPref 配列からの一意の文字列です。これは、並べ替え名内では一意でなければなりません。sortAttrib は属性名に対するもので、sortDirect には昇順または降順を指定します。昇順の場合は「偽」、降順の場合は「真」です。<#> は並べ替えキーの番号です。たとえば 0 = 最初のキーのようになります。ALL の並べ替えで wt.load.LoadFromFileWindchill\loadFiles\preferences.txt を使用してロードされるプリファレンスは、次のとおりです。
#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
すべてがデフォルトの例では、結果はまず番号列で並べ替えられ、次にバージョン列で並べ替えられます。このとき、番号は昇順、バージョンは降順です。理論上は並べ替えキーの数は Oracle のパフォーマンスのみによって制限されるべきですが、現在並べ替えキーは 3 までしかサポートされていません。3 を超えるキーのテストは、システムに対して実施されていません。