package eu.dnetlib.espas.data.harvest;

import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Formatter;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class CreateSyntheticXMLData {

	public static final String ESPAS_SYNTHETIC_DATA_NS 								= "http://espasdummyurl.eu";

	public static final String ESPAS_SYNTHETIC_DATA_XMLNS 							= "http://www.w3.org/2000/xmlns/";
	public static final String ESPAS_SYNTHETIC_DATA_PARAMETER_VOCABULARY 			= "http://vocabs.espas-fp7.eu/characteristicObserved/%04d";
	public static final String ESPAS_SYNTHETIC_DATA_LINK 							= "http://www.noa.gr/athens/%04d";

	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_RECORDS					= "Records";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_ACQUISITION				= "Acquisition";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_PROGRAM 				= "Program";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_INSTRUMENT 				= "Instrument";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_DATASET 				= "Dataset";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_PERSON	 				= "Person";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_ORGANISATION			= "Organisation";
	public static final String ESPAS_SYNTHETIC_ROOT_ELEMENT_OBSERVATORY 			= "Observatory";

	public static final String ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME	= "export.directory";

	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_ACQUISITIONS_KEY			= "number.non.mixed.acquisitions";
	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_PROGRAMS_KEY				= "number.non.mixed.programs";
	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_INSTRUMENTS_KEY			= "number.non.mixed.instruments";
	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_DATASETS_KEY				= "number.non.mixed.datasets";
	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_PERSONS_KEY				= "number.non.mixed.persons";
	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_ORGANISATIONS_KEY			= "number.non.mixed.organisations";
	public static final String ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_OBSERVATORIES_KEY			= "number.non.mixed.observatories";

	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_ACQUISITIONS_KEY				= "number.mixed.acquisitions";
	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_PROGRAMS_KEY					= "number.mixed.programs";
	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_INSTRUMENTS_KEY				= "number.mixed.instruments";
	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_DATASETS_KEY					= "number.mixed.datasets";
	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_PERSONS_KEY					= "number.mixed.persons";
	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_ORGANISATIONS_KEY				= "number.mixed.organisations";
	public static final String ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_OBSERVATORIES_KEY				= "number.mixed.observatories";

	public static final String ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN				= "localID%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_ACQUISITION_PATTERN		= "acquisition%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_PRORGAM_PATTERN			= "program%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_INSTRUMENT_PATTERN		= "instrument%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_DATASET_PATTERN			= "dataset%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_PERSON_PATTERN			= "person%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_ORGANISATION_PATTERN		= "organisation%07d";
	public static final String ESPAS_SYNTHETIC_DATA_GML_ID_OBSERVATORY_PATTERN		= "observatory%07d";

	public static final String ESPAS_SYNTHETIC_DATA_FILE_SUFFIX						= ".xml";
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_MIXED_RECORDS		= "records" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_ACQUISITION		= "acquisition%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_PROGRAM			= "program%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_INSTRUMENT			= "instrument%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_DATASET			= "dataset%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_PERSON				= "person%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_ORGANISATION		= "organisation%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;
	public static final String ESPAS_SYNTHETIC_DATA_FILE_PATTERN_OBSERVATORY		= "observatory%07d" + ESPAS_SYNTHETIC_DATA_FILE_SUFFIX;

	// Acquisition related stuff.

	// Program related stuff.
	public static final String ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN		= "Description for program%07d.";

	// Instrument related stuff.
	public static final String[] ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY = new String[]
	{
		"instrument-type-1", "instrument-type-2", "instrument-type-3", "instrument-type-4",  "instrument-type-5"
	};

	public static final String[] ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY = new String[]
	{
		"measurement-parameter-1", "measurement-parameter-2", "measurement-parameter-3", "measurement-parameter-4",  "measurement-parameter-5"
	};

	static {
		try {
			Properties properties = new Properties();
			properties.load(CreateSyntheticXMLData.class.getResourceAsStream("/eu/dnetlib/espas/data/harvest/log4j.properties"));
			PropertyConfigurator.configure(properties);
		}
		catch (IOException e) {
		}
	}

	public Logger logger = Logger.getLogger(CreateSyntheticXMLData.class);

	public CreateSyntheticXMLData() {}

	public void createAndExportSynetheticData() {
		this.createNonMixedRecordFiles();
		this.createMixedRecordFiles();
	}

	public void createNonMixedRecordFiles() {
		this.createAcquisitionRecordsFiles();
		this.createProgramRecordsFiles();
		this.createInstrumentRecordsFiles();
		this.createDatasetRecordsFiles();
		this.createPersonRecordsFiles();
		this.createOrganisationRecordsFiles();
		this.createObservatoryRecordsFiles();
	}

	public void createMixedRecordFiles() {
		long numberOfNonMixedAcquisitions = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_ACQUISITIONS_KEY));
		long numberOfMixedAcquisitions = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_ACQUISITIONS_KEY));
		long numberOfNonMixedPrograms = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_PROGRAMS_KEY));
		long numberOfMixedPrograms = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_PROGRAMS_KEY));
		long numberOfNonMixedInstruments = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_INSTRUMENTS_KEY));
		long numberOfMixedInstruments = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_INSTRUMENTS_KEY));
		long numberOfNonMixedDatasets = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_DATASETS_KEY));
		long numberOfMixedDatasets = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_DATASETS_KEY));
		long numberOfNonMixedPersons = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_PERSONS_KEY));
		long numberOfMixedPersons = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_PERSONS_KEY));
		long numberOfNonMixedOrganisations = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_ORGANISATIONS_KEY));
		long numberOfMixedOrganisations = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_ORGANISATIONS_KEY));
		long numberOfNonMixedObservatories = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_OBSERVATORIES_KEY));
		long numberOfMixedObservatories = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_MIXED_NUM_OF_OBSERVATORIES_KEY));
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		String currentFileName = ESPAS_SYNTHETIC_DATA_FILE_PATTERN_MIXED_RECORDS;
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			Document document = documentBuilder.newDocument();
			Element records = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_RECORDS);
			records.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			records.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			records.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			document.appendChild(records);
			for(long i = numberOfNonMixedAcquisitions + 1; i <= numberOfNonMixedAcquisitions + numberOfMixedAcquisitions; i++) {
				records.appendChild(this.createAcquisitionElement(document, i));
			}
			for(long i = numberOfNonMixedPrograms + 1; i <= numberOfNonMixedPrograms + numberOfMixedPrograms; i++) {
				records.appendChild(this.createProgramElement(document, i));
			}
			for(long i = numberOfNonMixedInstruments + 1; i <= numberOfNonMixedInstruments + numberOfMixedInstruments; i++) {
				records.appendChild(this.createInstrumentElement(document, i));
			}
			for(long i = numberOfNonMixedDatasets + 1; i <= numberOfNonMixedDatasets + numberOfMixedDatasets; i++) {
				records.appendChild(this.createDatasetElement(document, i));
			}
			for(long i = numberOfNonMixedPersons + 1; i <= numberOfNonMixedPersons + numberOfMixedPersons; i++) {
				records.appendChild(this.createPersonElement(document, i));
			}
			for(long i = numberOfNonMixedOrganisations + 1; i <= numberOfNonMixedOrganisations + numberOfMixedOrganisations; i++) {
				records.appendChild(this.createOrganisationElement(document, i));
			}
			for(long i = numberOfNonMixedObservatories + 1; i <= numberOfNonMixedObservatories + numberOfMixedObservatories; i++) {
				records.appendChild(this.createObservatoryElement(document, i));
			}
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (ParserConfigurationException e) {
			logger.error("Parser configuration exception.", e);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public void createAcquisitionRecordsFiles() {
		long numberOfAcquisitions = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_ACQUISITIONS_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfAcquisitions; currentRecordNumber++) {
			this.createAcquisitionRecordFile(currentRecordNumber);
		}
	}

	public void createAcquisitionRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_ACQUISITION, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createAcquisitionDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createAcquisitionDocument(long currentRecordNumber) {
		Document document = null;
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createAcquisitionElement(document, currentRecordNumber));
		}
		catch (ParserConfigurationException e) {
			logger.error("Parser configuration exception.", e);
		}
		return document;
	}

	public Element createAcquisitionElement(Document document, long currentRecordNumber) {
		Element acquisition = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "acquisition" element.
			acquisition = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_ACQUISITION);
			// Add additional namespaces to the root element.
			acquisition.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			acquisition.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			acquisition.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_ACQUISITION_PATTERN, currentRecordNumber);
			acquisition.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			acquisition.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "acquisitionTime".
			Element acquisitionTime = document.createElement("acquisitionTime");
			acquisition.appendChild(acquisitionTime);

			// Create element "gmlTimeInstant".
			Element gmlTimeInstant = document.createElement("gml:TimeInstant");
			gmlTimeInstant.setAttribute("gml:id", "t1");
			acquisitionTime.appendChild(gmlTimeInstant);

			// Create element "gmlTimePosition".
			Element gmlTimePosition = document.createElement("gml:timePosition");
			gmlTimePosition.setTextContent(dateFormat.format(dateFormat.parse("2005-10-16T14:42+0300")));
			gmlTimeInstant.appendChild(gmlTimePosition);

			// Create element "metadata".
			Element metadata = document.createElement("metadata");
			metadata.setAttribute("xlink:href", "eiscat");
			acquisition.appendChild(metadata);

			// Create element "procedure".
			Element procedure = document.createElement("procedure");
			procedure.setAttribute("xlink:href", "eiscat");
			acquisition.appendChild(procedure);

			// Create element "observedProperty".
			Element observedProperty = document.createElement("observedProperty");
			acquisition.appendChild(observedProperty);

			// Create element "ObservedCharacteristics".
			Element observedCharacteristics = document.createElement("ObservedCharacteristics");
			observedCharacteristics.setAttribute("gml:id", "obs1");
			observedProperty.appendChild(observedCharacteristics);

			for(int i = 1; i <= 10; i++) {
				// Create element "characteristicObserved".
				formatter = new Formatter();
				formatter.format(ESPAS_SYNTHETIC_DATA_PARAMETER_VOCABULARY, i);
				Element characteristicObserved = document.createElement("characteristicObserved");
				characteristicObserved.setAttribute("xlink:href", formatter.toString());
				formatter.close();
				observedCharacteristics.appendChild(characteristicObserved);
			}

			// Create element "featureOfInterest".
			Element featureOfInterest = document.createElement("featureOfInterest");
			featureOfInterest.appendChild(document.createComment(" Geographic location of sampling, this is just a point, later we might want more complex sampling regimes. "));
			acquisition.appendChild(featureOfInterest);

			// Create element "SamplingFeature".
			Element samplingFeature = document.createElement("SamplingFeature");
			samplingFeature.setAttribute("gml:id", "sf1");
			featureOfInterest.appendChild(samplingFeature);

			// Create element "spatialLocation".
			Element spatialLocation = document.createElement("spatialLocation");
			samplingFeature.appendChild(spatialLocation);

			// Create element "gml:Envelope".
			Element gmlEnvelope = document.createElement("gml:Envelope");
			spatialLocation.appendChild(gmlEnvelope);

			// Create element "gml:lowerCorner".
			Element gmlLowerCorner = document.createElement("gml:lowerCorner");
			gmlLowerCorner.setTextContent(" 0.000   0.000 ");
			gmlEnvelope.appendChild(gmlLowerCorner);

			// Create element "gml:upperCorner".
			Element gmlUpperCorner = document.createElement("gml:upperCorner");
			gmlUpperCorner.setTextContent(" 0.000   0.000 ");
			gmlEnvelope.appendChild(gmlUpperCorner);

			// Create element "result".
			Element result = document.createElement("result");
			acquisition.appendChild(result);

			// Create element "DataProductSet".
			Element dataProductSet = document.createElement("DataProductSet");
			dataProductSet.setAttribute("gml:id", "dataProductSet1");
			result.appendChild(dataProductSet);

			// Create element "contains".
			Element contains = document.createElement("contains");
			dataProductSet.appendChild(contains);

			// Create element "Data".
			Element data = document.createElement("Data");
			data.setAttribute("gml:id", "data1");
			contains.appendChild(data);

			// Create element "title".
			Element title = document.createElement("title");
			title.setTextContent("Data product set 1.");
			data.appendChild(title);

			// Create element "link".
			Element link = document.createElement("link");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LINK, 1);
			link.setTextContent(formatter.toString());
			formatter.close();
			data.appendChild(link);

			// Create element "mediaType".
			Element mediaType = document.createElement("mediaType");
			mediaType.setTextContent("html/text");
			data.appendChild(mediaType);
		}
		catch (java.text.ParseException e) {
			logger.error("Parse exception.", e);
		}
		return acquisition;
	}

	public void createProgramRecordsFiles() {
		long numberOfPrograms = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_PROGRAMS_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfPrograms; currentRecordNumber++) {
			this.createProgramRecordFile(currentRecordNumber);
		}
	}

	public void createProgramRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_PROGRAM, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createProgramDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createProgramDocument(long currentRecordNumber) {
		Document document = null;
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createProgramElement(document, currentRecordNumber));
		}
		catch (ParserConfigurationException e) {
			logger.error("Parser configuration exception.", e);
		}
		return document;
	}

	public Element createProgramElement(Document document, long currentRecordNumber) {
		Element program = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "program" element.
			program = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_PROGRAM);
			// Add additional namespaces to the root element.
			program.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			program.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			program.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_PRORGAM_PATTERN, currentRecordNumber);
			program.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			program.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "name".
			Element name = document.createElement("name");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			name.setTextContent(formatter.toString());
			formatter.close();
			program.appendChild(name);

			// Create element "description".
			Element description = document.createElement("description");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN, currentRecordNumber);
			description.setTextContent(formatter.toString());
			formatter.close();
			program.appendChild(description);

			// Create element "runBy".
			Element runBy = document.createElement("runBy");
			runBy.setAttribute("xlink:href", "eiscat");
			program.appendChild(runBy);
		}
		catch (java.text.ParseException e) {
			logger.error("Parse exception.", e);
		}
		return program;
	}

	public void createInstrumentRecordsFiles() {
		long numberOfInstruments = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_INSTRUMENTS_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfInstruments; currentRecordNumber++) {
			this.createInstrumentRecordFile(currentRecordNumber);
		}
	}

	public void createInstrumentRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_INSTRUMENT, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createInstrumentDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createInstrumentDocument(long currentRecordNumber) {
		Document document = null;
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createInstrumentElement(document, currentRecordNumber));
		}
		catch (ParserConfigurationException e) {
			logger.error("Parser configuration exception.", e);
		}
		return document;
	}

	public Element createInstrumentElement(Document document, long currentRecordNumber) {
		Element instrument = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "instrument" element.
			instrument = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_INSTRUMENT);
			// Add additional namespaces to the root element.
			instrument.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			instrument.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			instrument.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_INSTRUMENT_PATTERN, currentRecordNumber);
			instrument.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			instrument.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "name".
			Element name = document.createElement("name");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			name.setTextContent(formatter.toString());
			formatter.close();
			instrument.appendChild(name);

			// Create element "description".
			Element description = document.createElement("description");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN, currentRecordNumber);
			description.setTextContent(formatter.toString());
			formatter.close();
			instrument.appendChild(description);

			// Create element "managedBy".
			Element managedBy = document.createElement("managedBy");
			managedBy.setAttribute("xlink:href", "eiscat");
			instrument.appendChild(managedBy);

			// Create element "acquisitionType".
			Element acquisitionType  = document.createElement("acquisitionType");
			acquisitionType.setTextContent("Remote");
			instrument.appendChild(acquisitionType);

			// Append comment.
			instrument.appendChild(document.createComment(" The instrument type must come from a controlled vocabulary. "));

			// Create element "instrumentType".
			Element instrumentType  = document.createElement("instrumentType");
			instrumentType.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/instrumentTypes" + "/" +
			ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY[(int)currentRecordNumber % ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY.length]);
			instrument.appendChild(instrumentType);

			instrument.appendChild(document.createComment(" The parameters the instrument can measure must come from a controlled vocabulary TBD!!! "));

			for(int i = 0; i < ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY.length; i++) {
				Element measures = document.createElement("measures");
				measures.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/measurementParameter" + "/" +
				ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY[i]);
				instrument.appendChild(measures);
			}

			Element coupledWith = document.createElement("coupledWith");
			coupledWith.setAttribute("xlink:href", "eiscat");
			instrument.appendChild(coupledWith);
		}
		catch (java.text.ParseException e) {
			logger.error("Parse exception.", e);
		}
		return instrument;
	}

	public void createDatasetRecordsFiles() {
		long numberOfDatasets = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_DATASETS_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfDatasets; currentRecordNumber++) {
			this.createDatasetRecordFile(currentRecordNumber);
		}
	}

	public void createDatasetRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_DATASET, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createDatasetDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createDatasetDocument(long currentRecordNumber) {
		Document document = null;
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createDatasetElement(document, currentRecordNumber));
		}
		catch(ParserConfigurationException e) {
			logger.error("Parser configuration exception.", e);
		}
		return document;
	}

	public Element createDatasetElement(Document document, long currentRecordNumber) {
		Element dataset = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "dataset" element.
			dataset = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_DATASET);
			// Add additional namespaces to the root element.
			dataset.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			dataset.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			dataset.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_DATASET_PATTERN, currentRecordNumber);
			dataset.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			dataset.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "name".
			Element name = document.createElement("name");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			name.setTextContent(formatter.toString());
			formatter.close();
			dataset.appendChild(name);

			// Create element "description".
			Element description = document.createElement("description");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN, currentRecordNumber);
			description.setTextContent(formatter.toString());
			formatter.close();
			dataset.appendChild(description);

			// Create element "managedBy".
			Element managedBy = document.createElement("managedBy");
			managedBy.setAttribute("xlink:href", "eiscat");
			dataset.appendChild(managedBy);

			// Create element "acquisitionType".
			Element acquisitionType  = document.createElement("acquisitionType");
			acquisitionType.setTextContent("Remote");
			dataset.appendChild(acquisitionType);

			// Append comment.
			dataset.appendChild(document.createComment(" The instrument type must come from a controlled vocabulary. "));

			// Create element "instrumentType".
			Element instrumentType  = document.createElement("instrumentType");
			instrumentType.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/instrumentTypes" + "/" +
			ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY[(int)currentRecordNumber % ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY.length]);
			dataset.appendChild(instrumentType);

			dataset.appendChild(document.createComment(" The parameters the instrument can measure must come from a controlled vocabulary TBD!!! "));

			for(int i = 0; i < ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY.length; i++) {
				Element measures = document.createElement("measures");
				measures.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/measurementParameter" + "/" +
				ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY[i]);
				dataset.appendChild(measures);
			}

			Element coupledWith = document.createElement("coupledWith");
			coupledWith.setAttribute("xlink:href", "eiscat");
			dataset.appendChild(coupledWith);
		}
		catch (java.text.ParseException e) {
			logger.error("Parse exception.", e);
		}
		return dataset;
	}

	public void createPersonRecordsFiles() {
		long numberOfPersons = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_PERSONS_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfPersons; currentRecordNumber++) {
			this.createPersonRecordFile(currentRecordNumber);
		}
	}

	public void createPersonRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_PERSON, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createPersonDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createPersonDocument(long currentRecordNumber) {
		Document document = null;
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createPersonElement(document, currentRecordNumber));
		}
		catch (ParserConfigurationException e) {
			logger.error("Parser configuration exception.", e);
		}
		return document;
	}

	public Element createPersonElement(Document document, long currentRecordNumber) {
		Element person = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "person" element.
			person = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_PERSON);
			// Add additional namespaces to the root element.
			person.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			person.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			person.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_PERSON_PATTERN, currentRecordNumber);
			person.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			person.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "name".
			Element name = document.createElement("name");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			name.setTextContent(formatter.toString());
			formatter.close();
			person.appendChild(name);

			// Create element "description".
			Element description = document.createElement("description");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN, currentRecordNumber);
			description.setTextContent(formatter.toString());
			formatter.close();
			person.appendChild(description);

			// Create element "managedBy".
			Element managedBy = document.createElement("managedBy");
			managedBy.setAttribute("xlink:href", "eiscat");
			person.appendChild(managedBy);

			// Create element "acquisitionType".
			Element acquisitionType  = document.createElement("acquisitionType");
			acquisitionType.setTextContent("Remote");
			person.appendChild(acquisitionType);

			// Append comment.
			person.appendChild(document.createComment(" The instrument type must come from a controlled vocabulary. "));

			// Create element "instrumentType".
			Element instrumentType  = document.createElement("instrumentType");
			instrumentType.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/instrumentTypes" + "/" +
			ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY[(int)currentRecordNumber % ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY.length]);
			person.appendChild(instrumentType);

			person.appendChild(document.createComment(" The parameters the instrument can measure must come from a controlled vocabulary TBD!!! "));

			for(int i = 0; i < ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY.length; i++) {
				Element measures = document.createElement("measures");
				measures.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/measurementParameter" + "/" +
				ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY[i]);
				person.appendChild(measures);
			}

			Element coupledWith = document.createElement("coupledWith");
			coupledWith.setAttribute("xlink:href", "eiscat");
			person.appendChild(coupledWith);
		}
		catch (java.text.ParseException e) {
			logger.error("Parse exception.", e);
		}
		return person;
	}

	public void createOrganisationRecordsFiles() {
		long numberOfOrganisations = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_ORGANISATIONS_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfOrganisations; currentRecordNumber++) {
			this.createOrganisationRecordFile(currentRecordNumber);
		}
	}

	public void createOrganisationRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_ORGANISATION, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createOrganisationDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createOrganisationDocument(long currentRecordNumber) {
		Document document = null;
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createOrganisationElement(document, currentRecordNumber));
		}
		catch(ParserConfigurationException e) {
			logger.error("Parser Configuration Exception.", e);
		}
		return document;
	}

	public Element createOrganisationElement(Document document, long currentRecordNumber) {
		Element organisation = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "organisation" element.
			organisation = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_ORGANISATION);
			// Add additional namespaces to the root element.
			organisation.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			organisation.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			organisation.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_ORGANISATION_PATTERN, currentRecordNumber);
			organisation.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			organisation.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "name".
			Element name = document.createElement("name");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			name.setTextContent(formatter.toString());
			formatter.close();
			organisation.appendChild(name);

			// Create element "description".
			Element description = document.createElement("description");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN, currentRecordNumber);
			description.setTextContent(formatter.toString());
			formatter.close();
			organisation.appendChild(description);

			// Create element "managedBy".
			Element managedBy = document.createElement("managedBy");
			managedBy.setAttribute("xlink:href", "eiscat");
			organisation.appendChild(managedBy);

			// Create element "acquisitionType".
			Element acquisitionType  = document.createElement("acquisitionType");
			acquisitionType.setTextContent("Remote");
			organisation.appendChild(acquisitionType);

			// Append comment.
			organisation.appendChild(document.createComment(" The instrument type must come from a controlled vocabulary. "));

			// Create element "instrumentType".
			Element instrumentType  = document.createElement("instrumentType");
			instrumentType.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/instrumentTypes" + "/" +
			ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY[(int)currentRecordNumber % ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY.length]);
			organisation.appendChild(instrumentType);

			organisation.appendChild(document.createComment(" The parameters the instrument can measure must come from a controlled vocabulary TBD!!! "));

			for(int i = 0; i < ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY.length; i++) {
				Element measures = document.createElement("measures");
				measures.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/measurementParameter" + "/" +
				ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY[i]);
				organisation.appendChild(measures);
			}

			Element coupledWith = document.createElement("coupledWith");
			coupledWith.setAttribute("xlink:href", "eiscat");
			organisation.appendChild(coupledWith);
		}
		catch (java.text.ParseException e) {
			logger.error("Parse exception.", e);
		}
		return organisation;
	}

	public void createObservatoryRecordsFiles() {
		long numberOfObservatories = Integer.parseInt(Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_NON_MIXED_NUM_OF_OBSERVATORIES_KEY));
		for(long currentRecordNumber = 1; currentRecordNumber <= numberOfObservatories; currentRecordNumber++) {
			this.createObservatoryRecordFile(currentRecordNumber);
		}
	}

	public void createObservatoryRecordFile(long currentRecordNumber) {
		String exportDirectory = Configuration.getConfiguration().getProperty(ESPAS_SYNTHETIC_DATA_EXPORT_DIRECTORY_PROPERTY_NAME);
		Formatter formatter = new Formatter();
		formatter.format(ESPAS_SYNTHETIC_DATA_FILE_PATTERN_OBSERVATORY, currentRecordNumber);
		String currentFileName = formatter.toString();
		formatter.close();
		logger.debug("Export Directory : " + Configuration.getConfiguration().getProperty("export.directory") + "\n");
		try {
			Document document = this.createObservatoryDocument(currentRecordNumber);
			// write the content into xml file
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
			DOMSource domSource = new DOMSource(document);
			File _exportDirectory = new File(exportDirectory);
			_exportDirectory.mkdirs();
			StreamResult streamResult = new StreamResult(new File(exportDirectory + "/" + currentFileName));
			transformer.transform(domSource, streamResult);
		}
		catch (TransformerException e) {
			logger.error("Transformation exception.", e);
		}
	}

	public Document createObservatoryDocument(long currentRecordNumber) {
		Document document = null;
		try {
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			documentBuilderFactory.setNamespaceAware(true);
			DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
			document = documentBuilder.newDocument();
			document.appendChild(this.createObservatoryElement(document, currentRecordNumber));
		}
		catch(ParserConfigurationException e) {
			logger.error("Parser Configuration Exception.", e);
		}
		return document;
	}

	public Element createObservatoryElement(Document document, long currentRecordNumber) {
		Element observatory = null;
		try {
			// Create a document with the default namespace and a root node.
			// Create "observatory" element.
			observatory = document.createElementNS(ESPAS_SYNTHETIC_DATA_NS, ESPAS_SYNTHETIC_ROOT_ELEMENT_OBSERVATORY);
			// Add additional namespaces to the root element.
			observatory.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
			observatory.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:xlink", "http://www.w3.org/1999/xlink");
			observatory.setAttributeNS(ESPAS_SYNTHETIC_DATA_XMLNS, "xmlns:gml", "http://www.opengis.net/gml/3.2");
			Formatter formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_GML_ID_OBSERVATORY_PATTERN, currentRecordNumber);
			observatory.setAttribute("gml:id", formatter.toString());
			formatter.close();

			// Create element "espasID".
			Element espasID = document.createElement("espasID");
			observatory.appendChild(espasID);

			// Create element "ESPAS_Identifier".
			Element espasIdentifier = document.createElement("ESPAS_Identifier");
			espasID.appendChild(espasIdentifier);

			// Create element "localID".
			Element localID = document.createElement("localID");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			localID.setTextContent(formatter.toString());
			formatter.close();
			espasIdentifier.appendChild(localID);

			// Create element "namespace".
			Element namespace = document.createElement("namespace");
			namespace.setTextContent("eiscat");
			espasIdentifier.appendChild(namespace);

			// Create element "version".
			Element version = document.createElement("version");
			version.setTextContent("1");
			espasIdentifier.appendChild(version);

			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");

			// Create element "version".
			Element creationDate = document.createElement("creationDate");
			creationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(creationDate);

			// Create element "lastModificationDate".
			Element lastModificationDate = document.createElement("lastModificationDate");
			lastModificationDate.setTextContent(dateFormat.format(dateFormat.parse("2012-10-16T14:42+0300")));
			espasIdentifier.appendChild(lastModificationDate);

			// Create element "name".
			Element name = document.createElement("name");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_LOCAL_ID_PATTERN, currentRecordNumber);
			name.setTextContent(formatter.toString());
			formatter.close();
			observatory.appendChild(name);

			// Create element "description".
			Element description = document.createElement("description");
			formatter = new Formatter();
			formatter.format(ESPAS_SYNTHETIC_DATA_PROGRAM_DESCRIPTION_PATTERN, currentRecordNumber);
			description.setTextContent(formatter.toString());
			formatter.close();
			observatory.appendChild(description);

			// Create element "managedBy".
			Element managedBy = document.createElement("managedBy");
			managedBy.setAttribute("xlink:href", "eiscat");
			observatory.appendChild(managedBy);

			// Create element "acquisitionType".
			Element acquisitionType  = document.createElement("acquisitionType");
			acquisitionType.setTextContent("Remote");
			observatory.appendChild(acquisitionType);

			// Append comment.
			observatory.appendChild(document.createComment(" The instrument type must come from a controlled vocabulary. "));

			// Create element "instrumentType".
			Element instrumentType  = document.createElement("instrumentType");
			instrumentType.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/instrumentTypes" + "/" +
			ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY[(int)currentRecordNumber % ESPAS_SYNTHETIC_DATA_INSTRUMENT_TYPE_VOCABULARY.length]);
			observatory.appendChild(instrumentType);

			observatory.appendChild(document.createComment(" The parameters the instrument can measure must come from a controlled vocabulary TBD!!! "));

			for(int i = 0; i < ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY.length; i++) {
				Element measures = document.createElement("measures");
				measures.setAttribute("xlink:href", ESPAS_SYNTHETIC_DATA_NS + "/registry" + "/vocabulary" + "/measurementParameter" + "/" +
				ESPAS_SYNTHETIC_DATA_INSTRUMENT_MEASUREMENT_PARAMETER_VOCABULARY[i]);
				observatory.appendChild(measures);
			}

			Element coupledWith = document.createElement("coupledWith");
			coupledWith.setAttribute("xlink:href", "eiscat");
			observatory.appendChild(coupledWith);
		}
		catch(ParseException e) {
			logger.error("Parse Exception.", e);
		}
		return observatory;
	}

	public static void main(String args[]) {
		CreateSyntheticXMLData createSyntheticXMLData = new CreateSyntheticXMLData();
		createSyntheticXMLData.createAndExportSynetheticData();
		System.out.println("Successfully, created and exported XML data.");
	}
}
