/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mobirent.gui;

import com.mobirent.messageprocessor.XmlNode;

import java.util.Vector;

/**
 *
 * @author Budai Attila
 */
public class XmlString2Data {
    
    /**
     * @param tomb Ebben a tömbben helyezem el a String tokenjeit.
     */
    private int szamlalo = 0;
    private Vector lines = new Vector();
    
    /**
     * 
     * 
     * @param string az a String amiböl xml-t szeretnénk csinálni
     */
    public XmlString2Data(String string) throws ExceptionHandler {
        System.out.println("MSG: "+string);
        lines = split(string);
    }

    /**
     * Az input Stringböl ö hívja meg azt a metódust, amelyik xml-t kreál.
     * @return a root Node-ot.
     */
    public XmlNode getXml() throws ExceptionHandler {
        szamlalo = 0;
        return createXml();
    }

    /**
     * ö kreaálja az xml-t a stringböl.
     * @return
     * @throws java.lang.Exception
     */
    private XmlNode createXml() throws ExceptionHandler {
        XmlNode node = new XmlNode();
        node.setNodeName(lines.elementAt(szamlalo).toString());
        StringBuffer strBuff = new StringBuffer(lines.elementAt(szamlalo).toString());
        strBuff.insert(1, '/');
        for (; szamlalo < lines.size() - 1;) {
            String string = lines.elementAt(++szamlalo).toString();
            XmlNode nodeN = getNodeValue(string);
            if (nodeN == null) {
                if (string.equals(strBuff.toString())) {
                    break;
                } else {
                    nodeN = createXml();
                }
            }
            node.addSubNode(nodeN);
        }
        return node;
    }

    /**
     * adott sorban keresek értéket, ha van érték, hozzáadom a node-hoz, ha nincs, akkor rekurzió lesz!
     * @param input
     * @return
     * @throws java.lang.Exception
     */
        private XmlNode getNodeValue(String input) throws ExceptionHandler {
        XmlNode node = null; 
        int mennyi = 0;
        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) == '>') {
                mennyi += 1;
            }
            if (mennyi == 2) {
                node = keres(input);
                if (node == null) {
                    throw new ExceptionHandler("1AdatÁtviteli Hiba Történt! Ismételjük meg újra a letöltést!" + input);
                }
                return node;
            }
        }
        return node;
    }

    /**
     * Adott input sorban <type>type</type> <-ban keresi az értéket, ha van visszaadja
     * ha nincs akkor nullal tér vissza.
     * @param ebben
     * @return
     */
    private XmlNode keres(String ebben) {
        XmlNode node = new XmlNode();
        for (int i = 1; i < ebben.length(); i++) {
            if (ebben.charAt(i) == '>') {
                node.setNodeName(ebben.substring(0, i + 1));
            }
            if (ebben.charAt(i) == '<') {
                node.setValue(ebben.substring(node.getNodeName().length(), i));
                return node;
            }
        }
        return null;
    }

    /**
     * Az inputot feldarabolja tagokra.
     * @param string input.
     * @return 
     */
    private Vector split(String input) {
        Vector ret = new Vector();
        int index = 0;
        if (input.charAt(0) != '<') {
            return null;
        }
        for (int i = 1; i < input.length(); i++) {
            if (input.charAt(i - 1) == '>' && input.charAt(i) == '<') {
                ret.addElement(input.substring(index, i));
                index = i;
            }
        }
        return ret;
    }
}
