/*******************************************************************************
 *  Copyright 2017-2018 Centre for Development of Advanced Computing(C-DAC), Pune
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *   http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package cdac.medinfo.sdk.dcm30_04.dicommodel.modules;

import cdac.medinfo.sdk.dcm30_04.baselibs.DicomV3Factory;
import cdac.medinfo.sdk.dcm30_04.baselibs.InputInformationSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ScheduledHumanPerformersSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ScheduledProcessingParametersSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ScheduledStationClassCodeSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ScheduledStationGeographicLocationCodeSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ScheduledStationNameCodeSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ScheduledWorkitemCodeSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.Tag;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDataSet;
import cdac.medinfo.sdk.dcm30_04.commoninterface.ITag;

import cdac.medinfo.sdk.dcm30_04.enums.EnumScheduledProcedureStepPriority;
import cdac.medinfo.sdk.dcm30_04.enums.EnumInputReadinessState;
import cdac.medinfo.sdk.dcm30_04.exceptions.ConditionFailedException;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidModuleException;
import cdac.medinfo.sdk.dcm30_04.exceptions.MandatoryMissingException;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConfig;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConstants;
import cdac.medinfo.sdk.dcm30_04.utils.DicomLogger;
import cdac.medinfo.sdk.dcm30_04.utils.ISingleCollection;
import cdac.medinfo.sdk.dcm30_04.utils.SingleCollection;
//TODO: Auto-generated Javadoc
/**
\* This module describes attributes related to Unified Procedure Step Scheduled Procedure Information Module.
*/
 public class UnifiedProcedureStepScheduledProcedureInformationModule extends Module
{
	/**
	 * The obj single collection.
	 */
	public static ISingleCollection<ITag> objSingleCollection = null;


	/**
	 * Instantiates a UnifiedProcedureStepScheduledProcedureInformationModule.
	 * 
	 * @param objIDataSet the obj i data set
	 */
	public UnifiedProcedureStepScheduledProcedureInformationModule(IDataSet objIDataSet)
	{
		super(objIDataSet);
	}

	static
	{
		objSingleCollection = new SingleCollection<ITag>();
		objSingleCollection.add(new Tag(0x0074, 0x1200));
		objSingleCollection.add(new Tag(0x0040, 0x4010));
		objSingleCollection.add(new Tag(0x0074, 0x1202));
		objSingleCollection.add(new Tag(0x0074, 0x1204));
		objSingleCollection.add(new Tag(0x0040, 0x0400));
		objSingleCollection.add(new Tag(0x0040, 0x4005));
		objSingleCollection.add(new Tag(0x0040, 0x4011));
		objSingleCollection.add(new Tag(0x0040, 0x4041));
		objSingleCollection.add(new Tag(0x0020, 0x000D));		
		objSingleCollection.add(new Tag(0x0040, 0x4025));
		objSingleCollection.add(new Tag(0x0040, 0x4026));
		objSingleCollection.add(new Tag(0x0040, 0x4027));
		objSingleCollection.add(new Tag(0x0040, 0x4034));
		objSingleCollection.add(new Tag(0x0040, 0x4018));
		objSingleCollection.add(new Tag(0x0040, 0x4021));
		objSingleCollection.add(new Tag(0x0074, 0x1210));


	}

	/**
	 * This method validates each Attribute in the Module according to the Type
	 * of the Attribute.Attributes are of 5 types.
	 * Type 1,Type 2 are Mandatory:
	 * Mandatory Attributes have to present in the Module.
	 * Type 1C,2C are Conditional:
	 * Conditional Attributes' presence depend on a condition.
	 * If the condition is satisfied the Attribute has to be present.
	 * Type 3 are Optional
	 * Optional Attributes can be added as and when required.
	 * 
	 * @return Boolean - status indicating success or failure
	 * 
	 * @throws InvalidModuleException - If validation of Module fails
	 */
	public  boolean validateModule() throws InvalidModuleException
	{

		try
		{		
		/*
		 * Validation Rules for Mandatory Elements
		 */
	
		}
		catch(MandatoryMissingException mme)
		{
			if(DicomConfig.createInstance().isLoggingOn())
				DicomLogger.getLogger().log(mme.getMessage());

			
				throw new InvalidModuleException(this.getClass().getSimpleName(),mme);

		}
		catch (ConditionFailedException cfe)
		{
			if(DicomConfig.createInstance().isLoggingOn())
				DicomLogger.getLogger().log(cfe.getMessage());

			
				throw new InvalidModuleException(this.getClass().getSimpleName(),cfe);

		}
		return true;
	}
	
	/**
	 * Sets priority of the scheduled Procedure Step
	 *Enumerated Values:
	 *HIGH:used to indicate an urgent or emergent work item, equivalent to a STAT request.
	 *MEDIUM:used to indicate a work item that has a priority less than HIGHand higher than LOW. It can be used to further stratify workitems.
	 *LOW:used to indicate a routine or non-urgent work item.
	 * @param enumScheduledProcedureStepPriority enum value of Setup Device Type.
	 */
	public void setScheduledProcedureStepPriority(EnumScheduledProcedureStepPriority enumScheduledProcedureStepPriority)
	{
		/* Accept the ScheduledProcedureStepPriority in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */

		addDataElement(0x0074, 0x1200, DicomConstants.DCM_DT_CS,enumScheduledProcedureStepPriority);
	}
	/**
	 * Return ScheduledProcedureStepPriority 
	 * @return String - value of ScheduledProcedureStepPriority
	 */
	public String getScheduledProcedureStepPriority()
	{
		Object objValue = getValue(0x0074, 0x1200);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	/**
	 * Sets Scheduled Procedure StepModification Date and Time
	 * @param strScheduledProcedureStepModificationDateTime String value of Scheduled Procedure StepModification Date and Time
	 */
	public void setScheduledProcedureStepModificationDateTime(String strScheduledProcedureStepModificationDateTime)
	{
		/* Accept the Scheduled Procedure StepModification Date and Time of type DT.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040, 0x4010,DicomConstants.DCM_DT_DT,strScheduledProcedureStepModificationDateTime);
	}

	/**
	 * Retrieves Scheduled Procedure StepModification Date and Time
	 * @return String - value of Scheduled Procedure StepModification Date and Time
	 */
	public String getScheduledProcedureStepModificationDateTime()
	{
		Object objValue = getValue(0x0040, 0x4010);
		if(objValue != null)
			return objValue.toString();
		return null;
	}

	/**
	 * Sets Worklist Label
	 * @param strWorklistLabel String value of Worklist Label.
	 */
	public void setWorklistLabel(String strWorklistLabel)
	{
		/* Accept the Worklist Label in String format of type LO.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0074, 0x1202,DicomConstants.DCM_DT_LO,strWorklistLabel);
	}

	/**
	 * Return Worklist Label
	 * @return String - value of Worklist Label
	 */
	public String getWorklistLabel()
	{
		Object objValue = getValue(0x0074, 0x1202);
		if(objValue != null)
			return objValue.toString();
		return null;
	}

	/**
	 * Sets Procedure Step Label
	 * @param strProcedureStepLabel String value of Procedure Step Label
	 */
	public void setProcedureStepLabel(String strProcedureStepLabel)
	{
		/* Accept the Procedure Step Label in String format of type LO.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0074, 0x1204,DicomConstants.DCM_DT_LO,strProcedureStepLabel);
	}

	/**
	 * Return Procedure Step Label
	 * @return String - value of Procedure Step Label
	 */
	public String getProcedureStepLabel()
	{
		Object objValue = getValue(0x0074, 0x1204);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets Comments on the ScheduledProcedure Step
	 * @param strCommentsOnTheScheduledProcedureStep String value of Comments on the ScheduledProcedure Step.
	 */
	public void setCommentsOnTheScheduledProcedureStep(String strCommentsOnTheScheduledProcedureStep)
	{
		/* Accept Comments on the ScheduledProcedure Step of type LT.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040, 0x0400,DicomConstants.DCM_DT_LT,strCommentsOnTheScheduledProcedureStep);
	}

	/**
	 * Retrieves Comments on the ScheduledProcedure Step
	 * @return String - value of Comments on the ScheduledProcedure Step
	 */
	public String getCommentsOnTheScheduledProcedureStep()
	{
		Object objValue = getValue(0x0040, 0x0400);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	/**
	 * Sets Scheduled Procedure Step StartDateTime
	 * @param strScheduledProcedureStepStartDateTime String value of Scheduled Procedure Step StartDateTime
	 */
	public void setScheduledProcedureStepStartDateTime(String strScheduledProcedureStepStartDateTime)
	{
		/* Accept the Scheduled Procedure Step StartDateTime of type DT.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040, 0x4005,DicomConstants.DCM_DT_DT,strScheduledProcedureStepStartDateTime);
	}

	/**
	 * Retrieves Scheduled Procedure Step StartDateTime
	 * @return String - value of VScheduled Procedure Step StartDateTime
	 */
	public String getScheduledProcedureStepStartDateTime()
	{
		Object objValue = getValue(0x0040, 0x4005);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	/**
	 * Sets Expected Completion DateTime
	 * @param strExpectedCompletionDateTime String value of Expected Completion DateTime
	 */
	public void setExpectedCompletionDateTime(String strExpectedCompletionDateTime)
	{
		/* Accept the Expected Completion DateTime of type DT.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040, 0x4011,DicomConstants.DCM_DT_DT,strExpectedCompletionDateTime);
	}

	/**
	 * Retrieves Scheduled Procedure Step StartDateTime
	 * @return String - value of Expected Completion DateTime
	 */
	public String getExpectedCompletionDateTime()
	{
		Object objValue = getValue(0x0040, 0x4011);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets readiness state of the Input Information Sequence (0040,4021) and the referenced instances.
	 *Enumerated Values:
	 *INCOMPLETE:The Input Information Sequence is not yet complete and additional instance references might be added.
	 *UNAVAILABLE:The Input Information Sequence is complete but one or more of the referenced instances might not yet be available from the referenced source(s).
	 *READY:The Input Information Sequence is complete and the referenced instances are available from the referenced sources.
	 * @param enumInputReadinessState enum value of Input Readiness State.
	 */
	public void setInputReadinessState(EnumInputReadinessState enumInputReadinessState)
	{
		/* Accept the InputReadinessState in String format of type CS.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */

		addDataElement(0x0040, 0x4041, DicomConstants.DCM_DT_CS,enumInputReadinessState);
	}
	/**
	 * Return InputReadinessState 
	 * @return String - value of InputReadinessState
	 */
	public String getInputReadinessState()
	{
		Object objValue = getValue(0x0040, 0x4041);
		if(objValue != null)
			return objValue.toString();
		return null;
	}

	/**
	 * Sets a Study Instance UID
	 * @param strStudyInstanceUID String value of Study Instance UID
	 */
	public void setStudyInstanceUID(String strStudyInstanceUID)
	{
		/*Accept the Study Instance UID in String format of type UI.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */

		addDataElement(0x0020, 0x000D, DicomConstants.DCM_DT_CS,strStudyInstanceUID);
	}

	/**
	 * Retrieves Study Instance UID
	 * @return String - value of Study Instance UID
	 */
	public String getStudyInstanceUID()
	{
		Object objValue = getValue(0x0020, 0x000D);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	

	/**
	 * Retrieves pre-initialized object of Scheduled Station Name CodeSequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return ScheduledStationNameCodeSequence - instance of Scheduled Station Name CodeSequence.
	 */
	public ScheduledStationNameCodeSequence getScheduledStationNameCodeSequence()
	{
		ScheduledStationNameCodeSequence objScheduledStationNameCodeSequence = (ScheduledStationNameCodeSequence)getDicomValue(0x0040, 0x4025);
		if(objScheduledStationNameCodeSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objScheduledStationNameCodeSequence = (ScheduledStationNameCodeSequence)objDicomV3Factory.createSequence(0x0040, 0x4025, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4025, DicomConstants.DCM_DT_SQ, objScheduledStationNameCodeSequence.getValue());
		}
		return objScheduledStationNameCodeSequence;
	}		
	/**
	 * Retrieves pre-initialized object of Scheduled Station Class Code Sequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return ScheduledStationClassCodeSequence - instance of Scheduled Station Class Code Sequence.
	 */
	public ScheduledStationClassCodeSequence getScheduledStationClassCodeSequence()
	{
		ScheduledStationClassCodeSequence objScheduledStationClassCodeSequence = (ScheduledStationClassCodeSequence)getDicomValue(0x0040, 0x4026);
		if(objScheduledStationClassCodeSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objScheduledStationClassCodeSequence = (ScheduledStationClassCodeSequence)objDicomV3Factory.createSequence(0x0040, 0x4026, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4026, DicomConstants.DCM_DT_SQ, objScheduledStationClassCodeSequence.getValue());
		}
		return objScheduledStationClassCodeSequence;
	}

	/**
	 * Retrieves pre-initialized object of Scheduled Station Geographic Location Code Sequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return ScheduledStationGeographicLocationCodeSequence - instance of Scheduled Station Geographic Location Code Sequence.
	 */
	public ScheduledStationGeographicLocationCodeSequence getScheduledStationGeographicLocationCodeSequence()
	{
		ScheduledStationGeographicLocationCodeSequence objScheduledStationGeographicLocationCodeSequence = (ScheduledStationGeographicLocationCodeSequence)getDicomValue(0x0040, 0x4027);
		if(objScheduledStationGeographicLocationCodeSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objScheduledStationGeographicLocationCodeSequence = (ScheduledStationGeographicLocationCodeSequence)objDicomV3Factory.createSequence(0x0040, 0x4027, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4027, DicomConstants.DCM_DT_SQ, objScheduledStationGeographicLocationCodeSequence.getValue());
		}
		return objScheduledStationGeographicLocationCodeSequence;
	}
	/**
	 * Retrieves pre-initialized object of Scheduled Human PerformersSequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return ScheduledHumanPerformersSequence - instance of Scheduled Human PerformersSequence
	 */
	public ScheduledHumanPerformersSequence getScheduledHumanPerformersSequence()
	{
		ScheduledHumanPerformersSequence objScheduledHumanPerformersSequence = (ScheduledHumanPerformersSequence)getDicomValue(0x0040, 0x4034);
		if(objScheduledHumanPerformersSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objScheduledHumanPerformersSequence = (ScheduledHumanPerformersSequence)objDicomV3Factory.createSequence(0x0040, 0x4034, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4034, DicomConstants.DCM_DT_SQ, objScheduledHumanPerformersSequence.getValue());
		}
		return objScheduledHumanPerformersSequence;
	}

	/**
	 * Retrieves pre-initialized object ofScheduled Workitem CodeSequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return ScheduledWorkitemCodeSequence - instance of Scheduled Workitem CodeSequence
	 */
	public ScheduledWorkitemCodeSequence getScheduledWorkitemCodeSequence()
	{
		ScheduledWorkitemCodeSequence objScheduledWorkitemCodeSequence = (ScheduledWorkitemCodeSequence)getDicomValue(0x0040, 0x4018);
		if(objScheduledWorkitemCodeSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objScheduledWorkitemCodeSequence = (ScheduledWorkitemCodeSequence)objDicomV3Factory.createSequence(0x0040, 0x4018, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4018, DicomConstants.DCM_DT_SQ, objScheduledWorkitemCodeSequence.getValue());
		}
		return objScheduledWorkitemCodeSequence;
	}
	/**
	 * Retrieves pre-initialized object of Scheduled Processing ParametersSequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return ScheduledProcessingParametersSequence - instance of Scheduled Processing ParametersSequence
	 */
	public ScheduledProcessingParametersSequence getScheduledProcessingParametersSequence()
	{
		ScheduledProcessingParametersSequence objScheduledProcessingParametersSequence = (ScheduledProcessingParametersSequence)getDicomValue(0x0040, 0x4021);
		if(objScheduledProcessingParametersSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objScheduledProcessingParametersSequence = (ScheduledProcessingParametersSequence)objDicomV3Factory.createSequence(0x0040, 0x4021, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4021, DicomConstants.DCM_DT_SQ, objScheduledProcessingParametersSequence.getValue());
		}
		return objScheduledProcessingParametersSequence;
	}
	
	/**
	 * Retrieves pre-initialized object of Input Information Sequence. If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns the object of sequence 
	 * @return InputInformationSequence - instance of Input Information Sequence
	 */
	public InputInformationSequence getInputInformationSequence()
	{
		InputInformationSequence objInputInformationSequence = (InputInformationSequence)getDicomValue(0x0040, 0x4070);
		if(objInputInformationSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objInputInformationSequence = (InputInformationSequence)objDicomV3Factory.createSequence(0x0040, 0x4070, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x4070, DicomConstants.DCM_DT_SQ, objInputInformationSequence.getValue());
		}
		return objInputInformationSequence;
	}
		
	/* (non-Javadoc)
	 * @see cdac.medinfo.sdk.dcm30_04.dicommodel.modules.Module#getVectorOfKeys()
	 */
	public ISingleCollection<ITag> getVectorOfKeys()
	{
		return objSingleCollection;
	}
}
