データ統合にTalend Open Studioを使用しています。入力データと、入力列から派生する追加の列を出力するカスタムコンポーネントを作成したいと考えています。概念実証として、次のコードではすべての列に重複する列を作成しようとしていますが、実際の例ではより複雑なロジックが使用されます。コンポーネントの .javajet ファイルの「開始」部分で試したのは次のとおりです。
<%@ jet
imports="
org.talend.core.model.process.INode
org.talend.core.model.process.ElementParameterParser
org.talend.core.model.metadata.IMetadataTable
org.talend.core.model.metadata.IMetadataColumn
org.talend.core.model.process.IConnection
org.talend.core.model.process.IConnectionCategory
org.talend.designer.codegen.config.CodeGeneratorArgument
org.talend.core.model.metadata.types.JavaTypesManager
org.talend.core.model.metadata.types.JavaType
java.util.List
java.util.Map
"
%>
<%
CodeGeneratorArgument codeGenArgument = (CodeGeneratorArgument) argument;
INode node = (INode)codeGenArgument.getArgument();
String cid = node.getUniqueName();
IConnection conn = node.getOutgoingConnections().get(0);
IMetadataTable outputMetadataTable = conn.getMetadataTable();
List<IMetadataTable> metadatas = node.getMetadataList();
IMetadataTable metadata = metadatas.get(0);
List<IMetadataColumn> columnsToAdd = new java.util.ArrayList<IMetadataColumn>();
for(IMetadataColumn col : outputMetadataTable.getListColumns()){
IMetadataColumn cloned = col.clone();
cloned.setLabel("Clone_of_" + cloned.getLabel());
columnsToAdd.add(cloned);
}
List<IMetadataColumn> cols = new java.util.ArrayList<IMetadataColumn>(outputMetadataTable.getListColumns());
cols.addAll(columnsToAdd);
outputMetadataTable.setListColumns(cols);
%>
これはほとんど機能しているように見えますが、完全ではありません。コンポーネントを 1 つの入力と 1 つの出力を持つフローの一部として追加すると、出力には目的の余分な列が実際に表示されます。ただし、生成された Java コードにはコンパイル エラーがあります。コンポーネントへの出力の「構造体」に、追加の列を表すフィールドがないようです。つまり、row1 が入力で、row2 が出力の場合、row2Struct クラスには、メタデータへの変更によって表される余分なフィールドがありません。そのため、これらの列が出力に存在することが UI に表示されても、実際にはそれらの列に値を入力できないようです。
メタデータに含まれる列を変更できるので、これを行の構造体に反映させる方法が必要ですよね? ある種の「更新」方法または私が見逃しているものはありますか?