public DataFormat getDataType()

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);
        }
    }