private void UpdateComponentData()
        {
            //Set History Looup Properties
            UIHelper.ComponentMetadata.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.NoMatchBehavior)].Value  = _historyLookupProperties.NoMatchBehavior;
            UIHelper.ComponentMetadata.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.CacheType)].Value        = _historyLookupProperties.CacheType;
            UIHelper.ComponentMetadata.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.NoMatchCacheSize)].Value = _historyLookupProperties.NoMatchCacheSize;
            UIHelper.ComponentMetadata.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.DefaultCacheSize)].Value = _historyLookupProperties.DefaultCacheSize;
            UIHelper.ComponentMetadata.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.KeyHashAlgorithm)].Value = _historyLookupProperties.KeyHashAlgorithm;

            switch (_historyLookupProperties.NoMatchBehavior)
            {
            case HistoryLookupTransformation.NoMatchBehavior.FailComponent:
                UIHelper.Input.ErrorRowDisposition          = DTSRowDisposition.RD_FailComponent;
                UIHelper.Input.TruncationRowDisposition     = DTSRowDisposition.RD_FailComponent;
                UIHelper.Input2.ErrorRowDisposition         = DTSRowDisposition.RD_FailComponent;
                UIHelper.Input2.TruncationRowDisposition    = DTSRowDisposition.RD_FailComponent;
                UIHelper.ComponentMetadata.UsesDispositions = false;
                break;

            case HistoryLookupTransformation.NoMatchBehavior.RedirectToErrorOutput:
                UIHelper.Input.ErrorRowDisposition          = DTSRowDisposition.RD_RedirectRow;
                UIHelper.Input.TruncationRowDisposition     = DTSRowDisposition.RD_RedirectRow;
                UIHelper.Input2.ErrorRowDisposition         = DTSRowDisposition.RD_RedirectRow;
                UIHelper.Input2.TruncationRowDisposition    = DTSRowDisposition.RD_RedirectRow;
                UIHelper.ComponentMetadata.UsesDispositions = true;
                break;

            case HistoryLookupTransformation.NoMatchBehavior.RedirectToNoMatchOutput:
                UIHelper.Input.ErrorRowDisposition          = DTSRowDisposition.RD_NotUsed;
                UIHelper.Input.TruncationRowDisposition     = DTSRowDisposition.RD_NotUsed;
                UIHelper.Input2.ErrorRowDisposition         = DTSRowDisposition.RD_NotUsed;
                UIHelper.Input2.TruncationRowDisposition    = DTSRowDisposition.RD_NotUsed;
                UIHelper.ComponentMetadata.UsesDispositions = false;
                break;

            case HistoryLookupTransformation.NoMatchBehavior.IgnoreError:
                UIHelper.Input.ErrorRowDisposition          = DTSRowDisposition.RD_IgnoreFailure;
                UIHelper.Input.TruncationRowDisposition     = DTSRowDisposition.RD_IgnoreFailure;
                UIHelper.Input2.ErrorRowDisposition         = DTSRowDisposition.RD_IgnoreFailure;
                UIHelper.Input2.TruncationRowDisposition    = DTSRowDisposition.RD_IgnoreFailure;
                UIHelper.ComponentMetadata.UsesDispositions = false;
                break;

            default:
                break;
            }

            //Lists to hold information about processed ooutput columns
            List <OutputColumnDetail> outputCols          = new List <OutputColumnDetail>();
            List <OutputColumnDetail> processedOutputCols = new List <OutputColumnDetail>();
            List <int> oColsToRemove = new List <int>();

            if (UIHelper.Output != null)
            {
                //Get Output Columns Detailsfrom Output Columns ListView
                foreach (ListViewItem lvi in lvOutputColumns.Items)
                {
                    if (lvi.Checked)
                    {
                        outputCols.Add(new OutputColumnDetail((IDTSVirtualInputColumn)lvi.Tag, lvi.SubItems[1].Text, lvi.SubItems[1].Tag != null ? (int)lvi.SubItems[1].Tag : -1));
                    }
                }

                //Iterate through existing OutputColumns and try to update them
                foreach (IDTSOutputColumn oCol in UIHelper.Output.OutputColumnCollection)
                {
                    OutputColumnDetail od = outputCols.Find(ocd => ocd.ID == oCol.ID);
                    if (od != null)
                    {
                        outputCols.Remove(od);
                        processedOutputCols.Add(od);

                        oCol.Name = od.AliasName;
                        oCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.SourceLineageID)].Value = od.VirtualInputColumn.LineageID;
                        HistoryLookupTransformation.SetOutputColumnDataType(oCol, od.VirtualInputColumn);
                        od.OutputLineageID = oCol.LineageID;
                    }
                    else
                    {
                        oColsToRemove.Add(oCol.ID);
                    }
                }

                //Remove Not Existing Output Columns
                foreach (int id in oColsToRemove)
                {
                    UIHelper.Output.OutputColumnCollection.RemoveObjectByID(id);
                }

                //Add new OutputColumns
                foreach (OutputColumnDetail od in outputCols)
                {
                    processedOutputCols.Add(od);
                    IDTSOutputColumn oCol = UIHelper.Output.OutputColumnCollection.New();
                    oCol.Name = od.AliasName;
                    HistoryLookupTransformation.SetOutputColumnProperties(oCol);
                    HistoryLookupTransformation.SetOutputColumnDataType(oCol, od.VirtualInputColumn);
                    oCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.SourceLineageID)].Value = od.VirtualInputColumn.LineageID;
                    od.OutputLineageID = oCol.LineageID;
                }
            }


            List <ColumnMappingDetail> mappings = new List <ColumnMappingDetail>(lvMappings.Items.Count);

            //Process DataInput
            if (UIHelper.VirtualInput != null)
            {
                //Iterete through mappings and store them in List for easy searching
                foreach (ListViewItem lvi in lvMappings.Items)
                {
                    mappings.Add(new ColumnMappingDetail(((ConvertMetadataInputColumn)lvi.Tag).LineageID, ((ConvertMetadataInputColumn)lvi.SubItems[1].Tag).LineageID));
                }

                //Iterate tghrough virtual input
                foreach (IDTSVirtualInputColumn vCol in UIHelper.VirtualInput.VirtualInputColumnCollection)
                {
                    int lookupLineageID = 0;

                    HistoryLookupTransformation.InputColumnUsageType usageType = HistoryLookupTransformation.InputColumnUsageType.None;

                    //if column LineageID equalsto DataDateColumnLineageID in HistoryLookuProperties, then it was selected as Date Column
                    if (vCol.LineageID == _historyLookupProperties.DataDateColumnLineageID)
                    {
                        usageType |= HistoryLookupTransformation.InputColumnUsageType.DateColumn;
                    }

                    //Try to lookup defined mapping
                    ColumnMappingDetail cmd = mappings.Find(cm => cm.DataColumnLineageID == vCol.LineageID);

                    //If mapping was found then it is lookup column
                    if (cmd != null)
                    {
                        usageType      |= HistoryLookupTransformation.InputColumnUsageType.LookupColumn;
                        lookupLineageID = cmd.LookupColumnLineageID;
                    }

                    //If usageType is None then ignore column
                    if (usageType == HistoryLookupTransformation.InputColumnUsageType.None)
                    {
                        UIHelper.DesignTimeComponent.SetUsageType(UIHelper.Input.ID, UIHelper.VirtualInput, vCol.LineageID, DTSUsageType.UT_IGNORED);
                    }
                    else
                    {
                        IDTSInput       inp  = UIHelper.ComponentMetadata.InputCollection[0];
                        IDTSInputColumn iCol = UIHelper.DesignTimeComponent.SetUsageType(UIHelper.Input.ID, UIHelper.VirtualInput, vCol.LineageID, DTSUsageType.UT_READONLY);

                        HistoryLookupTransformation.SetDataInputColumnProperties(iCol);

                        iCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.InputColumnUsageType)].Value = usageType;
                        iCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.LookupKeyLineageID)].Value   = lookupLineageID;
                    }
                }
            }

            //Process HistoryLookupInput
            if (UIHelper.VirtualInput2 != null)
            {
                foreach (IDTSVirtualInputColumn vCol in UIHelper.VirtualInput2.VirtualInputColumnCollection)
                {
                    int oColLineageID = 0;
                    HistoryLookupTransformation.DateComparison       dateComparison = HistoryLookupTransformation.DateComparison.None;
                    HistoryLookupTransformation.InputColumnUsageType usageType      = HistoryLookupTransformation.InputColumnUsageType.None;
                    ColumnMappingDetail mapping = mappings.Find(m => m.LookupColumnLineageID == vCol.LineageID);

                    if (mapping != null)
                    {
                        usageType |= HistoryLookupTransformation.InputColumnUsageType.LookupColumn;
                    }

                    //If it matches LooupDateFromLineageID then it is LookupFromDate
                    if (vCol.LineageID == _historyLookupProperties.LookupDateFromLineageID)
                    {
                        usageType     |= HistoryLookupTransformation.InputColumnUsageType.DateFromColumn;
                        dateComparison = (HistoryLookupTransformation.DateComparison)_historyLookupProperties.LookupDateFromComparison;
                    }

                    //If it matches LookupDateToLineageID then it is LookupToDate
                    if (vCol.LineageID == _historyLookupProperties.LookupDateToLineageID)
                    {
                        usageType     |= HistoryLookupTransformation.InputColumnUsageType.DateToColumn;
                        dateComparison = (HistoryLookupTransformation.DateComparison)_historyLookupProperties.LookupDateToComparison;
                    }

                    var ocol = processedOutputCols.Find(oc => oc.VirtualInputColumn.LineageID == vCol.LineageID);
                    if (ocol != null)
                    {
                        usageType    |= HistoryLookupTransformation.InputColumnUsageType.OutputColumn;
                        oColLineageID = ocol.OutputLineageID;
                    }

                    //Uf UsageType is None then Ignore the input column
                    if (usageType == HistoryLookupTransformation.InputColumnUsageType.None)
                    {
                        UIHelper.DesignTimeComponent.SetUsageType(UIHelper.Input2.ID, UIHelper.VirtualInput2, vCol.LineageID, DTSUsageType.UT_IGNORED);
                    }
                    else //Set the column as Input Column
                    {
                        IDTSInputColumn iCol = UIHelper.DesignTimeComponent.SetUsageType(UIHelper.Input2.ID, UIHelper.VirtualInput2, vCol.LineageID, DTSUsageType.UT_READONLY);

                        HistoryLookupTransformation.SetLookupInputColumnProperties(iCol);
                        iCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.InputColumnUsageType)].Value  = usageType;
                        iCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.OutputColumnLineageID)].Value = oColLineageID;
                        iCol.CustomPropertyCollection[HistoryLookupTransformation.GetPropertyname(HistoryLookupTransformation.CustomProperties.DateComparison)].Value        = dateComparison;
                    }
                }
            }
        }