private void writeHeader()

in SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/SdmxDataWriterEngine.java [819:1004]


    private void writeHeader() {
        try {
            startElement(writer, MESSAGE_NS, "Header");  //START HEADER
            //ID
            startElement(writer, MESSAGE_NS, "ID");
            if (header != null && ObjectUtil.validString(header.getId())) {
                writer.writeCharacters(header.getId());
            } else {
                writer.writeCharacters("DS" + Long.toString(new Date().getTime()));
            }
            writer.writeEndElement();

            //Test
            startElement(writer, MESSAGE_NS, "Test");
            if (header != null) {
                writer.writeCharacters(new Boolean(header.isTest()).toString());
            } else {
                writer.writeCharacters("false");
            }
            writer.writeEndElement();

            if (!isTwoPointOne() && header != null && header.getName() != null) {
                //In 2.0 the name goes in this location
                writeTextTypes(MESSAGE_NS, "Name", header.getName());
            }

            //Prepared
            startElement(writer, MESSAGE_NS, "Prepared");
            if (header != null && header.getPrepared() != null) {
                writer.writeCharacters(DateUtil.formatDate(header.getPrepared()));
            } else {
                writer.writeCharacters(DateUtil.formatDate(new Date()));
            }
            writer.writeEndElement();

            startElement(writer, MESSAGE_NS, "Sender");
            if (header != null && header.getSender() != null) {
                writeParty(header.getSender(), isTwoPointOne()); //Only 2.1 has the concept of timeZone in the Sender
            } else {
                writer.writeAttribute("id", "MetadataTechnology");
            }
            writer.writeEndElement();

            if (header != null && header.getReceiver() != null) {
                writeReceiver(header.getReceiver());
            }
            if (isTwoPointOne() && header != null && header.getName() != null) {
                //In 2.1 the name goes in this location
                writeTextTypes(COMMON_NS, "Name", header.getName());
            }
            Set<MaintainableBean> constrainables = new HashSet<MaintainableBean>();
            Set<DataStructureBean> dsds = new HashSet<DataStructureBean>();
            for (DataSetOutputStreams os : outputDatasetLocations) {
                constrainables.add(os.getStructureForData());
                dsds.add(os.dsd);
            }

            if (isTwoPointOne()) {
                for (MaintainableBean currentStructure : constrainables) {
                    //Start Structure
                    startElement(writer, MESSAGE_NS, "Structure");

                    writer.writeAttribute("structureID", getStructureRef(currentStructure));


                    if (dataFormat == BASE_DATA_FORMAT.COMPACT) {
                        writer.writeAttribute("namespace", COMPACT_NS.namespaceURL);
                    }
                    if (crossSectionConcept != null) {
                        writer.writeAttribute("dimensionAtObservation", crossSectionConcept);
                    } else {
                        writer.writeAttribute("dimensionAtObservation", DimensionBean.TIME_DIMENSION_FIXED_ID);
                    }

                    //Start Structure (in this case Structure refers to DSD)
                    if (currentStructure instanceof ProvisionAgreementBean) {
                        startElement(writer, COMMON_NS, "ProvisionAgrement");
                    } else if (currentStructure instanceof DataflowBean) {
                        startElement(writer, COMMON_NS, "StructureUsage");
                    } else {
                        startElement(writer, COMMON_NS, "Structure");
                    }


                    //Start Ref
                    writer.writeStartElement("Ref");


                    writer.writeAttribute("agencyID", currentStructure.getAgencyId());
                    writer.writeAttribute("id", currentStructure.getId());
                    writer.writeAttribute("version", currentStructure.getVersion());
                    //End Ref
                    writer.writeEndElement();

                    //End Structure
                    writer.writeEndElement();

                    //End Structure
                    writer.writeEndElement();
                }
            } else if (dsds.size() == 1) {
                DataStructureBean dsd = (DataStructureBean) dsds.toArray()[0];
                StructureReferenceBean dsdRef = dsd.asReference();
                // KeyFamilyRef
                startElement(writer, MESSAGE_NS, "KeyFamilyRef");
                writer.writeCharacters(dsdRef.getMaintainableReference().getMaintainableId());
                writer.writeEndElement();

                // KeyFamilyAgency
                startElement(writer, MESSAGE_NS, "KeyFamilyAgency");
                writer.writeCharacters(dsdRef.getMaintainableReference().getAgencyId());
                writer.writeEndElement();
            }
            //The following are all optional, and only output if the header is not null
            if (header != null) {
                if (isTwoPointOne() && header.getDataProviderReference() != null) {
                    MaintainableRefBean ref = header.getDataProviderReference().getMaintainableReference();
                    if (ObjectUtil.validString(ref.getAgencyId(), ref.getMaintainableId())) {
                        //Start DataProvider
                        startElement(writer, MESSAGE_NS, "DataProvider");

                        //Start Ref
                        writer.writeStartElement("Ref");
                        writer.writeAttribute("agencyID", ref.getAgencyId());
                        writer.writeAttribute("id", ref.getMaintainableId());
                        if (ObjectUtil.validString(ref.getVersion())) {
                            writer.writeAttribute("version", ref.getVersion());
                        } else {
                            writer.writeAttribute("version", MaintainableBean.DEFAULT_VERSION);
                        }
                        //End Ref
                        writer.writeEndElement();

                        //End DataProvider
                        writer.writeEndElement();

                    }
                }
                if (!isTwoPointOne() && header.hasAdditionalAttribute(HeaderBean.DATASET_AGENCY)) {
                    startElement(writer, MESSAGE_NS, "DataSetAgency");
                    writer.writeCharacters(header.getAdditionalAttribute(HeaderBean.DATASET_AGENCY));
                    writer.writeEndElement();
                }
                String datasetId = getDatasetIdForHeader();
                String datasetAction = getDatasetActionForHeader();

                if (isTwoPointOne()) {
                    writeDatasetAction(datasetAction);
                    writeDatasetId(datasetId);
                } else {
                    writeDatasetId(datasetId);
                    writeDatasetAction(datasetAction);
                }

                if (header.getExtracted() != null) {
                    startElement(writer, MESSAGE_NS, "Extracted");
                    writer.writeCharacters(DateUtil.formatDate(header.getExtracted()));
                    writer.writeEndElement();
                }
                String reportingBeginDate = getReportingBeginForHeader();
                if (reportingBeginDate != null) {
                    startElement(writer, MESSAGE_NS, "ReportingBegin");
                    writer.writeCharacters(reportingBeginDate);
                    writer.writeEndElement();
                }

                String reportingEndDate = getReportingEndForHeader();
                if (reportingEndDate != null) {
                    startElement(writer, MESSAGE_NS, "ReportingEnd");
                    writer.writeCharacters(reportingEndDate);
                    writer.writeEndElement();
                }
                if (isTwoPointOne() && header.getEmbargoDate() != null) {
                    startElement(writer, MESSAGE_NS, "EmbargoDate");
                    writer.writeCharacters(DateUtil.formatDate(header.getEmbargoDate()));
                    writer.writeEndElement();
                }
                writeTextTypes(MESSAGE_NS, "Source", header.getSource());
            }

            writer.writeEndElement(); //END HEADER
            headerWritten = true;
        } catch (XMLStreamException e) {
            throw new RuntimeException(e);
        }
    }