2013-04-09 60 views
1

我正在使用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類不會有元數據更改所代表的額外字段。所以,即使用戶界面會告訴我這些列存在於輸出中,但我似乎無法將任何值放入這些列中。

由於我能夠更改元數據中的列,因此我必須讓方法將其反映在行的結構中,對嗎?是否有某種「更新」方法或我缺少的東西?

回答

-1

在這種情況下,row2Struct構造需要通過你的_main.javajet這樣生成的Java代碼來調用:

<% 
String outConnName = conn.getName(); 
%> 
<%=outConnName %> = new <%=outConnName %>Struct(); 

然後,如果你想在你的輸出數據流一些輸入數據副本,可以生成以下java代碼:

<% 
for (IMetadataColumn outColumn : outColumns) { 
%> 
<%=outConnName%>.<%=outColumn.getLabel()%> = <%=inConnName%>.<%=outColumn.getLabel()%>; 
<% 
} 
%> 
+0

我可以訪問row2Struct,但問題是它只有原始字段,而不是我添加到我的being.javajet中的新字段。 – 2013-04-09 19:48:05

+0

爲了更清楚地說明爲什麼這種方式不起作用,生成的Java代碼在引用row2.Clone_of_Column1時出現編譯錯誤等。row2Struct沒有用於克隆列的字段,並且收到消息「Clone_of_Column1無法解析或者不是一個領域。「 – 2013-04-09 20:01:44

+0

好吧,我現在明白了。不支持在javajet中修改組件元數據。 Javajet代碼僅用於生成Java代碼(不是組件參數控制) – 2013-04-09 21:14:52

相關問題