2013-04-09 4 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 все же имеет ошибки компиляции. Похоже, что «struct» для вывода на мой компонент не имеет полей для представления дополнительных столбцов. То есть, если row1 является входом, а row2 - результатом, класс row2Struct не имеет дополнительных полей, которые представлены изменением метаданных. Поэтому, хотя пользовательский интерфейс покажет мне, что эти столбцы существуют в выходном файле, кажется, что я не могу фактически поместить какие-либо значения в эти столбцы.

Поскольку я могу изменить, какие столбцы находятся в метаданных, должен быть способ, чтобы это отражалось в структурах строки, правильно? Есть ли какой-то метод «обновления» или что-то, что мне не хватает?

ответ

-1

В этом случае row2Struct конструктор должен вызываться в Java кода, сгенерированного вашим _main.javajet, как это:

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

Затем, если вы хотите скопировать некоторые входные данные в своем потоке выходных данных, вы можете сгенерируйте следующий код Java:

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

Я могу получить доступ к строке2Struct, но проблема в том, что у него есть только исходные поля, а не новые поля, которые я добавил в моем be.javajet. –

+0

Чтобы быть более понятным, почему это не сработает, сгенерированный код Java имеет ошибки компиляции при ссылках на строку2.Clone_of_Column1 и т. Д. Строка2Struct не имеет поля для столбцов clone, и я получаю сообщение «Clone_of_Column1 не может быть разрешено или не является полем ». –

+0

Хорошо, теперь я понимаю. Не поддерживается изменение метаданных компонентов в javajet. Код Javajet используется только для генерации Java-кода (не контроль компонентов компонентов) –