
package uk.co.wingpath.modbusgui;

import java.io.*;
import java.util.*;
import java.util.List;
import uk.co.wingpath.event.*;
import uk.co.wingpath.util.*;
import uk.co.wingpath.modbus.*;
import uk.co.wingpath.xml.*;

public final class FileGroupXml
{
    private FileGroupXml ()
    {
    }

    public static void save (Xml.Saver saver, FileGroup [] groups)
        throws IOException
    {
        for (FileGroup group : groups)
        {
            saver.startTag ("group");
            saver.saveValue ("filenum", group.fileNum);
            saver.saveValue ("address", group.address);
            saver.saveValue ("nvalues", group.nvalues);
            saver.endTag ("group");
        }
    }

    public static Xml.Loader getXmlLoader (Xml.Receiver<FileGroup []> receiver)
    {
        return new XmlLoader (receiver);
    }

    private static class XmlLoader
        extends Xml.AbstractLoader
    {
        private final Xml.Receiver<FileGroup []> receiver;
        private ArrayList<FileGroup> groups;

        XmlLoader (Xml.Receiver<FileGroup []> receiver)
        {
            this.receiver = receiver;
            groups = new ArrayList<FileGroup> ();
        }

        @Override
        public Xml.Loader startChild (String tag)
        {
            if (tag.equalsIgnoreCase ("group"))
            {
                return new Xml.AbstractLoader ()
                {
                    int fileNum = -1;
                    int address = -1;
                    int nvalues = -1;

                    @Override
                    public Xml.Loader startChild (String tag)
                    {
                        if (tag.equalsIgnoreCase ("filenum"))
                        {
                            return new Xml.IntegerLoader (1, 65535, 10,
                                new Xml.Receiver<Integer> ()
                                {
                                    public void receive (Integer value)
                                    {
                                        fileNum = value;
                                    }
                                });
                        }
                        if (tag.equalsIgnoreCase ("address"))
                        {
                            return new Xml.IntegerLoader (0, 65535, 10,
                                new Xml.Receiver<Integer> ()
                                {
                                    public void receive (Integer value)
                                    {
                                        address = value;
                                    }
                                });
                        }
                        if (tag.equalsIgnoreCase ("nvalues"))
                        {
                            return new Xml.IntegerLoader (0, 65535, 10,
                                new Xml.Receiver<Integer> ()
                                {
                                    public void receive (Integer value)
                                    {
                                        nvalues = value;
                                    }
                                });
                        }
                        return null;
                    }

                    @Override
                    public void end (String val)
                        throws ValueException
                    {
                        if (!val.equals (""))
                            throw new ValueException ("Value not allowed");
                        if (fileNum < 0)
                            throw new ValueException ("<filenum> missing");
                        if (address < 0)
                            throw new ValueException ("<address> missing");
                        if (nvalues < 0)
                            throw new ValueException ("<nvalues> missing");
                        groups.add (new FileGroup (fileNum, address,
                            nvalues));
                    }
                };
            }
            return null;
        }

        @Override
        public void end (String value)
            throws ValueException
        {
            if (!value.equals (""))
                throw new ValueException ("Value not allowed");
            FileGroup [] result = new FileGroup [groups.size ()];
            receiver.receive (groups.toArray (result));
        }
    }
}

