public override void AcquireConnections(object transaction)
        {
            DTSValidationStatus validationStatus = this.ValidateConnection(DTSValidationStatus.VS_ISVALID);

            if (validationStatus == DTSValidationStatus.VS_ISVALID)
            {
                IDTSConnectionManager100 connectionManager = this.ComponentMetaData.RuntimeConnectionCollection[0].ConnectionManager;
                try
                {
                    this.fileName = (string)connectionManager.AcquireConnection(transaction);
                }
                catch (Exception)
                {
                    this.PostErrorAndThrow(MessageStrings.CannotGetFileNameFromConnection);
                }

                if (!System.IO.File.Exists(this.fileName))
                {
                    this.PostErrorAndThrow(MessageStrings.FileDoesNotExist(this.fileName));
                }
            }
            else
            {
                throw new COMException(string.Empty, E_FAIL);
            }
        }
        public void TestOutputColumn_InvalidCustomProperty()
        {
            Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();
            Executable exec = package.Executables.Add("STOCK:PipelineTask");

            Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = exec as Microsoft.SqlServer.Dts.Runtime.TaskHost;
            MainPipe dataFlowTask        = thMainPipe.InnerObject as MainPipe;
            ComponentEventHandler events = new ComponentEventHandler();

            dataFlowTask.Events = DtsConvert.GetExtendedInterface(events as IDTSComponentEvents);

            IDTSComponentMetaData100 speechToText = dataFlowTask.ComponentMetaDataCollection.New();

            speechToText.ComponentClassID = typeof(Martin.SQLServer.Dts.SSISSpeechToText).AssemblyQualifiedName;
            CManagedComponentWrapper speechToTextInstance = speechToText.Instantiate();

            speechToTextInstance.ProvideComponentProperties();
            speechToText.CustomPropertyCollection[Utility.SubscriptionKeyPropName].Value = "NotTheDefault";
            // Before this is default setup for a clean component

            IDTSCustomProperty100 cp = speechToText.OutputCollection[0].OutputColumnCollection[0].CustomPropertyCollection.New();

            cp.Name  = "IAmInvalid";
            cp.Value = "IAmInvalid";
            DTSValidationStatus actual   = speechToTextInstance.Validate();
            DTSValidationStatus expected = DTSValidationStatus.VS_ISCORRUPT;

            Assert.AreEqual(expected, actual);
            Assert.AreEqual("[Error] SSIS Speech To Text: Output Column InputChannel has invalid property IAmInvalid.", events.errorMessages[0]);
        }
        public void TestValidateExtraCustomProperty()
        {
            Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();
            Executable exec = package.Executables.Add("STOCK:PipelineTask");

            Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = exec as Microsoft.SqlServer.Dts.Runtime.TaskHost;
            MainPipe dataFlowTask        = thMainPipe.InnerObject as MainPipe;
            ComponentEventHandler events = new ComponentEventHandler();

            dataFlowTask.Events = DtsConvert.GetExtendedInterface(events as IDTSComponentEvents);

            IDTSComponentMetaData100 speechToText = dataFlowTask.ComponentMetaDataCollection.New();

            speechToText.ComponentClassID = typeof(Martin.SQLServer.Dts.SSISSpeechToText).AssemblyQualifiedName;
            CManagedComponentWrapper speechToTextInstance = speechToText.Instantiate();

            speechToTextInstance.ProvideComponentProperties();

            speechToText.CustomPropertyCollection.New();

            DTSValidationStatus actual   = speechToTextInstance.Validate();
            DTSValidationStatus expected = DTSValidationStatus.VS_ISCORRUPT;

            Assert.AreEqual(expected, actual);
            Assert.AreEqual("[Error] SSIS Speech To Text: There is either to many or not enough custom properties.", events.errorMessages[0]);
        }
        public void TestValidateOK()
        {
            Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();
            Executable exec = package.Executables.Add("STOCK:PipelineTask");

            Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = exec as Microsoft.SqlServer.Dts.Runtime.TaskHost;
            MainPipe dataFlowTask        = thMainPipe.InnerObject as MainPipe;
            ComponentEventHandler events = new ComponentEventHandler();

            dataFlowTask.Events = DtsConvert.GetExtendedInterface(events as IDTSComponentEvents);

            IDTSComponentMetaData100 speechToText = dataFlowTask.ComponentMetaDataCollection.New();

            speechToText.ComponentClassID = typeof(Martin.SQLServer.Dts.SSISSpeechToText).AssemblyQualifiedName;
            CManagedComponentWrapper speechToTextInstance = speechToText.Instantiate();

            speechToTextInstance.ProvideComponentProperties();

            speechToText.CustomPropertyCollection[Utility.SubscriptionKeyPropName].Value = "NotTheDefault";

            DTSValidationStatus actual   = speechToTextInstance.Validate();
            DTSValidationStatus expected = DTSValidationStatus.VS_ISVALID;

            Assert.AreEqual(expected, actual);
            Assert.AreEqual(0, events.errorMessages.Count, "There are error messages");
        }
        public void TestOutputColumn_Timecode_Missing()
        {
            Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();
            Executable exec = package.Executables.Add("STOCK:PipelineTask");

            Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = exec as Microsoft.SqlServer.Dts.Runtime.TaskHost;
            MainPipe dataFlowTask        = thMainPipe.InnerObject as MainPipe;
            ComponentEventHandler events = new ComponentEventHandler();

            dataFlowTask.Events = DtsConvert.GetExtendedInterface(events as IDTSComponentEvents);

            IDTSComponentMetaData100 speechToText = dataFlowTask.ComponentMetaDataCollection.New();

            speechToText.ComponentClassID = typeof(Martin.SQLServer.Dts.SSISSpeechToText).AssemblyQualifiedName;
            CManagedComponentWrapper speechToTextInstance = speechToText.Instantiate();

            speechToTextInstance.ProvideComponentProperties();
            speechToText.CustomPropertyCollection[Utility.SubscriptionKeyPropName].Value = "NotTheDefault";
            // Before this is default setup for a clean component

            speechToText.OutputCollection[0].OutputColumnCollection.RemoveObjectByID(speechToText.OutputCollection[0].OutputColumnCollection[Utility.OutputTimecodeColumnName].ID);
            IDTSOutputColumn100 tempCol = speechToText.OutputCollection[0].OutputColumnCollection.New();

            tempCol.Name = "TempCol";
            tempCol.SetDataTypeProperties(DataType.DT_STR, 10, 0, 0, 1252);
            DTSValidationStatus actual   = speechToTextInstance.Validate();
            DTSValidationStatus expected = DTSValidationStatus.VS_ISCORRUPT;

            Assert.AreEqual(expected, actual);
            Assert.AreEqual("[Error] SSIS Speech To Text: Required Output Column Timecode is missing.", events.errorMessages[0]);
        }
        public DTSValidationStatus ValidateOutputProperties(IDTSCustomPropertyCollection100 customPropertyCollection, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus resultStatus = oldStatus;

            resultStatus = ValidatePropertyExists(customPropertyCollection, rowTypeValue, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, typeOfOutput, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, masterRecordID, resultStatus);
            return(resultStatus);
        }
        public DTSValidationStatus ValidateComponentProperties(IDTSCustomPropertyCollection100 customPropertyCollection, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus resultStatus = oldStatus;

            resultStatus = ValidatePropertyExists(customPropertyCollection, isTextDelmited, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, textDelmiter, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, columnDelimiter, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, treatEmptyStringsAsNull, resultStatus);
            return(resultStatus);
        }
        public override DTSValidationStatus Validate()
        {
            DTSValidationStatus status = DTSValidationStatus.VS_ISVALID;

            status = ValidateComponentProperties(status);
            status = ValidateInputs(status);
            status = ValidateOutputs(status);

            return(status);
        }
        public DTSValidationStatus ValidatePropertyValue(string propertyName, object propertyValue, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus resultStatus = oldStatus;

            if (this.propertyValidationTable.ContainsKey(propertyName))
            {
                resultStatus = CommonUtils.CompareValidationValues(resultStatus, this.propertyValidationTable[propertyName](propertyName, propertyValue));
            }
            return(resultStatus);
        }
        public DTSValidationStatus ValidateOutputColumnProperties(IDTSCustomPropertyCollection100 customPropertyCollection, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus resultStatus = oldStatus;

            resultStatus = ValidatePropertyExists(customPropertyCollection, usageOfColumn, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, keyOutputColumnID, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, dotNetFormatString, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, isColumnOptional, resultStatus);
            resultStatus = ValidatePropertyExists(customPropertyCollection, nullResultOnConversionError, resultStatus);
            return(resultStatus);
        }
        public DTSValidationStatus ValidateProperties(IDTSCustomPropertyCollection100 customPropertyCollection, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus resultStatus = oldStatus;

            foreach (IDTSCustomProperty100 property in customPropertyCollection)
            {
                resultStatus = ValidatePropertyValue(property.Name, property.Value, resultStatus);
            }

            return(resultStatus);
        }
Beispiel #12
0
        protected virtual void Validate()
        {
            DTSValidationStatus dtsStatus = Instance.Validate();

            // TODO: Error messages
            if (dtsStatus != DTSValidationStatus.VS_ISVALID)
            {
                if (dtsStatus == DTSValidationStatus.VS_NEEDSNEWMETADATA)
                {
                    Instance.ReinitializeMetaData();
                }
            }
        }
 public static DTSValidationStatus CompareValidationValues(DTSValidationStatus oldStatus, DTSValidationStatus newStatus)
 {
     if (oldStatus == DTSValidationStatus.VS_ISVALID && newStatus == DTSValidationStatus.VS_ISVALID)
     {
         return DTSValidationStatus.VS_ISVALID;
     }
     if (oldStatus == DTSValidationStatus.VS_ISCORRUPT || newStatus == DTSValidationStatus.VS_ISCORRUPT)
     {
         return DTSValidationStatus.VS_ISCORRUPT;
     }
     else
     {
         return DTSValidationStatus.VS_ISBROKEN;
     }
 }
Beispiel #14
0
 public static DTSValidationStatus CompareValidationValues(DTSValidationStatus oldStatus, DTSValidationStatus newStatus)
 {
     if (oldStatus == DTSValidationStatus.VS_ISVALID && newStatus == DTSValidationStatus.VS_ISVALID)
     {
         return(DTSValidationStatus.VS_ISVALID);
     }
     if (oldStatus == DTSValidationStatus.VS_ISCORRUPT || newStatus == DTSValidationStatus.VS_ISCORRUPT)
     {
         return(DTSValidationStatus.VS_ISCORRUPT);
     }
     else
     {
         return(DTSValidationStatus.VS_ISBROKEN);
     }
 }
        DTSValidationStatus ValidateRowDelimiterProperty(string propertyName, object propertyValue)
        {
            DTSValidationStatus retStatus = ValidateDelimiterProperty(propertyName, propertyValue);

            if (retStatus == DTSValidationStatus.VS_ISVALID)
            {
                string value = (string)propertyValue;
                if (value.Length == 0)
                {
                    this.PostError(MessageStrings.RowDelimiterEmpty);
                    retStatus = DTSValidationStatus.VS_ISBROKEN;
                }
            }

            return(retStatus);
        }
Beispiel #16
0
        public override DTSValidationStatus Validate()
        {
            DTSValidationStatus validation = base.Validate();

            if (validation == DTSValidationStatus.VS_ISVALID)
            {
                bool cancel;

                //Validate input column
                if (ComponentMetaData.InputCollection[0].InputColumnCollection[0].DataType != DataType.DT_IMAGE)
                {
                    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Invalid input column data type", string.Empty, 0, out cancel);
                    return(DTSValidationStatus.VS_ISBROKEN);
                }
            }
            return(validation);
        }
        public override DTSValidationStatus Validate()
        {
            DTSValidationStatus validation = base.Validate();

            if (validation == DTSValidationStatus.VS_ISVALID)
            {
                bool cancel;

                //Validate input column
                if (ComponentMetaData.InputCollection[0].InputColumnCollection[0].DataType != DataType.DT_IMAGE)
                {
                    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Invalid input column data type", string.Empty, 0, out cancel);
                    return(DTSValidationStatus.VS_ISBROKEN);
                }

                //Validate input projection
                if (ComponentMetaData.CustomPropertyCollection["Input Spatial Reference"].Value == null || ComponentMetaData.CustomPropertyCollection["Input Spatial Reference"].Value.ToString() == string.Empty)
                {
                    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Input projection is empty", "", 0, out cancel);
                    return(DTSValidationStatus.VS_ISBROKEN);
                }
                string           srInput = ComponentMetaData.CustomPropertyCollection["Input Spatial Reference"].Value.ToString();
                SpatialReference inSr    = new SpatialReference("");
                if (inSr.SetFromUserInput(srInput) != 0)
                {
                    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Invalid input projection", "", 0, out cancel);
                    return(DTSValidationStatus.VS_ISBROKEN);
                }

                //Validate output projection
                if (ComponentMetaData.CustomPropertyCollection["Output Spatial Reference"].Value == null || ComponentMetaData.CustomPropertyCollection["Output Spatial Reference"].Value.ToString() == string.Empty)
                {
                    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Output projection is empty", "", 0, out cancel);
                    return(DTSValidationStatus.VS_ISBROKEN);
                }
                string           srOutput = ComponentMetaData.CustomPropertyCollection["Output Spatial Reference"].Value.ToString();
                SpatialReference outSr    = new SpatialReference("");
                if (outSr.SetFromUserInput(srOutput) != 0)
                {
                    ComponentMetaData.FireError(0, ComponentMetaData.Name, "Invalid output projection", "", 0, out cancel);
                    return(DTSValidationStatus.VS_ISBROKEN);
                }
            }
            return(validation);
        }
        /// <summary>
        /// Validates the component metadata
        /// </summary>
        /// <returns>Is component configuration valid?</returns>
        public override DTSValidationStatus Validate()
        {
            InitProperties(false);
            LineageMapping.UpdateInputIdProperties(ComponentMetaData, _IsagCustomProperties);

            DTSValidationStatus status = base.Validate();

            if (status != DTSValidationStatus.VS_ISVALID)
            {
                return(status);
            }

            if (!_IsagCustomProperties.IsValid(ComponentMetaData, _events))
            {
                return(DTSValidationStatus.VS_NEEDSNEWMETADATA);
            }

            if (!this.ComponentMetaData.AreInputColumnsValid)
            {
                return(DTSValidationStatus.VS_NEEDSNEWMETADATA);
            }

            return(DTSValidationStatus.VS_ISVALID);
        }
        public DTSValidationStatus ValidateProperties(IDTSCustomPropertyCollection100 customPropertyCollection, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus resultStatus = oldStatus;
            foreach (IDTSCustomProperty100 property in customPropertyCollection)
            {
                resultStatus = ValidatePropertyValue(property.Name, property.Value, resultStatus);
            }

            return resultStatus;
        }
 public DTSValidationStatus ValidatePropertyValue(string propertyName, object propertyValue, DTSValidationStatus oldStatus)
 {
     DTSValidationStatus resultStatus = oldStatus;
     if (this.propertyValidationTable.ContainsKey(propertyName))
     {
         resultStatus = CommonUtils.CompareValidationValues(resultStatus, this.propertyValidationTable[propertyName](propertyName, propertyValue));
     }
     return resultStatus;
 }
 private DTSValidationStatus ValidateInputs(DTSValidationStatus oldStatus)
 {
     if (this.ComponentMetaData.InputCollection.Count > 0)
     {
         this.PostError(MessageStrings.NotExpectedInputs);
         return DTSValidationStatus.VS_ISCORRUPT;
     }
     else
     {
         return oldStatus;
     }
 }
        private DTSValidationStatus ValidateOutputs(DTSValidationStatus oldStatus)
        {
            DTSValidationStatus returnStatus = oldStatus;
            if (this.ComponentMetaData.OutputCollection.Count != 2)
            {
                this.PostError(MessageStrings.UnexpectedNumberOfOutputs);
                returnStatus = DTSValidationStatus.VS_ISCORRUPT;
            }
            else
            {
                IDTSOutputCollection100 outputCollection = this.ComponentMetaData.OutputCollection;
                IDTSOutput100 firstOutput = outputCollection[0];
                IDTSOutput100 secondOutput = outputCollection[1];
                if (secondOutput.IsErrorOut)
                {
                    returnStatus = ValidateRegularOutput(firstOutput, returnStatus);
                    returnStatus = ValidateErrorOutput(secondOutput, returnStatus);
                }
                else
                {
                    returnStatus = ValidateRegularOutput(secondOutput, returnStatus);
                    returnStatus = ValidateErrorOutput(firstOutput, returnStatus);
                }
            }

            return returnStatus;
        }
        private DTSValidationStatus ValidateRegularOutput(IDTSOutput100 output, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus returnStatus = oldStatus;

            IDTSOutputColumnCollection100 outputColumnCollection = output.OutputColumnCollection;

            if (outputColumnCollection.Count == 0)
            {
                this.PostError(MessageStrings.NoOutputColumns);
                if (returnStatus != DTSValidationStatus.VS_ISCORRUPT)
                {
                    returnStatus = DTSValidationStatus.VS_ISBROKEN;
                }
            }
            else
            {
                returnStatus = ValidateOutputColumns(outputColumnCollection, returnStatus);
            }

            return returnStatus;
        }
        private DTSValidationStatus ValidateErrorOutput(IDTSOutput100 errorOutput, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus returnStatus = oldStatus;

            IDTSOutputColumnCollection100 outputColumnCollection = errorOutput.OutputColumnCollection;

            if (outputColumnCollection.Count == 0)
            {
                this.PostError(MessageStrings.NoErrorOutputColumns);
                returnStatus = DTSValidationStatus.VS_ISCORRUPT;
            }

            return returnStatus;
        }
        private DTSValidationStatus ValidateOutputColumns(IDTSOutputColumnCollection100 outputColumnCollection, DTSValidationStatus oldStatus)
        {
            DTSValidationStatus returnStatus = oldStatus;

            foreach (IDTSOutputColumn100 outputColumn in outputColumnCollection)
            {
                returnStatus = ValidateOutputColumn(outputColumn, returnStatus);
            }

            return returnStatus;
        }
        private DTSValidationStatus ValidateOutputColumn(IDTSOutputColumn100 outputColumn, DTSValidationStatus returnStatus)
        {
            returnStatus = propertiesManager.ValidateProperties(outputColumn.CustomPropertyCollection, returnStatus);

            if (returnStatus != DTSValidationStatus.VS_ISCORRUPT)
            {
                DTSValidationStatus newValidationStatus = ValidateSupportedDataTypes(outputColumn.DataType);
                returnStatus = CommonUtils.CompareValidationValues(returnStatus, newValidationStatus);
            }

            return returnStatus;
        }
        private DTSValidationStatus ValidateConnection(DTSValidationStatus oldStatus)
        {
            if (this.ComponentMetaData.RuntimeConnectionCollection.Count != 1)
            {
                this.PostError(MessageStrings.InvalidConnectionReference(FileConnectionName));
                return DTSValidationStatus.VS_ISCORRUPT;
            }
            else
            {
                IDTSRuntimeConnection100 connection = this.ComponentMetaData.RuntimeConnectionCollection[0];
                if (string.Compare(connection.Name, FileConnectionName, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    this.PostError(MessageStrings.InvalidConnectionReference(FileConnectionName));
                    return DTSValidationStatus.VS_ISCORRUPT;
                }
            }

            return oldStatus;
        }
 private DTSValidationStatus ValidatePropertyExists(IDTSCustomPropertyCollection100 customPropertyCollection, string propertyName, DTSValidationStatus oldStatus)
 {
     foreach (IDTSCustomProperty100 property in customPropertyCollection)
     {
         if (property.Name == propertyName)
         {
             return(Utilities.CompareValidationValues(oldStatus, DTSValidationStatus.VS_ISVALID));
         }
     }
     this.PostError(MessageStrings.MissingProperty(propertyName));
     return(Utilities.CompareValidationValues(oldStatus, DTSValidationStatus.VS_ISCORRUPT));
 }
 private DTSValidationStatus ValidateComponentProperties(DTSValidationStatus oldStatus)
 {
     return this.propertiesManager.ValidateProperties(this.ComponentMetaData.CustomPropertyCollection, oldStatus);
 }
 private DTSValidationStatus promoteStatus(ref DTSValidationStatus currentStatus, DTSValidationStatus newStatus)
 {
     // statuses are ranked in order of increasing severity, from
     //   valid to broken to needsnewmetadata to corrupt.
     // bad status, if any, is result of programming error
     switch (currentStatus)
     {
         case DTSValidationStatus.VS_ISVALID:
             switch (newStatus)
             {
                 case DTSValidationStatus.VS_ISBROKEN:
                 case DTSValidationStatus.VS_ISCORRUPT:
                 case DTSValidationStatus.VS_NEEDSNEWMETADATA:
                     currentStatus = newStatus;
                     break;
                 case DTSValidationStatus.VS_ISVALID:
                     break;
                 default:
                     throw new System.ApplicationException("Internal Error: A value outside the scope of the status enumeration was found.");
             }
             break;
         case DTSValidationStatus.VS_ISBROKEN:
             switch (newStatus)
             {
                 case DTSValidationStatus.VS_ISCORRUPT:
                 case DTSValidationStatus.VS_NEEDSNEWMETADATA:
                     currentStatus = newStatus;
                     break;
                 case DTSValidationStatus.VS_ISVALID:
                 case DTSValidationStatus.VS_ISBROKEN:
                     break;
                 default:
                     throw new System.ApplicationException("Internal Error: A value outside the scope of the status enumeration was found.");
             }
             break;
         case DTSValidationStatus.VS_NEEDSNEWMETADATA:
             switch (newStatus)
             {
                 case DTSValidationStatus.VS_ISCORRUPT:
                     currentStatus = newStatus;
                     break;
                 case DTSValidationStatus.VS_ISVALID:
                 case DTSValidationStatus.VS_ISBROKEN:
                 case DTSValidationStatus.VS_NEEDSNEWMETADATA:
                     break;
                 default:
                     throw new System.ApplicationException("Internal Error: A value outside the scope of the status enumeration was found.");
             }
             break;
         case DTSValidationStatus.VS_ISCORRUPT:
             switch (newStatus)
             {
                 case DTSValidationStatus.VS_ISCORRUPT:
                 case DTSValidationStatus.VS_ISVALID:
                 case DTSValidationStatus.VS_ISBROKEN:
                 case DTSValidationStatus.VS_NEEDSNEWMETADATA:
                     break;
                 default:
                     throw new System.ApplicationException("Internal Error: A value outside the scope of the status enumeration was found.");
             }
             break;
         default:
             throw new System.ApplicationException("Internal Error: A value outside the scope of the status enumeration was found.");
     }
     return currentStatus;
 }