/**
 * <p>Titre : </p>
 *
 * <p>Description : </p>
 *
 * <p>Copyright : Copyright (c) 2008</p>
 *
 * <p>Société : </p>
 *
 * @author non attribuable
 * @version 1.0
 */
import org.json.*;
import com.hardis.adelia.common.HardisMsgErreur;
import com.hardis.common.type.HaBlob;
import java.io.*;

public class sampleXMLJSONConverter
{
    public sampleXMLJSONConverter()
    {
    }

    /**
     * Convertion d'un document XML sous la forme d'une chaine alpha
     * au format JSON dans une chaine alpha
     * @param tabParam Object[]
     * tabParam[0] : Document XML (String)
     * tabParam[1] : Chaine alpha devant recevoir le resulat de la convertion (String)
     * tabParam[2] : Taille max de la chaine alpha devant recevoir le resulat de la convertion (Integer)
     * tabParam[3] : Code retour de la convertion (Short). Les valeurs possibles sont :
     * 0 : Ok,
     * -1 : la taille max de la chaine alpha devant recevoir le resulat est insuffisante
     * -2 : erreur lors de la convertion
     */
    public static void XMLStringtoJSONString (Object[] tabParam)
    {
        String docXML = (String) tabParam[0], jsString;
        int maxSize = ((Integer) tabParam[2]).intValue();
        JSONObject js;

        try
        {
            // conversion d'une chaine alpha au format XML vers un objet JSON
            js = XML.toJSONObject(docXML);
        }
        catch (JSONException ex)
        {
            // Syntaxe XML erronee
            HardisMsgErreur.ErrPrintStackTrace(ex);
            tabParam[3] = new Short((short) -2);
            return;
        }
        // Conversion de l'objet JSON en chaine alpha
        jsString = js.toString();
        if (jsString == null)
            // erreur lors de la conversion de l'objet JSON au format text
            tabParam[3] = new Short((short) -2);
        else
        {
            if (jsString.length() > maxSize)
                // Chaine alpha resultat trop petite
                tabParam[3] = new Short((short) -1);
            else
            {
                // conversion Ok
                tabParam[1] = jsString;
                tabParam[3] = new Short((short) 0);
            }
        }
    }

    /**
     * Convertion d'un document XML sous la forme d'un HaBlob
     * au format JSON dans une chaine alpha
     * @param tabParam Object[]
     * tabParam[0] : Document XML (HaBlob)
     * tabParam[1] : Encoding du blob (String)
     * tabParam[2] : Chaine alpha devant recevoir le resulat de la convertion (String)
     * tabParam[3] : Taille max de la chaine alpha devant recevoir le resulat de la convertion (Integer)
     * tabParam[4] : Code retour de la convertion (Short). Les valeurs possibles sont :
     * 0 : Ok,
     * -1 : la taille max de la chaine alpha devant recevoir le resulat est insuffisante
     * -2 : erreur lors de la convertion
     * -3 : encoding non supporte
     */
    public static void XMLBlobtoJSONString (Object[] tabParam)
    {
        HaBlob blobXML = (HaBlob) tabParam[0];
        String docXML = null, jsString;
        String encoding = (String) tabParam[1];
        int maxSize = ((Integer) tabParam[3]).intValue();
        JSONObject js;

        try
        {
            // conversion du blob XML au format text
            docXML = new String(blobXML.getBuffer(), encoding);
        }
        catch (UnsupportedEncodingException ex1)
        {
            // mauvais encoding
            tabParam[4] = new Short((short) -3);
            return;
        }
        try
        {
            // conversion du document XML sous la forme text en objet JSON
            js = XML.toJSONObject(docXML);
        }
        catch (JSONException ex)
        {
            // Syntaxe XML erronee
            HardisMsgErreur.ErrPrintStackTrace(ex);
            tabParam[4] = new Short((short) -2);
            return;
        }
        jsString = js.toString();
        if (jsString == null)
            // erreur lors de la conversion de l'objet JSON au format text
            tabParam[4] = new Short((short) -2);
        else
        {
            if (jsString.length() > maxSize)
                // Chaine alpha resultat trop petite
                tabParam[4] = new Short((short) -1);
            else
            {
                // conversion Ok
                tabParam[2] = jsString;
                tabParam[4] = new Short((short) 0);
            }
        }
    }

    /**
     * Convertion d'un document JSON sous la forme d'une chaine alpha
     * au format XML dans une chaine alpha
     * @param tabParam Object[]
     * tabParam[0] : Document JSON (String)
     * tabParam[1] : Chaine alpha devant recevoir le resulat de la convertion (String)
     * tabParam[2] : Taille max de la chaine alpha devant recevoir le resulat de la convertion (Integer)
     * tabParam[3] : Code retour de la convertion (Short). Les valeurs possibles sont :
     * 0 : Ok,
     * -1 : la taille max de la chaine alpha devant recevoir le resulat est insuffisante
     * -2 : erreur lors de la convertion
     * -3 : La syntaxe du document JSON est invalide
     */
    public static void JSONStringtoXMLString (Object[] tabParam)
    {
        String jsonString = (String) tabParam[0], docXML = null;
        int maxSize = ((Integer) tabParam[2]).intValue();
        JSONObject js;

        try
        {
            // conversion d'un chaine alpha au format JSON en objet JSON
            js = new JSONObject(jsonString);
        }
        catch (JSONException ex)
        {
            // erreur de syntaxe JSON
            tabParam[3] = new Short((short) -3);
            return;
        }
        try
        {
            // conversion de l'objet JSON en document XML au format text
            docXML = XML.toString(js);
        }
        catch (JSONException ex1)
        {
            tabParam[3] = new Short((short) -2);
            return;
        }
        if (docXML.length() > maxSize)
            // Chaine alpha resultat trop petite
            tabParam[3] = new Short((short) -1);
        else
        {
            // conversion ok
            // Ajout du prolog XML avec un encoding UTF-8 par defaut
            tabParam[1] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + docXML;
            tabParam[3] = new Short((short) 0);
        }
    }

    /**
     * Convertion d'un document JSON sous la forme d'une chaine alpha
     * au format XML dans un blob
     * @param tabParam Object[]
     * tabParam[0] : Document JSON (String)
     * tabParam[1] : Blob devant recevoir le resulat de la convertion (HaBlob)
     * tabParam[2] : Encoding du blob resultat (String)
     * tabParam[3] : Code retour de la convertion (Short). Les valeurs possibles sont :
     * 0 : Ok,
     * -1 : erreur lors de la convertion
     * -2 : La syntaxe du document JSON est invalide
     * -3 : encoding non supporte
     */
    public static void JSONStringtoXMLBlob (Object[] tabParam)
    {
        String jsonString = (String) tabParam[0], encoding = (String) tabParam[2], docXML = null;
        HaBlob blob = (HaBlob) tabParam[1];
        JSONObject js;
        byte tab[];

        try
        {
            // conversion d'un chaine alpha au format JSON en objet JSON
            js = new JSONObject(jsonString);
        }
        catch (JSONException ex)
        {
            // erreur de syntaxe JSON
            tabParam[3] = new Short((short) -2);
            return;
        }
        try
        {
            // conversion de l'objet JSON en document XML au format text
            docXML = XML.toString(js);
        }
        catch (JSONException ex1)
        {
            tabParam[3] = new Short((short) -1);
            return;
        }
        try
        {
            // encodage du document XML au format text avec l'encoding spécifié
            tab = ("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>" + docXML).getBytes(encoding);
        }
        catch (UnsupportedEncodingException ex2)
        {
            // mauvais encoding
            tabParam[3] = new Short((short) -3);
            return;
        }
        // conversion ok
        // mise a jour du blob
        blob.set(tab.length, tab);
        tabParam[3] = new Short((short) 0);
    }

}
