我正在使用Talend Open Studio進行數據集成,我想創建一個自定義組件,它將輸出輸入數據以及將從輸入列派生的一些額外列。作爲概念證明,在下面的代碼中,我試圖爲每列創建一個重複的列,但真正的例子會有更復雜的邏輯。下面是我在.javajet文件的該組件的「開始」部分嘗試:我的自定義TOS組件如何根據輸入模式/元數據添加列來輸出?
<%@ 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);
%>
這似乎差不多的工作,但並不完全。如果我將組件添加爲具有單個輸入和單個輸出的流的一部分,則輸出確實會顯示所需的額外列。但是,生成的Java代碼仍然存在編譯錯誤。它看起來像輸出到我的組件的「結構」沒有字段來表示額外的列。也就是說,如果row1是輸入,row2是輸出,那麼row2Struct類不會有元數據更改所代表的額外字段。所以,即使用戶界面會告訴我這些列存在於輸出中,但我似乎無法將任何值放入這些列中。
由於我能夠更改元數據中的列,因此我必須讓方法將其反映在行的結構中,對嗎?是否有某種「更新」方法或我缺少的東西?
我可以訪問row2Struct,但問題是它只有原始字段,而不是我添加到我的being.javajet中的新字段。 – 2013-04-09 19:48:05
爲了更清楚地說明爲什麼這種方式不起作用,生成的Java代碼在引用row2.Clone_of_Column1時出現編譯錯誤等。row2Struct沒有用於克隆列的字段,並且收到消息「Clone_of_Column1無法解析或者不是一個領域。「 – 2013-04-09 20:01:44
好吧,我現在明白了。不支持在javajet中修改組件元數據。 Javajet代碼僅用於生成Java代碼(不是組件參數控制) – 2013-04-09 21:14:52