Passing paramateres to the custom component

I have requirement like, i have to take the Value objects as input and i have to wirte those value objects to XLS.

For that i have devloped a custom Component


public Result execute() throws Exception {
		InputPortDirect inPort = (InputPortDirect) getInputPort(READ_FROM_PORT);;
		List<DealDetailsVO> dealDetailsVOList = new PMIFacade().processDealExtract();
		Iterator<DealDetailsVO> iterator = dealDetailsVOList.iterator();
		
		while (iterator.hasNext() && runIt) {
				DealDetailsVO dealDetailsVO = (DealDetailsVO) iterator.next();
				outRecord.getField("ACCOUNTID").setValue(dealDetailsVO.getAccountId());
				outRecord.getField("DEALID").setValue(dealDetailsVO.getDealId());
				outRecord.getField("DEALNAME").setValue(dealDetailsVO.getDealName());
				outRecord.getField("BUSINESSSEGMENT").setValue(dealDetailsVO.getBusinessSegment());
				outRecord.getField("BUSINESSSUBSEGMENT").setValue(dealDetailsVO.getBusinessSubSegment());
				outRecord.getField("ORIGINATINGLOCATION").setValue(dealDetailsVO.getOriginatingLocation());
				outRecord.getField("BOOKINGLOCATION").setValue(dealDetailsVO.getBookingLocation());
				outRecord.getField("DATEFIRSTINPIPELINE").setValue(dealDetailsVO.getDateFirstInPipeline());
				outRecord.getField("CLOSEDDATE").setValue(dealDetailsVO.getClosedDate());
				outRecord.getField("LOSTDATE").setValue(dealDetailsVO.getLostDate());
				outRecord.getField("SALESSTAGE").setValue(dealDetailsVO.getSalesStage());
				outRecord.getField("UPDATEDTOTALANNUALREVENUE").setValue(dealDetailsVO.getUpdatedTotalAnnualRevenue());
				outRecord.getField("PRODUCTTYPE").setValue(dealDetailsVO.getProductType());
				outRecord.getField("SUBPRODUCTTYPE").setValue(dealDetailsVO.getSubProductType());
				outRecord.getField("ACCOUNTNAME").setValue(dealDetailsVO.getAccountName());
				outRecord.getField("ACCTGROUPID").setValue(dealDetailsVO.getAcctGroupId());
				outRecord.getField("ACCTLEID").setValue(dealDetailsVO.getAcctLEId());
				outRecord.getField("ACCTSUBPROFILEID").setValue(dealDetailsVO.getAcctSubProfileId());
				outRecord.getField("CREATEDDATE").setValue(dealDetailsVO.getCreatedDate());
				getOutputPort(0).writeRecord(outRecord);
		
			SynchronizeUtils.cloverYield();
		}
		
        return runIt ? Result.FINISHED_OK : Result.ABORTED;
	}

And i have created the grf file based on the custom component. i calling the graph file through java like this


                        EngineInitializer.initEngine("C:\\cloverETL.rel-3-0-0\\cloverETL\\plugins", null, null);
			String graphPath = "c:\\cloverETL.rel-3-0-0\\cloverETL\\bin\\graph\\tets.grf";
			InputStream is = new BufferedInputStream(new FileInputStream(graphPath));

			TransformationGraph graph = null;
			// engine customizationnm
			GraphRuntimeContext runtimeContext = new GraphRuntimeContext();
			// graph loading
			graph = TransformationGraphXMLReaderWriter.loadGraph(is,runtimeContext);
			// engine initialization
			EngineInitializer.initGraph(graph, runtimeContext);

			// graph running
			IThreadManager threadManager = new SimpleThreadManager();
			WatchDog watchDog = new WatchDog(graph, runtimeContext);
			threadManager.executeWatchDog(watchDog);

it is execeuting fine.

But right now my requirement is like. While calling the graph it self i need to pass some input parameters. i.e what ever the method i am calling in execute() (new PMIFacade().processDealExtract() ) requires some input parameter. i .e the new method will looks like new PMIFacade().processDealExtract(int a, string b). i nned to pass those inputs while calling the grah.

can anyone help on this.

Thanks in advance
Venkat

What about adding the attributes to your component? Something like that:


public class MyComponent extends Node

        public static String XML_A_PARAMETER_ATTRIBUTE = "aParameter";
        public static String XML_B_PARAMETER_ATTRIBUTE = "bParameter";

        int a;
        String b;
   
        .
        .

        public static Node fromXML(TransformationGraph graph, Element xmlElement) throws XMLConfigurationException {
                ComponentXMLAttributes xattribs = new ComponentXMLAttributes(xmlElement, graph);
                MyComponent component;
                .
                .
                .
                int aAttribute = xattribs.getInteger(XML_A_PARAMETER_ATTRIBUTE);
                String bAttribute = xattribs.getString(XML_B_PARAMETER_ATTRIBUTE);
                component.setAAttribute(aAttribute);
                component.setBAttribute(bAttribute);
                .
                .
                .
         }

         public Result execute() throws Exception {  
                 InputPortDirect inPort = (InputPortDirect) getInputPort(READ_FROM_PORT);;
                 List<DealDetailsVO> dealDetailsVOList = new PMIFacade().processDealExtract(a,b);
                 Iterator<DealDetailsVO> iterator = dealDetailsVOList.iterator();
                .
                .
                .
         }
}

Thank you very much for your reply.

I haven’t tried yet. I will try this and i will update you. I have one more doubt. To call the grf file using the follwing code.

EngineInitializer.initEngine(“C:\\cloverETL.rel-3-0-0\\cloverETL\\plugins”, null, null);
String graphPath = “c:\\cloverETL.rel-3-0-0\\cloverETL\\bin\\graph\\scbcdh.grf”;
InputStream is = new BufferedInputStream(new FileInputStream(graphPath));

TransformationGraph graph = null;
// engine customizationnm
GraphRuntimeContext runtimeContext = new GraphRuntimeContext();
// graph loading
graph = TransformationGraphXMLReaderWriter.loadGraph(is,runtimeContext);
// engine initialization
EngineInitializer.initGraph(graph, runtimeContext);

// graph running
IThreadManager threadManager = new SimpleThreadManager();
WatchDog watchDog = new WatchDog(graph, runtimeContext);
threadManager.executeWatchDog(watchDog);

here where i need to pass those parameters.

Thanks
Venkat

Hello Venkat,
define these attributes by parameters in your graph, eg:


<Node aParameter="${a}" bParameter="${b}"  id="MY_COMPONENT0"  type="MY_COMPONENT"/>

and paste the values to the GraphRuntimeContext object:


runtimeContext.addAdditionalProperty("a", "1");
runtimeContext.addAdditionalProperty("b", "b");

Hi avackova,

Thank you very much. It is working fine.
I have another question like is it possible to pass the List of object’s as input. If it is how can we do that.

Thank you
Venkat

Hello Venkat,
List object can’t be passed to the graph. You need to split the string, eg.:


   component.setListAttribute(Arrays.asList(xattribs.getString(XML_LIST_ATTRIBUTE).split(Defaults.Component.KEY_FIELDS_DELIMITER_REGEX)));

THANK YOU VERY MUCH avackova I am PAASING STRING ALONE