in SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/GenericDataWriterEngine.java [384:494]
public void writeObservation(String obsConceptId, String obsConceptValue, String obsValue, AnnotationBean... annotations) {
if (DimensionBean.TIME_DIMENSION_FIXED_ID.equals(obsConceptId)) {
if (schemaVersion == SDMX_SCHEMA.VERSION_TWO_POINT_ONE) {
obsConceptValue = DateUtil.formatDateForSdmxVersion21(obsConceptValue);
} else if (schemaVersion == SDMX_SCHEMA.VERSION_TWO) {
obsConceptValue = DateUtil.formatDateForSdmxVersion2(obsConceptValue);
} else if (schemaVersion == SDMX_SCHEMA.VERSION_ONE) {
obsConceptValue = DateUtil.formatDateForSdmxVersion1(obsConceptValue);
}
}
obsConceptId = getComponentId(obsConceptId);
super.writeObservation(obsConceptId, obsConceptValue, obsValue, annotations);
// if(!ObjectUtil.validString(obsValue)) {
// obsValue = SdmxConstants.MISSING_DATA_VALUE;
// }
try {
switch (currentPosition) {
case OBSERVATION:
writeEndObs();
break;
case OBSERVATION_ATTRIBUTE:
seriesWriter.writeEndElement(); //END ATTRIBUTES
writeEndObs();
break;
case SERIES_KEY_ATTRIBUTE:
seriesWriter.writeEndElement(); //END ATTRIBUTES
break;
case SERIES_KEY:
if (!isFlat) {
seriesWriter.writeEndElement(); //END SERIES KEY
}
break;
case GROUP:
if (isTwoPointOne()) {
writer.writeEndElement(); //END GROUP
} else {
throw new SdmxSemmanticException("Attempting to write observation to group , an observation must belong to a series");
}
break;
case GROUP_KEY:
if (isTwoPointOne()) {
writer.writeEndElement(); //END GROUP_KEY
writer.writeEndElement(); //END GROUP
} else {
throw new SdmxSemmanticException("Attempting to write observation to group , an observation must belong to a series");
}
break;
case GROUP_KEY_ATTRIBUTE:
if (isTwoPointOne()) {
writer.writeEndElement(); //END GROUP_KEY_ATTRIBUTE
writer.writeEndElement(); //END GROUP
} else {
throw new SdmxSemmanticException("Attempting to write observation to group , an observation must belong to a series");
}
break;
default:
if (!isTwoPointOne()) {
throw new IllegalArgumentException("An observation may only be written while inside a series");
}
}
currentPosition = POSITION.OBSERVATION;
startElement(seriesWriter, GENERIC_NS, "Obs"); //WRITE THE OBS NODE
if (isFlat) {
componentVals.put(obsConceptId, obsConceptValue);
writeAnnotations(seriesWriter, annotations);
startElement(seriesWriter, GENERIC_NS, "ObsKey");
for (String componentId : seriesKey) {
startElement(seriesWriter, GENERIC_NS, "Value");
seriesWriter.writeAttribute("id", componentId);
seriesWriter.writeAttribute("value", componentVals.get(componentId));
seriesWriter.writeEndElement(); //END Value
}
seriesWriter.writeEndElement(); //END ObsKey
} else if (isTwoPointOne()) {
writeAnnotations(seriesWriter, annotations);
startElement(seriesWriter, GENERIC_NS, "ObsDimension");
if (isCrossSectional) {
seriesWriter.writeAttribute("id", obsConceptId);
}
seriesWriter.writeAttribute("value", obsConceptValue);
seriesWriter.writeEndElement(); //END ObsDimension
} else {
obsAnnotations = annotations;
startElement(seriesWriter, GENERIC_NS, "Time");
seriesWriter.writeCharacters(obsConceptValue);
seriesWriter.writeEndElement(); //END Time
}
startElement(seriesWriter, GENERIC_NS, "ObsValue");
if (ObjectUtil.validString(obsValue)) {
seriesWriter.writeAttribute("value", obsValue);
}
seriesWriter.writeEndElement(); //END ObsValue
if (isFlat) {
// Write the Series Attributes as Observation Level Attributes
// NOTE - we do not want to write the Series Keys here, so they need to be removed
Map<String, String> componentValsClone = new LinkedHashMap<String, String>(componentVals);
componentValsClone.keySet().removeAll(seriesKey);
for (String key : componentValsClone.keySet()) {
writeAttributeValue(key, componentValsClone.get(key));
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}