public Main() throws IOException, SAXException, ParserConfigurationException
    {
        Runtime.getRuntime().addShutdownHook(new Cleaner());

        // Loading the properties
        if (properties.checkAndLoad()) {

            File nodeExecutable = getNodeJsExecutableFile();

            // Reading the XML with the nodes
            if (nodeExecutable != null) {
                DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
                xmlConfig = documentBuilder.parse(config);

                NodeList nodeList = xmlConfig.getFirstChild().getChildNodes();
                Node node;
                NodeList nodeConfig;
                String domNodeName, methodName;
                NodeRunner nodeRunner;
                NodeServer nodeServer;
                Method classMethod;

                for (int i = 0; i < nodeList.getLength(); i++) {
                    node = nodeList.item(i);

                    // We only care about node elements (not texts)
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        nodeConfig = node.getChildNodes();
                        nodeServer = new NodeServer();

                        for (int j = 0; j < nodeConfig.getLength(); j++) {
                            node = nodeConfig.item(j);

                            // We only care about node elements (not texts)
                            if (node.getNodeType() == Node.ELEMENT_NODE) {
                                domNodeName = node.getNodeName();

                                try {
                                    methodName = "set" + StringUtil.ucFirst(domNodeName);
                                    classMethod = NodeServer.class.getMethod(methodName, String.class);
                                } catch (NoSuchMethodException e) {
                                    classMethod = null;
                                    e.printStackTrace();
                                }

                                if(classMethod != null) {
                                    try {
                                        classMethod.invoke(nodeServer, node.getTextContent());
                                    } catch (IllegalAccessException | InvocationTargetException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }

                        // Configuring the node runner object
                        nodeRunner = new NodeRunner(nodeServer, nodeExecutable);

                        // Starting the thread
                        new Thread(nodeRunner).start();

                        // Tracking the runner
                        nodeRunners.add(nodeRunner);
                    }
                }
            } else {
                System.out.println("Could not find the node.js executable file (or an invalid one was provided)");
            }
        } else {
            System.out.println("Failed to load (or create) the properties file");
        }
    }