基本的なカスタマイズ > ユーザーインタフェースのカスタマイズ > MVC コンポーネント > MVC コンポーネントの概要 > MVC > JCA コンポーネント
  
JCA コンポーネント
ComponentConfig にはいくつかの実装があります。
JcaTableConfig
JcaAttributesTableConfig
JcaTreeConfig
JcaAttributePanelConfig
JcaColumnConfig
JcaInfoConfig
JcaPropertyConfig
JcaPropertyPanelConfig
MVC での JCA のコンフィギュレーション
JCA の Spring コンフィギュレーションはすべて <Windchill>\codebase\config\mvc\jca-mvc.xml にあります。以下の抜粋は、URL ハンドラマッピングのコンフィギュレーションを示しています。すべての URL パターン ptc1/comp/* は ID componentController で Bean にマッピングされ、パターン ptc1/tcomp/* は ID typeBasedComponentController で Bean にマッピングされます。
<bean id="abstractComponentHandlerMapping" abstract="true"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
-----
</bean>
<bean id="componentHandlerMapping" parent="abstractComponentHandlerMapping">
<property name="mappings" ref="componentHandlerMappings" />
-----
</bean>
<bean id="componentHandlerMappings"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties"><props>
<prop key="/comp/**">componentController</prop>
<prop key="/tcomp/**">typeBasedComponentController</prop>
</props></property>
</bean>
以下の抜粋は、componentController ID での Bean の定義を示しています。
jcaComponentBuilderResolvertheComponentBuilderResolver として注入されます。
デフォルトビューをマッピングするため、defaultViewMappings プロパティが定義されています。
<bean id="componentController"
class="com.ptc.mvc.components.ComponentController">
<property name="componentBuilderResolver"
ref="jcaComponentBuilderResolver" />
<property name="defaultViewMappings">
<map>
<entry key="com.ptc.mvc.components.TreeConfig"
value="/components/tree.jsp" />
<entry key="com.ptc.mvc.components.TableConfig"
value="/components/table.jsp" />
<entry key="com.ptc.mvc.components.AttributesTableConfig“
value="/components/table.jsp" />
<entry key="com.ptc.mvc.components.AttributePanelConfig”
value="/components/attributePanel.jsp" />
</map>
</property>
-----------
</bean>
以下の抜粋は、typeBasedComponentController ID での Bean の定義を示しています。
typeBasedComponentBuilderResolverComponentBuilderResolver として注入されます。最適ビルダーの検索中もコンテキストオブジェクトの Windchill タイプが考慮されます。
<bean id="typeBasedComponentController"
class="com.ptc.mvc.components.ComponentController“
parent="componentController“>
<property name="componentBuilderResolver"
ref="typeBasedComponentBuilderResolver" />
</bean>
指定されているデフォルトハンドラによって、マッピングを持たないすべての MVC URL パターンが処理されます。
<bean id="componentHandlerMapping" parent="abstractComponentHandlerMapping">
<property name="defaultHandler" ref="netmarketsController" />
-----
</bean>
<bean id="netmarketsController"
class="com.ptc.jca.mvc.controllers.LegacyController" />
ComponentConfigFactory
ComponentConfigFactoryAware であるビルダーが ComponentConfigFactory によって注入されます。ComponentConfigFactoryComponentConfig の各種実装のインスタンスを提供します (テーブル、ツリーなど)。JCA では、注入は Bean ポストプロセッサで生じ、<Windchill>\codebase\config\mvc\jca-mvc.xml で設定されます。
<bean class="com.ptc.mvc.components.support.ComponentBuilderBeanPostProcessor">
.....
<property name="componentConfigFactory" ref="jcaComponentConfigFactory" />
<property name="infoComponentConfigFactory">
......
</property>
<property name="typedAttrLayOutFactory">
<bean class="com.ptc.jca.mvc.components.JcaTypedAttrLayOutFactory" />
</property>
</bean>
<bean name="jcaComponentConfigFactory"
class="com.ptc.jca.mvc.components.JcaComponentConfigFactory"
factory-method="getInstance" />
ComponentDataConvertor
<bean id="jcaComponentDataConverter"
class="com.ptc.jca.mvc.components.JcaComponentDataConverter" />
<bean id="jcaComponentDataBuilder"
class="com.ptc.jca.mvc.components.DefaultJcaComponentDataBuilder"
scope="prototype">
<property name="componentDataConverter"
ref="jcaComponentDataConverter" />
</bean>
<bean id="jcaComponentBuilderResolver
class="com.ptc.jca.mvc.components.JcaComponentBuilderResolver">
......
<lookup-method name="createJcaDataBuilder"
bean="jcaComponentDataBuilder" />
</bean>
JCA が使用できるように、ComponentDataBuilder から使用可能なデータを処理する必要があります。dataUtilities を介したデータの実行はこの段階で行われます。JcaComponentDataConverter はこれを行い、jcaComponentBuilderResolver に注入されます。
ComponentBuilder リゾルバ
• 指定されている DataBuilder が ConvertingComponentDataBuilder のインスタンスである場合、JcaComponentBuilderResolver はこれを ComponentDataBuilder として使用します。
• 指定されている DataBuilder が ComponentDataBuilder のインスタンスである場合、JcaComponentBuilderResolver はこれを DefaultJcaComponentDataBuilder の内部ビルダーとして使用します。
MVC URL の生成
2 種類の JCA MVC URL があります。
タイプに依存しない JCA MVC URL: ここではコンテキストオブジェクトはビルダーの解決プロセスに関与しません。
タイプ依存の JCA MVC URL: ここではコンテキストオブジェクトのタイプがビルダーの解決プロセスに関与します。
これは操作定義を使用して生成されます。
<action>
<component name="myCompId" ……/>
</action>
<action>
<component name="myCompId" " typeBased="true" ……/>
</action>
e.g
<action name="CustEx_mvc_table">
<component name="carambola.mvc.table" windowType="page" />
</action>
<action name="primaryAttributes" resourceBundle="com.ptc.core.ui.navigationRB">
<component name="primaryAttributes" typeBased="true" windowType="page"/>
---
</action>
<Windchill>/codebase/ WEB-INF/tlds/mvc.tld には使用可能なヘルパー関数が格納されています。
<%@ taglib uri="http://www.ptc.com/windchill/taglib/mvc" prefix="mvc"%>
---
<jsp:include page="${mvc:getComponentURL('part.report.multiLevelBOM')}" />
-----
テーブルサイズの上限
テーブルに表示される最大行数は、USER レベルの表示機能を備えたこのプリファレンスによって駆動されます。こればシステム内のすべての JCA テーブルに適用されます。現在のところ、OOTB デフォルト値は 2,000 行であり、クライアントのハードウェアとブラウザのタイプに基づいて変更できます。
ツリーの場合、上限は適用されますが、エンドユーザーによってオーバーライド可能です。ツリーがサイズの上限に達すると、クライアントの一部のリソースを解放するため、いずれかのノードが折りたたまれたときに、その子がクライアントから除去されます。クライアントでのノード数がサイズの上限を下回るまで、この処理が行われます。
操作の処理
操作は 3 つのグループに大きく分けることができます。
オブジェクトがロードされるとこれらの操作を実行できます。
グループ 1 - ロードされたデータのみに適用される操作
行レベル操作と複数選択操作
「すべて選択」、Ctrl/Shift キーを使用した選択、「すべて解除」
選択したオブジェクトのみを表示
グループ 2 - データセット全体に適用される操作
これらの操作はいつでも実行できます (データセットが不完全な場合、サーバーからすべてのデータを取得します)。
テーブルビューの切り替え
テーブル内のサーチ
リストのエクスポート
グループ 3 - テーブル自体に適用される操作
これらの操作はいつでも実行できます。
作成操作
データロードのキャンセル
テーブルビューの保存
並べ替え
並べ替えは特別な操作であり、DataSource ではクライアント内のデータに依存します。
完全なデータセットの場合
クライアントで並べ替えが発生
データがロード中の場合
クライアント内にすでにあるデータが並べ替えられる
残りのポーリング行を並べ替え後の順序でクライアントに挿入
結果の上限に達した場合
クライアントで並べ替えが発生
(データセット全体ではなく) クライアント内の行だけが並べ替えられる
バージョン列は例外で、サーバートリップがクライアント内の使用可能なデータセットに対してのみ並べ替えを行います。
ヒント
Spring ログ作成の有効化
<Windchill>\codebase\WEB-INF\log4jMethodServer.properties に以下のエントリを追加してサーバーを再起動してください。
log4j.logger.org.springframework=DEBUG
ローカライズされたメッセージへのアクセス
ResourceBundleClientMessageSource を使用して、ローカライズされたメッセージを取得できます。
String resourceBundle = "com.ptc.test.TestResource";
ClientMessageSource messageSource =
new ResourceBundleClientMessageSource(resourceBundle);
String message = messageSource.getMessage(TestResource.TEST);
Entry in the TestResource file
@RBEntry("Test Message")
public static final String TEST = "test";
ビルダーが OOTB 抽象ビルダーを拡張する場合、その API を利用します。
AbstractComponentConfigBuilder.getMessageSource(String resourceBundle)
AbstractComponentDataBuilder.getMessageSource(String resourceBundle)
AbstractInfoConfigBuilder.getMessageSource(String resourceBundle)
ローカライズされたメッセージへのアクセス
ビューコンポーネントの格納
ビューのすべての jsp を <Windchill>\WEB-INF\jsp に配置し、その指定時に指定する値は <Windchill>\WEB-INF\jsp を基準にする必要があります。
table.setView("/carambola/carambolaMVCExampleTable.jsp");
JCA コンポーネントビルダーでの Nm*Bean のリクエスト
NmHelperBean helper = ((JcaComponentParams) params).getHelperBean();
NmCommandBean nmCommandBean = helper.getNmCommandBean();
HttpServletRequest request = nmCommandBean.getRequest();
ビルダーのスレッドセーフティ
デフォルトで、ビルダーはサーブレットのスレッドセーフティパラダイムに従います (シングルトンスコープ)。つまり、ビルダー内のインスタンス変数はスレッドセーフでなければなりません。コンフィギュレーションビルダー API とデータビルダー API との間の通信は、コンフィギュレーションオブジェクト自体または ComponentParams を介して行われます。
public class TestComponentBuilder extends AbstractComponentBuilder{
@Override
public ComponentConfig buildComponentConfig(ComponentParams params)
throws WTException {
Object myObject;
//add information that you want to pass to data builder
params.setAttribute("myKey", myObject);
-----
}
@Override
public Object buildComponentData(ComponentConfig config,
ComponentParams params)
throws WTException {
//get the information that was put in config builder
Object myObject = params.getAttribute("myKey");
-----
}
}