dynamically output columns

One Star

dynamically output columns

Hi,
  I would like to dynamically output the columns from my custom component. For example, I have 7 columns for my input but the output columns may change based on the input from the user.  Here is the main. Any help is appreciated.
<%@ 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>> input_personator = (List<Map<String, String>>)ElementParameterParser.getObjectValue(node, "__INPUT_PERSONATOR__");
%>
java.io.StringWriter sw_<%=cid%> = new java.io.StringWriter();
routines.Request.Records.RequestRecord req_<%=cid%> =new routines.Request.Records.RequestRecord();
<%  
    java.util.List<IMetadataTable> metadatas = node.getMetadataList();
    if ((metadatas!=null)&&(metadatas.size()>0)) { //1
       IMetadataTable metadata = metadatas.get(0);
       if (metadata!=null) { //2
          List< ? extends IConnection> conns = node.getIncomingConnections();
          for (IConnection conn : conns) { //3
              if(conn!=null && conn.getLineStyle().hasConnectionCategory(IConnectionCategory.DATA)){ //4
                  IMetadataTable metadata_input = conn.getMetadataTable();
                  List<IMetadataColumn> columnsInput = metadata_input.getListColumns();
                  
                  List< ? extends IConnection> connsout = node.getOutgoingConnections();
                  if (connsout!=null) { //5
                      List<IMetadataColumn> columnsout = metadata.getListColumns();
                      for (IConnection connout : connsout) { //6
                          if(connout!=null && connout.getLineStyle().hasConnectionCategory(IConnectionCategory.DATA)) { //7
                              // set right column values from the left column which name is the same
                              List exist = new java.util.ArrayList();
                              for (int j = 0; j < columnsout.size(); j++) {  //a
                                  IMetadataColumn columnOutput=columnsout.get(j);
                                  
                              }  //a
                              for (int k = 0; k < exist.size(); k++) {  //b
                                  String label=(String)exist.get(k);                 
%>
                             <%=connout.getName() %>.<%=label%>=<%=conn.getName() %>.<%=label%>;
<%
                              } //b
%>

<%                              
                              for (Map<String, String> input : input_personator) { //c
                                  String input_personator_field = input.get("PERSONATOR_FIELD");
                                  String input_column = input.get("INPUT_COLUMN");
                                  String methodName = input_personator_field.trim();
%>                
                                  if (<%=conn.getName() %>.<%= input_column %> != null && !"".equals(<%=conn.getName() %>.<%= input_column %>.trim())) { //d
                                      
                                      
                                    
                                    System.out.println(<%=conn.getName() %>.<%= input_column %>.trim());
                                      
                                      req_<%=cid%>.set<%=methodName%>(<%=conn.getName() %>.<%= input_column %>.trim());
                                  } //d
<%                
                              } //c
%>                        
                        
                            record_<%=cid%>.getRequestRecord().add(req_<%=cid%>);
request_<%=cid%>.setRecords(record_<%=cid%>);
 
try {

JAXBContext jaxbContext = JAXBContext.newInstance(routines.Request.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(request_<%=cid%>, sw_<%=cid%>);
String payload_<%=cid%>=routines.personatorService.callPersonatorsw(sw_<%=cid%>);
String payload2_<%=cid%>=routines.personatorService.callPersonatorsw(sw_<%=cid%>);
            <%=connout.getName() %>.payload = payload_<%=cid%>;
            <%=connout.getName() %>.payload2 = payload2_<%=cid%>;

//          System.out.println(routines.personatorService.callPersonatorsw(sw_<%=cid%>));
record_<%=cid%>.getRequestRecord().clear();
sw_<%=cid%>.close();
     } catch (JAXBException e) {
e.printStackTrace();
     }
                             
         
                                  
                              <%
                            } //7
                          }   //6 
                         }    //5
                      }       //4
                  }           //3
              }               //2
          }                   //1
 %>              
Community Manager

Re: dynamically output columns

Hi
Take a look dynamic schema feature which is only available in enterprise subscription product, you might be interesting in it.
Regards
Shong
----------------------------------------------------------
Talend | Data Agility for Modern Business