in SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/streaming/StreamDataWriterEngineBase.java [731:910]
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(Boolean.valueOf(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());
}
MaintainableBean currentStructure = dataSetInfo.getStructureForData();
if (isTwoPointOne()) {
//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 {
DataStructureBean dsd = dataSetInfo.dsd;
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);
}
}