/*******************************************************************************
 *  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.presentationstate;

import java.io.IOException;
import java.util.Locale;

import cdac.medinfo.sdk.dcm30_04.commoninterface.IDataSet;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDicomStream;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDictionaryReader;
import cdac.medinfo.sdk.dcm30_04.commoninterface.ITransferSyntax;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.ClinicalTrialSeriesModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.ClinicalTrialStudyModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.ClinicalTrialSubjectModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.DisplayedAreaModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.EnhancedGeneralEquipmentModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.GeneralEquipmentModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.GeneralSeriesModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.GeneralStudyModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.GraphicAnnotationModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.GraphicGroupModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.GraphicLayerModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.ICCProfileModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.ImagePixelModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.NonImageIOD;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.PaletteColorLookupTableModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.PatientModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.PatientStudyModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.PresentationStateBlendingModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.PresentationStateIdentificationModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.SOPCommonModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.SpatialTransformationModule;
import cdac.medinfo.sdk.dcm30_04.dicommodel.modules.StructuredDisplayAnnotationModule;
import cdac.medinfo.sdk.dcm30_04.enums.EnumModuleNames;
import cdac.medinfo.sdk.dcm30_04.enums.EnumSOPClassUIDs;

import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidIODException;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidModuleException;
import cdac.medinfo.sdk.dcm30_04.exceptions.ParseException;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConfig;
import cdac.medinfo.sdk.dcm30_04.utils.DicomLogger;
import cdac.medinfo.sdk.dcm30_04.utils.ResourceBundleWrapper;
/**
 * The Blending Softcopy Presentation State Information Object Definition (IOD) specifies information that may be used to blend two sets of images that are referenced from within the IOD for the purpose of presentation (display).
 * @author saloni
 *
 */
public class BlendingSoftcopyPresentationStateIOD extends NonImageIOD
{

	
	/**
	 * The Constant BLENDING_SOFT_COPY_PRESENTATION_STATE_IOD.
	 */
	public static final String BLENDING_SOFT_COPY_PRESENTATION_STATE_IOD = "Blending Softcopy Presentation State IOD";
	
	/**
	 * The obj patient module.
	 */
	PatientModule objPatientModule = null;

	/**
	 * The obj general study module.
	 */
	GeneralStudyModule objGeneralStudyModule = null;

	/**
	 * The obj patient study module.
	 */
	PatientStudyModule objPatientStudyModule = null;

	/**
	 * The obj general series module.
	 */
	GeneralSeriesModule objGeneralSeriesModule = null;

	/**
	 * The obj clinical trial series module.
	 */
	ClinicalTrialSeriesModule objClinicalTrialSeriesModule = null;

	/**
	 * The obj general equipment module.
	 */
	GeneralEquipmentModule objGeneralEquipmentModule = null;

	/**
	 * The obj clinical trial subject module.
	 */
	ClinicalTrialSubjectModule objClinicalTrialSubjectModule = null;

	/**
	 * The obj clinical trial study module.
	 */
	ClinicalTrialStudyModule objClinicalTrialStudyModule = null;


	/**
	 * The obj sop common module.
	 */
	SOPCommonModule objSOPCommonModule = null;

	/**
	 * The obj Enhanced General Equipment module.
	 */
	EnhancedGeneralEquipmentModule objEnhancedGeneralEquipmentModule = null;
	
	/**
	 * The obj Presentation State Identification module.
	 */
	PresentationStateIdentificationModule objPresentationStateIdentificationModule = null;
	
	/**
	 * The obj Presentation State Blending module.
	 */
	PresentationStateBlendingModule objPresentationStateBlendingModule = null;
	
	/**
	 * The obj Structured Display Annotation module.
	 */
	StructuredDisplayAnnotationModule objStructuredDisplayAnnotationModule = null;
	
	/**
	 * The obj displayed area module.
	 */
	DisplayedAreaModule objDisplayedAreaModule = null;

	/**
	 * The obj graphic annotation module.
	 */
	GraphicAnnotationModule objGraphicAnnotationModule = null;
	
	/**
	 * The obj graphic layer module.
	 */
	GraphicLayerModule objGraphicLayerModule = null;
	
	/**
	 * The obj Graphic Group module.
	 */
	GraphicGroupModule objGraphicGroupModule= null;
	
	/**
	 * The obj spatial transformation module.
	 */
	SpatialTransformationModule objSpatialTransformationModule = null;

	/**
	 * The obj palette color lookup table module.
	 */
	PaletteColorLookupTableModule objPaletteColorLookupTableModule = null;

	/**
	 * The obj ICC Profile module.
	 */
	ICCProfileModule objICCProfileModule = null;
	
	/**
	 * Instantiates a new image iod.
	 */
	public BlendingSoftcopyPresentationStateIOD()
	{
		super();
	}

	/**
	 * This constructor initializes the TransferSyntax in its superclass IOD.
	 * 
	 * @param objITransferSyntax_ Transfer Syntax of IOD.
	 */
	public BlendingSoftcopyPresentationStateIOD(ITransferSyntax objITransferSyntax_)
	{
		super(objITransferSyntax_);
	}

	/**
	 * This constructor initializes DictionaryReader in its superclass IOD.
	 * 
	 * @param objIDictionaryReader_ Dictionary Reader used by the IOD.
	 */
	public BlendingSoftcopyPresentationStateIOD(IDictionaryReader objIDictionaryReader_)
	{
		super(objIDictionaryReader_);
	}

	/**
	 * This constructor accepts the DictionaryReader and TransferSyntax from the user  in its superclass IOD.
	 * 
	 * @param objITransferSyntax_ Transfer Syntax of IOD.
	 * @param objIDictionaryReader_ Dictionary Reader used by the IOD.
	 */
	public BlendingSoftcopyPresentationStateIOD(ITransferSyntax objITransferSyntax_,IDictionaryReader objIDictionaryReader_)
	{
		super(objITransferSyntax_,objIDictionaryReader_);
	}

	/**
	 * This constructor accepts the Data set from the user  in its superclass IOD.
	 * 
	 * @param objIDataSet_ the obj i data set_
	 */
	public BlendingSoftcopyPresentationStateIOD(IDataSet objIDataSet_)
	{
		super(objIDataSet_);
	}

	/**
	 * Creates IOD from a DICOM file containing corresponding DICOM data.
	 * @param strFileName DICOM File with absolute path.
	 * @throws IOException signals Exception caused due to wrong I/O operations. 
	 * @throws ParseException signals if some parse exceptions occurred.
	 */
	public BlendingSoftcopyPresentationStateIOD(String strFileName)throws IOException, InvalidIODException
	{
		super(strFileName);
		try
		{
			if(objIDataSet != null)
			{
				String strSOPClassUID = objIDataSet.getSOPClassUID();
				if(strSOPClassUID != null)
				{
					if(!strSOPClassUID.equals(EnumSOPClassUIDs.BLENDINGSOFTCOPYPRESENTATIONSTATEIOD.getValue()))
					{
						throw new InvalidIODException(ResourceBundleWrapper.getValue("exceptions", "InvalidIOD.FileNotMatched", new Locale(DicomConfig.createInstance().getLocale())) + BLENDING_SOFT_COPY_PRESENTATION_STATE_IOD);
					}
				}
				strSOPClassUID = null;
			}
		}
		catch(InvalidIODException iie)
		{
			if(DicomConfig.createInstance().isLoggingOn())
			{
				DicomLogger.getLogger().log(iie.getMessage());
			}
			throw iie;
		}
	}

	/**
	 * This method returns the PatientModule with preinitializing it.
	 * 
	 * @return the patient module
	 */
	public PatientModule getPatientModule()
	{
		if(objPatientModule == null)
		{
			objPatientModule = new PatientModule(objIDataSet);
			return objPatientModule;
		}
		return objPatientModule;
	}

	/**
	 * This method returns the GeneralStudyModule with preinitializing it.
	 * 
	 * @return the general study module
	 */
	public GeneralStudyModule getGeneralStudyModule()
	{
		if(objGeneralStudyModule == null)
		{
			objGeneralStudyModule = new GeneralStudyModule(objIDataSet);
			return objGeneralStudyModule;
		}
		return objGeneralStudyModule;
	}

	/**
	 * This method returns the PatientStudyModule with preinitializing it.
	 * 
	 * @return the patient study module
	 */
	public PatientStudyModule getPatientStudyModule()
	{
		if(objPatientStudyModule == null)
		{
			objPatientStudyModule = new PatientStudyModule(objIDataSet);
			return objPatientStudyModule;
		}
		return objPatientStudyModule;
	}

	/**
	 * Gets the clinical trial series module.
	 * 
	 * @return the clinical trial series module
	 */
	public ClinicalTrialSeriesModule getClinicalTrialSeriesModule()
	{
		if(objClinicalTrialSeriesModule == null)
		{
			objClinicalTrialSeriesModule = new ClinicalTrialSeriesModule(objIDataSet);
			return objClinicalTrialSeriesModule;
		}
		return objClinicalTrialSeriesModule;
	}

	/**
	 * This method returns the GeneralSeriesModule with preinitializing it.
	 * 
	 * @return the general series module
	 */
	public GeneralSeriesModule getGeneralSeriesModule()
	{
		if(objGeneralSeriesModule == null)
		{
			objGeneralSeriesModule = new GeneralSeriesModule(objIDataSet);
			return objGeneralSeriesModule;
		}
		return objGeneralSeriesModule;
	}
	/**
	 * Retrieves pre-initialized instance of Palette Color Lookup Table Module. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return PaletteColorLookupTableModule - instance of {@link PaletteColorLookupTableModule}.
	 */
	public PaletteColorLookupTableModule getPaletteColorLookupTableModule() 
	{
		if(objPaletteColorLookupTableModule == null)
		{
			objPaletteColorLookupTableModule = new PaletteColorLookupTableModule(objIDataSet);
			return objPaletteColorLookupTableModule;
		}
		return objPaletteColorLookupTableModule;
	}
	/**
	 * This method returns the GeneralEquipmentModule with preinitializing it.
	 * 
	 * @return the general equipment module
	 */
	public GeneralEquipmentModule getGeneralEquipmentModule()
	{
		if(objGeneralEquipmentModule == null)
		{
			objGeneralEquipmentModule = new GeneralEquipmentModule(objIDataSet);
			return objGeneralEquipmentModule;
		}
		return objGeneralEquipmentModule;
	}

	/**
	 * This method returns the ClinicalTrialSubjectModule with preinitializing it.
	 * 
	 * @return the clinical trial subject module
	 */
	public ClinicalTrialSubjectModule getClinicalTrialSubjectModule()
	{
		if(objClinicalTrialSubjectModule == null)
		{
			objClinicalTrialSubjectModule = new ClinicalTrialSubjectModule(objIDataSet);
			return objClinicalTrialSubjectModule;
		}
		return objClinicalTrialSubjectModule;
	}

	/**
	 * This method returns the ClinicalTrialStudyModule with preinitializing it.
	 * 
	 * @return the clinical trial study module
	 */
	public ClinicalTrialStudyModule getClinicalTrialStudyModule()
	{
		if(objClinicalTrialStudyModule == null)
		{
			objClinicalTrialStudyModule = new ClinicalTrialStudyModule(objIDataSet);
			return objClinicalTrialStudyModule;
		}
		return objClinicalTrialStudyModule;
	}
	/**
	 * Retrieves pre-initialized instance of SOP Common Module. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return SOPCommonModule - instance of {@link SOPCommonModule}.
	 */
	public SOPCommonModule getSOPCommonModule()
	{
		if(objSOPCommonModule == null)
		{
			objSOPCommonModule = new SOPCommonModule(objIDataSet);
			return objSOPCommonModule;
		}
		return objSOPCommonModule;
	}

	/**
	 * Retrieves pre-initialized instance of Enhanced General Equipment Module. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return EnhancedGeneralEquipmentModule - instance of {@link EnhancedGeneralEquipmentModule}.
	 */
	public EnhancedGeneralEquipmentModule getEnhancedGeneralEquipmentModule() 
	{
		if(objEnhancedGeneralEquipmentModule == null)
		{
			objEnhancedGeneralEquipmentModule = new EnhancedGeneralEquipmentModule(objIDataSet);
			return objEnhancedGeneralEquipmentModule;
		}
		return objEnhancedGeneralEquipmentModule;
	}
	/**
	 * Retrieves pre-initialized instance of Presentation State Identification Module. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return PresentationStateIdentificationModule - instance of {@link PresentationStateIdentificationModule}.
	 */
	public PresentationStateIdentificationModule getPresentationStateIdentificationModule()
	{
		if(objPresentationStateIdentificationModule == null)
		{
			objPresentationStateIdentificationModule = new PresentationStateIdentificationModule(objIDataSet);
			return objPresentationStateIdentificationModule;
		}
		return objPresentationStateIdentificationModule;
	}
	
	/**
	 * Retrieves pre-initialized instance of StructuredDisplayImageBoxModule. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return PresentationStateBlendingModule - instance of {@link PresentationStateBlendingModule}.
	 */
	public PresentationStateBlendingModule getPresentationStateBlendingModule()
	{
		if(objPresentationStateBlendingModule == null)
		{
			objPresentationStateBlendingModule = new PresentationStateBlendingModule(objIDataSet);
			return objPresentationStateBlendingModule;
		}
		return objPresentationStateBlendingModule;
	}
	/**
	 * Retrieves pre-initialized instance of StructuredDisplayAnnotationModule . Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return StructuredDisplayAnnotationModule - instance of {@link StructuredDisplayAnnotationModule}.
	 */
	public StructuredDisplayAnnotationModule getStructuredDisplayAnnotationModule()
	{
		if(objStructuredDisplayAnnotationModule == null)
		{
			objStructuredDisplayAnnotationModule = new StructuredDisplayAnnotationModule(objIDataSet);
			return objStructuredDisplayAnnotationModule;
		}
		return objStructuredDisplayAnnotationModule;
	}
	/**
	 * Retrieves pre-initialized instance of DisplayedAreaModule. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return DisplayedAreaModule - instance of {@link DisplayedAreaModule}.
	 */
	public DisplayedAreaModule getDisplayedAreaModule()
	{
		if(objDisplayedAreaModule == null)
		{
			objDisplayedAreaModule = new DisplayedAreaModule(objIDataSet);
			return objDisplayedAreaModule;
		}
		return objDisplayedAreaModule;
	}
	/**
	 * Retrieves pre-initialized instance of GraphicAnnotationModule. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return GraphicAnnotationModule - instance of {@link GraphicAnnotationModule}.
	 */
	public GraphicAnnotationModule getGraphicAnnotationModule() 
	{
		if(objGraphicAnnotationModule == null)
		{
			objGraphicAnnotationModule = new GraphicAnnotationModule(objIDataSet);
			return objGraphicAnnotationModule;
		}
		return objGraphicAnnotationModule;
	}
	/**
	 * Retrieves pre-initialized instance of GraphicLayerModule. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return GraphicLayerModule - instance of {@link GraphicLayerModule}.
	 */
	public GraphicLayerModule getGraphicLayerModule() 
	{
		if(objGraphicLayerModule == null)
		{
			objGraphicLayerModule = new GraphicLayerModule(objIDataSet);
			return objGraphicLayerModule;
		}
		return objGraphicLayerModule;
	}
	/**
	 * Retrieves pre-initialized instance of Graphic Group Module. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return GraphicGroupModule - instance of {@link GraphicGroupModule}.
	 */
	public GraphicGroupModule getGraphicGroupModule() 
	{
		if(objGraphicGroupModule== null)
		{
			objGraphicGroupModule = new GraphicGroupModule(objIDataSet);
			return objGraphicGroupModule;
		}
		return objGraphicGroupModule;
	}
	/**
	 * Retrieves pre-initialized instance of SpatialTransformationModule. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return SpatialTransformationModule - instance of {@link SpatialTransformationModule}.
	 */
	public SpatialTransformationModule getSpatialTransformationModule() 
	{
		if(objSpatialTransformationModule == null)
		{
			objSpatialTransformationModule = new SpatialTransformationModule(objIDataSet);
			return objSpatialTransformationModule;
		}
		return objSpatialTransformationModule;
	}
	/**
	 * Retrieves pre-initialized instance of ICC Profile Module. Creates a new instance
	 * if no pre-existing module instance is available.If previously created instance is
	 * present then returns the same module instance.
	 * 
	 * @return ICCProfileModule - instance of {@link ICCProfileModule}.
	 */
	public ICCProfileModule getICCProfileModule() 
	{
		if(objICCProfileModule == null)
		{
			objICCProfileModule = new ICCProfileModule(objIDataSet);
			return objICCProfileModule;
		}
		return objICCProfileModule;
	}
	/**
	 * This method validates Image IOD according to the Module Table given in The DICOM Standard.
	 * The validate method fails if one of the mandatory modules are absent or any of the
	 * modules are invalid. The validate method also checks for conditional modules.
	 * 
	 * @return - status of validation as success or failure
	 * 
	 * @throws InvalidIODException the invalid iod exception
	 */
	public boolean validate() throws InvalidIODException
	{
		try
		{
			super.validate();

			/*
			 * The implementation is given in the following way because it may be needed this way 
			 * during exception handling when exact source of failure is to be decided.
			 * This condition checks for ImageIOD's common mandatory modules validation
			 */
			getPatientModule().validateModule();
			getGeneralStudyModule().validateModule();
			getGeneralSeriesModule().validateModule();
			getGeneralEquipmentModule().validateModule();
			getSOPCommonModule().validateModule();
			getPresentationStateIdentificationModule().validateModule();
			getPresentationStateBlendingModule().validateModule();
			getPaletteColorLookupTableModule().validateModule();
			getICCProfileModule().validateModule();

			
			/*
			 * This condition checks for Image IOD's user optional modules validation
			 */
			if(isModulePresent(PatientStudyModule.objSingleCollection, objIDataSet))
			{
				getPatientStudyModule().validateModule();
			}
			if(isModulePresent(ClinicalTrialSeriesModule.objSingleCollection, objIDataSet))
			{
				getClinicalTrialSeriesModule().validateModule();
			}
			if(isModulePresent(ClinicalTrialSubjectModule.objSingleCollection, objIDataSet))
			{
				getClinicalTrialSubjectModule().validateModule();
			}
			if(isModulePresent(ClinicalTrialStudyModule.objSingleCollection, objIDataSet))
			{
				getClinicalTrialStudyModule().validateModule();
			}
			if(isModulePresent(StructuredDisplayAnnotationModule.objSingleCollection, objIDataSet))
			{
				getStructuredDisplayAnnotationModule().validateModule();
			}
			if(isModulePresent(DisplayedAreaModule.objSingleCollection, objIDataSet))
			{
				getDisplayedAreaModule().validateModule();
			}
			if(isModulePresent(GraphicGroupModule.objSingleCollection, objIDataSet))
			{
				getGraphicGroupModule().validateModule();
			}
			if(isModulePresent(SpatialTransformationModule.objSingleCollection, objIDataSet))
			{
				getSpatialTransformationModule().validateModule();
			}

			/*Validate conditional modules*/
			/*
			 * Condition for validating conditional modules are not clear
			 * Hence not validated.
			 * Refer p.d.f Chapter 3
			 * Page No :- 155
			 */
			if(isModulePresent(GraphicAnnotationModule.objSingleCollection, objIDataSet))
			{
				getGraphicAnnotationModule().validateModule();
			}
			if(isModulePresent(GraphicLayerModule.objSingleCollection, objIDataSet))
			{
				getGraphicLayerModule().validateModule();
			}
		}
		catch(InvalidModuleException ime)
		{
			if(DicomConfig.createInstance().isLoggingOn())
				DicomLogger.getLogger().log(ime.getMessage());
			
				throw new InvalidIODException(ime.getMessage(),ime);
		}
		return true;
	}

	/**
	 *  Dumps the Name of Module and corresponding Attributs of IOD.
	 *  @param objIDicomStream - the Stream on which the Data is to be written.
	 *  @throws IOException - Exception is thrown indicating runtime failure of writing operation.
	 */
	public void dumpDICOMInfo(IDicomStream objIDicomStream) throws IOException
	{
		super.dumpDICOMInfo(objIDicomStream);
		objIDicomStream.writeString(BLENDING_SOFT_COPY_PRESENTATION_STATE_IOD+ "\n");
		
		objIDicomStream.writeString("\t" + getPatientModule().getClass().getSimpleName() + "\n");
		getPatientModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getGeneralStudyModule().getClass().getSimpleName() + "\n");
		getGeneralStudyModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getPatientStudyModule().getClass().getSimpleName() + "\n");
		getPatientStudyModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getGeneralSeriesModule().getClass().getSimpleName() + "\n");
		getGeneralSeriesModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getClinicalTrialSeriesModule().getClass().getSimpleName() + "\n");
		getClinicalTrialSeriesModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getGeneralEquipmentModule().getClass().getSimpleName() + "\n");
		getGeneralEquipmentModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getClinicalTrialSubjectModule().getClass().getSimpleName() + "\n");
		getClinicalTrialSubjectModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getClinicalTrialStudyModule().getClass().getSimpleName() + "\n");
		getClinicalTrialStudyModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getEnhancedGeneralEquipmentModule().getClass().getSimpleName() + "\n");
		getEnhancedGeneralEquipmentModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getSOPCommonModule().getClass().getSimpleName() + "\n");
		getSOPCommonModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getPresentationStateIdentificationModule().getClass().getSimpleName() + "\n");
		getPresentationStateIdentificationModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getPresentationStateBlendingModule().getClass().getSimpleName() + "\n");
		getPresentationStateBlendingModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getStructuredDisplayAnnotationModule().getClass().getSimpleName() + "\n");
		getStructuredDisplayAnnotationModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getDisplayedAreaModule().getClass().getSimpleName() + "\n");
		getDisplayedAreaModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getGraphicAnnotationModule().getClass().getSimpleName() + "\n");
		getGraphicAnnotationModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getGraphicLayerModule().getClass().getSimpleName() + "\n");
		getGraphicLayerModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getGraphicGroupModule().getClass().getSimpleName() + "\n");
		getGraphicGroupModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getSpatialTransformationModule().getClass().getSimpleName() + "\n");
		getSpatialTransformationModule().dumpDICOMInfo(objIDicomStream);

		objIDicomStream.writeString("\t" + getPaletteColorLookupTableModule().getClass().getSimpleName() + "\n");
		getPaletteColorLookupTableModule().dumpDICOMInfo(objIDicomStream);
		
		objIDicomStream.writeString("\t" + getICCProfileModule().getClass().getSimpleName() + "\n");
		getICCProfileModule().dumpDICOMInfo(objIDicomStream);
	}

	/**
	 * Checks whether the Module is present in the IOD or not.
	 * @param strModuleName String value of module name 
	 * @return boolean - true if the module is present in the IOD, else false is returned.
	 */
	public boolean isModulePresent(String strModuleName)
	{
		if(!super.isModulePresent(strModuleName))
		{
			if(strModuleName == null || strModuleName.equals(""))
				return false;
			if(strModuleName.equalsIgnoreCase(EnumModuleNames.PATIENT_MODULE.getValue()) && isModulePresent(PatientModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.GENERAL_STUDY_MODULE.getValue()) && isModulePresent(GeneralStudyModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.PATIENT_STUDY_MODULE.getValue()) && isModulePresent(PatientStudyModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.GENERAL_SERIES_MODULE.getValue()) && isModulePresent(GeneralSeriesModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.CLINICAL_TRIAL_SERIES_MODULE.getValue()) && isModulePresent(ClinicalTrialSeriesModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.GENERAL_EQUIPMENT_MODULE.getValue()) && isModulePresent(GeneralEquipmentModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.IMAGE_PIXEL_MODULE.getValue()) && isModulePresent(ImagePixelModule.objSingleCollection))
				return true;
			if(strModuleName.equalsIgnoreCase(EnumModuleNames.CLINICAL_TRIAL_SUBJECT_MODULE.getValue()) && isModulePresent(ClinicalTrialSubjectModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.CLINICAL_TRIAL_STUDY_MODULE.getValue()) && isModulePresent(ClinicalTrialStudyModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.SOP_COMMON_MODULE.getValue()) && isModulePresent(SOPCommonModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.ENHANCED_GENERAL_EQUIPMENT_MODULE.getValue()) && isModulePresent(EnhancedGeneralEquipmentModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.PRESENTATION_STATE_IDENTIFICATION_MODULE.getValue()) && isModulePresent(PresentationStateIdentificationModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.PRESENTATION_STATE_BLENDING_MODULE.getValue()) && isModulePresent(PresentationStateBlendingModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.STRUCTURED_DISPLAY_ANNOTATION_MODULE.getValue()) && isModulePresent(StructuredDisplayAnnotationModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.DISPLAYED_AREA_MODULE.getValue()) && isModulePresent(DisplayedAreaModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.GRAPHIC_ANNOTATION_MODULE.getValue()) && isModulePresent(GraphicAnnotationModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.GRAPHIC_LAYER_MODULE.getValue()) && isModulePresent(GraphicLayerModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.GRAPHIC_GROUP_MODULE.getValue()) && isModulePresent(SOPCommonModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.SPATIAL_TRANSFORMATION_MODULE.getValue()) && isModulePresent(SpatialTransformationModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.PALETTE_COLOR_LOOKUP_TABLE_MODULE.getValue()) && isModulePresent(PaletteColorLookupTableModule.objSingleCollection))
				return true;
			else if(strModuleName.equalsIgnoreCase(EnumModuleNames.ICC_PROFILE_MODULE.getValue()) && isModulePresent(ICCProfileModule.objSingleCollection))
				return true;
			else
				return false;
		}
		return true;
	}
}
