in SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/manager/impl/DataInformationManagerImpl.java [106:234]
public DataFormat getDataType(ReadableDataLocation sourceData) {
try {
SdmxException.disableExceptionTrace(true);
try (BufferedReader br = new BufferedReader(new InputStreamReader(sourceData.getInputStream()))) {
char[] firstPortion = new char[StreamCsvDataReaderEngine.DATAFLOW_KEY.length() * 2 + 2];
br.read(firstPortion, 0, firstPortion.length);
String str = new String(firstPortion);
//Check CSV format
if (str.contains(StreamCsvDataReaderEngine.DATAFLOW_KEY)) {
return new SdmxDataFormat(DATA_TYPE.CSV);
}
} catch (Throwable th) {
}
try {
//Try and read it as a JSON dataset
JsonReader reader = new JsonReader(sourceData);
try {
reader.moveNext();
return new SdmxDataFormat(DATA_TYPE.SDMXJSON);
} finally {
reader.closeParser();
}
} catch (Throwable th) {
}
if (SdmxMessageUtil.getMessageType(sourceData) == MESSAGE_TYPE.SDMX_EDI) {
return new SdmxDataFormat(DATA_TYPE.EDI_TS);
}
if (SdmxMessageUtil.getMessageType(sourceData) == MESSAGE_TYPE.ERROR) {
SdmxMessageUtil.parseSdmxErrorMessage(sourceData);
}
InputStream stream = sourceData.getInputStream();
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(stream, "UTF-8");
String rootNode = null;
while (parser.hasNext()) {
int event = parser.next();
if (event == XMLStreamConstants.START_ELEMENT) {
rootNode = parser.getLocalName();
for (int i = 0; i < parser.getNamespaceCount(); i++) {
String ns = parser.getNamespaceURI(i);
if (SdmxConstants.getNamespacesV1().contains(ns)) {
if (rootNode.equals(SdmxConstants.GENERIC_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.GENERIC_1_0);
} else if (rootNode.equals(SdmxConstants.UTILITY_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.UTILITY_1_0);
} else if (rootNode.equals(SdmxConstants.COMPACT_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.COMPACT_1_0);
} else if (rootNode.equals(SdmxConstants.CROSS_SECTIONAL_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.CROSS_SECTIONAL_1_0);
} else if (rootNode.equals(SdmxConstants.MESSAGE_GROUP_ROOT_NODE)) {
BASE_DATA_FORMAT dataForamt = getMessageGroupDataFormat(parser);
if (dataForamt != null) {
switch (dataForamt) {
case COMPACT:
return new SdmxDataFormat(DATA_TYPE.MESSAGE_GROUP_1_0_COMPACT);
case GENERIC:
return new SdmxDataFormat(DATA_TYPE.MESSAGE_GROUP_1_0_GENERIC);
case UTILITY:
return new SdmxDataFormat(DATA_TYPE.MESSAGE_GROUP_1_0_UTILITY);
}
}
throw new SdmxSyntaxException("Unknown Message Group Format");
} else {
throw new SdmxSyntaxException("Unexpected root node '" + rootNode + "'");
}
}
if (SdmxConstants.getNamespacesV2().contains(ns)) {
if (rootNode.equals(SdmxConstants.GENERIC_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.GENERIC_2_0);
} else if (rootNode.equals(SdmxConstants.UTILITY_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.UTILITY_2_0);
} else if (rootNode.equals(SdmxConstants.COMPACT_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.COMPACT_2_0);
} else if (rootNode.equals(SdmxConstants.CROSS_SECTIONAL_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.CROSS_SECTIONAL_2_0);
} else if (rootNode.equals(SdmxConstants.MESSAGE_GROUP_ROOT_NODE)) {
BASE_DATA_FORMAT dataForamt = getMessageGroupDataFormat(parser);
if (dataForamt != null) {
switch (dataForamt) {
case COMPACT:
return new SdmxDataFormat(DATA_TYPE.MESSAGE_GROUP_2_0_COMPACT);
case GENERIC:
return new SdmxDataFormat(DATA_TYPE.MESSAGE_GROUP_2_0_GENERIC);
case UTILITY:
return new SdmxDataFormat(DATA_TYPE.MESSAGE_GROUP_2_0_UTILITY);
}
}
throw new SdmxSyntaxException("Unknown Message Group Format");
} else {
throw new SdmxSyntaxException("Unexpected root node '" + rootNode + "'");
}
}
if (SdmxConstants.getNamespacesV2_1().contains(ns)) {
if (rootNode.equals(SdmxConstants.STRUCTURE_SPECIFIC_TIME_SERIES_DATA)
|| rootNode.equals(SdmxConstants.STRUCTURE_SPECIFIC_DATA)) {
return new SdmxDataFormat(DATA_TYPE.COMPACT_2_1);
} else if (rootNode.equals(SdmxConstants.GENERIC_TIME_SERIES_DATA_ROOT_NODE) ||
rootNode.equals(SdmxConstants.GENERIC_DATA_ROOT_NODE)) {
return new SdmxDataFormat(DATA_TYPE.GENERIC_2_1);
} else {
throw new SdmxSyntaxException("Unexpected root node '" + rootNode + "'");
}
}
}
throw new SdmxSyntaxException(ExceptionCode.XML_PARSE_EXCEPTION, "Can not determine data type " +
"unknown namespaces defined");
}
}
throw new SdmxSyntaxException(ExceptionCode.XML_PARSE_EXCEPTION,
"Unknown Data type with root node :" + rootNode);
} catch (javax.xml.stream.XMLStreamException e) {
throw new SdmxSyntaxException(e, ExceptionCode.XML_PARSE_EXCEPTION);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
} finally {
SdmxException.disableExceptionTrace(false);
}
}