Именование пользовательского компонента Talend - не работает, кроме tTutorialRow

Я следил за учебником Talend на Как создать пользовательский компонент. Если я буду следовать примеру дословно, с моими файлами, названными следующим образом и помещенными в папку tTutorialRow, учебник будет работать:

tTutorialRow_java.xml
tTutorialRow_messages.properties
tTutorialRow_begin.javajet
tTutorialRow_main.javajet
tTutorialRow_end.javajet

Это использует следующий код:

tTutorialRow_java.xml:

<COMPONENT>
  <HEADER
    PLATEFORM="ALL"
    SERIAL=""
    VERSION="2.0"
    STATUS="ALPHA"
  
    COMPATIBILITY="ALL"
    AUTHOR="Talend"
    RELEASE_DATE="20070525A"
    STARTABLE="false"
  >
    <SIGNATURE/>
  </HEADER>
  
  <FAMILIES> 
    <FAMILY>Helium</FAMILY> 
  </FAMILIES> 
  
  <DOCUMENTATION>
    <URL/>
  </DOCUMENTATION>
  
  <CONNECTORS>
    <CONNECTOR CTYPE="FLOW" MAX_INPUT="1"/>
    <CONNECTOR CTYPE="ITERATE" MAX_OUTPUT="1" MAX_INPUT="1"/>
    <CONNECTOR CTYPE="SUBJOB_OK" MAX_INPUT="1" />
    <CONNECTOR CTYPE="SUBJOB_ERROR" MAX_INPUT="1" />
    <CONNECTOR CTYPE="COMPONENT_OK" />
    <CONNECTOR CTYPE="COMPONENT_ERROR" />
    <CONNECTOR CTYPE="RUN_IF" />
  </CONNECTORS>
  
  <PARAMETERS>
    <PARAMETER NAME="ADDRESSES" FIELD="TABLE" REQUIRED="true" NUM_ROW="3" NB_LINES="5" SHOW="true">
      <ITEMS BASED_ON_SCHEMA="false">
        <ITEM NAME="USERNAME" />
        <ITEM NAME="DOMAIN" />
      </ITEMS>
    </PARAMETER>
  </PARAMETERS>
  
  <CODEGENERATION/>
  
  <RETURNS>
    <RETURN NAME="NB_LINE" TYPE="id_Integer" AVAILABILITY="AFTER"/>
  </RETURNS>
  
</COMPONENT>

tTutorialRow_messages.properties:

LONG_NAME=Tutorial component
HELP=org.talend.help.TutorialRow
 
NB_LINE.NAME=Number of lines
ADDRESSES.ITEM.USERNAME=Username
ADDRESSES.ITEM.DOMAIN=Domain
ADDRESSES.NAME=Addresses

tTutorialRow_begin.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();  
    List<Map<String, String>> lines = (List<Map<String,String>>)ElementParameterParser.getObjectValue(node, "__ADDRESSES__");
%> 
java.util.List<String> addresses_<%=cid %> = new java.util.ArrayList<String>();
<%
  for (int i=0; i<lines.size(); i++) {
    Map<String, String> line = lines.get(i);
%>
    addresses_<%=cid %>.add(<%= line.get("USERNAME") %> + "@" + <%= line.get("DOMAIN") %>);
<%
  }
%>
int nb_line_<%=cid %> = 0;

tTutorialRow_main.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();  
%>
    String[] adresses_<%=cid %> = addresses_<%=cid %>.toArray(new String[] {});
     
    System.out.print(nb_line_<%=cid %>++ + ": ");
    for (int i_<%=cid %> = 0; i_<%=cid %> < adresses_<%=cid %>.length; i_<%=cid %>++ )
    {
      System.out.print(adresses_<%=cid %>[i_<%=cid %>]);
      if (i_<%=cid %> < adresses_<%=cid %>.length-1) System.out.print(",");
    }   
    System.out.println();

tTutorialRow_end.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();  
%>   
    globalMap.put("<%=cid %>_NB_LINE",nb_line_<%=cid %>);

Если я изменю имя файла с:

tTutorialRow_java.xml
tTutorialRow_messages.properties
tTutorialRow_begin.javajet
tTutorialRow_main.javajet
tTutorialRow_end.javajet

to:

myProject_java.xml
myProject_messages.properties
myProject_begin.javajet
myProject_main.javajet
myProject_end.javajet

и обновите имя папки на myProject, добавление компонента больше не работает. Как я могу добавить компонент с новым именем?

Спасибо!


person maudulus    schedule 18.08.2014    source источник
comment
имя должно быть одинаковым во всех файлах, если оно отличается, оно не будет отображаться в палитре. Можете ли вы объяснить, как компонент не работает, не отображается ли он или не работает в соответствии с кодом?   -  person UmeshR    schedule 19.08.2014
comment
не могли бы вы попробовать использовать tmyProject_ ? Я думаю, что это не загрузится, если имя не начинается с t   -  person Balazs Gunics    schedule 19.08.2014
comment
Вот и все - мне просто нужно было настроить имена не только файла, но и содержащей его папки (например, tProjectName (это была папка), tProjectName_begin.javajet, tProjectName_java.xml... и т. д.)   -  person maudulus    schedule 19.08.2014


Ответы (1)


Ответ заключается в том, что существуют определенные особенности/требования к именованию для включения пользовательского компонента в Talend.

Сработало следующее:

Мне пришлось включить папку внутри моей основной папки с именем tProjectName, содержащую:

tProjectName_begin.javajet
tProjectName_end.javajet
tProjectName_icon32.png
tProjectName_java.xml
tProjectName_main.javajet
tProjectName_message.properties

Эти файлы вообще не нужно было менять внутри формата в разделе вопросов этого вопроса stackoverflow.

person maudulus    schedule 19.08.2014
comment
Вы говорите, что вам пришлось добавить префикс t? У меня сложилось впечатление, что на самом деле не требуется, чтобы оно начиналось с t. Префикс t изначально должен был означать, что это официальный компонент, поставляемый Talend, но сообщество, похоже, тоже его подхватило. Или вы здесь что-то еще делали? Не могли бы вы перечислить особенности/требования к именованию. Желательно со ссылкой на то, где это указано. - person ydaetskcoR; 20.08.2014
comment
Все, что я сделал, это переименовал проект, основываясь на комментариях, данных ранее к этому вопросу. - person maudulus; 20.08.2014