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

import java.util.Vector;

/**
 *
 * @author Budai Attila
 */
public class XmlNode {

    private String value;
    private String nodeName;
    private Vector subNodes = new Vector();
    private int nodeIndex = 0;

    public XmlNode() {
    }

    /**
     * Az aktuális node nevét beállító konstruktor.
     * @param nodeName név.
     */
    public XmlNode(String nodeName) {
        this.nodeName = nodeName;

    }

    /**
     * A következő node lekérdezése.
     * @return a következő node.
     */
    public XmlNode getNextNode() {
        return (XmlNode) subNodes.elementAt(nodeIndex++);
    }

    /**
     * Megadja, hogy van-e több node.
     * @return igen: amennyiben van.
     */
    public boolean hasMoreNodes() {
        if (nodeIndex < subNodes.size()) {
            return true;
        }
        nodeIndex = 0;
        return false;
    }

    /**
     * Beállítja az aktuális node értékét.
     * @param value érték.
     */
    public void setValue(String value) {
        this.value = value;
    }

    /** ha nincs Value akkor a subnode-okat adja vissza Stringgé konvertálva */
    /**
     * ha nincs érték akkor az alnode-okat adja vissza Sztringgé konvertálva.
     * @return
     */
    public String getValue() {
        StringBuffer tmp = null;
        if (subNodes.size() == 0) {
            System.out.println("value: "+value);
            return value;
        }
        tmp = new StringBuffer();
        for (int i = 0; i < subNodes.size(); i++) {
            tmp.append(subNodes.elementAt(i).toString());
        }
        return tmp.toString();
    }

    /**
     * Az aktuális node-hoz hozzáadunk egy másik node-ot. ez lesz az aktuális node al(sub)nodeja.
     * @param node ezt adjuk hozzá.
     */
    public void addSubNode(XmlNode node) {
        subNodes.addElement(node);

    }

    /**
     * Az aktuális node-nak beállítjuk az alnode-jait.
     * @param subNodes alnode-ok.
     */
    public void setSubNodes(Vector subNodes) {
        this.subNodes = subNodes;
    }

    /**
     * Alnode-ok lekérdezése.
     * @return alnode-ok.
     */
    public Vector getSubNodes() {
        return subNodes;
    }

    /**
     * Node nevének beállítása.
     * @param nodeName név.
     */
    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
    }

    /**
     * Node nevének lekérdezése.
     * @return node neve.
     */
    public String getNodeName() {
        return nodeName;
    }

    /**
     * Bejar rekurzivan egy node-ot. a kiiráshoz kell.
     * @param node ezt a node-ot járja be.
     * @return a kiirandó node.
     */
    private String bejar(XmlNode node) {
        StringBuffer strBuffS = new StringBuffer(node.getNodeName());
        StringBuffer strBuffV = new StringBuffer(node.getNodeName());
        strBuffV.insert(1, '/');
        if (node.value != null) {
            return strBuffS + node.getValue() + strBuffV.toString();
        }
        while (node.hasMoreNodes()) {
            strBuffS.append(bejar(node.getNextNode()));
        }
        return strBuffS.toString() + strBuffV;
    }

    /**
     * A bejar segítségével.
     * @return
     */
    public String toString() {
        return bejar(this);
//       return nodeName  + getValue();
    }
}
