# SiddhiExtensionConfigReader.java

    /*
     * Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
     *
     * WSO2 Inc. licenses this file to you under the Apache License,
     * Version 2.0 (the "License"); you may not use this file except
     * in compliance with the License.
     * You may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing,
     * software distributed under the License is distributed on an
     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     * KIND, either express or implied. See the License for the
     * specific language governing permissions and limitations
     * under the License.
     */

    package org.wso2.extension.siddhi.device.client.configs;

    import org.w3c.dom.Document;
    import org.wso2.carbon.utils.CarbonUtils;
    import org.wso2.extension.siddhi.device.client.exception.APIMClientException;
    import org.wso2.extension.siddhi.device.client.exception.InvalidConfigurationStateException;

    import javax.xml.XMLConstants;
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Unmarshaller;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import java.io.File;

    /**
     * This holds the configuration parser for api integration.xml
     */
    public class SiddhiExtensionConfigReader {

        private static SiddhiExtensionConfig config;
        private static SiddhiExtensionConfigReader configReader = new SiddhiExtensionConfigReader();
        private static boolean isInitialized = false;
        private static final String SIDDHI_INTEGRATION_CONFIG_PATH =
                CarbonUtils.getCarbonConfigDirPath() + File.separator + "siddhi-integration.xml";

        private SiddhiExtensionConfigReader() {

        }

        private static String apimIntegrationXmlFilePath = "";

        //TOD file may be a part of another file
        public static SiddhiExtensionConfigReader getInstance() {
            if (!isInitialized) {
                try {
                    init();
                } catch (APIMClientException e) {
                    throw new InvalidConfigurationStateException("Webapp Authenticator Configuration is not " +
                            "initialized properly");
                }
            }
            return configReader;
        }

        public static void init() throws APIMClientException {
            try {
                File siddhiConfigFile = new File(SIDDHI_INTEGRATION_CONFIG_PATH);
                Document doc = convertToDocument(siddhiConfigFile);

                JAXBContext ctx = JAXBContext.newInstance(SiddhiExtensionConfig.class);
                Unmarshaller unmarshaller = ctx.createUnmarshaller();
                config = (SiddhiExtensionConfig) unmarshaller.unmarshal(doc);
                isInitialized = true;
            } catch (JAXBException e) {
                throw new APIMClientException("Error occurred while un-marshalling SiddhiExtensionConfig", e);
            }
        }

        private static Document convertToDocument(File file) throws APIMClientException {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            try {
                factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
                factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
                DocumentBuilder docBuilder = factory.newDocumentBuilder();
                return docBuilder.parse(file);
            } catch (Exception e) {
                throw new APIMClientException("Error occurred while parsing file 'apim-integration.xml' to a org.w3c.dom.Document", e);
            }
        }

        public SiddhiExtensionConfig getConfig() {
            return config;
        }

    }